版权信息
书名:自己动手写Java虚拟机
作者:张秀宏
出版社:机械工业出版社
出版时间:2016-05
ISBN:9787111534136
前言
为什么编写本书
Java语言于1995年首次公开发布,很快便取得了巨大的成功,成为使用最为广泛的编程语言之一。到现在,Java已经经历了20多个年头。在这期间,无论是Java语言本身还是Java虚拟机技术,都取得了长足的进步。现如今,Java依然长期占据TIOBE网站的编程语言排行榜首。最近更是被TIOBE选为2015年度编程语言,风采可谓不减当年。众所周知,Java早已不仅仅是一个单纯的语言,而是一个开放的平台。活跃在这个平台之上的编程语言除了Java之外,还有Groovy、Scala、Clojure、Jython和JRuby等。Java虚拟机则是支持这个平台的基石。
市面上教授Java语言的书籍种类繁多,相比之下,介绍Java虚拟机的书籍却是凤毛麟角。这足以说明Java作为一门高级语言是多么成功(让程序员远离底层),但并不代表Java虚拟机技术不重要。恰恰相反,当Java语言掌握到一定程度时,Java虚拟机原理自然就会成为必须越过的一道鸿沟。
近几年,国内涌现出了一些讨论Java虚拟机技术的优秀书籍,这些书籍主要以分析OpenJDK或Oracle JDK为主。本书另辟蹊径,带领读者自己动手从零开始用Go语言编写Java虚拟机。这样做好处颇多,弥补了OpenJDK等虚拟机的不足。
首先,OpenJDK等虚拟机实现非常复杂。对于初学者而言,很容易陷入代码的海洋和不必要的细节之中。其次,OpenJDK等虚拟机大多用C++语言编写。C++语言非常复杂,理解起来难度很大。最后,单纯阅读代码比较乏味,缺少乐趣,而脱离代码又很难透彻讨论技术。通过自己动手编写代码,很好地避免了上述问题。看着自己实现的Java虚拟机功能逐渐增强,看到可以运行的Java程序越来越复杂,成就感非常强。总之,通过实践的方式,相信读者可以更深刻地领悟Java虚拟机的工作原理。
Go是Google公司于2012年推出的系统编程语言。从到硬件的距离来看,Go语言介于C和Java之间。Go的语法和C类似,但更加简洁,因此很容易学习。Go语言内置了丰富的基本数据类型,并且支持结构体,所以很适合用来实现Java虚拟机。Go支持指针,但并不支持指针运算,因此用Go编写的代码要比C代码更加安全。此外,Go还支持垃圾回收和接口等Java类语言中才有的功能,大大降低了实现Java虚拟机的难度。
以上是本书采用Go语言编写Java虚拟机的原因,希望读者在学习本书的过程中,可以喜欢上Go这门还很年轻的语言。
为什么编写本书
全书一共分为11章,各章内容安排如下:
第1章:安装开发环境,讨论java命令,并编写一个类似Java的命令行程序。
第2章:讨论Java虚拟机如何搜索class文件,实现类路径。
第3章:讨论class文件结构,实现class文件解析。
第4章:讨论运行时数据区,实现线程私有的运行时数据区,包括线程、Java虚拟机栈、栈帧、操作数栈和局部变量表等。
第5章:讨论Java虚拟机指令集和解释器,实现解释器和150余条指令。
第6章:讨论类、对象以及线程共享的运行时数据区,实现类加载器、方法区以及部分引用类指令。
第7章:讨论方法调用和返回,实现方法调用和返回指令。
第8章:讨论数组和字符串,实现数组相关指令和字符串池。
第9章:讨论本地方法调用,实现Object.hashCode()等本地方法。
第10章:讨论异常处理机制,实现athrow指令。
第11章:讨论System类的初始化过程和System.out.println()的工作原理等,并对全书进行总结。
为什么编写本书
本书主要面向有一定经验的Java程序员,但任何对Java虚拟机工作原理感兴趣的读者都可以从本书获益。如前所述,本书将使用Go语言实现Java虚拟机。书中会简要介绍Go语言的部分语法以及与Java语言的区别,但不会深入讨论。由于Go语言相对比较简单,相信任何有C系列语言(如C、C++、C#、Objective-C、Java等)经验的读者都可以轻松读懂书中的源代码。
为什么编写本书
本书代码经过精心调整,每一章(第1章除外)都建立在前一章的基础上,但每一章又都可以单独编译和运行。本书内容主要围绕代码对Java虚拟机展开讨论。读者可以从第1章开始,按顺序阅读本书并运行每一章的源代码,也可以直接跳到感兴趣的章节阅读,必要时再阅读其他章节。
为什么编写本书
本书主要参考了下面这些资料:
❑《Java虚拟机规范》第8版
❑《Java语言规范》第8版
❑《深入Java虚拟机》(原书第2版)
其中《Java虚拟机规范》主要参考了第8版,但同时也参考了第7版和更老的版本。《Java语言规范》则主要参考了第8版。读者可以从http://docs.oracle.com/javase/specs/index.html获取各个版本的《Java虚拟机规范》和《Java语言规范》。
笔者早在十年前还在上学时就读过由Bill Venners著,曹晓钢等翻译的《深入Java虚拟机(原书第2版)》。但是由于当时水平有限,理解得并不是很深入。时隔十年,重读此书还是颇有收获。较之《Java虚拟机规范》的严谨和刻板,该书更加通俗易懂。原书作者已经将部分章节放于网上,网址是http://www.artima.com/insidejvm/ed2/,读者可以免费阅读。
以上是Java方面的资料。Go语言方面主要参考了Go官网上的各种资料,包括《如何编写Go程序》《Effective Go》《Go语言规范》以及Go标准库文档等。另外,在本书的写作过程中,笔者还通过搜索引擎查阅了遍布于网络上(特别是StackOverflow和Wikipedia)的各种资料,这里就不一一罗列了。
下载本书源代码
本书源代码可以从https://github.com/zxh0/jvmgo-book获取。代码分为Go和Java两部分,目录结构如下:
https://github.com/zxh0/jvmgo-book/v1/code/ —-go —-src —-jvmgo —-java —-example
Go语言部分是Java虚拟机代码,每章为一个子目录,可以独立编译和运行。Java语言部分是Java示例代码,每章为一个包。Java代码按照Gradle工程标准目录结构组织,可以用Gradle编译整个工程,也可以用javac分别编译每个文件。
为什么编写本书
《Java虚拟机规范》对Java虚拟机的工作机制有十分严谨的描述。但是由于笔者水平和表达能力有限,本书一定存在表述不精确、不准确,甚至不正确的地方。另外,由于时间有限,书中也难免会有一些疏漏之处,还请读者谅解。
本书的勘误将通过<<a href="https://github.com/zxh0/jvmgo-book/blob/master/v1/errata.md">https://github.com/zxh0/jvmgo-book/blob/master/v1/errata.md发布和更新。如果读者发现书中的错误、有改进意见,或者有任何问题需要讨论,都可以在本书的Github项目上创建Issue。此外也可以加入QQ群(470333113)与读者交流。
为什么编写本书
首先要感谢我的家人和朋友,没有你们的鼓励、支持和帮助,本书不可能面世。这里特别感谢我的妻子,在我陷入低谷的时候,叮嘱我继续努力不要放弃。还有我的朋友范森,每章开头的可爱鼹鼠就是出自他手,希望这些鼹鼠能给枯燥的文字增添一些色彩。
其次感谢我所在的公司乐元素,它为我提供了舒适和愉悦的工作环境,使我在工作之余可以全心投入本书的写作之中。
代码被我放到了Github上,地址是https://github.com/zxh0/jvm.go。不过由于能力和时间有限,这个虚拟机离完整实现《Java虚拟机规范》还相距甚远。2015年4月份,我停止了jvm.go的编写,同时开始改造代码,酝酿本书。感谢所有关注过jvm.go项目的人,没有你们的帮助就没有jvm.go,也就没有本书。
最后,感谢机械工业出版社华章分社的编辑,本书能够顺利出版离不开他们的敬业精神和一丝不苟的工作态度。