来看看什么是:编译型语言和解释型语言的区别

news2024/12/24 13:29:05

通过高级语言编写的源码,我们能够轻松理解,但对于计算机来说,它只认识二进制指令,源码就是天书,根本无法识别。源码要想执行,必须先转换成二进制指令。

所谓二进制指令,也就是由 0 和 1 组成的机器码,能被计算机直接识别并执行。

然而,究竟在什么时候将源代码转换成二进制指令呢?不同的编程语言有不同的规定:

  • 有的编程语言要求必须提前将所有源代码一次性转换成二进制指令,也就是生成一个可执行程序(比如 Windows 下的 .exe 文件)​,比如C语言、C++、Golang、汇编语言等,它们都属于编译型语言,使用的转换工具称为编译器。​
  • 有的编程语​ 言可以一边执行一边转换,需要哪些源代码就转换哪些源代码,不会生成可执行程序,比如 Python、JavaScript、PHP、Shell 等,这类编程语言称为解释型语言,使用的转换工具称为解释器。 ​


简单地理解,编译器和解释器其实就是一个“翻译工具”,对源代码进行“翻译”是一个很复杂的过程,大致包括词法分析、语法分析、语义分析、性能优化、生成可执行文件等五个步骤,期间涉及到复杂的算法和硬件架构,有兴趣的读者请参考《编译原理》一书,这里不再赘述。

编译型语言和解释型语言的执行流程如下所示:

解释型语言和编译型语言


图1:编译型语言和解释型语言的执行流程


总结:对于编译型语言来说,在执行之前先要经过编译器将源码转换成 CPU 可识别的机器码文件(比如 Windows 下的 .exe 文件);解释型语言无需预先编译,而是由解释器逐行对源码进行解释,一边解释一边执行。

除编译型和解释型语言外,还有一种半编译半解释型语言,​ 比如 Java 和 C# 等,这 ​类语言将源代码先转换成一种中间文件(字节码文件),然后再将中间文件拿到虚拟机中执行。

那么,编译型语言和解释型语言各有什么特点呢?它们之间又有什么区别?

编译型语言

对于编译型语言,开发完成以后需要将所有的源代码都转换成可执行程序,比如 Windows 下的.exe文件就是一个可执行程序,它里面包含的就是机器码,只要拥有这个可执行程序,就可以随时运行,不需要再重新编译,也就是“一次编译,无限次运行”。

在运行的时候,我们只需要编译生成的可执行程序,此时就不再需要源代码和编译器,所以编译型语言可以脱离开发环境运行。

编译型语言通常是不能跨平台的,也就是不能在不同的操作系统之间随意切换。

编译型语言不能跨平台表现在两个方面:

1) 可执行程序不能跨平台

可执行程序不能跨平台很容易理解,因为不同操作系统对可执行文件的内部结构有着截然不同的要求,彼此之间也不能兼容。不能跨平台是天经地义,能跨平台反而才是奇葩。

比如,你不能将 Windows 下的可执行程序拿到 Linux 下使用,也不能将 Linux 下的可执行程序拿到 macOS 下使用(​ 虽然它们都是类 Unix 系统)。 ​

注意:相同操作系统的不同版本之间也不一定兼容,比如不能将 x64 程序(Windows 64 位程序)拿到 x86 平台上(Windows 32 位平台)运行。但反之一般可行,因为 64 位 Windows 对 32 位程序做了很好的兼容性处理。

2) 源代码不能跨平台

不同平台支持的函数、类型、变量等都可能不同,基于某个平台编写的源代码一般不能拿到另一个平台直接运行。下面以C语言为例进行说明。

【实例1】在C语言中,要想让程序暂停,我们可以使用“睡眠”函数。在 Windows 平台下该函数是 Sleep() ,并以毫秒为时间单位,而在 Linux 平台下则是 sleep(), 以秒为单位。可以看出,首先两个函数的首字母大小写不同,再者 Sleep() 的参数是毫秒,而 sleep() 的参数是秒,单位也不一样。

以上两个原因导致具有暂停功能的C语言程序不能跨平台,除非在代码层面对平台的兼容性做出处理,但这非常麻烦。

【实例2】虽然不同平台的C语言都支持 long 类型,但不同平台下 long 类型所占用的字节长度却不相同。例如 Windows 64 位平台下的 long 占用 4 个字节,Linux 64 位平台下的 long 却占用 8 个字节。

如果在 Linux 64 位平台下编写代码时,将 8 字节的值赋值给 long 类型的变量,这是完全没有问题的,但如果是在 Windows 平台下就会导致数值溢出,让程序产生错误的运行结果。

解释型语言

对于解释型语言,每次执行程序都需要一边转换一边执行,用到哪些源代码就将哪些源代码转换成机器码,用不到的则不进行任何处理。

