深入理解Java Class文件格式(九)

http://blog.csdn.net/zhangjg_blog/article/details/22432599

http://blog.csdn.net/zhangjg_blog/article/details/22205831

Introduction to Compiler Construction in a Java World

http://download.csdn.net/download/jetsong/6908145

https://shipilev.net

http://www1.digitalgrammars.com/ipl-book/

http://www.oracle.com/technetwork/server-storage/ts-6434-159339.pdf

http://citeseer.ist.psu.edu/viewdoc/download?doi=10.1.1.47.6924&rep=rep1&type=pdf

Chapter 6: Code Generation

http://www1.digitalgrammars.com/ipl-book/slides/6-slides-ipl-book.pdf

找出栈上的指针/引用

http://rednaxelafx.iteye.com/blog/1044951

http://dsxwjhf.iteye.com/blog/2201685

http://www.grothoff.org/christian/teaching/2007/3353/papers/click95simple.pdf

PJama

https://users.cs.jmu.edu/bernstdh/Web/CS685/papers/printezis-et-al-1997.pdf

https://pdfs.semanticscholar.org/a60e/fc20de0237aa968c7275651c16b9ce7eff91.pdf

windows JDM编译

http://icyfenix.iteye.com/blog/1097344

java native interface programmer's guide and specification

http://download.csdn.net/detail/dengchendeng/4910351

https://github.com/AdoptOpenJDK/jitwatch/wiki

https://blogs.oracle.com/thejavatutorials/ Java问题分析的实例

http://www.read.seas.harvard.edu/~kohler/class/04f-aos/ref/i386.pdf

http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-instruction-set-reference-manual-325383.pdf

http://newscentral.exsees.com/item/775cc72298692421bc9b4bad1dcb46fe-45bdc49be072f13531f759726dcc0b55

https://oracle.rainfocus.com/scripts/catalog/oow16.jsp?event=javaone&search.event=javaone&search.javaonetrack=emerginglanguages&search.javaonetrack=javacloudandserversidedevelopment&search.javaonetrack=javadevelopmenttools&search.javaonetrack=javadevopsandmethodol

https://blog.fastthread.io/

http://www.cliffc.org/blog/

http://bluedavy.me/?p=36  R大的视频

https://shipilev.net/blog/2015/black-magic-method-dispatch/

http://openjdk.java.net/groups/compiler/doc/compilation-overview/index.html?spm=5176.100239.blogcont20227.55.HNKmKF

Introduction to Compiler Construction in a Java World

http://download.csdn.net/download/jetsong/6908145

https://wiki.openjdk.java.net/display/HotSpot/CallingSequences

http://www.valleytalk.org/wp-content/uploads/2011/05/Java_Program_in_Action_20110727.pdf

http://cr.openjdk.java.net/~vlivanov/talks/2016_JVMLS_MachineCodeSnippets.pdf

http://cr.openjdk.java.net/~jrose/pres/201009-OneVMManyLanguages.pdf

http://www.ibm.com/developerworks/java/library/j-jtp12214/index.html

http://de.slideshare.net/CharlesNutter/javaone-2012-jvm-jit-for-dummies

https://wiki.openjdk.java.net/display/HotSpot/Main

https://www.infoq.com/articles/OpenJDK-HotSpot-What-the-JIT

http://www.cliffc.org/blog/2010/06/09/part-2-lisbon-san-francisco-toronto-plus-ismm-and-pldi/

[HotSpot VM] JIT编译以及执行native code的流程

java_main的汇编入口在哪里

http://greenteajug.cn/tag/rednaxelafx/

借助HotSpot SA来一窥PermGen上的对象

https://www.zhihu.com/people/rednaxelafx/answers

[HotSpot VM] 想研究HotSpot C2编译器编译过程,请教如何入手?

https://vimeo.com/186425635

http://ssw.jku.at/Research/Projects/JVM/

Generalized Trace Compilation for Java

www.ssw.uni-linz.ac.at/Teaching/PhDTheses/Haeubl/PhD.pdf

https://bugs.openjdk.java.net/browse/JDK-8062493

