作为一个看过JVM虚拟机的小白,不懂解释器和编译器之间的区别的,那就是糗大了~
1 参考文献
- 深入理解JVM虚拟机
- https://www.cnblogs.com/chengdabelief/p/6576320.html
- https://blog.csdn.net/wangaiheng/article/details/78343260
2 简单地区别解释器和编译器
JVM:Java字节码(Java bytecode)在上面可以直接运行,是JVM平台无关的基础。JVM把每一条要执行的字节码交给解释器,翻译成对应的机器码,然后由解释器执行。JVM解释执行字节码文件就是JVM操作Java解释器进行解释执行字节码文件的过程。
Java编译器:将Java源文件(.java文件)编译成字节码文件(.class文件,是特殊的二进制文件,二进制字节码文件),这种字节码就是JVM的“机器语言”。javac.exe可以简单看成是Java编译器。
Java解释器:是JVM的一部分。Java解释器用来解释执行Java编译器编译后的程序。java.exe可以简单看成是Java解释器。
3 深入了解下Java中的编译器
JVM中,把Java编译过程分为两个过程,分别是前端编译(.java文件转换成.class文件)和后端编译(JIT编译器对应.class文件转换成机器码文件)
先说前端编译过程,也就是Java中javac.exe文件所做的事情,主要是三件事
1. 解析与填充符号表
1.1 词法分析(代码字符流转变为标记集合Token)
1.2 语法分析(根据Token序列生成语法树)
1.3 填充符号表
2. 插入式注解处理器的注解过程
2.1 注解处理API对语法树进行修改
3. 分析和字节码的生成
3.1 标注检查–变量使用前是否声明,=号左右是否匹配等,常量折叠(int a = 1 + 3,字节码中a=3)
3.2 数据及控制流分析–上下文逻辑验证,如,局部变量是否有赋值,方法每条路径是否都有返回值…
3.3 解语法糖–Java中常见语法糖,自动装箱拆箱,泛型,变长数组等。
3.4 生成字节码
再说说,后端编译器–JIT编译器,负责将经常使用的方法或者代码块编译成机器码,提高效率。
下图是Java中解释器和编译器的交互(JVM中JIT不是必需的,可以么有),关于具体的优化技术,自己也不是看得很清楚。有机会再写吧。