如何构建一个你自己的 JVM (0) 概述

260 阅读2分钟

合抱之木 起于毫末

JVM(Java Virtual Machine), 完整的实现一个, 难不难, 难于上青天, 实现一个简单的, 简单不简单, 简单, 多简单, 容下文道来.

小目标

定个目标尤为重要

几个小目标

  1. 快速原型, 验证是否可行.
  2. 入门通用做法, 把 HelloWorld 跑起来.
  3. 测试通过经典书籍示例代码 Code Examples for the book "On Java 8"
  4. self-bootstrap , 自举, 自己能把自己跑起来.

做什么, 不做什么, 做到什么程度

生活中到处都是选择, 技术上到处都是权衡. 造个小轮子, 自然是怎么顺手怎么来了.

做什么

  1. 解释器
  2. class file 解析
  3. 静态方法调用
  4. 本地方法调用
  5. 类与对象
  6. 数组
  7. 字符串
  8. 异常处理
  9. 完善方法调用
  10. JDK 类库
  11. 查漏补缺
  12. 一些更小的玩具

分先后, 不分难易(几乎一样简单)

不做什么

  1. GC // 外面的人想进去, 里面的人想出来.
  2. 多线程 // 虽然是 JVM 的杀手级功能. 但这个功能更多还是底层操作系统提供的, 只是做了点封装, 又难测试, 收益不高.
  3. 网络通讯 // 杀手级功能2, 同多线程.
  4. 错误处理 // 指的实现过程的非预期情况.

做到什么程度

刚好能用

怎么做

简单讲就是怎么简单怎么做.

几个原则

  1. 写刚好能运行的代码.
  2. keep it simple, stupid. 写简单的代码.
  3. let it crash. 快速失败.
  4. 测试先行.

前置要求

得有点最基本的门槛, 当然, 要求绝对不高.

开发环境

  • 系统: 最好是 Unix*, 当然 Windows 也行.
  • IDE: 最好是 IDEA.
  • JDK: 1.8
  • MAVEN: 3.3+

背景知识

  • 基础的 JAVA 语法 (赋值, 控制结构)
  • 基础的 数据结构 (线性表, 栈)
  • 基础的算法 (递归)

好戏开场

看了半天, 似乎并没有体会到有多简单. 现在正式开场.

do {
    获取下一个指令
    解释指令
while (还有指令);

正如上面伪代码所展示的, 核心就是一个循环. class file 什么的都是辅助.

更多信息, 下回分解.

下期预告

  1. 基于栈还是基于寄存器?
  2. 栈帧为什么需要局部变量表和操作数栈, 只用其中一个, 行不行?
  3. 构建一个简单的解释器需要多久, 10分钟够不够?

FAQ

  1. 为什么选择 Java ?
    引入新的语言有对应的成本. 对 Java 开发来讲, Java 是最容易上手的了.