点评方舟编译器开源:如同婴儿般带来新希望

来源:http://www.chinese-glasses.com 作者:编程 人气:165 发布时间:2020-04-23
摘要:八月份,方舟编译器开源官网已经上线,同时框架代码同步对外公布。这次方舟编译器开源的是编译器框架部分源码,包括编译器中间表示和语言编译实现,同时搭配编译器其他二进制

八月份,方舟编译器开源官网已经上线,同时框架代码同步对外公布。这次方舟编译器开源的是编译器框架部分源码,包括编译器中间表示和语言编译实现,同时搭配编译器其他二进制组件,实现Java程序到aarch64汇编指令的编译过程。

10bet 1

方舟编译器的开源虽然已经过去近一个月时间,各大论坛以及行业内的讨论仍在持续。北京理工大学计算学院计卫星副教授认为,华为方舟编译器基于新的中间语言,实现了从Java程序到机器代码的翻译。这其中最主要的、最引人注目的亮点是能够离线将现有的移动应用翻译为机器代码执行,并且在这个过程中加入了大量的代码优化工作。

随着 2019 华为开发者大会的临近,华为消费者业务 CEO 余承东此前在 P30 国内发布会上宣布的 “能够实现 Android 性能革命” 的方舟编译器也即将进入到开源阶段。虽然此前在 4 月份华为已经就方舟编译器进行了介绍,但人们更加关心的是:...

同时,计卫星副教授还给予方舟编译器一些期许,表示华为方舟编译器就如同一个新生的婴儿,为大家带来了新的希望,但是仍然有很大的成长空间,需要不断的发展和壮大,但是这都有赖于整个业界的精心照看和呵护,有赖于大家给与足够的耐心和信心。

随着 2019 华为开发者大会的临近,华为消费者业务 CEO 余承东此前在 P30 国内发布会上宣布的 “能够实现 Android 性能革命” 的方舟编译器也即将进入到开源阶段。虽然此前在 4 月份华为已经就方舟编译器进行了介绍,但人们更加关心的是:华为方舟编译器的革命性到底体现在哪里?

10bet 2

针对这个问题,余承东在 8 月 6 日推荐了一篇由“菊厂搞机”发表的一篇题为《华为新贵!方舟编译器的荣光和使命》的长文,该文对华为方舟编译器的实现原理和背后故事进行了解读——而雷锋网也希望由此提取出关于华为方舟编译器实现 Android 性能革命的诸多要点。

以下为计卫星副教授《从方舟编译器看华为终端软件生态的构建之路》全文:

Android 代码编译的原理和弊端

经过不断的酝酿和催生,华为方舟编译器在八月的最后一天开源,向公众揭开了神秘面纱的一角。在这之前,大小媒体对方舟编译器进行了大量报道,大家对这款编译器的期望值也不断被抬高。

在目前全世界的多种编程语言中,Android 操作系统采用的是 Java 语言。

从此前公开的资料和目前公开的部分源码来看,华为方舟编译器基于新的中间语言,实现了从Java程序到机器代码的翻译。这其中最主要的、最引人注目的亮点是能够离线将现有的移动应用翻译为机器代码执行,并且在这个过程中加入了大量的代码优化工作。但是此次开源的部分并没有包括运行时系统,以及编译器中的很多优化模块,所以仍然会让大家保持一定的好奇心,Java语言特性相关的部分在运行时是如何支持的,例如垃圾收集和异常处理。特别是垃圾收集算法,大家已经研究了很多年,出现了很多种不同的算法,但是华为这次采用不同寻常的技术路线,也引起了广泛的讨论,实际效果有待于进一步实践检验。

Java 语言是在 1995 年 5 月发布的,它的一个重点特点就是可以跨平台操作,而且需要借助虚拟机机制来解释源代码并调度硬件资源;但同时 Java 是一种预编译语言,需要先在开发者环境中将源代码转换成字节码,然后在设备上运行时再将字节码编译或解释成硬件能听得懂的机器码。

从代码规模的角度来看,此次开源的代码规模并不是很大,但是要进一步了解其内部的实现细节,则需要更多的时间。当下为什么除了处理器和操作系统,编译器会被推到前台成为舆论讨论的热点之一?我想这也是不得已而为之,在华为被打压的关键时刻,推出方舟编译器的战略意义可能要更为重要一些。没有软件的计算机系统,就如同剥离了血肉的人体,只剩下坚硬的骨骼,没有生命的气息。计算机系统也是有生命的,软件如同血肉和神经,赋予了计算机不同的能力和空间。即使华为有了自己的芯片和操作系统,没有繁荣的应用软件生态做支撑,这些芯片和系统软件也只会被束之高阁。从过去到现在,已有的国产自主系统都是在这一困境中不断挣扎,目前也只是在特定的领域取得了不错的进展。因此,如何能让已有的智能终端软件,特别是手机上的应用在华为的手机上顺畅的运行起来,就成为这些核心芯片和系统从后台走向前台必须要解决的问题。直接翻译机器代码虽然能够极大提高程序的运行效率,但是同时也会使得原本只用Java编写的应用失去了跨平台运行的能力,不过对于手机类APP,这个倒不是太大问题。

也就是说,从 Java 的字节码到机器码,中间需要两样东西:

此外,单纯靠离线翻译并不能将所有的应用顺利的翻译到华为的平台上运行,这主要是因为:一方面,部分应用在发布之前进行了加固处理,只有在运行时部分代码才会被解码并执行,因此完全靠静态分析并不能解决所有的问题;另一方面,部分应用为了躲避分析,在运行时通过网络动态加载部分代码执行,这一部分代码在运行之前对编译器来说完全是黑洞,并且各个不同的应用处理方式也各不相同。要完整支持所有应用的平滑翻译和顺利运行,必然会导致一个复杂的解决方案,而这一复杂的方案是否会引起可靠和安全相关的问题则不得而知。从相关报道来看,并没有说明现有应用会100%支持和成功运行。

