第232页 7.2.1 Interpreter模块
RednaxelaFX (Script Ahead, Code Behind)
在读 HotSpot实战
- 章节名:7.2.1 Interpreter模块
- 页码:第232页
前文提到,在HotSpot中,实现了两种具体的解释器,即模板解释器和C++解释器,它们分别由TemplateInterpreter子模块和CppInterpreter子模块实现。其中,模板解释器正是目前HotSpot的默认解释器。在本章中,解释器的话题也是围绕着模板解释器而展开的。 事实上,除了上述两种解释器,HotSpot中仍保留了另外一种解释器,即字节码解释器(BytecodeInterpreter)。它没有使用编译优化,在运行期就是纯粹地以解释方式执行。由于历史原因,它已经淡出了HotSpot解释器的舞台,但在OpenJDK7中,仍然保留了这部分代码。模板解释器与它有一些渊源,前者便是将BytecodeInterpreter字节码的执行语句换成汇编代码而来的。也正是因此,模板解释器模块的代码更佳以来计算机架构的汇编指令,在可读性上要差一些。 引自 7.2.1 Interpreter模块 诶,这段脑补的成分比较多⋯ 实际上书中提到的BytecodeInterpreter正是CppInterpreter的实现的一部分。作者可能没留意到CppInterpreter生成的方法入口就是指向BytecodeInterpreter::run()的。所以并不是“除了上述两种解释器还有一种解释器”,而是就只有模板解释器和C++解释器两个。 而且模板解释器也没有使用“编译优化”,也只是纯粹的解释执行。 另外就是其实HotSpot从一开始就有模板解释器,而C++解释器反而是后来加进来的。前者源于HotSpot的前身Strongtalk,而后者源于Sun的另一个JVM——CVM,又名“CDC HotSpot Implementation”或者“CDC-HI”。CVM更早的前身是Sun的Classic VM。 也就是说,这俩解释器没有任何血缘关系,前者并非将后者翻译为汇编。当时Sun之所以把后者加到HotSpot是在实现Itanium(IA-64)的移植时想偷懒,人肉写Itanium汇编挺烦的所以要实现Itanium版模板解释器不方便,他们就想到了把CVM的解释器移植过来,这样可以少写点汇编就能完成移植。结果一直以来HotSpot能运行的平台上只有Itanium版是真的用了这个C++解释器的,而其它平台上默认都在用模板解释器,但还是可以通过编译参数选择使用C++解释器。 Itanium的HotSpot移植版不开源,所以作者可能会以为这个C++解释器已经“淡出了HotSpot解释器的舞台”。Sun/Oracle发布的Itanium版JDK其实一直还在用这个解释器呢。当然Oracle后来决定不再支持Itanium版,所以这个解释器对Oracle来说意义就没多少了。 http://www.oracle.com/technetwork/java/javase/itaniumreleasenotes-140450.html (订正:回复里@思寇特.熊 指出HP的Itanium版HotSpot是自己移植的,其中的解释器是自己移植的模板解释器,而不是Sun做的C++解释器。) SAP贡献给OpenJDK的PowerPC/AIX移植版早期也使用C++解释器,直到两个月前才刚把模板解释器提交到OpenJDK里:https://bugs.openjdk.java.net/browse/JDK-8036976 SAP商用的PPC64、Itanium、zArch版HotSpot现在也在用这个C++解释器而没有移植模板解释器。找人确认过了。他还提到SAP将会渐渐为这些移植版实现模板解释器,只是资源问题所以现在还没都实现而已。 另外,Red Hat为了让OpenJDK能更方便的移植到更多平台上,研发了“zero”移植版。这个移植版进一步修改了C++解释器让它的实现不依赖任何汇编,“zero assembler”,故得名“zero”。这个版本也还在用着C++解释器的。关于这个zero移植版可以参考其早期主要开发Gary Benson的博客:http://gbenson.net/?page_id=120 想对CVM有更多了解的话,可以读读Mark Lam以前写的系列博文。这是其中一篇:https://weblogs.java.net/blog/2006/11/30/cvm-stacks-and-code-execution
RednaxelaFX对本书的所有笔记 · · · · · ·
-
第277页 8.2.3 实战:数组的越界检查
读到这里,如果你觉得上述这一切设想只是异想天开的话,那么这个事实将让你大吃一惊:在当前...
-
第298页 8.7.2 invoke系列指令
其实,在编译callInvokevirtual()方法时,在开始编译任何一条Java代码之前,编译器会立即插入...
-
第232页 7.2.1 Interpreter模块
-
第7页 1.1.3 Java 7的语法变化
第7到12页的1.1.3小节介绍了Java 7中Java语言的语法变化。说真的我完全不理解这段跟这本书的...
-
第7页 1.1.2 JDK的发展历程
Java 8 ⋯ ⬛ JavaScript引擎(JSR 223),允许Java程序嵌入JavaScript代码,由Nashorn...
说明 · · · · · ·
表示其中内容是对原文的摘抄