编译型语言与解释型语言的区别

来源:互联网 发布:淘宝返利网怎么用视频 编辑:程序博客网 时间:2024/05/20 16:11

最近感觉自己对编译和解释的区别不是很清楚,于是查阅了相关资料,以c++,java和Ruby为例说明编译和解释的区别。

传统意义上的所谓编译与解释,区别在于代码是在什么时候被翻译成目标CPU的指令。编译型语言在编译过程中生成目标平台的指令,解释型语言在运行过程中才生成目标平台的指令。

编译型语言

对 C 语言或者其他编译型语言来说,编译是把源程序进行处理,生成一个目标文件,而这个目标文件是针对特定的 CPU 体系的,只能在特定的平台去执行。例如,为 ARM 生成的目标文件,不能被用于 MIPS 的 CPU。这段代码在编译过程中就已经被翻译成了目标 CPU 指令,所以,如果这个程序需要在另外一种 CPU 上面运行,这个代码就必须重新编译。程序执行的是编译好的文件,因此速度比较快。

以C++为例,C++先把源程序编辑成变成目标代码,也就是二进制文件(扩展名为.o)。然后将单个编译后的文件链接成一个二进制可执行文件(扩展名为.exe),二进制程序从硬盘载入内存即可执行。

解释型语言

解释型语言就没有这个编译的过程,而是在程序运行的时候,通过解释器对程序逐行作出解释,然后直接运行,最典型的例子是Ruby。

半编译半解释语言

java通常先编译后解释运行,但java编译生成的通常是一种平台无关的中间代码(字节码文件),这种代码一般不是针对特定的 CPU 平台,他们是在运行过程中才被翻译成目标 CPU 指令的(由解释器边解释边执行),因而,在 ARM的 CPU 上能执行,换到 MIPS 也能执行,不需要重新对源代码进行编译。

java解释器就是把在java虚拟机上运行的目标代码(字节码)解释成为具体平台的机器码的程序。即jdk或jre目录下bin目录中的java.exe文件,而javac.exe是编译器。运行java程序的过程是先用javac编译,然后用java解释。而一经编译成功后,就可以直接java.exe随处解释运行了。

由于程序要在运行时动态解释语言,因此往往需要特定的平台。例如Java需要目标机器上安装JRE,但是这种方式也有一个好处就是可以跨平台。源代码不变,在运行时根据不同的平台,解释成不同的二进制执行。

虚拟机

为什么会有虚拟机的存在?这个答案也很简单了,因为那些非编译型语言生成的并不是目标平台的代码,而是某种中间代码。而能够运行这种中间代码的机器并不广泛存在,所以我们在每个不同的平台中用软件模拟出这个假想平台的虚拟机,这个虚拟机执行这种中间代码,而虚拟机负责把代码转换成最终的目标平台上的指令。

0 0
原创粉丝点击