http://docklandsljc.uk/2016/06/hotspot-hood-microbenchmarking-java.html

https://www.infoq.com/presentations/openjdk8-hotspot?utm_source=infoq&utm_medium=related_content_link&utm_campaign=relatedContent_news_clk

https://www.infoq.com/presentations/hotspot-memory-data-structures?utm_source=infoq&utm_medium=related_content_link&utm_campaign=relatedContent_news_clk

https://www.infoq.com/articles/OpenJDK-HotSpot-What-the-JIT

https://www.infoq.com/news/2016/02/29?utm_source=infoq&utm_medium=related_content_link&utm_campaign=relatedContent_news_clk

https://community.oracle.com/docs/DOC-920250

https://blogs.oracle.com/dholmes/entry/inside_the_hotspot_vm_clocks

https://blogs.oracle.com/thejavatutorials/entry/hotspot_serviceability_agent_api_javadoc

https://www.infoq.com/news/2016/10/AOT-HotSpot-OpenJDK-9

http://openjdk.java.net/jeps/243

https://www.usenix.org/legacy/events/vee05/full_papers/p132-wimmer.pdf

http://ssw.jku.at/Research/Papers/Wuerthinger11PhD/Wuerthinger11PhD.pdf

http://ssw.jku.at/Research/Papers/Haeubl08Master/Haeubl08Master.pdf

http://ssw.jku.at/Research/Papers/Schwaighofer09Master/schwaighofer09master.pdf

http://ssw.jku.at/Research/Papers/Wuerthinger07Master/Wuerthinger07Master.pdf

http://ssw.jku.at/Research/Reports/Report15.PDF

http://ssw.jku.at/Research/Papers/Wimmer04Master/Wimmer04Master.pdf

http://ssw.jku.at/Research/Papers/Haeubl13a/Haeubl13a.pdf

http://ssw.jku.at/Research/Papers/Stadler11Master/Stadler11Master.pdf

https://www.complang.tuwien.ac.at/andi/java-hotspot.pdf

http://compilers.cs.uni-saarland.de/ssasem/talks/Christian.Wimmer.pdf

http://ssw.jku.at/Research/Papers/Stadler14PhD/Thesis_Stadler_14.pdf

http://docklandsljc.uk/2016/06/hotspot-hood-microbenchmarking-java.html

http://ssw.jku.at/Research/Papers/Haeubl08Master/Haeubl08Master.pdf

http://dl.acm.org/citation.cfm?id=504296&dl=ACM&coll=DL&CFID=867529866&CFTOKEN=65053560

http://www.docklandsljc.uk/presentations/2016/AlexBlewitt-HotSpotUnderTheHood.pdf

https://speakerdeck.com/alblue/javaone-2016-hotspot-under-the-hood

http://ssw.jku.at/Research/Papers/Stadler14PhD/Thesis_Stadler_14.pdf

http://www.sdsc.edu/~allans/cs231/openjit.pdf

https://wiki.openjdk.java.net/display/HotSpot/The+C2+Register+Allocator

https://advancedweb.hu/2016/05/27/jvm_jit_optimization_techniques/

http://mail.openjdk.java.net/pipermail/hotspot-gc-dev/

http://ssw.jku.at/General/Staff/GD/APPLC-2013-paper_12.pdf

http://cr.openjdk.java.net/~jrose/draft/code-media.html

http://cr.openjdk.java.net/~jrose/draft/code-media.html

http://alblue.bandlem.com/2016/09/javaone-hotspot.html

https://www.cs.utexas.edu/~pingali/CS395T/2009fa/papers/ferrante87.pdf

http://dl.acm.org/citation.cfm?id=504296&dl=ACM&coll=DL&CFID=867529866&CFTOKEN=65053560

http://cr.openjdk.java.net/~vlivanov/talks/2015-Indy_Deep_Dive.pdf

https://wiki.openjdk.java.net/display/HotSpot/Presentations

https://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/geninfo/diagnos/underst_jit.html

http://docs.oracle.com/cd/E15289_01/doc.40/e15058/underst_jit.htm

http://tirania.org/blog/archive/2012/Apr-04.html

