一文看懂华为方舟编译器为什么厉害,安卓的一大进步
华为P30发布会上一起发布的方舟编译器引起了业内广泛的关注,更多的人是不明觉厉,方舟编译器是什么?厉害在哪?解决了什么问题?有什么意义?作为一个曾经的程序员为大家解读一下,也欢迎知乎各位大神提意见。
方舟编译器是什么?
爪哇岛上一位富豪家里有很多菲佣,富豪只会爪哇语,他每次用爪哇语吩咐管家需要菲佣干什么都是管家听完后一句句翻译给菲佣听,虽然效率不高但是语言不通没办法。某天,一位叫方舟的人来应聘管家的职位说:我能让菲佣干活更快,于是他成了新管家。这位叫方舟的新管家给富豪建议:给我一个手册,写好菲佣每天要干什么。方舟拿到手册后将手册翻译成菲佣的语言然后发给菲佣,从此菲佣再也不用听吩咐就知道该干什么了,干活变快了。备注:爪哇岛是印尼小道,英文JAVA,也是JAVA编程语言的来源,JAVA是Android的主要编程语言。方舟这位管家就是方舟编译器,什么是编译器呢?其实就跟这位管家一样充当了“翻译官”的角色,将程序员看的懂的语言(C++,JAVA等高级语言)翻译成处理器看的懂的语言(机器码,都是0和1的组合)。不管是早期的电子管还是现在的半导体晶体管,这些计算的基本单位能识别的只有电平的高低,在计算机中我们就用0和1来表示。1和0的各种组合就是机器是能看懂的语言,也就是机器码。计算机的初期,人们就是用0和1来写成程序命令的,这种反人类的编码显然是程序员痛恨的,于是有了汇编语言,用字符来表示命令编码,这就方便了很多,但是大型程序依然不可行,C\C++,JAVA等高级语言应运而生。可以说高级语言是为程序员设计的,也是为大型的软件工程设计的,因此逐步诞生了面向对象编程的继承、多态以及回调、反射等机制,不管高级语言怎么变化,处理器能够识别的都只是机器码,编译器就承担了这个翻译转化的角色,这也是方舟编译器要做的事儿。
做好编译器并不容易
我们都学过英语,可是翻译并不是每个人都能做,《刺激1995》这部电影看过吗?《月黑高飞》这部电影看过吗?都没看过?那《肖申克的救赎》你一定看过吧,其实他们是同一部电影,这是陆港台三地根据英文名《The Shawshank Redemption》的不同翻译,是不是差异很大?
做一个编译器并不难,难的是做出一个能够高效准确翻译的编译器,并且进行长期的维护迭代,所以绝大多数厂商是不愿意碰触编译器也缺乏动力去改变的动力。当前最主要的编译器是有两个:GCC与LLVM。现代编译器的结构基本就如下图LLVM的结构差不多,分为前后端,前段主要是处理程序员用的C/C++,JAVA等,后端主要处理硬件架构相关的优化。方舟编译器应该也是如此,具体的实现如何要等开源后才能得知了。
干掉虚拟机
当今移动终端领域分为IOS和Android两大阵营,说起IOS很多人会说“快!流畅!”。这是建立在苹果强大的A系列处理器,精心设计的swift语言,集成swiftc编译命令的Xcode工具,高效的IOS系统,严格的权限管理等基础上的快,可以称之为软硬件结合一体化的典范。
AOT (Ahead of time):在程序运行之前或者空闲时将JAVA字节码码编译为机器码。JIT(Just in time):在程序运行时实时将JAVA字节码编译为机器语言然后执行,应用退出后消失。如果用翻译来描述现在的Android运行机制的话就是:一位CEO在记者招待会上用母语回答各国记者提问题,为了在座的记者都能听懂采用了同声传译(解释执行),翻译人员发现有些回答会重复多次就将这部分翻译成稿件,再遇到就直接念稿(JIT)这样会快一些,记者招待会结束后翻译在空闲时间将这些常用问答正式整理成稿件(AOT),这样下次再召开发布会更高效。如果在招待会开始前把所有要说的都写在稿件上直接念不是更高效吗?没错!这就是方舟要干的事儿。
方舟编译器舍弃了现在Android中的ART虚拟机,所以也不需要编译为字节码文件(DEX),在生成APK安装包时直接编译生成适合的机器码,在终端设备上安装后直接就可以执行。省去了虚拟机,省去了JIT与AOT编译,采用了与IOS一样的方式,从机制上来说保证了App的快速运行。
说的这么好,“那么,古尔丹,代价是什么呢?”
代价就是文件的体积会变大,与IOS安装包大于Android安装包一样的道理,以往的App安装包是打包字节码的DEX文件,而方舟编译器的安装包是直接打包的二进制机器码文件。微博极速版为例,安卓9.0安装后37.5M(APK为9.7M),使用方舟后安装后约为50M(APK为23M)。在存储越来越大的今天,安装文件的大小已经不是主要问题,而且安装包安装完成后还会删除,所以不用太在意,至于体积大的游戏也不需要太在意,因为游戏的安装包中资源文件占比很大,这是与编译无关的。
去掉虚拟机还不够
有一家叫安卓的公司展开了一个新项目需要两个部门一起来完成,项目尽速有点缓慢,经过分析查找原因发现大部分时间都浪费在两个部门之间的协调上了。负责项目的主管认为这是公司架构划分不合理造成的,应该打破部门的壁垒,将联系频繁的部门合并成一个部门。从此这家公司的工作效率得到了大大的提升,这主要归功于这位叫做“方舟”的项目主管。这样的“跨部门协调”导致效率不高的问题同样发生在Android应用身上。Android中ART虚拟机的存在是因为JAVA是Android APP的开发语言,但是绝大多数的APP因为各种原因还会用到其它语言开发的库,比如C语言。这样就存在一个显而易见的问题,这两个语言之间势必会产生调用、通信,这会产生很大的损耗。方舟编译器将不同的语言统一为如何将不同的语言统一为同一个语言呢?有两种方式:把不同的语言都翻译中间代码IR(Intermediate Representation),然后再由IR去对应不同的硬件架构翻译成二进制机器码。这样有一个好处就是,可以方便的支持新的开发语言与硬件架构。都直接翻译成二进制的机器码,这样做需要对编程用的语言有非常深刻的理解,尤其是JAVA这样动态特性很丰富的语言。
编译器是重要突破
处理器、操作系统、数据库、编译器、编程语言这些是IT领域真正核心且基础的东西,也是我们落后美国的地方,在上层应用上我们应该处于领先的地位。芯片处理器这几年已经有了很大的起色,Android系统国产厂商也贡献良多,其它领域最好的突破口就是与这两者结合较为紧密的编译器。但是国内有实力和动力做的公司屈指可数。海思芯片的成功让华为决定试一试,2013年华为自研的编译器HCC取得初步成功,这也是华为在4G及5G时代移动通信领域取得领先的关键支撑,但是这还远远不够,要做编译器好必须要找行业大牛并长期投入。2014年,Fred Chow(周志德)加入了华为,这是编译器领域的顶级权威,著名的Open64编译器就是他主持开发的。Fred Chow发出了华为召集令,是否有千军万马来相应我们不得而知,但是可以肯定“前途是光明的,过程是艰苦的”,随后2012编译器与编程语言实验室成立,剩下的就是“十年磨一剑”了。
现在方舟编译器出来了,但是这只是一个开始,编译器是需要长期维护优化的。方舟编译器未来如何也不仅仅取决于华为,还要看谷歌的态度。
方舟编译器的价值
方舟编译器并不是为了“填补XXXX空白”,而是为了在不改变现有代码和编程习惯的基础上进行编译的优化,使得APP的运行更加流畅,方舟编译器的最终的目的是成为一个跨硬件平台、跨系统、跨语言的软件编译平台。编译器是一个桥梁,连接着上层的开发语言与底层硬件,又与操作系统紧密结合,掌握了编译器,更换开发语言,更换硬件架构甚至更换操作系统都会有很大的帮助。值得注意的华为成立的“编译器与编程语言实验室”从名字来看除了编译器还有编程语言,因为设计的原因JAVA脱离虚拟机后并非最好的开发语言,与其它语言的连接再如何优化也没有同一个语言方便,所以推出一个自己的编程语言可能是最佳的选择,然而这一步可能更加艰难,因为程序员要为此改变编程习惯。
拥有自己的编程语言,甚至在操作系统、硬件架构方面有所作为目前仅仅是幻想,也许有一天会实现,梦总是要有的。抛去幻想,面对现实,方舟编译器同样有着非常重大的意义。
锻炼人才:编译器的开发需要扎实的基本功,需要对编程语言和底层硬件都非常的熟悉,能够锻炼一批人才这是毋庸置疑的,这些技术人才是公司宝贵的财富。
为Android注入新活力:Android的诞生和维护主要归功于谷歌,虽然随着版本的迭代一直在进步但是多年来始终没有打破固有框架也因此无法再进一步,方舟编译器的出现显然为Android提供了另一种可能,华为已经从几年前的使用者变成了重要贡献者。
更好的用户体验:Android的生态需要谷歌、手机厂家、App开发商共同维护才能给消费者更好的体验,这点在国内尤其突出,绿色联盟和统一推送联盟在着手治理App生态乱象,方舟编译器则是从系统框架层面提供了更深一层的优化
提高效率:华为在ICT领域涉及的业务众多,芯片、Server、终端、IoT、云、通信,涉及的硬件和软件系统也很多,如果能够有一个统一的软件开发平台对自己本身也是非常好的,从芯片到编译器再到系统这种高度整合的软硬件一体化可以带来最佳的效果。
中国的IT行业发展的很好,但是在基础领域缺少突破,中国的IT业需要唐吉可德,需要为探索者鼓掌,当然面包也很重要,方舟编译器我认为干的不错。关于方舟编译器的具体细节与是非我们等下半年开源后再讨论。