深入理解Java Class文件格式(九)
http://blog.csdn.net/zhangjg_blog/article/details/22205831
Introduction to Compiler Construction in a Java World
Chapter 6: Code Generation
http://www.grothoff.org/christian/teaching/2007/3353/papers/click95simple.pdf
PJama
windows JDM编译
java native interface programmer's guide and specification
Java问题分析的实例
R大的视频
Introduction to Compiler Construction in a Java World
Generalized Trace Compilation for Java
- HotSpot Developers
- Programmers
- To be added…
https://www.researchgate.net/publication/221303106_Optimized_strings_for_the_Java_HotSpot_virtual_machine
Visualization of Program Dependence Graphs
Materials § Notes:
§
"Deconstructing MethodHandles” by Paul Sandoz –
"Lambda Forms” by John Rose, JVMLS'12 –
“J9's MethodHandle Compilation Pipeline” by Dan Heidinga, Jfocus VM Summit’15 –
HotSpot: methodHandles*.hpp/.cpp
JVM Specification 8:
http://www.slideshare.net/RednaxelaFX/green-teajug-hotspotintrinsics02232013
http://www.slideshare.net/zuluJDK/nhjug-jvminternalsoptimized120123211545phpapp02
http://www.slideshare.net/ValeriiaMaliarenko/java-jit-compilation-and-optimization-by-andrey-kovalenko
推荐书籍 The Java Language Specification The Java Virtual Machine Specification ◦ 针对Java 5癿修订 ◦ 针对Java 6癿Class文件格式癿修订 ◦ JVM觃范第三版草案(2011/03/01) (到Java 6为止所有JVM觃范更新癿整合版) Oracle JRockit: The Definitive Guide Virtual Machines: Versatile Platforms for Systems and Processes ◦ 中文版:虚拟机——系统不迕程癿通用平台 Compilers: Principles, Techniques, and Tools (2nd Edition) ◦ 中文版:编译原理(原书第2版) Advanced Compiler Design and Implementation ◦ 中文版:高级编译器设计不实现 Principles of Computer Organization and Assembly Language, Using the Java Virtual Machine ◦ 中文版:计算机组成及汇编诧言原理 较老书籍 Java and the Java Virtual Machine Programming for the Java Virtual Machine Virtual Machines (Iain D. Craig著) Inside the Java Virtual Machine (2nd Edition) ◦ 中文版:深入Java虚拟机(原书第2版) 推荐网站不博宠 HotSpot Publications JVM Language Summit OpenJDK The HotSpot Group javac Group the Da Vinci Machine Project The Java HotSpot Performance Engine Architecture Java™ Virtual Machine Technology – JDK 7 HotSpot Internals for OpenJDK Da Vinci Machine Project Wiki Publications of the Institute for System Software IBM Research: Java JIT compiler and related publications Jikes RVM Cliff Click John Rose Mark Lam Fredrik Öhrström Ian Rogers The JRockit Blog Christian Thalinger Lukas Stadler Gary Benson Steve Goldman Xiao-Feng Li Christian Wimmer Maurizio Cimadamore Joseph D. Darcy Ben L. Titzer Steve Blackburn ……
最近想开始研究HotSpot C2编译器的编译过程,例如字节码是如何转换为Ideal Graph的,而Ideal Graph又是如何基于ad文件转换为机器码的,等等。 请教应该如何入手。谢谢。 | |
| 2014-02-09 有个叫IdealGraphVisualizer的工具,可以看C2的node。 期待R大的答案。 |
| 2014-02-10 HotSpot C2编译器。又名HotSpot Server Compiler,HotSpot VM的优化JIT编译器。 楼主确定要跳这个坑了么…? 如果只是想笼统的了解JVM的JIT编译器的话,我不建议从C2入手。 好吧我确定楼主确实是要跳这坑的。跟我来 可以先看看前同事Vladimir Ivanov讲解JIT编译器: , Vladimir Ivanov, JavaOne 2013 Moscow, 2013 Charles Nutter的系列演讲也OK: , JavaOne 2012, 2012 请楼主先说说你已经知道的(包括基本的编译原理、JIT编译器的特定知识、其它JVM JIT编译器的实现),以及研究C2的动机,然后我看看如何引导你进入C2的世界。 hellhell 写道 有个叫IdealGraphVisualizer的工具,可以看C2的node。 期待R大的答案。 嗯嗯, 是研究C2的实用工具之一。我之前在 的“ ”里有提到和演示它。 工具的下载链接用这个: ================================================= C2包含许多传统编译器的技术,例如 * 的 * (global value numbering) * (common sub-expression elimination) * CCP(conditional constant propagation) * * (dead code elimination) * * (loop-invariant code motion) * * * * Scalar replacement / SRoA(Scalar Replacement of Aggregate) * (bottom-up rewrite system) * Code Scheduling: Global Code Motion (GCM) / Local Code Motion (LCM) * * LeafInWind 写道 字节码是如何转换为Ideal Graph的 字节码转换为Ideal Graph的过程在C2里叫做parsing,这是一个 的过程。 LeafInWind 写道 而Ideal Graph又是如何基于ad文件转换为机器码的 ad文件是个 ,描述了一个BURS匹配系统的匹配规则。 也有一些JIT编译器/运行时特有的技术,例如: * uncommon trap / deoptimization * OSR(on-stack replacement) * dynamic profile-based optimization * devirtualization * guarded inlining * 还有跟GC交互的VM会用到的技术,例如: * Safepoint * OopMap / stack map * base-pointer / derived-pointer tracking 还有Java或者跟Java类似的面向对象语言特有的技术,例如: * CHA(class hierarchy analysis) * Lock elision * Lock coarsening * Array Bounds Check Elimination / Range Check Elimination 还有C2特有的技术,例如: * Sea-of-node IR / (Ideal Graph) 就不穷举术语了。借用John Rose在这个演示稿里的介绍,HotSpot VM的JIT编译器所用到的技术的列表如下(包括C1和C2): John Rose 写道 Thomas Würthinger 写道 |
| 2014-02-10 RednaxelaFX 写道 请楼主先说说你已经知道的(包括基本的编译原理、JIT编译器的特定知识、其它JVM JIT编译器的实现),以及研究C2的动机,然后我看看如何引导你进入C2的世界。 感谢R神。你提到的上述技术我基本都了解。我目前主要对hotspot JIT的inline cache、逆优化、OSR还算熟悉。 目前对C2编译器最关注的其实是它的寄存器分配问题。 但也希望能借这个机会对C2有一个全面的理解。 |
| 2014-02-10 我前面的回帖有更新喔,回头可以读读看。 LeafInWind 写道 RednaxelaFX 写道 请楼主先说说你已经知道的(包括基本的编译原理、JIT编译器的特定知识、其它JVM JIT编译器的实现),以及研究C2的动机,然后我看看如何引导你进入C2的世界。 你提到的上述技术我基本都了解。我目前主要对hotspot中x86平台相关部分的代码比较熟悉,对JIT的inline cache、逆优化、OSR也算熟悉。 LeafInWind 写道 但对字节码到理想图的转换,以及ad文件在理想图到最终机器码之间转换的细节,由于平台无关,目前还不算熟悉。 这些都是编译原理的基础知识。也就是说对编译原理并不太熟悉?还是说只是特定于C2的实现,因为它的代码太⋯那啥,所以想知道编译原理的各种概念如何在C2中体现? 如果编译原理基础都没啥问题的话我就不用多说啦,直奔具体实现。反之楼主就得补习一下了。 LeafInWind 写道 目前对C2编译器最关注的其实是它的寄存器分配问题。 这个好办。C2的寄存器分配器用的是graph coloring的思路,具体来说是基于 算法。它的一部分声明就在ad文件里(平台相关的寄存器声明、每条指令的“开销”声明之类)。相关论文在这儿有链接: 所以研究C2的寄存器分配就是你的研究动机了是么?或许不只如此? |
| 2014-02-10 RednaxelaFX 写道 我前面的回帖有更新喔,回头可以读读看。 这个更新太全面了,现在再不敢说这些技术都了解了,看来今后一段时间有得忙了,感谢R神。 我对编译的理解主要来自大学时的课程学习以及之前对ideal graph的学习(也就是看的Würthinger的硕士论文),但总感觉一知半解,所以想基于C2编译器做更深入的学习。 |
| 2014-02-10 LeafInWind 写道 我对编译的理解主要来自大学时的课程学习以及之前对ideal graph的学习(也就是看的Würthinger的硕士论文),但总感觉一知半解,所以想基于C2编译器做更深入的学习。 呵呵,总算知道楼主在做的是啥项目了。加油! 我又稍微更新了一下前面的回复,主要是针对你在顶楼问的那两点,希望对你有帮助 |
| 2014-02-11 看了Würthinger的硕士论文,对理想图的语义都能理解,对其中介绍的优化也能明白,但这些优化都是直接基于理想图的,文中却没有介绍理想图是如何得到的。 看了一下The Java HotSpotTM Server Compiler,其第四节parser感觉就是在讲字节码到理想图的转换过程的,但感觉讲得实在太抽象了。 |
| 2014-02-12 LeafInWind 写道 看了一下The Java HotSpotTM Server Compiler,其第四节parser感觉就是在讲字节码到理想图的转换过程的,但感觉讲得实在太抽象了。 可能是因为你关心的是个实现细节而那个实在太直观,作者觉得没必要写出来orz 有没有去看看Graal的parser?(GraphBuilderPhase) |
| 2014-02-12 R神 写道 有没有去看看Graal的parser?(GraphBuilderPhase) 现在开始看,呵呵 |
2014-03-06 请问R神,上图的编译流程在hotspot中是否对应Compile::Compile(..., ciMethod* target, ...)方法。 编译流程包括三个步骤:parse、optimize和code_gen。 猜测optimize步骤对应Compiler方法对Compile::Optimize()方法的调用; code_gen步骤对应Compiler方法对Compile::Code_Gen()方法的调用; 那么parse步骤对应Compiler方法中的什么代码呢??感觉只能对应GraphKit的构造函数啊!!?? | |
| 2014-03-09 LeafInWind 写道 请问R神,上图的编译流程在hotspot中是否对应Compile::Compile(..., ciMethod* target, ...)方法。 编译流程包括三个步骤:parse、optimize和code_gen。 猜测optimize步骤对应Compiler方法对Compile::Optimize()方法的调用; code_gen步骤对应Compiler方法对Compile::Code_Gen()方法的调用; 那么parse步骤对应Compiler方法中的什么代码呢??感觉只能对应GraphKit的构造函数啊!!?? 哈哈。C2编译的主入口确实是Compile::Compile() Parse的部分的入口就在这里: 其中有调用cg->generate(jvms),留意一下那里。这里的cg是调用CallGenerator::for_inline()得到的,实际上是个ParseGenerator: 然后ParseGenerator::generate()会构造一个Parse实例, 真正的parsing就是从其构造函数Parse::Parse()开始的。 Parse的过程中,(几乎)每个节点在生成出来之后都会马上经过PhaseGVN::transform()的优化: 而这就是图里右上角的部分:Ideal() -> Value() -> Identity() -> global value numbering Ideal()、Value()、Identity()是Node类上可以说最核心的三个方法,它们的作用贯穿在整个C2的优化过程中。嘛说“整个”可能有点过头,至少可以说是在instruction selection之前吧。 这仨主要是跟GVN和Iterative GVN配套使用的。 其实并不难找啦,给点耐心。有什么疑问欢迎继续来讨论~ |
| 2014-03-09 请问代码中有一大堆以ci开头的类,不知ci是什么意义? R神在 曾写过ci目录是“动态编译器的公共服务/从动态编译器到VM的...”但很可惜最后几个字看不见了。 另外R神能否再大概展开一下,描述一下该目录下比较重要的类的作用。 谢谢!!! |
| 2014-03-09 LeafInWind 写道 请问代码中有一大堆以ci开头的类,不知ci是什么意义? R神在 曾写过ci目录是“动态编译器的公共服务/从动态编译器到VM的...”但很可惜最后几个字看不见了。 另外R神能否再大概展开一下,描述一下该目录下比较重要的类的作用。 谢谢!!! 看不见的话复制下来就可以看到啦。 ci就是Compiler Interface,主要是为了让编译器不受runtime其它部分的变化而影响的抽象层。其中很多类都是跟runtime里的类对应的,特别是oops目录下的类。 例如说: ci/ciConstantPoolCache -> oops/cpCache ci/ciInstance -> oops/instanceOop ci/ciInstanceKlass -> oops/InstanceKlass ci/ciKlass -> oops/klass ci/ciStreams -> interpreter/bytecodeStream 还有少量本来应该是在C1和C2之间共享的一些公共服务,结果只有一个编译器用,例如说ciTypeFlow。它的作用是在C2真正parse字节码之前先找出基本块边界,并且计算出每个local variable slot的抽象类型。 |
| 2014-03-11 这几天都在看hotspot的寄存器分配。想问一下build_ifg_virtual和build_ifg_physical两个步骤的主要区别是什么。是否physical ifg就是类似下图的预着色图(precolored)。 (上图引用自虎书11.3节) |