首页 > 编程知识 正文

编程语言难度排名(解释与编译的区别)

时间:2023-05-04 08:45:55 阅读:85235 作者:4622

他们写的源代码是人类语言,我们自己很容易理解; 但是,对于计算机硬件(CPU ),源代码是天书,根本无法执行。 计算机只能识别特定的二进制指令,在程序实际执行之前必须将源代码转换为二进制指令。 二进制指令,也就是机械代码,是CPU能够识别的硬件级别的“代码”,简陋的硬件(例如旧的单片机)只能使用几十个指令,强大的硬件(PC和智能手机, 但是,什么时候将源代码转换为二进制指令呢? 规定因编程语言而异:

根据不同的编程语言,需要预先将所有源代码转换为二进制指令。 也就是说,需要生成c语言、c、Golang、Pascal(Delphi )、程序集等可执行文件(Windows的. exe )。 这种编程语言称为编译型语言,使用的转换工具称为编译器。 有些编程语言可以边运行边转换,有些语言可以转换所需的源代码,但不生成可执行程序。 例如,Python、JavaScript、PHP、外壳、MATLAB等。 这样的编程语言称为解释器型语言,使用的转换工具称为解释器。 简单来说,编译器是一种“翻译工具”,类似于将中文翻译成英语,将英语翻译成俄语。 但是,源代码翻译是一个复杂的过程,包括词法分析、语法分析、语义分析、性能优化和可执行文件的生成五个步骤,其中涉及复杂的算法和硬件体系结构。 解释器与此类似。 有兴趣的人请参考《编译原理》这本书。 在此省略说明。

Java和C#是比较奇怪的存在,是半编译半解释器型的语言。 源代码必须转换为中间文件(字节码文件),然后将中间文件导入虚拟机中执行。 Java引领了这种风潮,其目的是跨越平台,同时兼顾执行效率,而C#只是后来的跟随者,而C#只是停留在Windows平台上,在其他平台上用处不大。

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

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

对于

编译型语言

编译型语言,开发完成后,需要将所有源代码转换为可执行程序,例如Windows下的. exe文件。 可执行程序包含的是机器代码。 我们只要有可执行程序,随时都可以执行。 不需要重新编译。 也就是说,“一次编译,无限执行”。 在运行时,只需编译生成的可执行文件,不需要源代码或编译器。 因此,编译型语言可以远离开发环境运行。 编译型语言一般不能跨平台使用。 也就是说,不能在不同的操作系统之间自由切换。 编译型语言无法在跨平台中表达两个方面。

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

可执行程序如果越过平台很难理解。 由于操作系统不同,可执行文件的内部结构完全不同,因此彼此不兼容。 不能越过平台是天经地义的,越过平台才是奇怪的。 例如,不能将Windows可执行文件拿到Linux下使用,也不能将Linux下的可执行文件拿到Mac OS下使用(虽然它们都是类Unix系统)。 此外,同一操作系统的不同版本之间也不一定兼容,例如无法在x86平台、Windows 32位平台上运行x64程序(Windows 64位程序)。 然而,由于64位Windows对32位程序进行了良好的兼容性处理,相反一般是可能的。

2) 源代码不能跨平台

平台支持的函数、类型、变量等可能不同,基于一个平台创建的源代码不能在另一个平台上编译。 让我以c语言为例进行说明。 【实例1】要用c语言暂停程序,请使用“睡眠”函数。 在Windows平台上有Sleep (,在Linux平台上有Sleep ),开头字母的大小写不同。 其次,Sleep (的参数是毫秒,Sleep ) )的参数是秒,单位也不同。 由于这两个原因,使用暂停功能的c语言程序只有在代码级别进行兼容的处理,才能成为跨平台的。 【实例2】根据平台的不同,c语言支持long类型,但根据平台的不同,long的长度也不同。 例如,在Windows 64位平台上,长字节占4字节,在Linux 64位平台上,长字节占8字节。 我们在Linux 64位平台上写代码的时候,把0x2f1e4ad23代入long型变量是完全没有问题的,但是这样的代入在Windows平台上数值溢出,会给程序带来错误的执行结果。 麻烦的是,这样的错误一般不太容易知道。 因为编译器不报告错误,所以我们不记得取不同类型值的范围。

解释型语言

解释器型语言,每次执行程序时都需要一边转换一边执行。 使用哪个源代码会将哪个源代码转换为机器码,不使用的则不会进行任何处理。 每次运行程序时都有可能使用不同的功能,此时需要转换的源代码也不同。 由于每次运行程序时都需要重新转换源代码,因此解释器型语言的运行效率天生低于编译型语言,也存在订单

的差距。计算机的一些底层功能,或者关键算法,一般都使用 C/C++ 实现,只有在应用层面(比如网站开发、批处理、小工具等)才会使用解释型语言。在运行解释型语言的时候,我们始终都需要源代码和解释器,所以说它无法脱离开发环境。当我们说“下载一个程序(软件)”时,不同类型的语言有不同的含义:

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

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

关于 Python

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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。