跨平台这件事儿
跨平台很神秘吗
刚刚开始做开发的时候,感觉跨平台是那么高大上,就像夕阳下,湖面上的一朵白莲花,只可远观,不可亵玩焉。那么,跨平台到底是怎么一回事儿。难道真的有什么东西可以跨平台吗,这就像一台多功能交通设备,投到水里能游,放到陆地上能跑,扔到天上能飞,加速到第二宇宙速度都能脱离地球了进行星际航行了。
揭开跨平台神秘面纱
让我们一起来揭开跨平台神秘的面纱,比起一种语言是不是跨平台的,我们更关心的是功能可不可以跨平台,毕竟我们使用各种开发语言是为了实现某些功能。举个例子,假设我们打算用 Java 开发了一款游戏,这个游戏要跨 Mac、Windows、桌面版Linux 三个平台,怎么完成这个功能呢。
假设要完成游戏中人物的显示,这样一个看似很简单的功能,程序从上层向下层要做下面这些:
1、最上层 Java 要调用一个图像相关的类库;
2、这个类库要调用系统层提供的接口,比如显卡驱动相关接口;
3、这个显卡驱动相关的接口又调用了显卡的硬件接口;
我们再从下向上分析一下,如果要做到跨平台要做到什么?
1、最后调用到了硬件接口,那么首先要保证硬件是相同的,比如显卡是相同的,这就要保证世界上各大显卡厂商使用相同的标准;
2、再往上保证显卡配套的显卡驱动接口是相同的;
3、再往上还要保证系统暴露给上层的驱动接口调用 API 是相同的,这就要求三个平台具有相同的驱动 API 标准;
通过以上我们发现一个语言可不可以跨平台要看它的下一层是不是跨平台,依次类推,最后总会到达硬件层次。最后得出的结论就是只有硬件是同一种标准,那才能实现真正意义上的跨平台。但是由于历史、商业等等各种原因,导致完全统一标准几乎是不可能的。
所以目前所说的语言跨平台、框架跨平台都是用其他方式实现的,并且我们可以把这里的平台理解为语言、框架的下一层级的载体。
几种语言的跨平台方式
比如说 HTML 是跨平台的,他跨的平台指的是浏览器,浏览器几乎都遵循 w3c 标准,所以 HTML 是这样实现跨平台的。
比如说 C 语言是不是跨平台的,C 语言常常被用在偏底层的开发。那么 C 语言是如果在多个平台运行的呢?首先要编写代码,编写的代码要兼容要跨的平台,要支持 windows 平台,那么就要为 windows 实现一套代码,要支持 Linux 就要为 Linux 实现一套,然后当要执行的时候,简单粗暴的说就是加上 if else
做个判断,是哪个平台就用其对应的代码,著名的 GUI 开发框架 Qt j就是这个原理嘛,框架本身帮你做好了平台判断,在哪个平台就用哪个平台下的 GUI 接口,所以开发者只需要调用它包装包的接口即可。写完代码之后,拿这套代码到各个平台去编译成当前平台需要的格式,这里又涉及到了编译器,不同平台下的编译器也是不同, windows 下的编译器需要把 C 代码编译成 windows 下可执行的文件格式,Linux 下的编译器需要把 C 代码编译成 Linux 下的可执行文件格式。
再比如说 Java , Java 的口号是 Write once, run anywhere,也就是一次编写,到处运行(跨平台运行)。听上去比 C 语言还要厉害,写一次就好,不用再到各个平台上去编译,厉害了。这都要归功到 JVM(Java 虚拟机)上,JVM 有他自己的字节码格式和具体的执行机制,只要把 Java 代码编译成 JVM 需要的字节码即可。以开发者的视角,确实是跨平台了。但是具体是怎么实现的呢?首先我们安装 JDK 的时候会根据平台不同选择不同的版本,当然 JVM 也就选择了不同的版本,而代码要执行的时候,不同平台版本的 JVM 会根据自身所在的平台,把字节码转换成平台所需的机器码。看着是不是很眼熟,这不就是 C 语言里不同平台的编译器吗。
回到最开始提到的那个交通设备,真的要把把它做出来,那要具备涡轮一类的推水装置、 路面行走的轮子、喷气式装置,甚至核能推进器。总结起来就是说,要跨平台就要有对应平台的功能实现。作为开发者来说,我们使用的一些语言或框架可以方便的跨平台,不需要我们关系细节,是因为语言或框架本身帮我们做了繁杂的适配工作。
揭开跨平台的面纱,是不是感觉这概念没那么神秘了。
欢迎关注公众号「gushidefengzheng」古时的风筝