篮球世界杯在哪买球:解读 | 华为方舟编译器的

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

2017 年,方舟编译器上的第一个 Java 程序 “HelloWorld” 跑通。

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

总结来看,面对现有的 Android 系统在代码编译、运行、IR、内存回收等四个层面的问题,华为方舟编译器分别给出了自己的解决方案,这其中的核心创新点是混合语言的统一中间表示和完全静态编译,但更重要的是华为在解决 Android 操作系统 App 运行问题的崭新思路,以及为了实现这种思路而敢于大力投入的勇气。

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

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

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

Android 代码编译的原理和弊端

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

也就是说华为方舟编译器可以将混合语言实现统一的中间表示 IR,这就相当于同一个人能够理解全世界的语言——当然,这背后是华为方舟编译器团队基于多个编程语言的深刻理解和大量研发积累。

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

雷锋网按:本文参考资料《华为新贵!方舟编译器的荣光和使命》,点此查看。

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

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

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

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

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

雷锋网总结

篮球世界杯在哪买球 1

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

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

第四:解决 Android 内存回收带来的卡顿问题

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

2018 年春节前一周,方舟编译器跑通 Android 系统所有后台服务,并成功移植到手机。

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

为了解决这个问题,方舟编译器采用了引用计数法来进行内存的实时回收,并且配合使用了专门的消除环算法,来避免 GC 集中式回收带来的系统卡顿。相比 GC,方舟的内存回收是实时的而非集中式的,且不需要暂停应用进程,这样便大大消除了卡顿。

具体来说,方舟编译器通过编译阶段和运行阶段的双向加持,将静态编译动态语义最大的两大难点解决:一是设计数据模型,二是如何在运行时高效获得动态信息。方舟编译器团队基本遍历了 Java 的动态语义,进行了大规模的数据建模。同时,大大提高了编译时动态语义分析的精度,特别是涉及跨语言调用时;另外,华为设计了一套具有核心专利的动态语义匹配机制,有效降低了运行时动态语义的开销。

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

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

第一:将 Java 代码直接编译成机器码

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

华为方舟编译器团队对 IR 进行了长达五年的精雕细琢,逐渐摸索出 “大脑” 里每一条神经、每一个神经元的信号规律,并在此基础上发明了一套核心专利,使得不同语言代码在开发者环境中能够统一编译成同一套可直接执行的机器码,从而彻底消除了混合语言互相调用的开销。

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

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

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

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

2019 年 4 月,华为方舟编译器在 P30 系列的国内发布会上对外宣布。

华为方舟编译器,直接将代码优化从手机环节搬到了开发者环境,未来还可能搬到云端。利用开发者环境更强大的算力,可以实现更先进和精细的优化算法,来达到更佳的优化效果——华为表示,在很多特定场景代码优化的提升甚至是颠覆性的。

正如雷锋网所言,方舟本质上不仅仅是一个编译器,而是一个编译系统,它需要通过用户终端和开发者的共同支持。对于华为手机用户来说,华为在手机终端中已经用方舟编译器替代了 Android system-server 的所有后台服务,这一项就已经足够让华为 EMUI 比其他 Android 系统更快一步——根据华为官方测试,方舟编译器提升手机系统操作流畅度高达 24%,系统响应性能提升 44%。

就目前的情况来看,Java 编译成机器码的过程中,要面临的难题是 Java 中的动态语义,静态语义指的是确定的语言和意思,而动态语义指的是需要结合上下文来理解的内容——这其中,如果要像编译静态语义一样去编译动态语义,很多知乎大神认为是根本就不可能的。

本文由美洲杯在哪买球发布于计算机教程,转载请注明出处:篮球世界杯在哪买球:解读 | 华为方舟编译器的

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。