编译器与解释器的区别

牧草 = 我们的各种编程语言,C/C++/C#, Java, Pascal, PHP, Python, Perl, Java Script等等
切割机 = 各种编译器
奶牛 = 各种CPU(不要告诉我Intel和AMD哦),比如x86,ARM,MIPS等等
那你应该知道了为什么奶牛会有吃不同形状牧草的嗜好了,这个奇怪的比喻是为了表示不同的CPU接受的不同的机器语言。

对应上面的奶牛图,编译器的图是这样的

编译器与解释器的区别_第1张图片

 源代码被编译成机器码,在CPU上运行。

而解释器是这样的

编译器与解释器的区别_第2张图片

用解释器很方便,只需要直接“运行”就好了,不用像C那样有编译链接的工序。

为什么说这些语言是跨平台的?因为你写了程序以后,如果这个平台上有这种语言的解释器,只需要拿到这个平台上直接运行就可以了。你可以理解为:解释器是在“一边编译,一边运行”,它只是把以前程序员手工做的编译过程放在了运行程序的时候进行。

为什么我们一般说解释器的效率比较低?你也可以想象的是,一段程序在解释器中运行时可能会被编译多次,因为每次运行到这段程序时,都会重新编译一次,这样的开销是很大的。

编译器与解释器的区别_第3张图片

在运行之前,需要手动把源代码编译成中间代码(Java里叫字节码),然后在解释器中执行。
这种架构避免了上面纯解释器中编译源代码的开销,所以相对会有效率一些。

但 是我不能骗你们,其实我画在纯解释器中的Python,Perl,PHP可能都不会是真的纯解释执行的,这样实在是太没有效率。Python在运行时会生 成pyc的二进制临时文件,看起来很像是预编译的结果。只有JavaScript这种真的不会写得太长的语言(Ajax请原谅我)才会采用纯解释的运行方 式。 

 

例题:

下面关于编译器与解释器的观点,错误的是?

  • 解释器不产生目标程序,它直接执行源程序或者源程序的内部形式
  • 解释程序和编译程序的主要区别在于是否产生目标程序
  • 编译器对高级语言程序的处理过程划分成词法分析、语法分析、语义分析,中间代码生成、代码优化、目标代码生成几个阶段
  • 解释器参与运行控制、程序执行的速度快
    

    A 正确 解释程序直接执行源程序或源程序的内部形式,一般是读一句源程序,翻译一句,执行一句,不产生目标代码 

  • B 正确 编译程序与解释程序的区别之一在于前者生成目标代码,而后者不生成;此外,前者产生的目标代码的执行速度比解释程序的执行速度要快;后者人机交互好,适于初学者使用。而二者最大的区别在于:对解释执行而言,程序运行时的控制权在解答器而不在用户程序;对编辑执行而言,运行时的控制权在于用户程序。

  • C 正确 编译程序的工作过程可以分为6个阶段:词法分析、语法分析、语义分析、中间代码 
    生成、代码优化、目标代码生成 
  • D 错误 解释器参与运行控制,程序执行的速度慢

 

转载:https://www.cnblogs.com/130701-EYES/p/5301555.html

你可能感兴趣的:(C/C++)