合抱之木 起于毫末
JVM(Java Virtual Machine), 完整的实现一个, 难不难, 难于上青天, 实现一个简单的, 简单不简单, 简单, 多简单, 容下文道来.
0x00 小目标
定个目标尤为重要
几个小目标
- 快速原型, 验证是否可行.
- 入门通用做法, 把 HelloWorld 跑起来.
-
测试通过经典书籍示例代码 Code Examples for the book “On Java 8”
- self-bootstrap , 自举, 自己能把自己跑起来.
0x01 做什么, 不做什么, 做到什么程度
生活中到处都是选择, 技术上到处都是权衡. 造个小轮子, 自然是怎么顺手怎么来了.
做什么
- 解释器
- class file 解析
- 静态方法调用
- 本地方法调用
- 类与对象
- 数组
- 字符串
- 异常处理
- 完善方法调用
- JDK 类库
- 查漏补缺
- 一些更小的玩具
分先后, 不分难易(几乎一样简单)
不做什么
- GC // 外面的人想进去, 里面的人想出来.
- 多线程 // 虽然是 JVM 的杀手级功能. 但这个功能更多还是底层操作系统提供的, 只是做了点封装, 又难测试, 收益不高.
- 网络通讯 // 杀手级功能2, 同多线程.
- 错误处理 // 指的实现过程的非预期情况.
做到什么程度
刚好能用
0x02 怎么做
简单讲就是怎么简单怎么做.
几个原则
- 写刚好能运行的代码.
- keep it simple, stupid. 写简单的代码.
- let it crash. 快速失败.
- 测试先行.
0x03 前置要求
得有点最基本的门槛, 当然, 要求绝对不高.
开发环境
- 系统: 最好是 Unix*, 当然 Windows 也行.
- IDE: 最好是 IDEA.
- JDK: 1.8
- MAVEN: 3.3+
背景知识
- 基础的 JAVA 语法 (赋值, 控制结构)
- 基础的 数据结构 (线性表, 栈)
- 基础的算法 (递归)
0x04 好戏开场
看了半天, 似乎并没有体会到有多简单. 现在正式开场.
do {
获取下一个指令
解释指令
} while (还有指令);
正如上面伪代码所展示的, 核心就是一个循环. class file 什么的都是辅助.
更多信息, 下回分解.
0x05 预告
- 基于栈还是基于寄存器?
- 栈帧为什么需要局部变量表和操作数栈, 只用其中一个, 行不行?
- 构建一个简单的解释器需要多久, 10分钟够不够?
0x06 FAQ
-
为什么选择 Java ?
引入新的语言有对应的成本. 对 Java 开发来讲, Java 是最容易上手的了.
原文
https://www.guxingke.com/posts/how-to-build-your-own-jvm-1.html