Python基础之编译型语⾔和解释型语⾔的区别
我们编写的源代码是⼈类语⾔,我们⾃⼰能够轻松理解;但是对于计算机硬件(CPU),源代码就是天书,根本⽆法执⾏,计算机只能识别某些特定的⼆进制指令,在程序真正运⾏之前必须将源代码转换成⼆进制指令。
所谓的⼆进制指令,也就是机器码,是 CPU 能够识别的硬件层⾯的“代码”,简陋的硬件(⽐如古⽼的单⽚机)只能使⽤⼏⼗个指令,强⼤的硬件(PC 和智能⼿机)能使⽤成百上千个指令。
创建数据库连接失败然⽽,究竟在什么时候将源代码转换成⼆进制指令呢?不同的编程语⾔有不同的规定:
有的编程语⾔要求必须提前将所有源代码⼀次性转换成⼆进制指令,也就是⽣成⼀个可执⾏程序(Windows 下的 .exe),⽐如C语⾔、、Golang、Pascal(De lphi)、汇编等,这种编程语⾔称为编译型语⾔,使⽤的转换⼯具称为编译器。
有的编程语⾔可以⼀边执⾏⼀边转换,需要哪些源代码就转换哪些源代码,不会⽣成可执⾏程序,⽐如、、、Shell、等,这种编程语⾔称为解释型语⾔,使⽤的转换⼯具称为解释器。
简单理解,编译器就是⼀个“翻译⼯具”,类似于将中⽂翻译成英⽂、将英⽂翻译成俄⽂。但是,翻译源代码是⼀个复杂的过程,⼤致包括词法分析、语法分析、语义分析、性能优化、⽣成可执⾏⽂件等五个
步骤,期间涉及到复杂的算法和硬件架构。解释器与此类似,有兴趣的读者请参考《编译原理》⼀书,本⽂不再赘述。
c语言定义链表和是⼀种⽐较奇葩的存在,它们是半编译半解释型的语⾔,源代码需要先转换成⼀种中间⽂件(字节码⽂件),然后再将中间⽂件拿到虚拟机中执⾏。Java 引领了这种风潮,它的初衷是在跨平台的同时兼顾执⾏效率;C# 是后来的跟随者,但是 C# ⼀直⽌步于 Windows 平台,在其它平台鲜有作为。
编译型语⾔
对于编译型语⾔,开发完成以后需要将所有的源代码都转换成可执⾏程序,⽐如 Windows 下的.exe⽂件,可执⾏程序⾥⾯包含的就是机器码。只要我们拥有可执⾏程序,就可以随时运⾏,不⽤再重新编译了,也就是“⼀次编译,⽆限次运⾏”。
在运⾏的时候,我们只需要编译⽣成的可执⾏程序,不再需要源代码和编译器了,所以说编译型语⾔可以脱离开发环境运⾏。
编译型语⾔⼀般是不能跨平台的,也就是不能在不同的操作系统之间随意切换。
编译型语⾔不能跨平台表现在两个⽅⾯:
1) 可执⾏程序不能跨平台
可执⾏程序不能跨平台很容易理解,因为不同操作系统对可执⾏⽂件的内部结构有着截然不同的要求,彼此之间也不能兼容。不能跨平台是天经地义,能跨平台反⽽才是奇葩。
⽐如,不能将 Windows 下的可执⾏程序拿到 Linux 下使⽤,也不能将 Linux 下的可执⾏程序拿到 Mac OS 下使⽤(虽然它们都是)。
另外,相同操作系统的不同版本之间也不⼀定兼容,⽐如不能将 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 位平台下编写代码时,将 0x2f1e4ad23 赋值给 long 类型的变量是完全没有问题的,但是这样的赋值在 Windows 平台下就会导致数值溢出,让程序产⽣错误的运⾏结果。
让⼈苦恼的,这样的错误⼀般不容易察觉,因为编译器不会报错,我们也记不住不同类型的取值范围。
解释型语⾔
对于解释型语⾔,每次执⾏程序都需要⼀边转换⼀边执⾏,⽤到哪些源代码就将哪些源代码转换成机器码,⽤不到的不进⾏任何处理。每次执⾏程序时可能使⽤不同的功能,这个时候需要转换的源代码也不⼀样。
因为每次执⾏程序都需要重新转换源代码,所以解释型语⾔的执⾏效率天⽣就低于编译型语⾔,甚⾄存在数量级的差距。计算机的⼀些底层功能,或者关键算法,⼀般都使⽤ C/C++ 实现,只有在应⽤层⾯(⽐如⽹站开发、批处理、⼩⼯具等)才会使⽤解释型语⾔。
数据库常用增删改查命令在运⾏解释型语⾔的时候,我们始终都需要源代码和解释器,所以说它⽆法脱离开发环境。
当我们说“下载⼀个程序(软件)”时,不同类型的语⾔有不同的含义:
对于编译型语⾔,我们下载到的是可执⾏⽂件,源代码被作者保留,所以编译型语⾔的程序⼀般是闭源的。
对于解释型语⾔,我们下载到的是所有的源代码,因为作者不给源代码就没法运⾏,所以解释型语⾔的程序⼀般是开源的。
相⽐于编译型语⾔,解释型语⾔⼏乎都能跨平台,“⼀次编写,到处运⾏”是真是存在的,⽽且⽐⽐皆是。那么,为什么解释型语⾔就能快平台呢?
这⼀切都要归功于解释器!
我们所说的跨平台,是指源代码跨平台,⽽不是解释器跨平台。解释器⽤来将源代码转换成机器码,它就是⼀个可执⾏程序,是绝对不能跨平台的。
官⽅需要针对不同的平台开发不同的解释器,这些解释器必须要能够遵守同样的语法,识别同样的函数,完成同样的功能,只有这样,同样的代码在不同平台的执⾏结果才是相同的。
你看,解释型语⾔之所以能够跨平台,是因为有了解释器这个中间层。在不同的平台下,解释器会将相同的源代码转换成不同的机器码,解释器帮助我们屏蔽了不同平台之间的差异。
关于Pythonstrname必填
python基础代码大全加翻译Python 属于典型的解释型语⾔,所以运⾏ Python 程序需要解释器的⽀持,只要你在不同的平台安装了不同的解释器,你的代码就可以随时运⾏,不⽤担⼼任何兼容性问题,真正的“⼀次编写,到处运⾏”。count函数怎么用文字
Python ⼏乎⽀持所有常见的平台,⽐如 Linux、Windows、Mac OS、、FreeBSD、Solaris、PocketPC 等,你所写的 Python 代码⽆需修改就能在这些平台上正确运⾏。也就是说,Python 的可移植性是很强的。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论