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

首先,大家都知道计算机底层只能识别(并执行)0、1序列的机器码,这表示所有的高级编程语言所编写的代码,最终都要以某种方式被转换成能被计算机识别的0、1序列机器码,方可被计算机接受并执行。那么这种将代码转换为机器码的方式就分为编译型和解释型这两类,两者方式只是在翻译的时间不同。
其次,看看两者的概念:
         编译型语言,写的程序执行之前,需要一个专门的编译过程,把程序编译成为机器语言的文件,比如exe文件,以后要运行的话就不用重新翻译了,直接使用编译的结果就行了(exe文件),因为翻译只做了一次,运行时不需要翻译,所以编译型语言的程序执行效率高。 
        解释性语言,在运行时由翻译器将高级语言代码翻译成易于执行的中间代码,并由解释器(例如浏览器、虚拟机)逐一将该中间代码解释成机器码并执行(可看做是将编译、运行合二为一了)。
最后,两者的异同:
       1、 两种转换为机器码的方式,最大不同之处是处理转换为机器码的时机不同。编译型是在运行前(且只编译一次),需要做转换工作,并生成一个可执行的机器码文件,用户每次运行该可执行文件执行即可,效率、执行速度要比解释型的快。因为解释型是在运行时做转换工作,并不生成可执行文件,所以每次运行都需要做一下转换工作,然后再执行,效率自然就低了。
      2、 编译型语言,在编译阶段即可发现常见的语法或者链接等错误,此机制可在运行前帮助程序员排查出可能潜在的语法、语义和类型转换错误,编译型语言一般都有明确的变量类型检测,也被称作强类型语言,即编译型语言至少能确保所生成的可执行文件肯定是可运行的,至于执行的逻辑不对则属于程序员业务逻辑错误范畴了。
      而对于解释型语言,代码中的错误必须直到运行阶段方可发现,由此造成的困惑是:往往一段程序看不出问题但却在运行阶段错误连连且需要一个个排查:变量拼写错误、方法不存在等。但也正是基于解释是在运行期执行转化的特性,一般的解释型语言通常都有自己的shell,可以在不确定某些执行结果是立即“动手执行”试一下,这就比每次都需要编译后才能运行并看到结果省去不少时间,鱼和熊掌不可兼得的理念再一次被验证了
    3、编译型在编译后生成的可执行文件,是相对与本机机器指令集的,所生成的可执行文件移植到不同机器指令集的机器上,势必不一定能正常运行。而解释型的,尽管在不同配置的机器上,也是最终会解释成基于当前机器指令集的机器码并执行,故解释型的可移植性相对来说还是强于编译型的。 
   4、鱼与熊掌不能兼得,两者各有优点也相互独立。编译型执行速度较解释型快,因为编译型会把大量时间花在编译上,所以对机器和跨平台性的要求不高,开发操作系统、大型应用程序、数据库程序系统时一般都采用编译型语言;而解释型由于每次运行都需要解释一遍,对机器有一定的配置要求(在内存较小的机器上去一遍遍解释执行肯定是件很痛苦的事),适用的地方是一些例如网页脚本、服务器脚本及辅助开发接口这类对机器配置要求不高、需要一定跨平台兼容性的程序。

你可能感兴趣的:(编译原理)