这两天看了篇《为什Java可以跨平台》的文章,里面用了比较有趣的语言来介绍的Java跨平台的原因。我想来谈谈更加广泛的原因,可能有的地方写的不对,我们为什么需要跨平台的开发和为什么可以跨平台。

现在的跨平台主要是分为编程语言的跨平台和应用程序的跨平台这两大类,严格的说,编程语言也算是应用程序,但是我就简单的谈一谈编程语言的跨平台。

现在的跨平台语言,主要在使用的是Java,JavaScript,Python这三个大类,这几个语言大多都是应用级程序上进行使用,并且使用的规模和范围还是特别广泛的,在底层使用者三个语言的可能性是比较低的。性能是其主要的限制原因,对于底层,首先要考虑和硬件的接合的融洽,也要考虑性能,因为其上有许多的服务要运行。

为什么需要跨平台

程序员都是喜欢偷懒的,同一个功能,谁都不喜欢在不同的平台上在写一遍。写重复性的代码,首先自己不愿意,公司也不愿意做这样的事情,因为出力不讨好,后期还比较麻烦。如果语言能够跨平台开发,那就是不交不错的选择了,写一次代码,然后到处运行,不是挺好的选择吗?

我说的这个快,不是运行快,而是相对于其它非跨平台的语言开发的时候开发速度更加的快。这个快,在大部分的时候是必须的,对于初创公司,更加喜欢使用能快速开发的语言先搭建出一个可以运行的平台,然后这样就可以尽快的投入市场是使用。还有就是许多需要短时间内开发出来的功能,使用这种便利性的语言,先开发出一个模型,然后后期再根据需求进行维护和修改都是一些不错的选择。

如何实现跨平台

原理

其实跨平台的原理不难理解,很简单的一个逻辑。所有的编程都是抽象的,抽象是计算机中一个比较基础的概念。如果将计算机中的各种操作抽象出来,其实就是数理逻辑。也就是说,计算机的编程以及计算机的运行,就是这些数理逻辑在实际过程中的映射而已。

也就是说,我们将一个语言内部的底层实现抽离出来,形成一套数理逻辑规则,然后在不同的硬件和操作系统平台上进行实现,这样的就可以实现跨平台了编程了。还有就是对于编程语言最重要的一点,那就是其表现形式,也就是说,通用的语句在不同的平台上使用应该是相同的(这也是最难的一点),就是这个难度造成了Java在各个平台上的割裂(一个编写,到处维护嘛),尤其是多线程方面,系统界面外观都还是其次。

语言本身实现

想Java,Python这种语言,主要是运行在虚拟机或者解释器上面,只要将虚拟机或者解释器构建成跨平台的就行,对于虚拟机或解释器的构建,是不限定语言的,我们可以认为虚拟机是一个黑盒,可以运行在不同硬件和操作系统之上。这样,同一门语言就可以在不同的平台上运行,实现了的跨平台编程了。

工具链实现

也就是说这个语言本身不是一个解释型的语言,也不是编译成字节码运行在虚拟机上,但是使用这门语言编写的代码可以在不同的硬件平台和操作系统之上,是不是挺令人兴奋的。其实这是在工具链的底层动了手脚,在编写代码的时候,我们不需要考虑平台,而在编译的时候,其工具链的底端的汇编生成器上,会根据不同的硬件平台生成不同平台上的汇编代码,进而形成生成不同的二进制代码,或者是在这个硬件平台上生成另外一个硬件的代码(交叉编译)。

使用的这个主要工具是LLVM,这个强大的工具可以更加硬件的不同,生成不同的二进制代码,虽然说是利用了虚拟技术,但是其一点都不“虚拟”,具体的可以参考以下几篇文章:

  1. 为什么人人都该懂点LLVM
  2. LLVM——维基百科

对于其更加深层次的理解就需要去看编译原理相关方面的书了,我就不说书了,因为没多少人会去看这些书的,功利性的编程还是占大多数的,O(∩_∩)O哈哈~