https://www.researchgate.net/publication/221303106_Optimized_strings_for_the_Java_HotSpot_virtual_machine

Visualization of Program Dependence Graphs

http://hllvm.group.iteye.com/group/topic/34932#post-232535

https://www.cs.utexas.edu/~pingali/CS395T/2009fa/papers/ferrante87.pdf

https://shipilev.net/blog/2015/black-magic-method-dispatch/

http://ssw.jku.at/Research/Projects/JVM/

http://ssw.jku.at/Research/Papers/Ko05/Ko05.pdf

https://shipilev.net/

https://en.wikipedia.org/wiki/Optimizing_compiler

http://hllvm.group.iteye.com/group/topic/39493

http://www.oracle.com/technetwork/java/jvmls2016-wimmer-3125555.pdf

http://www.oracle.com/technetwork/java/jvmls2014kuksenko-2265188.pdf

http://hpac.rwth-aachen.de/teaching/sem-accg-16/slides/04.Khan-JIT.pdf

http://www.slideshare.net/ZeroTurnaround/vladimir-ivanovjvmjitcompilationoverview-24613146

http://cr.openjdk.java.net/~jrose/draft/code-media.html

http://www.cliffc.org/blog/2015/02/22/how-does-java-both-optimize-hot-loops-and-allow-debugging/

http://www.cliffc.org/blog/2012/02/12/too-much-theory/

http://www.cliffc.org/blog/2012/02/27/too-much-theory-part-2/

http://developer.amd.com/wordpress/media/2012/10/AddingNewInstructionsToHotspot1.pdf

http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.224.353

http://www.slideshare.net/RednaxelaFX/green-teajug-hotspotintrinsics02232013

https://book.douban.com/subject/1610344/

http://hllvm.group.iteye.com/group/topic/34932#post-232535

http://rednaxelafx.iteye.com/blog/644038

https://github.com/drazzib/openjdk-hsdis

https://wiki.openjdk.java.net/display/HotSpot/PrintAssembly

http://stackoverflow.com/questions/9337670/hotspot7-hsdis-printassembly-intel-syntax

http://cr.openjdk.java.net/~vlivanov/talks/2015-JVMLS_State_of_JLI.pdf

https://github.com/drazzib/openjdk-hsdis

https://www.amazon.com/Engineering-Compiler-Second-Keith-Cooper/dp/012088478X/ref=pd_cp_14_2?_encoding=UTF8&psc=1&refRID=F2MCCGKF2WA34HFAJX4N

https://www.amazon.com/Optimizing-Compilers-Modern-Architectures-Dependence-based/dp/1558602860/ref=pd_cp_14_3?_encoding=UTF8&psc=1&refRID=F2MCCGKF2WA34HFAJX4N

https://www.amazon.com/Advanced-Compiler-Design-Implementation-Muchnick/dp/1558603204/ref=sr_1_1?s=books&ie=UTF8&qid=1479655895&sr=1-1

http://www.cs.wustl.edu/~cytron/cs531/Resources/Papers/cprop.pdf

http://www.sdsc.edu/~allans/cs231/openjit.pdf

http://www.javaworld.com/article/2078635/enterprise-middleware/jvm-performance-optimization-part-2-compilers.html

http://blog.takipi.com/java-on-steroids-5-super-useful-jit-optimization-techniques/

Materials § Notes:

http://cr.openjdk.java.net/~vlivanov/talks/2015-Indy_Deep_Dive.pdf §

https://wiki.openjdk.java.net/display/HotSpot/Method+handles+and+invokedynamic

https://wiki.openjdk.java.net/display/HotSpot/Bound+method+handles

https://wiki.openjdk.java.net/display/HotSpot/Direct+method+handles

https://wiki.openjdk.java.net/display/HotSpot/Method+handle+invocation

"Deconstructing MethodHandles” by Paul Sandoz –

https://wiki.openjdk.java.net/display/HotSpot/Deconstructing+MethodHandles

"Lambda Forms” by John Rose, JVMLS'12 –

http://cr.openjdk.java.net/~jrose/pres/201207-LF-Tutorial.pdf

