本书按内容分为六个部分,*部分介绍语言虚拟机的基本概念,并实现字节码解释器;第二部分,实现内嵌类型,如整数、字符串、列表和字典等;第三部分,实现了函数;第四部分,实现自定义类、对象和方法;第五部分,实现垃圾回收,也就是自动内存管理;第六部分,模块和迭代。本书的章节内容之间都有很强的依赖性,后面的章节内容都是在前面章节的基础上去实现的,所以读者必须按部就班地从前向后阅读,才能保证阅读的流畅。
本书适合的人群包括:在校大学生(可以通过本书掌握很多计算机工作运行的核心知识),以及对编译器,编程语言感兴趣的人。
编程语言是每个程序员每天都要使用的基本工具,现代的主流编程语言以 Java、javascript 和
Python 为代表,都是运行在语言虚拟机之上的,很多人都很想知道语言虚拟机的内部构造。我从2017年开始在知乎撰写专栏《进击的Java新人》,专栏中对 Java 语言虚拟机的字节码和垃圾回收做了一些简单的介绍,很多读者发私信给我,表示非常想知道更多的细节。在这样的背景下,我开始了本书的写作。我希望在这本书中和读者一起从零开始构建一个完整的编程语言虚拟机,它将会涉及到字节码的解析执行、对象系统、语言内置功能和垃圾回收等多个主题。
本书适合的人群包括:
1. 在校大学生,大一大二的同学可以通过本书掌握很多计算机工作运行的核心知识
。
2. 对编译器和编程语言感兴趣的人。相比起直接将一门语言编译成机器码,将其编译为虚拟机上的字节码文件会简单很多,所以掌握一门虚拟机字节码,甚至自己实现一个虚拟机对学习编译器、了解编程语言特性有很大的帮助。
本书的内容虽然很新颖,但是对读者门槛的要求并不高。读者只要简单地掌握一些Python或者某一门类C语言(例如Java)即可。在本书中,我选择了使用C 来实现语言虚拟机。这主要是由于在内存操作方面,C 可以更精准地表达作者的意图。C 是一门很难的语言,相比起 Java、Python和PHP 等语言,流行度也不高,但是读者不必有畏难情绪,本书在使用 C 的时候是比较克制的。本书并没有使用很多 C 的高级技巧,最多只涉及到类和一点点的模板编程的知识。C 是一门多范式的编程语言,我们不可能在一个工程中使用所有的编程范式。本书中所涉及的代码,读者只需要有任何一门面向对象的语言的编程经验即可顺利阅读。
如何使用本书:
本书共分为六个部分,第一部分介绍语言虚拟机的基本概念,并实现字节码解释器;第二部分,实现了内嵌类型,如整数、字符串、列表和字典等;第三部分,实现了函数;第四部分,实现自定义类、对象和方法;第五部分,实现垃圾回收,也就是自动内存管理;第六部分,模块和迭代。其中第二、第三和第四部分的实现并不是完全独立的,而是相互嵌套依赖的。比如完整的对象系统必然依赖函数,而 Python 中的函数本身也是对象,这就产生了循环依赖,解决这个问题的办法是先实现一套相对简单的对象系统,然后基于此也实现一套简单的函数系统,再回过头来补充完善对象系统……这样螺旋式地上升,最终完成整个系统的搭建。
本书章节的内容之间都有很强的依赖,后面章节的内容都是在前面的章节的基础上去实现的。所以读者必须按部就班地从前向后阅读,才能保证阅读的流畅。本书为了节约篇幅,对于一些逻辑比较简单的代码,就都省略了。读者可以在https://gitee.com/hinus/pythonvm 里找到全部的代码,包括该项目最近的更新以及各种提交记录。在提交记录中,读者可以清晰地看到本项目的进化过程。
感谢出版社编辑剧艳婕的耐心审校,尤其还要感谢专栏《进击的Java新人》的读者,是你们的精彩评论和学习反馈引发了这本书的创作。
实现一个高效的编程语言虚拟机是一个十分复杂的问题,从Hotspot虚拟机的发展过程中就可以看出来。书中难免有讹错纰漏之处,欢迎读者及时指出。书中如果有描述不清的地方,也欢迎读者来信交流,可发至邮箱:hinus@163.com。