Q:为什么用Go语言实现JVM?
A:很大程度是因为个人喜好。在我动手写这个玩具JVM的时候,摆在我面前的有几种选择:使用JavaScript、Python、Ruby这样的脚本语言;使用Java或者C#;使用C或者C++。脚本语言很酷,但是对于虚拟机来讲,我更倾向于一门稍微底层一些的语言,所以排除掉了。我工作主要是用Java,想在业余时间尝试一门别的语言,所以也没有选择。C/C++开发效率太低,而且我自己不太喜欢“头文件”语言,所以也没有选择。综合考虑,选择了大概介于Java和C之间的Go语言。这样我就可以一边学习JVM,一边练习Go语言,一举两得。
Q:本书第二版什么时候出版?
A:暂时没有出版第二版的计划。如果大家有好的建议或者意见,可以提交issue,也可以加入本书的QQ群直接和我交流。如果大家不满足于只是实现虚拟机,还想自己动手实现编译器或者标准库,可以阅读我的第二本书《自己动手实现Lua》。
Q:为什么没有实现多线程?
A:主要是为了降低书的难度、限制篇幅。如果想要了解多线程的实现,可以参考本书最初想法的来源,也就是jvm.go。这个项目的代码和本书最后一章的代码非常接近,但是包含了一个简单的多线程实现,仅供读者参考。
Q:为什么没有讲GC(垃圾回收)?
A:选择Go作为开发语言的很重要的一个原因,就是因为Go自带了垃圾回收,这样就可以把JVM的垃圾回收直接交给Go去处理,大幅降低开发玩具JVM的难度。垃圾回收实际上是个非常通用的技术,读者可以阅读其他专门的书籍获得这方面的知识。