“J9's MethodHandle Compilation Pipeline” by Dan Heidinga, Jfocus VM Summit’15 –

http://www.jfokus.se/jfokus15/preso/J9%20MethodHandle%20Compilation%20Pipeline.pdf

HotSpot: methodHandles*.hpp/.cpp

JVM Specification 8:

http://docs.oracle.com/javase/specs/jvms/se8/html/index.html

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文件转换为机器码的,等等。 
请教应该如何入手。谢谢。
 
hellhell 2014-02-09
有个叫IdealGraphVisualizer的工具,可以看C2的node。 
期待R大的答案。
 
RednaxelaFX 2014-02-10
HotSpot C2编译器。又名HotSpot Server Compiler,HotSpot VM的优化JIT编译器。

楼主确定要跳这个坑了么…? 
如果只是想笼统的了解JVM的JIT编译器的话,我不建议从C2入手。 
好吧我确定楼主确实是要跳这坑的。跟我来

可以先看看前同事Vladimir Ivanov讲解JIT编译器: 
JIT-compiler in JVM seen by a Java developer, Vladimir Ivanov, JavaOne 2013 Moscow, 2013

Charles Nutter的系列演讲也OK: 
JVM JIT for Dummies, JavaOne 2012, 2012

请楼主先说说你已经知道的(包括基本的编译原理、JIT编译器的特定知识、其它JVM JIT编译器的实现),以及研究C2的动机,然后我看看如何引导你进入C2的世界。

hellhell 写道
有个叫IdealGraphVisualizer的工具,可以看C2的node。 
期待R大的答案。

嗯嗯,IdealGraphVisualizer是研究C2的实用工具之一。我之前在第0回JVM源码阅读活动的“为啥别读HotSpot VM的源码”里有提到和演示它。 
工具的下载链接用这个:http://ssw.jku.at/General/Staff/PH/igv_latest.zip

=================================================

C2包含许多传统编译器的技术,例如 
SSA形式中间表现(intermediate representation) 
GVN(global value numbering) 
CSE(common sub-expression elimination) 
* CCP(conditional constant propagation) 
Constant folding 
DCE(dead code elimination) 
Alias analysis 
LICM(loop-invariant code motion) 
Loop unrolling 
Loop peeling 
Escape analysis 
* Scalar replacement / SRoA(Scalar Replacement of Aggregate) 
BURS(bottom-up rewrite system) 
* Code Scheduling: Global Code Motion (GCM) / Local Code Motion (LCM) 
Graph-coloring register allocator 
Peephole optimization

LeafInWind 写道
字节码是如何转换为Ideal Graph的

字节码转换为Ideal Graph的过程在C2里叫做parsing,这是一个抽象解释(abstract interpretation)的过程。

LeafInWind 写道
而Ideal Graph又是如何基于ad文件转换为机器码的

ad文件是个DSL(domain-specific language),描述了一个BURS匹配系统的匹配规则。

也有一些JIT编译器/运行时特有的技术,例如: 
* uncommon trap / deoptimization 
* OSR(on-stack replacement) 
* dynamic profile-based optimization 
  * devirtualization 
  * guarded inlining 
  * inline caching

还有跟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 / Program Dependence Graph(Ideal Graph)

就不穷举术语了。借用John Rose在这个演示稿里的介绍,HotSpot VM的JIT编译器所用到的技术的列表如下(包括C1和C2):

John Rose 写道

挺多知识点的?

这些背景知识都得先有所掌握才能开始真的探索C2的工作过程。最好先找几本编译原理的书把基础知识(特别是编译器后端知识)打扎实了再考虑真的着手深入研究C2。

等楼主补充一下信息我再回复。也欢迎其他同学来参与讨论喔!

=================================================

相关资料:

入门C2最好的材料就是Thomas Würthinger写的关于IdealGraphVisualizer的硕士论文: 
Visualization of Program Dependence Graphs, Thomas Würthinger, 2007 
其中第三章对C2的讲解非常精辟,是初学C2必读文章。文中这张图清晰讲解了C2的工作流程:

Thomas Würthinger 写道

