我一直在努力Java
从8年多开始。
上周,在我公司的一次小型会议上,我的一位同事问我到底如何Java Compiler
工作?我无言以对。
我尝试解释一下,就像 Java 编译器将语句一一转换为不针对任何对象的字节码OS
but to JVM
.
即使是我,也没有人对这个答案感到满意。
现在主要的问题是java编译器到底是如何工作的。即,在编译一个文件的情况下,编译器将完成多少个步骤或阶段或阶段Java
file.
到底是什么Java's compiler
建筑学?
如果有多个怎么办Java classes
在同一个 .java 文件中。那么会编译多少个类。
如果导入指向未编译的 Java 类怎么办?那么未编译的类是被编译还是被忽略?
我用谷歌搜索了半天多,所有人都提供了与我给同事的答案相同的答案。
但最后我找到了一些有用的教程here http://www.bearcave.com/software/java/comp_arch.html.
但该教程的内容也不太深入,我无法想象该教程。
但我仍然不满足,并渴望从你那里了解更多有关这方面的信息。
因此,如果有人比我和上面的博客更了解一些东西,通过使用它我可以直观地看到内部架构到底是什么Java Compiler
请解释一下。
一些基本步骤:
- parse:读取一组 *.java 源文件并映射结果标记
序列成 AST(抽象语法树)节点。
- Enter:将定义的符号输入到符号表中。
- 处理注释:如果有请求,则处理在以下位置找到的注释
指定的编译单元。
- attribute:语法树的属性。此步骤包括姓名
分辨率、类型检查和常量折叠。
- flow:对上一步中的树执行数据流分析。
这包括检查分配和可达性。
- desugar:重写 AST 并翻译掉一些语法糖。
- generate:生成源文件或类文件。
更详细地说:
- Lex - 将源文件分解为单个单词或标记。
- 解析 - 分析程序的短语结构。
- 语义动作 - 构建一个与每个短语对应的抽象语法树。
- 语义分析 - 确定每个短语的含义,将变量的使用与其定义联系起来,检查表达式的类型,请求每个短语的翻译。
- 帧布局 - 以与机器相关的方式将变量、函数参数等放入激活记录(堆栈帧)中。
- 翻译 - 生成中间表示树(IR 树),一种表示法
它不依赖于任何特定的源语言或目标机器体系结构。
- 规范化 - 消除表达式中的副作用,并清理条件分支,以方便下一阶段。
- 指令选择 - 将 IR 树节点分组为与目标机器指令的操作相对应的块。
控制流分析 - 将指令序列分析为控制流图,显示程序可能的所有可能的控制流
执行时跟随。
数据流分析 - 通过程序变量收集有关信息流的信息;例如,活跃度分析计算每个程序变量保存仍然需要的值(活跃)的位置。
寄存器分配——选择一个寄存器来保存程序使用的每个变量和临时值;变量不同时存在
可以共享同一个寄存器。
代码发射 - 将每个机器指令中的临时名称替换为
机器寄存器。
有一本很好看的书:
Java 中的现代编译器实现
您可能想查看 javac 代码:
Javac 文档 http://openjdk.java.net/groups/compiler/
OpenJDK 源代码 http://hg.openjdk.java.net/jdk7
javac 黑客指南 http://scg.unibe.ch/archive/projects/Erni08b.pdf
不要恐慌!帮助 javac 新手浏览代码库 http://openjdk.java.net/groups/compiler/doc/hhgtjavac/index.html
JVM JLS http://docs.oracle.com/javase/specs/jvms/se7/html/index.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)