编译执行与解释执行的区别是什么?JVM 使用哪种方式?
编译执行与解释执行的区别是什么?JVM 使用哪种方式?
回答重点
编译执行:是指程序在执行之前,首先通过编译器将源代码编译为机器代码,然后直接在 CPU 上运行。常见的编译语言如 C、C++。
- 优点:编译后的程序运行速度快,因为机器代码是针对目标平台直接生成的,且不需要在运行时再进行翻译。
- 缺点:程序必须针对每个平台重新编译,跨平台性差;另外,编译后生成的机器代码难以调试和逆向工程。
解释执行:解释执行是指源代码不经过编译器的预先编译,而是在运行时通过解释器逐行翻译并执行。常见的解释语言如 Python、Ruby。
- 优点:跨平台性好,因为代码在每个平台上都是通过相应平台的解释器来运行的,且开发周期更短。
- 缺点:运行速度较慢,因为每次执行时都需要进行动态翻译和解释。
JVM 采用编译执行和解释执行相结合的方式:
- 解释执行:JVM 会逐行解释执行字节码,尤其是程序初次运行时,这种方式有助于程序的跨平台性。
- 即时编译(JIT):JVM 引入了即时编译器(Just-In-Time Compiler),在程序运行时将热代码(经常执行的代码)编译为本地机器码,避免反复解释,提升性能。因此,JVM 实际上是混合使用解释执行和编译执行。
扩展知识
通俗理解
我们以英文阅读的角度来看解释执行和编译执行。
例如英文不好的人,看英文的时候会在脑海中翻译成中文,然后才能知晓其意思,这就是解释执行。
如果有个人把英文翻译成中文,然后直接给我看,这就叫编译执行。
从描述我们也可以得知编译执行的效率比较高,它仅需在前期花点时间“翻译”下,后期就不要在实时翻译了。
JVM 是哪个呢?都有!
正常情况下 JVM 是解释执行,但是如果 JVM 发现这段逻辑执行特别频繁,是个热点代码,那么就会把它就会通过 JIT (JUST IN TIME) 即时编译将其直接编译成机器码,这样就是编译执行了。
JIT 和 AOT
Comments