C2的整体介绍最好的资料还是原始论文: 
The Java HotSpot™ Server Compiler, Michael Paleczny, Christopher Vick, Cliff Click, JVM'01

Overview of Ideal, C2's high level intermediate representation, HotSpot Internals, OpenJDK Wiki 
介绍了C2 Ideal Graph的设计思路

但要真的理解Ideal Graph的设计思路,也就是“sea-of-nodes”或者叫“program dependence graph”,还是得把Cliff Click原本的几篇论文读了才行。C2的核心设计跟Cliff最初做这几篇论文时几乎一模一样,甚至还有部分代码就是从当时他的博士毕业作品一直遗留至今。 
From Quads to Graphs: An Intermediate Representation's Journey, Cliff Click, 1993 
A Simple Graph-Based Intermediate Representation, Cliff Click, Michael Paleczny, 1995 
Combining Analyses, Combining Optimizations, Cliff Click, Keith Cooper, 1995 
Global Code Motion, Global Value Numbering, Cliff Click, PLDI'95 
这几篇里面1993年那篇写得很生动,建议先读。

John Rose写了篇讨论编译器IR的文章,也值得一读: 
Thinking About Intermediate Representations, John Rose, 2014-09

Cliff Click讲解C2里的类型(type lattice): 
Too Much Theory, 2012-02-12 
Too Much Theory, Part 2, 2012-02-27 
Too Much Theory, Part 3, 2012-03-24

Escape Analysis for Java, Jong-deok Choi, Mannish Gupta, Mauricio Serrano, Vugranam C. Sreedhar, Sam Midkiff, OOPSLA'99, 1999

Exploiting Superword Level Parallelism with Multimedia Instruction Sets, Samuel Larsen , Saman Amarasinghe, PLDI'00, 2000

A Tutorial on Adding New Instructions to the Oracle® Java HotSpot ™ Virtual Machine, Vasanth Venkatachalam, AMD 
介绍了ad文件的格式,以及如何对其添加新指令

Optimal Code Generation for Expression Trees: An Application of BURS Theory, Eduardo Pelegri-Llopart, Susan L. Graham, 1988 
Engineering a Simple, Efficient Code Generator Generator, Christopher W. Fraser, David R. Hanson, Todd A. Proebsting, 1992 
讲解BURS的早期论文。C2的指令选择就是基于BURS的思想设计的,而ad文件正是C2的BURS系统的一部分。

The C2 Register Allocator, HotSpot Internals, OpenJDK Wiki 
介绍了C2的基于Chaitin算法的图着色寄存器分配器

Graph Coloring Register Allocation Papers, HotSpot Internals, OpenJDK Wiki 
图着色寄存器分配器的相关论文链接

C2的寄存器分配器还有许多潜在的改进点。它可以说是C2最慢的部分了。Niclas Adlertz在做一些相关研究,近期OpenJDK里C2寄存器分配器的改进也主要是他在做。可以关注一下他的论文(现在还没发表)。

=================================================

既然楼主特别指出关心两个过程——字节码->Ideal Graph、Ideal Graph->Machine Graph(MachNode)——那我推荐先通过另外两个项目熟悉相关概念,然后再回来研究C2的实现。

首先是Graal

Graal是一个用Java实现的JIT编译器,可以插在HotSpot VM与Maxine VM上使用。 
它衍生自Maxine VM更早的一个用Java写的JIT编译器——C1X。C1X则是HotSpot C1编译器的Java移植版,基本结构与C1几乎完全一致。 
Graal保持了C1X的大致思路,特别是后端结构基本上还是一样的;但是它完全重写了前端,把C1X的HIR改为与C2相似的“sea-of-nodes”/program dependence graph的“StructuredGraph”。

由于StructuredGraph与Ideal Graph比较相似,从字节码到它们的构造过程也有相似之处;而Graal的代码结构比C2清晰得多,所以先从Graal入手去了解Program Dependence Graph的特性,然后再去看C2会舒服许多。 
更好的是Graal IR也可以用IdealGraphVisualizer来可视化。研究Graal与C2共用一个工具,在两者之间可以轻松切换。

