编译与解释的区别

 图片来源:http://web.cs.wpi.edu/~gpollice/cs544-f05/CourseNotes/maps/Class1/Compilervs.Interpreter.html

编译和解释都是将高级程序语言(也称为3GL,3rd-generation languages,例如C和JAVA)转换为机器可理解的机器代码的翻译过程,它们的主要区别列举如下:

编译

1. 基本过程:将编译程序写成软件安装于机器上,每次输入高级程序语言源代码后,编译程序软件将其转换为目标程序。转换的过程包括代码的分析和综合——首先对源代码进行词法、语法分析,然后进行代码优化、存储分配并生成结果,为了做到这一点,常常需要多次扫描源代码。得到的目标程序文件包含机器指令代码和存储划分等具体信息,其实现的功能与源程序等价;目标程序可以直接被计算机执行。(有一部分编译程序生成的并非目标文件,而是汇编语言代码文件,需要再利用汇编程序将其转换为机器语言并生成目标程序文件)

2. 目标程序文件运行效率较之于解释程序的执行要更高,适用于大型程序设计,虽然编译过程耗时较大,但是毕竟只需一次编译,目标程序就可以反复使用。

3. 目标程序由于包含机器指令,所以是与硬件高度相关的,这意味着如果需要更换平台,就不能重复使用原先的目标程序了。

4. 目标程序是直接可执行的,即不需要机器上安装任何平台以辅助执行。

5. 目标程序文件可以起到保护源代码的作用,因为其中只包含机器指令等内容,要反编译为高级语言有很大的难度。

6. 按编译方式执行的程序有PASCAL,FORTRAN,C,COBOL等,相对不容易学习和理解。

解释    

1. 基本过程:解释程序把源代码解析为某种中间形式,例如AST(抽象语法树),然后开始扫描,将源代码逐句翻译成机器语言并执行,没有生成中间的目标文件。

2. 程序整体运行效率较低,例如如果程序的主体是一个循环,那么解释执行的方式需要一次次把相同的语句翻译成机器指令。由于可以立刻看到单条语句的运行结果,所以适用于小规模程序,或者在程序开发过程中仅需要对代码做小规模的改进的场合。

3. 相对于目标文件,解释方式执行的程序有更好的可移植性,因为其与硬件相关性小,所以可以在不同平台上使用各自的解释器执行相同的高级程序代码;Java虚拟机(JVM)就是这样一种针对不同平台设计的解释器,它实现了JAVA语言的跨平台性。注意由于JVM进行了一定程度的全局优化,所以严格地说使用JVM执行的java程序语言采用的是介于编译执行和解释执行中间的某种方式(最后一句话存疑)

4. 解释执行方式的程序只能在装有解释器的机器上执行。

5. 由于不需要目标文件,所以运行发布程序就相当于发布了源代码,这样在知识产权重要的场合下就很不利了。

6. 按解释方式执行的程序有Basic,Matlab,JAVA等,由于可以迅速看到单条语句的运行结果,所以适于初学者学习和理解。

尚待了解的问题:
· 为什么说JAVA程序的执行方式介于解释和编译中间,JVM究竟发生了什么作用?
(更新:Java是解释型的,但Java通过预先将源代码编译为接近于机器指令的字节码,有效地克服了传统解释型语言的性能瓶颈,同时又保持了解释型语言的可移植性。Java解释器能直接在任何机器上执行Java字节码。……Java开发者设计了just in time编译器(也叫代码生成器),这种编译器可以在运行时把Java的字节码翻译成特定的机器代码,提高了其高性能。——摘自讲义)
· AST是什么?解释执行过程中源代码对应的中间结果是什么样子的?

参考材料
· http://blog.csdn.net/superdont/article/details/1622136
· http://dreamhead.blogbus.com/logs/10227569.html
· http://www.cnblogs.com/menglin2010/archive/2011/05/27/2059568.html
· http://web.cs.wpi.edu/~gpollice/cs544-f05/CourseNotes/maps/Class1/Compilervs.Interpreter.html
· http://computersight.com/programming/compiler-vs-interpreter/
· http://www.bookrags.com/research/interpreter-vs-compiler-wcs/

你可能感兴趣的:(java,语言,jvm,fortran,matlab,pascal)