中文版序

亲爱的读者:

你现在看到的这本书讨论的是语言虚拟机的设计与实现技术。虚拟机这个概念的内涵在过去十几年里逐渐发生了变化,从特指实现某个语言的运行时技术,扩大到系统仿真的各类技术,甚至容器技术。其中一个原因是,语言虚拟机已经被广泛应用在各个领域,并与各种系统紧密结合,从而不再新奇和稀有。如果现在的程序员在平时的工作中接触不到某种语言的虚拟机,那倒是比较少见了。尽管如此,语言虚拟机的设计技术对大多数人来说,仍然深不可测。虽然市场上已经有了一些相关图书,网络上的各种文章也层出不穷,但现有的资料要么偏于理论和概念,要么仅限于讨论语言虚拟机的某个局部,很难让学习者对语言虚拟机技术有全面而系统的理解。学习者往往还要通过阅读某个虚拟机的源码来学习相关技术,但因为并不了解其设计决策的来龙去脉,所以在想改进一个虚拟机或者开发自己的虚拟机项目时,仍会感到力不从心。

笔者多年来一直从事虚拟机技术的研究与开发,同时也大量涉猎操作系统、编译器和语言设计的相关技术。由本人及所带领团队开发的各类虚拟机软件和技术已经被应用在数以亿计的服务器、个人计算机、手机和其他智能设备中,一些创新研究成果以学术论文的形式发表在著名的国际会议上。在这个过程中,笔者对虚拟机设计的特点有了较深的理解,经常受邀给一些研究和开发机构做报告或培训,并先后为北京大学和中国科技大学计算机系的研究生讲授过短期课程。笔者的一些博客文章,一度在 Google 搜索相关技术时排名居前,给业界同行带来了有益的启发。在和同行的交流中,笔者也往往会得到一些精彩的反馈,加深了自己对该领域的理解,并在项目中得以实践。这样,经过反复的“研发实践-提炼总结-交流反馈-吸收改进”,笔者对虚拟机的技术逐步形成了一套较为系统的设计方法论。这些心得体会,在现有的技术资料中很难找到较完整的表述,因此一些同事和朋友还是会经常向我咨询相关问题,并建议我能整理成文字,给相关开发人员提供帮助,并填补虚拟机技术文献的空白。这就是我写这本书的初衷。

把多年的知识积累系统地写出来,并做到深入浅出,这不是一件容易的事。由于笔者所从事的工作的特点,业余时间不是在加班,就是在学习充电,并且经常出差,这样的情况下要保障每天写书一小时,而且内容前后保持连贯、环环相扣,是需要极大的毅力的。从动笔开始,前前后后写了近四年才搁笔。当然,写作期间也有不少乐趣,特别是每当自己精心绘制出一幅图,将语言难以表达的意思较好地表达出来时,总会端详片刻,体验一下表达的乐趣。但总体来说,遗憾比快乐更多。这么说的一个重要原因是,尽管用时颇长,但本来计划好的内容还是有很大一部分因种种原因未能写成,只能留待未来弥补了。好在成书的部分已经相对完整,基本概括了典型的语言虚拟机的所有核心部件的设计。对学习者来说,如果掌握了这些内容,那么对虚拟机技术的理解就已经相当深入了,足以支撑其进入任意一种语言虚拟机的设计开发。不过需要提醒的是,本书对读者的系统软件基础有一定的要求,即了解基本的编译器和操作系统技术。在遇到生疏的术语时,请查阅相关资料。

本书有两个特点:一是比较系统全面,很多内容在其他资料中难以见到,比如异常处理的实现等;二是内容尽量做到深入浅出,既有理论阐述,又有代码示例。笔者尽力将典型虚拟机设计的方方面面都有机地串联在一起,并解释它们的来龙去脉,而不是简单地进行技术堆砌。对每个主题的内容,本书也尽量按照平常的思维模式,循序渐进地讲解。不过请读者注意,本书的重点是虚拟机中特有的技术,如果某种技术在编译器或操作系统中已经有充分的讨论,本书则会略去。读者如果对那些技术感兴趣,应能找到比本书更好的资料。另外,本书内容虽然是虚拟机通用技术为主,但为了避免泛泛而谈,主要以 JVM 设计为例,并兼顾其他虚拟机。还有,近几年来,语言虚拟机设计技术又有了新的发展,比如异步编程,但本书没有涵盖,请读者海涵。读者若有任何对本书内容的批评和建议,请与我联系,不胜荣幸!

最后,感谢我的老朋友、著名编译专家周志德(Fred Chow)欣然为本书作序,同时感谢译者单业和ManBetX编辑团队对本书的出版所做的重要贡献。在我与ManBetX出版团队的交往中,我深切感受到他们对图书质量的严格要求和对读者的诚挚与负责。希望本书能为ManBetX的精品书单增添光彩。

李晓峰

2019 年 11 月 1 日于美国硅谷

目录

  • 中文版序
  • 前言
  • 关于本书
  • 第一部分 虚拟机基础
  • 第1章 虚拟机简介
  • 第2章 虚拟机内部组成
  • 第3章 虚拟机中的数据结构
  • 第二部分 虚拟机设计
  • 第4章 执行引擎设计
  • 第5章 垃圾回收设计
  • 第6章 线程设计
  • 第三部分 虚拟机内部支持
  • 第7章 本地接口
  • 第8章 栈展开
  • 第9章 垃圾回收支持
  • 第10章 运行时辅助
  • 第11章 异常抛出
  • 第12章 终结与弱引用
  • 第13章 虚拟机模块化设计
  • 第四部分 垃圾回收优化
  • 第14章 针对吞吐量的GC优化
  • 第15章 针对可扩展性的GC优化
  • 第16章 针对响应性的GC优化
  • 第17章 并发移动式回收
  • 第五部分 线程交互优化
  • 第18章 monitor性能优化
  • 第19章 基于硬件事务内存的设计
  • 参考文献