解释和编译的区别

这方面在知乎上回答的很多,也很到位.
先给出参考的文献和链接如下:
百度百科,知乎,《c语言程序设计》,Bluestorm’s Space平凡生活
当然最主要的还是参考了课本《c语言程序设计》,毕竟课本比较专业
先从基本概念入手
机器语言:电脑CPU指令体系(系统)。CPU指令系统中包含大量的由0和1组成的指令码(序列),这些指令码可以直接由计算机识别。如下面两条指令码:
10000000(代表进行一次加法计算)
10010000(代表进行一次减法计算)
因为机器(电脑)只能识别0和1,因此这种语言称为机器语言。
汇编语言:由于机器语言复杂庞大很难懂,因此人们在此基础上加入了一些标记符号,如:
A+B 或者 ADD A,B
A-B 或者 SUB A,B
加入这些符号之后“+”和“-”就不再需要像上面那样写一串0和1了,因此这种用标记符号描述的指令系统称为汇编语言(或者符号语言)。值得一提的是,这种语言是不能直接被电脑识别的,电脑只识别0和1.另外,汇编语言和机器语言两者都是面向机器的语言,也就是说,他们是依CPU不同而不同的,不同类型的计算机使用的汇编语言和机器语言是不同的。
高级语言:虽然汇编语言消除了大量的识别上带来的困难,但依然是很费力的,于是人们再次升级,设计出一种接近人类自然语言(如英语)的语言来描述程序,这就是高级语言,1954年的FORTRAN是第一种高级语言。
编译:前面说到电脑是只能识别自然语言的,而我们更熟悉的是高级语言,也用高级语言来敲代码;因此要让电脑识别我们的指令,则需要将我们敲的高级语言转换成自然语言,这种转换过程称为编译,而转换过程的执行是由编译器来完成(compiler)。
通常为了将机器语言和高级语言进行区别,我们将高级语言写的程序称为源文件(或源程序source program)编译之后的机器可以直接辨认并执行的文件称为可执行文件(exe,当然这里经过了链接,见下文),而由0和1构成的机器语言称为目标程序文件(object program)。因此可以将编译进一步定义为:由源程序编译成目标程序的过程。
解释:解释跟编译很类似,不同之处在于编译是直接一次性生成目标文件(.obj和/或.o文件,即object),而解释则是一条条的解释执行源文件。也因为这种差别,编译型语言(如C/C++、Pascal/Object Pascal(Delphi))生成的目标文件是针对特定CPU体系的,当换一个CPU体系时需要重新编译(如make(编译),make clean(将目标文件.o .obj删除))(引用百科的一句话“用c语言开发了程序后,需要通过编译器把程序编译成机器语言(即计算机识别的二进制文件,因为不同的操作系统计算机识别的二进制文件是不同的),所以c语言程序进行移植后,要重新编译。(如windows编译成ext文件,linux编译成erp文件)”);而解释型语言(如Java、JavaScript、VBScript、Perl、Python、Ruby、MATLAB )等由于是在运行过程中才会被翻译成目标CPU指令,所以在不同CPU体系下都可以执行,不需要重新编译。解释性语言在运行程序的时候才翻译,每个语句都是执行的时候才翻译。这样解释性语言每执行一次就要翻译一次,效率比较低,但跨平台性好。关于这点的比喻可以查看这篇博文,最后配一张知乎上直白的图。
解释和编译的区别
另外,编译和连接的关系如下
链接:将目标程序模块以及程序所需的系统固有目标程序模块(如执行输入\输出操作的模块)链接成一个完整的程序。链接器(linker)链接后生成的文件就是可执行文件(exe)。
解释和编译的区别
(图片来自网络)