编译型语⾔与解释型语⾔的区别及各⾃的优缺点
计算机编程语⾔种类⾮常多,根据与计算机硬件贴近程度和抽象程度⼤致可分为3类,⾃顶向下分别是:
⾼级语⾔(抽象层次更⾼的便于记忆和表⽰的英⽂代码)
|
汇编语⾔(抽象层次较⾼的对应机器硬件的cpu指令集,英⽂缩的助记符号代码)
|
机器语⾔(抽像层次最低的由0、1序列所表⽰的机器码)
众所周知,计算机底层只能识别(并执⾏)0、1序列的机器码,这表⽰所有的⾼级编程语⾔所编写的代码,最终都要以某种⽅式被转换成能被计算机识别的0、1序列机器码,⽅可被计算机接受并执⾏。这种将代码转换为机器码的⽅式可分为编译型和解释型这2类:
概念:
编译型语⾔:把做好的源程序全部编译成⼆进制代码的可运⾏程序。然后,可直接运⾏这个程序。
解释型语⾔:把做好的源程序翻译⼀句,然后执⾏⼀句,直⾄结束!
编译型语⾔
编译是指在应⽤源程序执⾏之前,就将程序源代码“翻译”成⽬标代码(机器语⾔),因此其⽬标程序可以脱离其语⾔环境独⽴执⾏,使⽤⽐较⽅便、效率较⾼。但应⽤程序⼀旦需要修改,必须先修改源代码,再重新编译⽣成新的⽬标⽂件(* .OBJ)才能执⾏,只有⽬标⽂件⽽没有源代码,修改很不⽅便。现在⼤多数的编程语⾔都是编译型的。编译程序将源程序翻译成⽬标程序后保存在另⼀个⽂件中,该⽬标程序可脱离编译程序直接在计算机上多次运⾏。⼤多数软件产品都是以⽬标程序形式发⾏给⽤户的,不仅便于直接运⾏,同时⼜使他⼈难于盗⽤其中的技术C、C++、Fortran、Visual Foxpro、Pascal、Delphi、Ada都是编译实现的。
解释型语⾔
解释型语⾔的实现中,翻译器并不产⽣⽬标机器代码,⽽是产⽣易于执⾏的中间代码,这种中间代码与机器代码是不同的,中间代码的解释是由软件⽀持的,不能直接使⽤硬件,软件解释器通常会导致执⾏效率较低。⽤解释型语⾔编写的程序是由另⼀个可以理解中间代码的解释程序执⾏的。与编译程序不同的是,解释程序的任务是逐⼀将源程序的语句解释成可执⾏的机器指令,不需要将源程序翻译成⽬标代码后再执⾏。释程序的优点是当语句出现语法错误时,可以⽴即引起程序员注意,⽽程序员在程序开发
期间就能进⾏校正。对于解释型Basic语⾔,需要⼀个专门的解释器解释执⾏ Basic程序,每条语⾔只有在执⾏才被翻译。这种解释型语⾔每执⾏⼀次就翻译⼀次,因⽽效率低下。⼀般地,动态语⾔都是解释型的,如python、Tcl、Perl、Ruby、VBScript、 JavaScript等。
混合型
Java很特殊,Java程序也需要编译,但是没有直接编译称为机器语⾔,⽽是编译称为字节码,然后在Java虚拟机上⽤解释⽅式执⾏字节码。Python 的也采⽤了类似Java的编译模式,先将Python程序编译成Python字节码,然后由⼀个专门的Python字节码解释器负责解释执⾏字节码。(Java虚拟机对字节码的执⾏相当于模拟⼀个cpu,⽽ruby1.8–在虚拟机还未出现前–是通过解释成语法树执⾏。)
区别
编译型语⾔####
1、编译型语⾔最⼤的优势之⼀就是其执⾏速度。⽤C/C++编写的程序运⾏速度要⽐⽤Java编写的相同程序0%-70%。
2、编译型程序⽐解释型程序消耗的内存更少。
3、不利的⼀⾯——编译器⽐解释器要难写得多。
4、编译器在调试程序时提供不了多少帮助——有多少次在你的C语⾔代码中遇到⼀个“空指针异常”时,需要花费好⼏个⼩时来明确错误到底在代码中的什么位置。
5、可执⾏的编译型代码要⽐相同的解释型代码⼤许多。例如,C/C++的.exe⽂件要⽐同样功能的Java的.class⽂件⼤很多。
6、编译型程序是⾯向特定平台的因⽽是平台依赖的。
7、编译型程序不⽀持代码中实现安全性——例如,⼀个编译型的程序可以访问内存的任何区域,并且可以对你的PC做它想做的任何事情(⼤部分病毒是使⽤编译型语⾔编写的)
8、由于松散的安全性和平台依赖性,编译型语⾔不太适合开发因特⽹或者基于Web的应⽤。
解释型语⾔
1、解释型语⾔提供了极佳的调试⽀持。⼀名Java程序员只需要⼏分钟就可以定位并修复⼀个“空指针异常”,因为Java运⾏环境不仅指明了异常的性质,⽽且给出了异常发⽣位置具体的⾏号和函数调⽤顺序(著名的堆栈跟踪信息)。这样的便利是编译型语⾔所⽆法提供的。
2、另⼀个优势是解释器⽐编译器容易实现
3、解释型语⾔最⼤的优势之⼀是其平台独⽴性
4、解释型语⾔也可以保证⾼度的安全性——这是互联⽹应⽤迫切需要的
5、中间语⾔代码的⼤⼩⽐编译型可执⾏代码⼩很多
6、平台独⽴性,以及严密的安全性是使解释型语⾔成为适合互联⽹和Web应⽤的理想语⾔的2个最重要的因素。
源程序是指什么程序7、解释型语⾔存在⼀些严重的缺点。解释型应⽤占⽤更多的内存和CPU资源。这是由于,为了运⾏解释型语⾔编写的程序,相关的解释器必须⾸先运⾏。解释器是复杂的,智能的,⼤量消耗资源的程序并且它们会占⽤很多CPU周期和内存。
8、由于解释型应⽤的decode-fetch-execute(解码-抓取-执⾏)的周期,它们⽐编译型程序慢很多。
9、解释器也会做很多代码优化,运⾏时安全性检查;这些额外的步骤占⽤了更多的资源并进⼀步降低了应⽤的运⾏速度。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论