解释与编译

来源:互联网 发布:网络管理经验 编辑:程序博客网 时间:2024/06/07 22:55

 用高级语言或汇编语言编写的程序称为源程序。计算机不能直接执行源程序,必须先把源程序翻译成为用"1"和"0"这两个机器代码表示的目标程序,即用机器语言编码的程序。语言处理就是将源程序翻译成目标程序。翻译方式一般分为编译和解释两种。

     区别:

     一:执行速度

  编译是把源代码全部转换为可以直接执行的指令,从而程序运行速度比较快。   
  解释是把当前行的代码转换为可以直接执行的指令,执行完毕,就要解释下一句代码,边解释,边执行,速度慢。

    二:翻译后中间代码

    编译型的设计语言的编译初始也是先将其编译成中间的伪代码形式,然后形成机器代码,你知道机器代码的执行速度比其他的码要快,但是他的执行语句描述在体积上会很大.   
    解释型的语言生成的是伪代码,也就是其执行需要解释器,实际上伪代码也是一种能够简单描述指令的代码行为,例如PASCAL语言.例如Vb生成的就是伪代码.

 

 

 

解释,通常是将源代码解析为一个中间形式(比如抽象语法树,AST),然后,经由一个软件的执行引擎执行这个中间形式,产生对应的结果。这种做法的好处就是可以把执行逻辑独立处理,无须为每个平台编写不同的代码,所以,这种做法的可移植性很好,于是,它成了不少程序设计语言最初的选择。不过,随之而来的问题就是这会降低执行速度,毕竟,这个软件执行引擎的性能无法与硬件相比。所以,以硬件作为执行引擎的“编译”会让程序拥有更佳的性能。

采用编译的方式,我们可以将代码编译成可以由硬件直接执行的二进制代码。因为不同硬件和不同操作系统的二进制格式是不同的,所以,如果希望语言得到广泛应用,那便需要针对不同平台实现平台相关的编译器后端,理论上说,这不是一件不能完成的任务,但这意味着巨大的工作量。虽然编译语言的数量不在少数,但事实上,真正能够跨越各种软硬平台的编译语言似乎只有C。

虚拟机的出现让人们找到了在软硬件执行引擎之间的一个折衷。一方面,编译器只要生成针对虚拟机的代码,而不必为各种各样的软硬件平台费心,另一方面,虚拟机不断的优化可以让程序在不受编译器的影响下越跑越快。所以,许多程序设计语言走上了这条路,比如Java,比如Python。这些语言大多采用的是自行设计的虚拟机,但这个做法虽然可以充分的将语言特性与虚拟机结合起来,但无疑也意味着大量的重复工作。Parrot希望成为一个集大成者,为众多动态语言搭建一个共同的平台,只是不知何年何月才能实现它宏大的目标。

Java虚拟机(JVM)的普及为这个问题提供了另外一种选择。因为主流软硬件平台上基本都有自己的JVM实现,所以,只要生成针对JVM的代码——字节码,便意味着可以运行在大多数平台上。当然,虚拟机也是一种软件实现,所以,性能上也会有一些损失。不过,从Java平台的广泛应用也证明了,这样的损失在实践中是可以接受的。随着JVM技术上的不断进步,性能损失越来越小。再者,作为一种为静态语言设计的平台,目前,JVM自身并不支持动态语言特性,所以,要想让动态语言语言运行在上面,需要额外做一些工作,搭建一套支撑动态语言的结构。不过,随着一些动态语言逐渐被移植到JVM上,人们也意识到了这个问题上,开始考虑在JVM中增加动态语言的支持。

除了执行性能之外,编译带来的好处还在于保护源代码。因为解释方式通常不会保留的其中间形式,所以,产品发布意味着将源代码也发布出去。对于需要保护知识产权的公司和个人而言,这是他们所不愿意看到的。通过编译的方式,我们将源代码转成了二进制,这样,源代码可以得到有效保护。当然,破解二进制也是有可能的,不过,那就是另外的故事了。

原创粉丝点击