Graal将Java字节码转换为StructuredGraph的实现代码在此:com.oracle.graal.java.GraphBuilderPhase 
(顺带一提,这就是个抽象解释的过程的实现)

Graal IR的介绍可以参考这篇论文: 
Graal IR: An Extensible Declarative Intermediate Representation, Gilles Duboscq, Lukas Stadler, Thomas Würthinger, Doug Simon, Christian Wimmer, Hanspeter Mössenböck, APPLC 2013, 2013

Graal的整体设计可以参考这个演讲: 
Wholly Graal: Accelerating GPU Offload for Java [CON6419], Christian Thalinger, Christian Wimmer, Vasanth Venkatachalam, JavaOne 2013

-------------------------------------------------------------------

其次是Jikes RVM

Jikes RVM是个用纯Java实现的JVM。上面提到的Maxine VM也是如此。 
这里提到Jikes RVM是因为它的优化编译器的指令选择跟C2相似,也用到了BURS。所以指令选择这部分可以先参考Jikes RVM的实现和相关文档,然后再回去看C2的实现。

但其实Jikes RVM的BURS代码就这么直接读也不算易读的。我比较不喜欢Jikes RVM里各种要在构建过程中生成代码的地方,这里正是其中之一——Jikes RVM的源码里有BURS的规则文件,构建过程中由它会生成出真正负责匹配的状态机的C代码。

那为啥还要推荐它呢?因为它胜在“有根可寻”。它的BURS名为jburg,是iburg的移植版。后者的一个变种在lcc里也有用到。

A Retargetable C Compiler: Design and Implementation》详细介绍了lcc的实现。其中第14章提到了其BURS系统的实现,非常建议阅读。 
这本书有中文版,但翻译太烂所以我不推荐读中文版。

=================================================

Hmm,下次做个简易案例来带大家走一遍C2的编译过程好了〜

说来我以前就分析过一个案例,涉及了C2工作流程的一部分,在这 
里:http://hllvm.group.iteye.com/group/topic/34932#post-232535 
请先读读这篇案例看是否有帮助 ;-)

还有几个主要面向Java应用开发者的实验: 
逃逸分析的实验:HotSpot 17.0-b12的逃逸分析/标量替换的一个演示 
基于superword的向量化的实验:降序循环总是比升序循环快? 
Uncommon trap的实验:JIT编译找不到类?

 
LeafInWind 2014-02-10
RednaxelaFX 写道
请楼主先说说你已经知道的(包括基本的编译原理、JIT编译器的特定知识、其它JVM JIT编译器的实现),以及研究C2的动机,然后我看看如何引导你进入C2的世界。

感谢R神。你提到的上述技术我基本都了解。我目前主要对hotspot JIT的inline cache、逆优化、OSR还算熟悉。 
目前对C2编译器最关注的其实是它的寄存器分配问题。 
但也希望能借这个机会对C2有一个全面的理解。

 
RednaxelaFX 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的思路,具体来说是基于Chaitin算法。它的一部分声明就在ad文件里(平台相关的寄存器声明、每条指令的“开销”声明之类)。相关论文在这儿有链接:https://wiki.openjdk.java.net/display/HotSpot/Graph+Coloring+Register+Allocation+Papers

所以研究C2的寄存器分配就是你的研究动机了是么?或许不只如此?

 
LeafInWind 2014-02-10
RednaxelaFX 写道
我前面的回帖有更新喔,回头可以读读看。

这个更新太全面了,现在再不敢说这些技术都了解了,看来今后一段时间有得忙了,感谢R神。 
我对编译的理解主要来自大学时的课程学习以及之前对ideal graph的学习(也就是看的Würthinger的硕士论文),但总感觉一知半解,所以想基于C2编译器做更深入的学习。

 
RednaxelaFX 2014-02-10
LeafInWind 写道
我对编译的理解主要来自大学时的课程学习以及之前对ideal graph的学习(也就是看的Würthinger的硕士论文),但总感觉一知半解,所以想基于C2编译器做更深入的学习。

呵呵,总算知道楼主在做的是啥项目了。加油!

