什么程序的跨平台

条件编译作用2 ———— 帮助我们的程序(c/c++)实现跨环境(平台)

我们在正式介绍之前,我们先了解下有关“跨平台”是怎么回事。


1)什么是跨平台

所谓的跨平台,就是让“同一个程序”能够应对多个环境,可以在多个环境下运行,这就好比两栖战车,既能在水上环境跑,又能在陆地跑,能够适应不同环境。

这个“环境”主要包含两个方面,一个软件系统环境,另一个是硬件系统环境。

(a)软件系统:主要指OS

        比如有的是windows的,有的是unix的。

        不同的系统本身又分为了很多不同的版本,比如以windows为例,有xp、w7、w8、w10等,unix和Linux自然也存在类似的情况。

(b)硬件系统:主要指cpu

        比如有的是Intel的,有的是AMD的,有的是ARM的,同一类型下的CPU也分为不同的版本(架构)。

程序跨环境时,环境主要指的就是这两方面。

· 裸机程序跨环境:跨的是硬件环境

        比如这个程序本来是在某个CPU上运行的,现在要到另一个CPU上运行,这时程序就涉及到跨硬件环境运行。

· 非裸机程序跨环境:软件系统和硬件系统环境都涉及

        非裸机程序,指的就是需要基于OS运行的程序。

比如本来是在ARM(CPU) Linux(os)上运行C程序,现在要到Intel(cpu) windows(OS)上运行,跨环境时,即垮了硬件环境,又跨了软件环境。

2)不同语言所写的程序,是如何实现跨平台的

语言大致分为两类,编译型语言和解释型语言。

(a)编译型语言

· 什么是编译型语言

如果语言所写的程序能够被直接编译为对应环境的、被cpu直接运行的机器指令(存放在了可执行文件中)的话,那么像这类的语言就是编译型语言。

image.png

编译型语言哪些:汇编、c、c++、Delphi、Pascal等都是编译型语言。

· 如何实现“编译型语言程序”的跨环境

从上图看出,对于“编译型语言程序”来说,跨环境的核心靠的是编译器,你想让程序在不同的环境上运行,就需要使用针对不同环境的编译器来重新编译。

疑问:对于编译型语言所写程序的跨环境来说,是不是只要换一个针对不同环境的编译器就可以了?

如果不需要修改源码的话,直接换一个编译器就可以了,但是如果需要修改源码的话,就需要先修改源码,然后再使用不同环境的编译器来重新编译。

我们这里介绍使用“条件编译”来实现c/c++跨平台,其实就与C/C++跨平台时源码的修改有关。

修改源码、然后编译得到不同环境的可执行程序,其实就是我们常说的移植的过程。

(b)解释型语言

Java、JavaScript、VBScript、Perl、Python、Ruby、C#等都是解释型语言,你想知道某门语言是编译型的还是解释型的,自己上网搜索一下就行了。


· 什么是解释型语言

如果语言所写程序需要被“虚拟机(解释器)”解释才能执行的话,这类语言就是解释型语言。

java就是典型的解释型语言,所以我们这里就以java为例来详细的介绍下解释型语言。

java程序被编译后,所得到的并不是可以被直接运行的机器指令,而是一些java字节码(java伪指令),这些字节码放在了.class字节码文件中,我们编译java程序时所看到的各种.class文件,就是这么来的,运行java程序时,运行的也是.class文件。

运行.class文件时,其实就是运行里面存放的字节码,但是字节码不是机器指令,不能被CPU直接执行,因此字节码需要被“虚拟机”解释(翻译为)为机器指令后,CPU才能执行。


虚拟机:就是一个翻译软件,将字节码翻译(解释)为对应环境的机器指令,虚拟机也被称解释器。

不过要注意的是,虚拟机在翻译时是一句一句进行的,也就是每翻译一句CPU就执行一句,并不是一次性翻译完毕,然后再一次性执行。

image.png

有些解释型语言所编写的程序是被直接解释的,都不用被编译为字节码。



· 解释型语言所写的程序,是如何实现跨平台

从java的运行模型中可以看出,解释型语言实现跨环境的核心靠的是虚拟机。

在java的世界里有一句名言,“叫做一次编译到处运行”,只要在相关环境中安装了该环境的java虚拟机,之前所编译好的同一份java字节码文件可以在不同环境的虚拟机上运行。

总之,对于解释性语言所写的程序来说,跨环境靠的是虚拟机。

疑问:虚拟机是“编译型语言”写的,还是“解释型语言”写的?

答:肯定是编译型语言写的,如果虚拟机是由解释型语言写的,那么虚拟机这个软件在运行时,又需要另一个虚拟机来解析,如此这就陷入了一种死循环。

其实有好些个虚拟机,基本都是使用c/c++来实现的。

(c)编译型语言 与 解释型语言的对比

· 跨平台性

- 解释型语言的跨平台

解释型语言的跨平台性相对会更好些,因为可以一次编译到处运行,跨平台这件事完全交给虚拟机就可以了。

疑问:安装虚拟机这个软件会不会很麻烦吗?

现在很多的OS会自带常见的虚拟机,比如java虚拟机、c#虚拟机,就算OS没有自带也不需要用户自己安装,比如以java虚拟机为例,别人在发布java程序时,一并就带了java虚拟机,安装java程序时会自动安装java虚拟机。

所以对于用户来说,虚拟机这个软件完全是透明的,用户完全不需要关心。

- 编译型语言的跨平台

编译型语言所写程序的跨平台性稍微比较差些,因为你必须使用针对不同环境的编译器来重新编译,而且有时可能还需要修改源码。

从以上的对比可以看出,解释型语言与编译型语言相比来说,解释型语言的跨平台性更好些。

· 运行效率

编译型语言的运行效率更高,因为编译型语言所写的程序,会被一次性编译为对应环境的、可以被直接执行机器指令,而不需要运行额外的虚拟机来解释,所以效率自然高。

解释型和编译型语言各有优缺,各有属于自己的应用场合,很多人喜欢过分的夸大解释型语言的优点,认为除了解释型语言外,其它编译型语言都是多余的,都是垃圾,这种想法是不对的。


别的不说,最起码一点,如果没有“编译型语言”所写“虚拟机”的话,解释型语言所写的程序就不可能被解释,所以说编译型语言和解释性语言,各有各的应用场合,在各自的应用场合下,各自都有不可替代的作用。

总结:

解释性语言:跨平台性更好,但是运行效率相对较差。

编译型语言:跨平台性较差些,但是运行效率会更好些。


头像
0/200
图片验证码