Java 和 C# 是一种比较奇葩的存在,它们是半编译半阐明型的措辞,源代码须要先转换成一种中间文件(字节码文件),然后再将中间文件拿到虚拟机中实行。
Java 引领了这种风潮,它的初衷是在跨平台的同时兼顾实行效率;C# 是后来的跟随者,但是 C# 一贯止步于 Windows 平台,在其它平台鲜有作为。

图 1 编译型措辞和解释型措辞的实行流程

那么,编译型措辞和解释型措辞各有什么特点呢?它们之间有什么差异?

php编译还是解释型编译型说话息争释型说话的差别 Webpack

编译型措辞

对付编译型措辞,开拓完成往后须要将所有的源代码都转换成可实行程序,比如 Windows 下的.exe文件,可实行程序里面包含的便是机器码。
只要我们拥有可实行程序,就可以随时运行,不用再重新编译了,也便是“一次编译,无限次运行”。
在运行的时候,我们只须要编译天生的可实行程序,不再须要源代码和编译器了,以是说编译型措辞可以分开开拓环境运行。
编译型措辞一样平常是不能跨平台的,也便是不能在不同的操作系统之间随意切换。
编译型措辞不能跨平台表现在两个方面:

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

可实行程序不能跨平台很随意马虎理解,由于不同操作系统对可实行文件的内部构造有着截然不同的哀求,彼此之间也不能兼容。
不能跨平台是天经地义,能跨平台反而才是奇葩。
比如,不能将 Windows 下的可实行程序拿到 Linux 下利用,也不能将 Linux 下的可实行程序拿到 Mac OS 下利用(虽然它们都是类 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 位平台下编写代码时,将 0x2f1e4ad23 赋值给 long 类型的变量是完备没有问题的,但是这样的赋值在 Windows 平台下就会导致数值溢出,让程序产生缺点的运行结果。
让人苦恼的,这样的缺点一样平常不随意马虎察觉,由于编译器不会报错,我们也记不住不同类型的取值范围。

阐明型措辞

对付阐明型措辞,每次实行程序都须要一边转换一边实行,用到哪些源代码就将哪些源代码转换成机器码,用不到的不进行任何处理。
每次实行程序时可能利用不同的功能,这个时候须要转换的源代码也不一样。
由于每次实行程序都须要重新转换源代码,以是阐明型措辞的实行效率天生就低于编译型措辞,乃至存在数量级的差距。
打算机的一些底层功能,或者关键算法,一样平常都利用 C/C++ 实现,只有在运用层面(比如网站开拓、批处理、小工具等)才会利用阐明型措辞。
在运行阐明型措辞的时候,我们始终都须要源代码和解释器,以是说它无法分开开拓环境。
当我们说“下载一个程序(软件)”时,不同类型的措辞有不同的含义:

对付编译型措辞,我们下载到的是可实行文件,源代码被作者保留,以是编译型措辞的程序一样平常是闭源的。
对付阐明型措辞,我们下载到的是所有的源代码,由于作者不给源代码就没法运行,以是阐明型措辞的程序一样平常是开源的。

比较于编译型措辞,阐明型措辞险些都能跨平台,“一次编写,到处运行”是真是存在的,而且比比皆是。
那么,为什么阐明型措辞就能快平台呢?这统统都要归功于阐明器!
我们所说的跨平台,是指源代码跨平台,而不是阐明器跨平台。
阐明器用来将源代码转换成机器码,它便是一个可实行程序,是绝对不能跨平台的。
官方须要针对不同的平台开拓不同的阐明器,这些阐明器必须要能够遵守同样的语法,识别同样的函数,完成同样的功能,只有这样,同样的代码在不同平台的实行结果才是相同的。
你看,阐明型措辞之以是能够跨平台,是由于有理解释器这个中间层。
在不同的平台下,阐明器会将相同的源代码转换身分歧的机器码,阐明器帮助我们屏蔽了不同平台之间的差异。

关于 Python

Python 属于范例的阐明型措辞,以是运行 Python 程序须要阐明器的支持,只要你在不同的平台安装了不同的阐明器,你的代码就可以随时运行,不用担心任何兼容性问题,真正的“一次编写,到处运行”。
Python 险些支持所有常见的平台,比如 Linux、Windows、Mac OS、Android、FreeBSD、Solaris、PocketPC 等,你所写的 Python 代码无需修正就能在这些平台上精确运行。
也便是说,Python 的可移植性是很强的。