我们写的java代码如何在各种各样的操作系统上运行起来的?
- Java文件通过javac 编译成为class文件,这种中间码被称为字节码
- 由jvm加载字节码
- 运行时 解释器将字节码解释为一行行的机器码来执行
- 在程序运行期间 即时编译器能会针对热点代码将该部分字节码编译成 机器码 以获得更高的执行效率
- 在整个运行时,解释器和即时编译器 相互配合 使java程序几乎能够达到和编译型 语言一样的执行效率
Q:
1.解释器和编译器区别和联系
- 解释器是一条一条的解释执行源语言。比如php,postscritp,javascript就是典型的解释性语言
- 编译器是把源代码整个编译成目标代码,执行时不在需要编译器直接在支持目标代码的平台上运行,这样执行效率比解释执行快很多。比如C语言代码被编译成二进制代码(exe程序),在windows平台上执行。
- 解释器的优点是比较容易让用户实现自己跨平台的代码,比如java,php等,同一套代码可以在几乎所有的操作系统上执行,而无需根据操作系统做修改;
- 编译器的目的就是生成目标代码再由连接器生成可执行的机器码,这样的话需要根据不同的操作系统编制代码,虽然有像Qt这样的源代码级跨平台的编程工具库,但在不同的平台上仍然需要重新编译连接成可执行文件,但其执行效率要远远高于解释运行的程序。
2.Java是什么类型的
Java即是编译型的,也是解释型语言,总的来说Java更接近解释型语言。
- 可以说它是编译型的。因为所有的Java代码都是要编译的,.java不经过编译就什么用都没有。同时围绕JVM的效率问题,会涉及一些如JIT、AOT等优化技术,例如JIT技术,会将热点代码编译成机器码。而AOT技术,是在运行前,通过工具直接将字节码转换为机器码。
- 可以说它是解释型的。因为Java代码编译后不能直接运行,它是解释运行在JVM上的,所以它是解释运行的。