跨平台这件事儿

跨平台很神秘吗

刚刚开始做开发的时候,感觉跨平台是那么高大上,就像夕阳下,湖面上的一朵白莲花,只可远观,不可亵玩焉。那么,跨平台到底是怎么一回事儿。难道真的有什么东西可以跨平台吗,这就像一台多功能交通设备,投到水里能游,放到陆地上能跑,扔到天上能飞,加速到第二宇宙速度都能脱离地球了进行星际航行了。

揭开跨平台神秘面纱

让我们一起来揭开跨平台神秘的面纱,比起一种语言是不是跨平台的,我们更关心的是功能可不可以跨平台,毕竟我们使用各种开发语言是为了实现某些功能。举个例子,假设我们打算用 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 语言里不同平台的编译器吗。

回到最开始提到的那个交通设备,真的要把把它做出来,那要具备涡轮一类的推水装置、 路面行走的轮子、喷气式装置,甚至核能推进器。总结起来就是说,要跨平台就要有对应平台的功能实现。作为开发者来说,我们使用的一些语言或框架可以方便的跨平台,不需要我们关系细节,是因为语言或框架本身帮我们做了繁杂的适配工作。

揭开跨平台的面纱,是不是感觉这概念没那么神秘了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏mySoul

设计模式-单一职责原则

设计模式有六大基本原则,单一职责原则,里氏替换原则,依赖倒置原则,接口隔离原则,迪米特法则,开闭原则。

1071
来自专栏圣杰的专栏

eShopOnWeb 知多少

eShopOnWeb是基于ASP.NET Core构建,官方创建这样一个示例项目的目的,我想无非以下几点:

1721
来自专栏大数据和云计算技术

对象存储入门

10.5.3 对象接口 对象存储系统(Object-BasedStorage System)是综合了NAS和SAN的优点,同时具有SAN的高速直接访问和NAS...

7524
来自专栏安恒信息

Jsprime——一款JavaScript静态安全分析工具

如今,越来越多开发人开始将JavaScript作为其首选语言方案。理由很简单,JavaScript如今正越来越多地被视为应用程序的主流开发语言——无论是在Web...

3047
来自专栏一个会写诗的程序员的博客

函数式编程与面向对象编程[5]:编程的本质函数式编程与面向对象编程[5]:编程的本质编程的本质

函数式程序员在洞察问题方面会遵循一个奇特的路线。他们首先会问一些似有禅机的问题。例如,在设计一个交互式程序时,他们会问:什么是交互?在实现 基于元胞自动机的生命...

1272
来自专栏PHP实战技术

3-5年的PHPer常见的面试题

看到有很多,的总结一下,比较适合有一定经验的PHPer 平时喜欢哪些php书籍及博客?CSDN、虎嗅、猎云 js闭包是什么,原型链了不了解? for与forea...

46010
来自专栏Golang语言社区

Node.js真的无所不能?那些不适用的应用领域分析

Node.js是一个服务器端JavaScript解释器,底层采用的还是libevent;它的目标是帮助程序员构建高度可伸缩的应用程序,目前对Node.js 的采...

3306
来自专栏JavaEdge

设计模式实战 - 原型模式0 导读 - 个性化电子账单1 定义与类型2 适用场景3 优点4 缺点5 扩展

● 个性化服务 一般银行都要求个性化服务,发过去的邮件上总有一些个人信息吧,比如“××先生”,“××女士”等 ● 递送成功率 邮件的递送成功率有一定的要求...

1382
来自专栏铭毅天下

Elasticsearch聚合后分页深入详解

1、Elasticsearch支持聚合后分页吗,为什么? 不支持,看看Elasticsearch员工如何解读。 ? ? 这个问题,2014年在gith...

1.1K11
来自专栏极客生活

数据分析要会写代码

最近工作任务有些忙,主要是各个部门的数据分析需求再加上APP后端性能优化挤到一块儿去了。

821

扫码关注云+社区

领取腾讯云代金券