由于每次执行程序都需要重新转换源代码,所以解释型语言的执行效率天生就低于编译型语言,甚至是数量级的差距。因此计算机的一些底层功能,或者关键算法,一般都使用 C/C++ 实现,只有在应用层面(比如网站开发、批处理、小工具等)才会使用解释型语言。

在运行解释型语言的时候,我们始终都需要源代码和解释器,所以说它无法脱离开发环境。

例如,当我们说“下载一个程序(软件)”时,不同类型的语言有不同的含义:

  • 对于编译型语言,我们下载到的是可执行文件,源代码被作者保留,所以编译型语言的程序一般是闭源的;
  • 对于解释型语言,我们下载到的是所有的源代码,因为作者不给源代码就没法运行,所以解释型语言的程序一般是开源的。


相比于编译型语言,解释型语言几乎都能跨平台,“一次编写,到处运行”是真实存在的,而且比比皆是。那么,为什么解释型语言就能跨平台呢?

其实,这一切都要归功于解释器!

这里所说的跨平台,是指源代码跨平台,而非解释器跨平台。解释器用来将源代码转换成机器码,它本质上就是一个可执行程序,是绝对不能跨平台的。

我们以 Python 为例,Python 官方针对不同平台(比如 Windows、macOS、Linux )开发了不同的解释器,这些解释器必须要遵守同样的语法,识别同样的函数,完成同样的功能。只有这样,同一份代码才能在不同平台上拥有相同的执行结果。

你看,解释型语言之所以能够跨平台,是因为有了解释器这个中间层。在不同的平台下,解释器会将相同的源代码转换成不同的机器码,解释器帮助我们屏蔽了不同平台之间的差异性。

关于Python

Python 属于典型的解释型语言,所以运行 Python 程序需要解释器的支持,只要你在不同的平台安装了不同的解释器,你的代码就可以随时随地运行,不用担心任何兼容性问题,真正实现了“一次编写,到处运行”。

Python 几乎支持所有常见的平台,比如 Linux、Windows、​macOS、Android​、FreeBSD、Solaris、PocketPC 等,我们所写的 Python 代码无需修改就能直接在这些平台上正确运行。也就是说,Python 的可移植性是很强的。

总结

下表对编译型语言和解释型语言的差异进行了总结:
 

类型原理优点缺点
编译型语言通过专门的编译器,将所有源代码一次性转换成特定平台(Windows、Linux、macOS等)的机器码(以可执行文件的形式存在)。编译一次后,脱离了编译器也能运行,并且运行效率高。可移植性差,不够灵活。
解释型语言通过专门的解释器,根据需要可以将部分或全部源代码转换成特定平台(Windos、Linux、macOS等)的机器码。跨平台性好,通过不同的解释器,将相同的源代码解释成不同平台下的机器码。一边执行一边转换,效率较低。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/988892.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

非插座式水壶/插座式水壶:SOR/2016-181(水壶法规)和CSA 22.1标准解读!

电水壶作为一种常见的小家电,受到了广大消费者的喜爱。然而,由于安全问题的日益重视,亚马逊加拿大站决定加强对电水壶产品的审核,以确保消费者的安全和权益。 近日,亚马逊平台发布公告,要求在加拿大站销售…

C/C++苹果和虫子 2019年9月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C苹果和虫子 一、题目要求 1、编程实现 2、输入输出 二、解题思路 1、案例分析 三、程序代码 四、程序说明 五、运行结果 六、考点分析 C/C苹果和虫子 2019年9月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 你买了一箱n个苹果,很不幸…

printf scanf

目录 printf scanf printf 把十的二进制代码放进去了,i对的是二进制代码,指定这一串0101代码以什么样的格式输出。 为什么要输出控制符,因为里面放的是二进制,必须控制输出的格式,指定这一串二进制以什么样的格式输出…

当妈妈们开始精致悦已,母婴品牌该怎么做营销?媒介盒子告诉你

近年来,二孩政策全面放开,母婴行业产品溢价高利润可观,优质品牌层出不穷,那么母婴行业该如何宣传产品呢? 试试软文推广吧!软文推广是企业宣传最有效且投入成本最低的宣传方式了。 母婴行业做软文推广可以达…

[uni-app] 海报图片分享方案 -canvas绘制

文章目录 canvas使用记录先看下实际效果图绘制流程及思路1. 绘制头像, 通过drawImage来绘制2.绘制文字部分 具体代码 分享海报图片的方式,以前再RN端采用的是截图方案, 我记得组件好像是 react-native-view-shot 现在要处理uni-app的海报图片分享, 一般也有 html2canvas的相关插…

