一、详细对比
解释器和编译器均是将高级编程语言
(源代码)转换为机器语言
+---------------+ +---------------+
| 高级语言 | | 高级语言 |
| | | |
+---------------+ +---------------+
| 编译器 | | 解释器 |
| | | |
+---------------+ +---------------+
| 机器语言 | | 机器语言 |
| | | |
+---------------+ +---------------+
| 硬件 | | 硬件 |
| | | |
+---------------+ +---------------+
参数 | 编译器 | 解释器 |
---|---|---|
源码扫描 | 一次性编译全部源码 | 一次解释一行源码 |
错误检查 | 编译的同时,检查并展示所有错误 | 解释一行,展示一行的错误 |
执行产物 | 编译后产出机器码文件 | 不产生任何实体文件 |
执行时间 | 很快 | 较慢 |
程序运行 | 不需要源码,运行编译后的机器码 | 需要源码,读取一行,运行一行 |
语法语义 | 编译时都要检查 | 只检查语法错误 |
大小 | 较大 | 更小 |
灵活性 | 不够灵活 | 相对灵活 |
效率 | 高效 | 相对较低 |
代表语言 | C,C++,java | Python, Ruby, Perl |
二、JVM 是解释器
2.1 JVM
- 依赖硬件的虚拟平台
- 组成
1.类加载器加载.class
文件
2. 字节码验证组件,检查字节码中是否有违反访问限制区域的内容。这也是JAVA是安全的原因之一。
3. 执行引擎,将字节码翻译成机器码
2.2 术语解释:
- Javac 是Java 编译器,将源码编译成字节码
- JVM 将字节码翻译成机器码,所以JVM是解释器。
- JIT(Just In Time Compiler) 在JVM运行时,当一段字节码需要执行时,JIT将其编译成机器码。 目的在于最大可能优化性能。
- 字节码,字节码文件由十六进制值组成,而JVM以两个十六进制值为一组,即以
字节
为单位进行读取。
参考:https://builtin.com/software-engineering-perspectives/compiler-vs-interpreter