python常用编译器和解释器的区别_编译器和解释器各有什么特点与区别

编译器和解释器各有什么特点与区别

这是我们编译原理老师前几天发在在线学习平台上(没办法,因为肺炎,都只能搞个在线学习了)的一个课前讨论问题,写着写着就发现好像写的有点多了,不好发布在平台上了,于是就干脆写成了文章的形式,发布在了知乎上面,也算是自己的之前学习编译原理后的复习与总结,如有遗漏或错误,欢迎大家进行指正。

如果直接说解释器与编译器的特点与区别,会比较抽象,不好理解,最好拿一些特定的编程语言来举例子。

首先我们来列举一下常见的编程语言:Java、C、C++、Python、JavaScript、PHP.....

然后我们把这些语言分个类,类型1:C、C++

类型2:JavaScript、Python、PHP

类型3:Java

这个分类是按照使用编译器还是解释器来进行分的,或许你会比较疑惑的是,为啥会有三个类别呢,不应该是两个吗?

其实确实应该是两个,但问题是,Java既用了解释器也用编译器,所以只能单独立出来了。

对于类型1,我们一般称为编译型语言,也就是需要用到编译器进行编译。

对于类型2,我们一般称为解释型语言,或是脚本语言,也就是要用解释器进行解释。

在说具体的解释型语言与编译型语言之前,我想提一下,或许有的人会有这样的一种认知,能直接运行的就是编译型语言,不能直接运行的就是解释性语言,这种理解其实是有偏差的,不管是编译型还是解释型语言,它们都是无法直接运行的,在windows下可以直接运行的一般情况下只有以.exe结尾的可执行文件,而.exe文件里都是二进制数据,之所以是二进制数据的原因是,最终执行程序的不是系统,而是CPU,而CPU它只认识二进制数。

既然操作系统或者CPU都无法直接执行这些语言,那怎么办呢,这时就需要编译器或解释器了,它们起到了一个翻译官的作用,它们将自己认识的语言翻译成操作系统或者CPU可以执行的二进制数据,同时这二者的区别就体现在了这个翻译的过程里。

在我们的日常生活中也有许多做翻译工作的人,大多数可以分为两类,一类是笔译,一类是口译,笔译就是用文字将一份文档翻译成另一种语言编写的文档,口译就是以口语的方式,将译入语转换为译出语的方式。

而编译器与解释器就类似于笔译工作者与口译工作者的区别,编译器就是笔译工作者,而解释器就是口译工作者。编译器在编译的过程中,读入源程序文件,输出一份等价的二进制可执行文件,就和笔译工作者一样,他们都会输出一份翻译后的文件。

解释器在解释的过程中,读入源程序文件,输出的是执行的结果,就和口译工作者一样,他们输出的是已经完成翻译的结果。

输出的不同是这两者最大的区别,一个会输出用于执行的文件,另一个只会输出运行的结果;

同时,我们都知道,一般情况下,编译器输出的执行文件在执行的过程中,不管是运行速度还是效率都能甩解释器几条大街,那是不是就是说,编译型语言就比解释型语言要好呢?或者说我们有编译器就够了,还要啥解释器呀,速度又慢,效率又低,运行还要装个解释器,麻烦的要死。

其实并不是这样的,任何事物的存在性必有其合理性,事实上解释器也有许多编译器没有的优点。

首先,最广为人知的一点是,解释型语言可以跨平台执行,只要这个平台有对应的解释器就行,毕竟真正执行程序的是解释器而不是平台系统。

另外,解释型语言在开发效率上比编译型语言强大许多,同样的功能,用解释型语言写的代码要远远少于编译型语言的代码量。

还有一点就是,其实解释型语言并不慢,甚至某种程度上比编译型语言还要快上好几分,我估计不少人要犯嘀咕了,前面不是说编译型更快吗,怎么这里又说解释型更快了呢?

其实是这样的,我们在执行编译型语言的时候,大都忽略了编译器在编译的时候所花的时间,但其实这个时间应该是要算上的,如果不算上的话,对解释器就太不公平了,就和两个人比赛百米赛跑,但其中一个人在起跑的时候已经站在50米的位置了,这明显就是欺负人。

事实上编译器在编译的过程中所花的时间是极高的,甚至可以这么说,分别用解释型语言和编译型语言写同一个程序,然后同时开始运行(注:此处运行的条件是二者都是源代码的情况下,也就是说编译型语言还需要编译),解释器都运行结束,结果都出来了,而编译器还在编译呢,别说结果了,还没正式开始运行呢。

曾经在网上看到过有人吐槽C++编译太慢的问题,说早上来到公司,看到有一个Bug被上报了,然后开始愉快的Debug,改了十分钟就改好了,然后按下了编译键,接着开始等它编译完成,一直等到下午快下班的时候才显示编译完成,于是一天就改了一个bug。

或许有人不服,说自己c++编译很快的,几秒就完成了,那是因为你C++文件太少了,一两个确实快呀,可问题是你见过哪个公司项目中只有一两个C++文件的,大都是几百甚至上千个文件,所以这个时候,用c++进行调试工作是一件及其耗时的事情,而解释型语言就不会有这个问题,换句话说解释型语言启动速度快,但启动后的运行效率不高,而编译型语言启动速度慢,但启动后运行效率高,这也是两者一个极大的区别。

这里简单提一下上面的类型3,也就是Java这个语言,它既可以说是编译型语言也可以说是解释型语言,因为它内部既有解释器也有编译器(还不止一个)的存在。

Java中编译器比较多,它包含一个前端编译器,一个后端编译器(JIT)以及一个静态预编译器(AOT)。前端编译器的功能是从源代码生成Java字节码,也就是中间代码;

后端编译器,也叫作即时编译器(JIT)它是包含在了JVM中,用于在执行的过程中,将热点代码(也就是执行次数比较多的代码)转化为本地机器码,并做一些优化,以加速执行效率。

静态预编译器(AOT)它是直接将java源代码编译成本地机器码,也就是传统意义上的编译器,但用的不多,因为这样会使java的一些特性丢失。

Java中的解释器与JIT一起打包,作为JVM中的执行引擎,解释器主要将字节码进行解释执行,同时配合JIT进行代码的优化操作。

最后,这里总结一下编译器与解释器的特点和区别

特点:解释器:

优点:跨平台、启动速度快、开发效率高

缺点:执行速度慢,执行效率低

编译器:

优点:执行速度快、执行效率高

缺点:平台相关性高,编译速度(启动速度)慢,开发效率低

可以看出,二者的特点起到了一个很好的互补关系,所以没有谁好谁坏的说法,同时Java很好的融合了这两者的优点。

区别:编译器输出一个翻译完成后的可执行文件,是一个二进制数据流;解释器输出解释后运行的结果;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值