二维码怎么做调查问卷?二维码统计数据的技巧

小伙伴们一定发现,现在用来收集用户数据时,通过扫码填表的方式在很多场景中都被应用,这种方式有效的提升制作者获取用户数据的速度,而且对于填表者而言也更加的便捷。那么用二维码生成器(免费在线二维码生成器-二维码在…

Docker网络功能

基本网络功能 Docker 允许通过外部访问容器或容器互联的方式来提供网络服务。使用docker network子命令来管理Docker网络。 外部访问容器可通过端口映射实现,启动容器时使用-p参数指定映射关系。-p可多次使用来绑定多个端口。使用docker port命令查看当前映射的端…

VR全景拍摄发展如何?在各行业应用中有优势吗?

现如今,虚拟现实技术正在以惊人的速度改变着我们的生活,而VR全景拍摄作为一种创新的拍摄方式,可以为大家带来全新的视觉体验。通过VR全景拍摄,可以将平面画面变得更加逼真、更具沉浸感,让人仿佛置身于真实场景之中。 近…

蚂蚁发布金融大模型:两大应用产品支小宝2.0、支小助将在完成备案后

9月8日,在上海举办的外滩大会上,蚂蚁集团正式发布金融大模型。据了解,蚂蚁金融大 模型基于蚂蚁自研基础大模型,针对金融产业深度定制,底层算力集群达到万卡规模。该大 模型聚焦真实的金融场景需求,在“认知…

恭贺弘博创新2023下半年软考(中/高级)认证课程顺利举行

为迎接2023年下半年软考考试,弘博创新于2023年9月2日举行了精品的软考中/高级认证课程,线下线上学员都积极参与学习。 在课程开始之前,弘博创新的老师为学员们提供了详细的学习资料和准备建议,以确保学员们在课程中能够跟上老师的…

如何排查网站及APP数据泄露的源头

近年来数据泄露安全事件频发,在今年的hw网络安全攻防演练中,获取敏感信息、数据泄露等漏洞的得分也越来越高,我们SINE安全近十年来成功的帮助了许多客户,查找到了数据泄露的原因,在这里向大家分享我们的经验与心得&…

程序员面试逻辑题

红白帽子推理 答案: 这个题有点像数学归纳法,就是假设有 A A A和 B B B两个人是黑色的帽子,这样的话第一次开灯, A A A看到 B B B是黑色的,其他人都是白色的,那么 A A A会觉得 B B B是那个黑色的&#xff0…

【2023高教社杯】B题 多波束测线问题 问题分析、数学模型及参考文献

【2023高教社杯】B题 多波束测线问题 问题分析、数学模型及参考文献 1 题目 1.1 问题背景 多波束测深系统是利用声波在水中的传播特性来测量水体深度的技术,是在单波束测深的基础上发展起来的,该系统在与航迹垂直的平面内一次能发射出数十个乃至上百个…

从gles,vulkan到metal(二)-- 同步和内存

无论以任何形式本篇文章内容,请注明来自leonnwei的csdn blog 在第一章节中我们讨论了图形API的基本数据结构和图形指令的提交机制,在指令的生成,提交,执行过程中,在复杂而又高度并行的GPU管线中,必然存在着…

安全模型中的4个P

引言:在安全模型中,经常会碰到PDR,PPDR,IPDRR,CARTA-PPDR等模型,其中的P,是predicet?是prevent?还是protect?还是policy呢? 一、4P字典意思解释 1、predict&…

【C++基础】3. 数据类型

文章目录 【 1. 数据类型分类 】1.1 字符型1.2 整型1.3 浮点型1.4 布尔型1.5 无类型1.6 枚举类型1.7 其他类型1.8 类型占用大小输出 【 2. typedef 类型声明 】 使用编程语言进行编程时,我们需要用到各种变量来存储各种信息。变量保留的是它所存储的值的内存位置&am…

iOS创建Category类别(扩展类)

我要为UIButton扩展其他系统提供以外的方法,这就要用到扩展类了 创建步骤如下图: 步骤一:New File 步骤二:选中Objective-c File 步骤三:File名称随便起(这里写了AaaBtn),继承Class为UIButton 步骤四&…

4. xaml Button按钮

1.运行图片 2.源码 <Grid><!--BorderBrush="BlueViolet" 边框颜色--><!--BorderThickness="2" 边框线的粗细--><

软件测试适合零基础学么

零基础学习软件测试不失为一个好的选择&#xff0c;虽然IT行业里对小白最友好的非软件测试莫属了&#xff0c;但是也要看你个人在学习软件测试这件事上面花费了多少的时间和努力了~ 每年毕业季&#xff0c;IT行业依然是比较热门且收入是最高的行业。对于应届毕业生来说想要进入…