目录
前言
本章要聊的话题是解释型语言和编译型语言的异同,之所以用《Java是解释型语言?还是编译型语言?》为题,是本人对Java更熟悉,后续举例说明也会相对侧重于Java,其他同学可根据自己学习的语言理解。
一、先提出一个问题
先不给出解释型语言和编译型语言的定义,如果有人问“Java是解释型语言?还是编译型语言?”,你给出的答案会是什么?你的第一反应是不是“Java是编译型语言”,无他,天天“编译/build”挂在嘴边的缘故......
二、解释型语言和编译型语言的定义
计算机不能直接理解高级语言,只能直接理解机器语言,所以必须要把高级语言翻译成机器语言,计算机才能执行高级语言编写的程序。
程序执行之前,需要一个专门的编译过程,把程序编译成为机器语言的文件,比如exe文件,以后不用重新翻译,直接使用编译的结果就行了(exe文件),编写此类程序的高级语言称为编译型语言。
解释性语言则不同,解释性语言编写的程序不需要提前编译成机器语言,在运行程序的时候才翻译,比如basic语言,专门有一个解释器能够直接执行basic程序,每个语句都是执行的时候才翻译。这样解释性语言每执行一次就要翻译一次,效率比较低。
三、回顾前面的问题
到此,如果有人再问“Java是解释型语言?还是编译型语言?”,你给出的答案会是什么?很明显,Java是解释型语言。如果你仍觉Java是编译型语言,只有一个原因,你将Java语言的编译与编译型语言定义中的编译混淆了。了解Java语言的同学可以回忆下,Java虽然提前由翻译器进行了编译,得到的却不是机器语言,而是.class字节码文件,一个恍惚.....机器语言. ≠ .class字节文件。
四、关于所谓“混合型”语言
随着硬件的升级和设计思想的变革,编译型和解释型语言越来越笼统,主要体现在一些新兴的高级语言上。
如上,Java很特殊,Java程序也需要编译,但是没有直接编译称为机器语言,而是编译成.class字节码文件,然后在Jvm上用解释方式解释执行字节码。
基于“编译+解释”的这种特点,有人也将Java称为混合型语言。
其实C++、.Net 更符合所谓混合型语言,因为不同Java的“编译+解释”,C++、.Net有部分代码是完全编译的,而有部分代码是托管的解释型代码。
但混合型语言这个表述不是一个标准术语,严格来说,从概念上的定义,所谓混合型语言仍属于解释型语言。
Python 的也采用了类似Java的编译模式,先将Python程序编译成Python字节码,然后由一个专门的Python字节码解释器负责解释执行字节码。
附:
编译型的语言包括:C、C++、Delphi、Pascal、Fortran等。
解释型的语言包括:C#、Java等。那些脚本类的语言也被分为解释型,不过不完全相同, 他们没有C#和Java类似的第一次编译, 直接由他们的脚本引擎运行那些字符窜组成的代码,比如 JavaScript、VBScriptBasic、javascript等。
五、解释型语言和编译型语言的利弊
编译型语言安全性高、易用性高、执行性率高,但依赖编译器、跨平台性差些。
现在大多数的编程语言都是编译型的, 编译程序将源程序翻译成目标程序后保存在另一个文件中,该目标程序可脱离编译程序直接在计算机上多次独立执行,使用比较方便、效率较高。并且,因为编译型语言的编译是在应用源程序执行之前,就将程序源代码“翻译”成目标代码(机器语言),反编译后只能得到汇编代码,又使他人难于盗用其中的技术。
不过,对于不同的系统,编译型语言需要针对系统提供的API修改。再依赖编译器编译生成对应的目标文件(* .OBJ)才能执行。编译之后如果需要修改就需要整个模块重新编译,如果只有目标文件而没有源代码,修改很不方便( 不过也有类似wine的东西存在,使得编译型也可以直接跨平台运行,前提是足够完善的重新封装整个API......)。
而 针对每种作业系统、CPU,而提供并测试各自的编译版本,这种做法的可行性很小;开源软件则允许用户自己来编译目的码(object code),这样在跨平台方面更好一些。
解释型语言安全性较低、执行性率低、 依赖解释器、跨平台性好。
解释型语言,如C#和java第一次编译成执行文件时编译成字节码,字节码作为一种中间语言,对其反编译的到的结果和源代码还是比较相似的,可能会被盗取其中的技术。
不过,对于不同的系统, 只要运行环境虚拟机足够符合这门语言的标准,解释型语言使用同一个执行文件即可, 比如java程序运行于JVM、C#程序运行于CLR, 使得一次编译到处运行成为可能。 解释语言编写的程序的优点还在于当语句出现语法错误时,可以立即引起程序员注意,使得一些错误在程序开发期间就能进行校正。一般地,动态语言都是解释型的,如Tcl、Perl、Ruby、VBScript、 JavaScript等。
因为中间代码的解释是由软件支持的,不能直接使用硬件,需要一个专门的解释器解释执行,所以不是所有解释型语言跨平台性都好,VB是解释型语言,但是不能跨平台……但这并不影响我们对于解释型语言更加符合跨平台的要求的评价。
解释器解释执行程序时,每条语言只有在执行才被翻译。这种解释型语言每执行一次就翻译一次,因而解释型语言程序的执行效率相比编译型语言较低。
六、解释型语言和编译型语言的应用
由于编译型语言编写的程序执行速度快,同等条件下对系统要求较低,因此像开发操作系统、大型应用程序、数据库系统等时都采用它。像C/C++、Pascal/ObjectPascal(Delphi)、VB等基本都可视为编译语言,而一些网页脚本、服务器脚本及辅助开发接口这样的对速度要求不高、
目录
对不同系统平台间的兼容性有一定要求的程序则通常使用解释性语言,如Java、JavaScript、VBScript、Perl、Python、MATLAB 等等。