首先我们应该了解这两种语言的概念 .
高级语言在计算机上执行 , 有两种方式 , 分为编译型语言和解释型语言 .
编译型语言 : 编写源代码–>编译–>链接. 典型的编译型语言 : C/C++ .
特点 : 源代码中一处有错 , 就不允许编译 ; 编译过程中出现一处错误 , 就停止编译 .
优点 : 直接运行生成最终产物 , 以C语言为例 , 最终产物就是二进制机器代码 , 速度快 , 效率高 !
解释性语言 : 编写源代码 , 一行一行解释执行 , 而不是一次编译全部代码 . 典型的解释型语言 : JavaScript , Python , Matlab .
特点 : 边解释 , 边执行 .
优点 : 源代码有错照样能解释执行 , 遇到错再停下 .
缺点:不断地对源代码进行解释、执行、解释、执行 . 由于解释型程序是将翻译过程放到执行过程中 , 这就决定了解释型程序注定要比编译型慢上一大截,而且每次运行程序 , 都要对源代码进行重新解释 , 而不是执行最终产品 , 所以速度比编译型慢得多得多 .
Java比较特殊 , 是编译型 + 解释型 .
Java的编译器先将其编译为class文件,也就是字节码;然后将字节码交由JVM(java虚拟机)解释执行;所以很多地方都说“Java是一种半编译、半解释执行”的语言 .
看上去陷入了一个困境,Java到底是编译型语言呢,还是解释型语言呢?
一种朴素的判定方式:如果翻译器部分较为简单,我们说这个语言是“解释的”,反之如果翻译器部分很复杂,我们就说这个语言是“编译的” .事实上这两者之间的界限是模糊的,因为“简单”和“复杂”都具有主观性 . “解释型”和“编译型”并不是一个清晰的描述 . 故强行将某种具有混合形式的语言划入两者之一是不当的。
但实践中肯定还是有进行分类的需求,所以这里有一条启发性原则用以判断语言的类型:
如果翻译器对程序进行了彻底的分析而非某种机械的变换,而且生成的中间程序与源程序之间没有很强的相似性,我们就认为这个语言是编译的 . 彻底的分析和非平凡的变换,是编译方式的标志性特征 .
因此,从这一角度讲 , Java应当被认作一种编译型语言 .
由Java的代码执行过程可知 ,一个Java 代码的执行过程是由 . Java–>. class–>对应平台机器码 ;
- . Java–>. class是由 Javac 编译,这个过程符合编译型语言的特点 (一次性编译,注意并未编译为实际平台的机器码) .
- 而. class–>对应平台机器码 的这一过程 是由Java解释执行 (逐行解释为特定平台机器码)这一过程符合解释语言的特点 ;
我本人更倾向于Java既是编译型语言语言 ,又是解释型语言。