最近写了一个玩具型的Fantom语言VM,也就是解释器。类似于JVM运行Java bytecode。
实现一个VM需要完成以下任务:
- 字节码读取
- 函数调用栈
- 操作数栈和指令操作实现
- 参数传递和返回值
- 默认参数和参数缩减
- 本地方法调用
- 垃圾收集
- 基本类型装箱和拆箱
- 运行时类型信息和对象字段访问
- 方法查找缓存和对象缓存
- 异常处理
作为了一个玩具实现,很简单,没有复杂的地方。如果要再进一步成为可实际使用的VM,有三个难的地方:
- 对垃圾收集的优化。目前我只做了一个简单的标记清除垃圾回收。
- JIT编译,目前我没有任何的思路来做,也许可以通过LLVM来实现。
- 实现所有的系统标准库。这个工作量比较大,而且写起来也有些乏味。