13589067279

精品源码、源码交易、源码下载

新闻资讯

解释型语言和编译型语言的不同之处

发布时间:2021-05-21

我们编写的源代码是人类语言,我们可以很容易地自己理解。但是对于计算机硬件(CPU),源代码是一本天堂之书,根本无法执行。计算机只能识别某些特定的二进制指令。源代码被转换为二进制指令。

所谓的二进制指令,即机器代码,是CPU可以识别的硬件级别的“代码”。简单的硬件(例如古老的单芯片计算机)只能使用数十条指令,而功能强大的硬件(PC和智能手机)可以使用它们。数百条指令。

但是,到底什么时候将源代码转换为二进制指令?不同的编程语言有不同的规定:

某些编程语言要求所有源代码必须事先一次转换为二进制指令,即生成可执行程序(Windows下为.exe),例如C语言,C ++,Golang,Pascal(Delphi) ,汇编等。此编程语言称为编译语言,而使用的转换工具称为编译器。

某些编程语言可以在执行时进行转换,并且可以根据需要转换源代码,并且不会生成可执行程序,例如Python,JavaScript,PHP,Shell,MATLAB等。这种编程语言称为解释型语言和用途转换工具称为解释器。

简单理解,编译器是一个“翻译工具”,类似于将中文翻译成英文和将英文翻译成俄文。但是,翻译源代码是一个复杂的过程,大致包括五个步骤:词法分析,语法分析,语义分析,性能优化和可执行文件生成,其中涉及复杂的算法和硬件体系结构。解释器与此类似,有兴趣的读者请参阅《编译器原理》一书,本文将不再赘述。

Java和C#是一种奇怪的存在。它们是半编译和半解释语言。需要将源代码转换为中间文件(字节码文件),然后在虚拟机中执行该中间文件。 Java引领了这一趋势。其初衷是在跨平台时考虑执行效率。 C#是后来的追随者,但C#始终在Windows平台上停止运行,而对其他平台影响不大。

那么,编译语言和解释语言的特征是什么?它们之间有什么区别?

编译语言

对于编译语言,开发完成后,所有源代码都需要转换为可执行程序,例如Windows下的.exe文件。可执行程序包含机器代码。只要我们有一个可执行程序,我们就可以在任何时间运行它而无需重新编译,即“一次编译,无限次运行”。

在运行时,我们只需要编译生成的可执行程序,而不再需要源代码和编译器,因此编译后的语言可以在没有开发环境的情况下运行。

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

编译语言不能通过两种方式跨平台:

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

由于不同的操作系统对可执行文件的内部结构有完全不同的要求,并且它们彼此不兼容,因此跨平台不容易理解可执行程序。不能跨平台是有道理的,但是能够跨平台是一件很了不起的事情。

例如,您不能在Linux下的Windows下使用可执行程序,也不能在Mac OS下的Linux下使用可执行程序(尽管它们都是类似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的可移植性非常强。


QQ客服