Java既是编译型语言,也是解释型语言。
首先先查找关于两种语言的特性及运行机制。
编译型语言与解释型语言的区别
编译型语言
什么是编译呢?通过查找资料,大概就是使用专门的编译器,针对特定的平台将高级语言源代码一次性“翻译”成可以被该平台及其执行的机器码,并包装成该平台能够识别的可执行程序的格式。ps:计算机当然只能看不懂我们敲得代码。
解释型语言
解释则是通过专门的解释器对源程序解释成平台需要的机器码并且立即执行,也就是每次执行之前,都需要解释一遍。
细数两者之差别
- 编译生成的可执行程序可以脱离开发环境,(但是如果要移到另外一个平台上,则需要将源码复制另外平台,并重新编译),而解释型语言程序不能脱离解释器独立运行,但跨平台容易。
- 编译型语言的执行速度那是相当的快,因为之前高级程序已经被编译成机器语言文件,比如
windows下的exe文件
,运行可执行程序的时候就不需要再进行编译了,而是直接运行。而解释型语言编写的程序每执行一次,就要翻译一次,效率偏低。 - 编译型程序可以访问内存的任何区域,相对不安全,而解释型当然在这方面就很安全,很贴心。
- 编译型程序运行消耗的内存比解释型少一点,而编译器在运行之前要先开相关的解释器,而且会进行许多代码优化,安全检查,消耗资源,占用内存。
- 但是编译型代码真的好难好难,c语言就是典型的编译型语言,而解释器毕竟智能,你懂我意思吧。
C,C++,Objective-C,Pascal等高级语言都是编译型语言。
Ruby,Python等语言都是解释型语言。
而Java就很奇怪,真的很怪,又编译,又解释。
Java的奇怪之处
Java的编译
Java的编译并不会生成特定平台的机器码,而是与平台无关的字节码,也就是.class
文件。
Java的解释
.class
文件通过Java虚拟机,即JVM(Java Virtual Machine)翻译成本地的机器码才能执行,这就是解释的过程。
具体机制
-
经过编译生成的字节码不面向平台,而是JVM,JVM作为一个交换器把一份字节码分别翻译成不同平台所需要的,这就是Java跨平台性体现的关键之处。
-
下图为执行Java程序的步骤:
-
JDK中的JRE(Java Runtime Environment)提供了
javac.exe
对编写的.java
文件进行编译,形成字节码文件,以及Java.exe
加载Java类文件,并逐步对字节码文件进行编译。
在此鸣谢: