从编程语言角度理解:什么是跨平台性

从编程语言角度理解:什么是跨平台性

01455

平台,指的是不同的操作系统,比如 Windows、Linux、MacOS、Unix 等等。而跨平台则是是编程语言的一种特性,指的是编程语言的“源码”是否可以在不同的平台上运行。一些种语言拥有着较好的跨平台性,但注意,并不是所有语言都均有良好的跨平台性。通过对编程语言跨平台性的学习,你可以更深层次地理解不同种类编程语言的区别。

编译型语言

对于编译型语言来说,开发完成以后需要将所有的“源代码”都转换成“可执行程序”,例如 Windows 下的.exe文件。可执行程序文件中包含的都是机器码,这种程序可以随时运行,并且运行前不需要重新编译,可以理解为“一次编译,无限次运行”,因此编译型语言可以脱离开发环境,并且运行效率高。

但是编译型语言一般是不能跨平台的,也就是不能在不同的操作系统之间随意切换。原因主要表现在两个方面:

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

这一点很好理解,因为不同操作系统对可执行文件的内部结构有着截然不同的要求,因此它们之间也不能兼容。比如,不能将 Windows 下的可执行程序拿到 MacOS 下运行。

2) 源代码不能跨平台

不同操作平台支持的函数、类型、变量等都可能存在不同,因此某个平台编写的源代码一般不能拿到另一个平台下编译。比如在 C语言中使用暂停多长时间的函数。

Windows 平台下使用 Sleep() 来实现函数的暂定,但是在 Linux 系统中,若要实现暂停功能就需要使用 sleep() 函数。结果显而易见,首先两者从形式上就不一样,其次它们之间的参数也存在差异,前者的的单位是毫秒,而后者是秒。上述原因导致 C语言中暂停功能的函数不能跨平台使用。

再者不同平台对类型的支持也存在差异,比如在 Windows 64 位平台中,C语言的字符 long 类型占用 4 个字节,而 Linux 64 位平台却占用 8 个字节。

解释型语言

对于解释型语言而言,每次运行程序时“边转换边执行”,用到哪些源代码就将哪些源代码转换成机器码,而用不到的则不做任何处理。由于每次执行程序都需要重新转换源代码,所以解释型语言的执行效率要就低于编译型语言,但是其开发效率却很高,适合于网站、App 应用的快速开发。

解释型语言无法脱离开发环境运行,如何理解能否脱离开发环境,举一个简单的例子:“当我们说要下载一个程序”时,不同类型的语言有不同的含义:

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

解释型语言有着良好的跨平台性,与编译型语言相比,它真正实现了“一份代码,到处使用”的目的,而这一特性的实现要归功于“解释器”。

解释型语言使用“解释器”将源代码转换成机器码。这里需要重申一下概念,我们所说的跨平台指的是源代码跨平台,而解释器相当于一个可执行程序,是不可以跨平台的。因此针对不同的平台就需要使用不同的解释器,这些解释器必须要能够遵守同样的语法,同样代码可以完成相同的功能,这样同一份代码在不同平台的执行结果才会是一致的。

混合型语言

既然编译型语言和解释型语言各有各自的优势,那么广大的计算机工程师们为什么不能把它们两者综合一下呢?当然可以,正是这种想法的存在,促使了 Java 语言的诞生。

 Java 语言是一种编译型-解释型语言(混合型语言),同时具备编译特性和解释特性。

作为编译型语言,Java 程序要被统一编译成字节码文件(.class文件),但是这文件不能直接被计算机执行,它需要被 java 虚拟机(JVM)翻译成机器码后才能执行。而这一翻译过程解释性的。因此从顺序上来说 Java 语言是要先进行编译,接着执行解释。

Java 属于一种特殊的存在(C#也属于混合型语言),它剑走偏锋,虽然没有纯编译型语言效率高,但是比解释型语言要高效很多,并且具有良好的跨平台性。

总结

下面对每种类型语言的特点做简单的总结:

1)编译型语言特点

  • 一次性的编译成适应平台的可执行文件(机器码),运行时可以脱离开发环境,运行效率高;
  • 编译的可执行文件只适用于特定平台相关,一般无法跨平台,移植到其他平台上使用;
  • 现有的C、C++、Objective、等都属于编译型语言。

2) 解释型语言特点

  • 解释型语言每次运行都需要将源码“边转换边运行”,因此执行效率较低;
  • 不同操作平台使用相应的解释器就可以运行代码,因此具有很好的跨平台性;
  • Python、JavaScript、Shell 、R语言等都属于解释型语言。

3) 混合型语言特点

  • 兼备编译型和解释型,使其开发效率比用其他语言要快很多。
  • 通过使用 JVM 虚拟机实现跨平台,具有良好平台移植性。
© 版权声明
THE END
喜欢就支持一下吧
点赞5赞赏
分享
评论 抢沙发
HarryPotter的头像|艾奇编程网

昵称

取消
昵称表情