我又稍微更新了一下前面的回复,主要是针对你在顶楼问的那两点,希望对你有帮助

 
LeafInWind 2014-02-11
看了Würthinger的硕士论文,对理想图的语义都能理解,对其中介绍的优化也能明白,但这些优化都是直接基于理想图的,文中却没有介绍理想图是如何得到的。
看了一下The Java HotSpotTM Server Compiler,其第四节parser感觉就是在讲字节码到理想图的转换过程的,但感觉讲得实在太抽象了。
 
RednaxelaFX 2014-02-12
LeafInWind 写道
看了一下The Java HotSpotTM Server Compiler,其第四节parser感觉就是在讲字节码到理想图的转换过程的,但感觉讲得实在太抽象了。

可能是因为你关心的是个实现细节而那个实在太直观,作者觉得没必要写出来orz

有没有去看看Graal的parser?(GraphBuilderPhase)

 
LeafInWind 2014-02-12
R神 写道
有没有去看看Graal的parser?(GraphBuilderPhase)

现在开始看,呵呵

LeafInWind 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的构造函数啊!!??
 
RednaxelaFX 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的部分的入口就在这里: 
http://hg.openjdk.java.net/hsx/hotspot-main/hotspot/file/a61af66fc99e/src/share/vm/opto/compile.cpp#l493 
其中有调用cg->generate(jvms),留意一下那里。这里的cg是调用CallGenerator::for_inline()得到的,实际上是个ParseGenerator: 
http://hg.openjdk.java.net/hsx/hotspot-main/hotspot/file/a61af66fc99e/src/share/vm/opto/callGenerator.cpp#l226 
然后ParseGenerator::generate()会构造一个Parse实例, 
http://hg.openjdk.java.net/hsx/hotspot-main/hotspot/file/a61af66fc99e/src/share/vm/opto/callGenerator.cpp#l62 
真正的parsing就是从其构造函数Parse::Parse()开始的。

Parse的过程中,(几乎)每个节点在生成出来之后都会马上经过PhaseGVN::transform()的优化: 
http://hg.openjdk.java.net/hsx/hotspot-main/hotspot/file/a61af66fc99e/src/share/vm/opto/phaseX.cpp#l648 
而这就是图里右上角的部分:Ideal() -> Value() -> Identity() -> global value numbering

Ideal()、Value()、Identity()是Node类上可以说最核心的三个方法,它们的作用贯穿在整个C2的优化过程中。嘛说“整个”可能有点过头,至少可以说是在instruction selection之前吧。 
http://hg.openjdk.java.net/hsx/hotspot-main/hotspot/file/a61af66fc99e/src/share/vm/opto/node.hpp#l795 
这仨主要是跟GVN和Iterative GVN配套使用的。

其实并不难找啦,给点耐心。有什么疑问欢迎继续来讨论~

 
LeafInWind 2014-03-09
请问代码中有一大堆以ci开头的类,不知ci是什么意义? 
R神在http://hllvm.group.iteye.com/group/topic/26998曾写过ci目录是“动态编译器的公共服务/从动态编译器到VM的...”但很可惜最后几个字看不见了。 
另外R神能否再大概展开一下,描述一下该目录下比较重要的类的作用。 
谢谢!!!
 
RednaxelaFX 2014-03-09
LeafInWind 写道
请问代码中有一大堆以ci开头的类,不知ci是什么意义? 
R神在http://hllvm.group.iteye.com/group/topic/26998曾写过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的抽象类型。

 
LeafInWind 2014-03-11
这几天都在看hotspot的寄存器分配。想问一下build_ifg_virtual和build_ifg_physical两个步骤的主要区别是什么。是否physical ifg就是类似下图的预着色图(precolored)。 
 
(上图引用自虎书11.3节)