1、虚拟机,用来调度硬件资源;

反过来看,健壮的软件并不是一天长成的,肯定是经过时间的打磨和锤炼的。华为方舟编译器就如同一个新生的婴儿,为大家带来了新的希望,但是仍然有很大的成长空间,需要不断的发展和壮大,但是这都有赖于整个业界的精心照看和呵护,有赖于大家给与足够的耐心和信心。

2、翻译器或者编译器。此处要注意的是,翻译器和编译器是不同的;编译器是把源程序的每一条语句都编译成机器语言并保存成二进制文件,这样运行时计算机可以直接以机器语言来运行此程序,因而速度很快;而解释器则是只在执行程序时,才一条一条地解释成机器语言来让计算机执行,因此运行速度不如编译后的程序运行得快。

方舟编译器未来要走的路还很长。华为应该在开源的基础之上构建一个开放的生态,让高校、科研院所、企业和个人开发者共同参与、协作贡献,不断拓宽方舟的宽度和深度,才能让方舟承载的更多。

而对于 Android 操作系统来说,为了将 Java 字节码变成机器语言,Google 在不同的版本中进行了多样化的尝试,其目的自然是不断推动应用程序的运行速度向前发展;我们来看一下 Android 在不同版本是怎么做的:

说不定哪天在大家的共同努力下会长出一个新的语言,从此才会剥离的更加彻底和干净。基于此构建的软件生态,也才能让华为的芯片和操作系统成为真正的大杀器。

Android 1.0:采用一个名为 Dalvik 的虚拟机,并且集成了一个解释器。当 App 运行时,就会调用这个解释器,对代码进行逐句解释,速度很慢。

Android 2.2:引入 JIT即时编译机制,当 App 运行时,会将用户经常使用的功能编译为机器能直接执行的 010101 机器码,不用一句一句地去翻译。当出现不常用的功能时,再调用解释器来翻译;这样速度加快,但每次启动 App 都要重新编译一次,不能一劳永逸。

Android 5.0:将虚拟机 Dalvik 换成 ART,将 JIT 的编译器替换成 AOT。如此,App 在下载后安装到手机上时同时把能编译的代码先编译成机器听得懂的 101010;剩下不太好翻译的代码,就在用户使用时再叫醒解释器来翻译。如此,不用每次打开 App 都需要编译,但安装 App 的时间有点长,而且占用手机空间。

Android 7.0:采用混合编译机制,安装时先不编译中间代码,而是在用户空闲时将能够编译成机器码的那部分代码,通过 AOT 编译器先静态编译了。如果 AOT 还没来得及编译或者不能编译,再调用 JIT+ 解释器。这种机制,相当于用时间换空间,既缩短了用户安装 APP 的等待时间,又将虚拟机里编译器和解释器能做的优化提升到最大效率了。

可以看到,无论是编译器还是解释器,只是在虚拟机上打补丁;手机上的虚拟机+编译器+解释器本身不仅占用硬件资源,还无法最大发挥软件运行性能。正因如此,所以绝大部分手机厂商只能无奈的通过简单粗暴提升 Android 手机的内存和存储空间,来弥补虚拟机的弊端。

由此出发,Android 系统在性能和应用运行层面有四个方面的问题:

1、如前所述,离不开虚拟机;

2、为了与 C/C++ 等代码进行交互,Java 原生接口应运而生。目前 95% 的TOP应用都是使用 Java 和 C/C++ 等多种语言混合开发而成。Java 和 C/C++ 属于两种不同架构的语言,各有自己的使用规范。为了 APP 正常运行,它俩之间需要互通有无,这个互通有无的接口就是 JNI。在数据访问、函数调用、生命周期维护、异常处理等方面都需要这两种代码互相调用。这就意味着手机硬件资源要分配一部分给 JNI 去做调度——这一机制本身的效率就不高,而且占用了硬件资源。

3、Android 虚拟机的编译器受限于手机硬件和代码优化模板单一,代码优化空间有限。 编译器包含三个部分:前端 Front End,主要负责将源代码翻译成 IR;中端的 Optimizer 主要负责代码优化,将前端翻译过来的 IR 代码优化得更高效;后端 Back End 则将优化后的 IR 编译成 101010 的机器码——为了防止生态过于碎片化,Android 只为第三方开放了简单的编译代码优化模板,代码优化空间有限。

10bet,4、Java 现有的内存回收机制容易造成 “间歇性” 卡顿。 当手机内存资源不够用的时候,Android 虚拟机就会召唤 GC 让所有手机运行的 Java 线程全部暂停,等待它回收内存空间,避免过载超载。这个 GC 机制,无法精确控制和干预,用户也无法把它去掉,所以性能比较差的手机还存在 “间歇性” 卡顿。

这四个问题,也是华为试图通过方舟编译器解决的问题。

华为方舟编译器是如何解决问题的?

在回答这个问题之前,先看一下华为从事方舟编译器工作的时间线:

2009 年,华为启动 5G 基础技术研究的同时,开始创建编译组,第一批海内外研究人员加入。

2013 年,华为推出面向基站领域的自研编译器 HCC,并正式提出编译器框架构想。

2014 年,众多海内外专家加入华为,方舟项目正式启动。

2016 年,成立编译器与编程语言实验室。

本文由10bet发布于编程,转载请注明出处:点评方舟编译器开源:如同婴儿般带来新希望

关键词:

最火资讯