解释和编译的区别

这方面在知乎上回答的很多,也很到位.
先给出参考的文献和链接如下:
百度百科,

1 编译和解释的区别

机器语言:(machine code)电脑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)。
这里写图片描述
(图片来自网络)

2 appendix

2.1 compiler编译器

参考视频极简编译器原理

以c语言举例:
我们有一个c语言源程序(source code/program), 为:

int main(){
	int x;
	x = 3;
	x = x+1;
}

编译的完整步骤:
我们把它放在test.c文件中,现在要开始进行编译了。test.c—>通过编译器—>编译器lexical analysis(词法分析)找到tokens—>syntactic analysis(句法/语法分析)—>解析树/语法树parse tree—>semantic analysis(语义分析)分析上下文—>生成汇编语言—>转到机器语言
源码变为机器码
在这里插入图片描述
1,通过编译器
在这里插入图片描述
2 词法分析,找到tokens

在这里插入图片描述
3, 句法分析–分析树
在这里插入图片描述
4 语义分析–分析上下文
在这里插入图片描述
5 变为汇编语言
在这里插入图片描述
6 通过汇编语言找到对于的机器语言
下面就是汇编语言看起来的样子,高亮部分表示在某个位置加(add)+1
在这里插入图片描述
注意:如果是在一台电脑上编译完成了,即生成了如下的机器码
在这里插入图片描述
那么直接复制生成的机器码到别的电脑上,可能会出现运行不成功,这是因为不同电脑可能处理器或者操作系统不一样,它们可能使用不一样的机器指令集。但是也是有办法的,即你可以编译为你想在上面运行的那台电脑对应的机器码,可以使用Audacity, VLC, blender等
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
对于java而言,它没有编译成机器码,而是编译成被称为字节码(byte code)的中介码, 然后在特定的电脑编译成特定的机器码。这可能是一种折中的方法,虽然便捷但效率较低
在这里插入图片描述
更新2019.11.13

2.2 编译型语言和解释型语言

参考视频:编译型语言和解释型语言
建议看视频,只有9分钟,解释很好
在这里插入图片描述

  • 21
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值