JIT编译器的更多相关文章

  1. 谈谈JIT编译器和本机影像生成器(NGen.exe)

    前言 在看<CLR>的时候,作者在开篇的时候提到了NGen.exe,前面一节执行程序集的代码中提到:程序或方法执行前会执行MSCorEE.dll中的JIT函数把要执行方法的IL转换成本地的 ...

  2. 浅谈对JIT编译器的理解。

    1. 什么是Just In Time编译器? Hot Spot 编译 当 JVM 执行代码时,它并不立即开始编译代码.这主要有两个原因: 首先,如果这段代码本身在将来只会被执行一次,那么从本质上看,编 ...

  3. NET基础课--JIT编译器如何工作1

    1..Net运行时调用JIT编译器,用来把由C#编译器生成的IL指令编译成机器代码.这一任务在应用程序的运行期间是分步进行的.JIT并不是在程序一开始就编译整个应用程序,取而代之的是,CLR是一个函数 ...

  4. JIT编译器技术理解

    参考链接: https://blog.csdn.net/liaodehong/article/details/51605457 https://www.cnblogs.com/insistence/p ...

  5. 五、CLR加载程序集代码时,JIT编译器对性能的产生的影响

    1.CLR首次加载代码造成的性能损失 四.CLR执行程序集中代码介绍了CLR在首次执行一个类的时,会初始化一个内部结构,然后当目标方法被首次调用时,JITComplier函数(JIT编译器)会验证IL ...

  6. 深入浅出 JIT 编译器

    转载 https://www.ibm.com/developerworks/cn/java/j-lo-just-in-time/ JIT 编译器在运行程序时有两种编译模式可以选择,并且其会在运行时决定 ...

  7. 《Java性能权威指南》笔记----JIT编译器

    概览 编译型语言(C++,Fortran等):运行程序前,需要用编译器将代码静态编译成CPU可执行的汇编码.汇编码针对特定的CPU. 优点:只需编译一次,且有足够的程序信息来优化汇编码.执行速度快: ...

  8. Java虚拟机解释器与JIT编译器

    一.JAVA编译相关概念 1.动态编译(dynamic compilation)指的是“在运行时进行编译”:与之相对的是事前编译(ahead-of-time compilation,简称AOT),也叫 ...

  9. 「译」Graal JIT编译器是如何工作的

    原文Understanding How Graal Works - a Java JIT Compiler Written in Java,讲了jvmci和ideal graph的基本概念以及一些优化 ...

随机推荐

  1. 应用程序正常初始化(0xc0000135)失败的解决方法

    转自:http://blog.sina.com.cn/s/blog_64fba4e00100mzf9.html 这是由于没有安装.NET framework 所造成的,请安装.NET framewor ...

  2. javaweb项目打成war包

    进入项目文件 jar -cvf newsisAP.war *

  3. hdoj-1251-统计难题【map】

    统计难题 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others) Total Submiss ...

  4. 〖Linux〗build sqlite3 for Arm

    Version: sqlite-autoconf-3080100.tar.gz Download: https://www.sqlite.org/download.html 1. toolchains ...

  5. 18、Java中可变参数

    从JDK 1.5之后,Java允许定义形参可变的参数 例如: public void test(int a,String ... books){ for(String book:books){ Sys ...

  6. 【laravel5.4】引入自定义类库+卸载已有的自定义库(以引入钉钉应用为例)composer dumpautoload -o

    本文之前,首先感谢: Azeroth_Yang  传送门:https://blog.csdn.net/zwrj1130/article/details/73467320 强烈建议引入的类 都是含有命名 ...

  7. (四)Linux Shell编程——输入输出重定向

    Unix 命令默认从标准输入设备(stdin)获取输入,将结果输出到标准输出设备(stdout)显示.一般情况下,标准输入设备就是键盘,标准输出设备就是终端,即显示器. 1. 输出重定向 命令的输出不 ...

  8. PHP 与 UTF-8

    没有一行式解决方案.小心.注意细节,以及一致性. PHP 中的 UTF-8 糟透了.原谅我的用词. 目前 PHP 在低层次上还不支持 Unicode.有几种方式可以确保 UTF-8 字符串能够被正确处 ...

  9. HDUOJ----John

    John Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submis ...

  10. Sublime Text 2搭建Go开发环境(Windows)

    转自:http://blog.csdn.net/love_se/article/details/7754274 下载packcontrol包地址:http://www.imjeff.cn/blog/6 ...