前一阵子,华为P30系列发布,最为明显的升级就是相机拍照部分,外加上P20打下的基础,突破了自己,就算是突破了整个行业,然而从长远的眼光看,华为P30的发布带来的拍照提升只是例行升级,真正懂行的人都注意到了华为推出的“方舟编译器”,也看出来了华为真正的技术实力。
打开百度App,看更多图片
方舟编译器简单来说,就是可以将高级语言比如Java,直接编译成变成机器码的技术。它最大的优势就在于绕过了安卓系统的VM(虚拟机),从使得应用可以像苹果引以为傲的iOS系统一样,转化出的机器码可以直接由CPU运算,从而使得运行效率大大提升。
概括的话,什么事都变得很简单,为了证明方舟编译器的技术含量,我想还是有必要详细介绍一下它的运行原理。
经历过九年义务教育的我们都知道,计算机是只认识0101这样的二进制代码。对于人脑来说,直接用这样的二进制代码来编程,显然是不太现实的。于是汇编语言就出现了,属于低级语言,只是一系列的字母指令集,后来为了实现更复杂的功能,高级语言诞生了,比如C语言,Java,python等等,能够用更短的代码实现更复杂的功能。
当然了高级语言计算机是无法直接读取的,这里就需要用到编译器了,而编译器就是将一种高级语言转译成一种低级语言的程序,起到关键的“承上启下”作用,所以编译的复杂程度直接会影响程序的执行效率,比如C语言比Java语言的执行效率高,正是因为C语言编译出来的是CPU可以直接执行的机器码,而Java语言则先是Java虚拟机(JVM)编译Java语言,然后JVM再编译成机器码。所以多出来的这一步就会被放大,影响到应用的运行,这也是安卓系统的应用前期卡顿的主要原因,虽然之后谷歌针对JVM做出了一系列的改进和优化,但还是难以彻底解决。
反观苹果的iOS系统,直接使用Clang/LLVM来编译出机器码,就没有安卓还要一个中间层那么麻烦,所以iOS如丝滑般流畅的原因也因为如此,还有一个不可忽视的因素是闭环。而安卓系统的底层是Linux系统搭建的,同时又因为安卓系统开源,为了解决应对不同硬件环境的适配问题,谷歌就增加了基于JIT(动态编译)的虚拟机Dalvik,并在Dalvik虚拟机上搭建了一个JAVA应用框架,所有的安卓应用都是运行在这个虚拟机上。
当然了谷歌也知道这样效率不好,于是在Android 5.0版本中,使用了ART模式来替换Davlik虚拟机。而ART是一个AOT (Ahead of Time)编译器,是指在应用运行前就把字节码静态编译成机器码,就避免了每次打开应用都要虚拟机编译的麻烦。然而只是代码的静态编译,Java本身的动态特性,在执行代码过程中会有动态类的加载(就是使用轮子),而静态编译时无法预测会加载哪些动态类。
所以弄了半天,还是需要虚拟机的动态编译能力。而安卓想要像iOS那样流畅,就必须跳过虚拟机,而方舟编译器,解决的就是这个问题。
根据官方信息,华为的方舟编译器也基于AOT编译器,不过方舟编译器创造性地静态编译了动态类,把所有的Java代码都编译成机器码,这样也就可以完全避开虚拟机,直接编译成机器码在手机CPU上运行,也就能够有iOS系统一样的高效。除了直接编译之外,方舟编译器也优化了编译算法,并且在内存回收方面也有一定的改进,不仅是应用,对系统运行的流畅度也有很大的提升。
当然了,如此重大的提升,难道谷歌就不会想到吗。想得到,但力不从心。因为想要使用方舟编译器,得从应用的打包编译上架重新开始,开发者必须按照方舟编译器的标准重新编译应用安装包,所以这并不只是安卓系统,也需要应用的配合才能使用,目前好像只有微博极速版做了适配。
当然了,华为也宣布将方舟编译器全面开源,提供完整的编程框架和应用开发工具,将更多的开发者参与到方舟编译器的开发和使用,共同提升整个安卓生态的体验。方舟编译器编译是基于ARM指令集开发的,所以全面开源意味着其它厂商的安卓系统也可以使用。
这里我们就能看出来华为对研发的投入,以及对生态的规划,并不只是说说而已。开开发布会卖卖手机只是小打小闹的事情,华为的目标是全方位的生态建立。不管你是对华为这个品牌报什么看法,但不得不承认目前在国内只有华为有这样的实力去做整个产业上的事,去构建属于自己的生态,方舟编译器就是这个过程中的催化剂。