华为方舟编译器开源了,Show you the code!

昨天,8 月 31 日,也是 8 月的最后一天,华为履约在 8 月这个时间点正式开源了方舟编译器。

对于华为来说,他们拖到 8 月的最后一天开源必然是有一些难言之隐,在开源的过程中我们也可以看到华为的一些赶工的痕迹。方舟编译器的初版开源代码只公开了 3 分钟就关闭了,原因是华为在文档和版权声明上没有处理好,所以是把这个版本紧急撤回并回炉了。

华为方舟编译器开源了,Show you the code!

如果方舟编译器早早就做好了开源的准备,做好了代码的 review,这些文档上的错误必然是不会出现的,所以很显然,华为是非常匆忙地将这些代码上线开源,对于开源,他们并没有做好充分的准备。

虽然华为内部推进相关的开发可能已经有很长时间了,但是打造一个优秀的编译器可不是一朝一夕的事情,所以临近承诺的开源时限,华为应该也是迫于当下的舆论形式而临阵磨枪,抓了一批工程师加班加点地赶出了这一版可以开源放出的代码。

华为的开源路线图也从侧面反映出了华为在开发时间上的紧迫,方舟编译器的开源分为两部分,这一次的开源只是「框架开源」,华为只会放出一部分代码,而非所有代码,这被网友们戏称为「按揭开源」。

华为方舟编译器开源了,Show you the code!

如果方舟编译器已经完成了开发,那么它完全没有必要切割成两个部分进行开源,这意味着华为在发布方舟编译器的时候,方舟编译器距离完全开发完整还有很长一段路,华为其实也没有办法保证到了 12 月,方舟编译器一定能够完整地放出来,从现在来看, 这个时间更多只是华为相对自信的开发进度的预估时间。

此前网友们对方舟编译器是提出了各种各样的质疑,和鸿蒙 OS 类似,此前华为公开提到的、关于方舟编译器的内容都没有实质性的技术内容,以至于专业人士也没有办法去分析方舟编译器的优劣。

方舟编译器到底实力如何,对 Android 应用来说到底能带来多少提升,在编译方面它做了什么样的创新,是否能够给行业带来巨大的变化。这一切,只有在方舟编译器开源后我们才能知晓,开源前一切只是空谈。

之前很多网友搬出了「Talk is cheap, show me the code」这句话来质疑方舟编译器的实际能力,华为官方似乎是看到了网友们的发言与讨论,在开源前的预热海报上,他们打上了「Show you the code」这句话,用代码去对质疑做一个有力的回击。

华为方舟编译器开源了,Show you the code!

方舟编译器并没有选择 GitHub 等知名的代码托管平台进行代码的开源,为了配合这一次的开源,华为特地打造了一个他们自己的「华为开源平台」来托管开源代码。

华为这么做可能是方便他们自己管理开源代码,根据开源许可,华为的这些代码是可以被他人上传到其他平台的,所以华为并不是出于「代码会被国外盗走」之类的原因而自己打造一个平台来托管代码的,如果担心这方面的原因,那么华为不可能会宣布方舟编译器以及鸿蒙 OS 的开源。

既然开源了,那么根据其采用的木兰开源许可,方舟编译器的源代码是可以被自由传播的。在方舟编译器代码部分开源之后,其源代码也是很快就出现在了 GitHub 上。

笔者个人认为华为选择自己搭建的开源平台作为首选平台托管代码,一方面是便于代码的管理,另一方面是方舟编译器是华为内部的产物,他们可能也不太希望这个东西受到外界过多的干扰,例如华为对其他开发者向这个项目贡献代码就有相对比较严苛的要求,华为要求开发者先与开发团队取得联系,就修改的地方进行讨论,在达成共识之后才会合入开发者贡献的代码,这和其他很多开源项目有很大的不同。

华为方舟编译器开源了,Show you the code!

方舟编译器的核心思想是将多种编程语言转化到一个统一的 IR,再基于 IR 将代码进行编译,生成二进制的可执行文件,配合 Runtime 在设备上运行。

目前方舟编译器只做了对 Java/Kotlin 的支持,其他语言目前只是在规划中。从方舟编译器目前对 Java 的支持程度来看,华为是做了相当多的工作。

在这个结构图中,Java 到 Maple IR 只是一个箭头,但在实际的编译过程中,华为需要考虑到 Java 众多的语言特性,对其做翻译到 IR 的处理。Java 本身的一个特点就是语义比较复杂,方舟编译器能够做到对 Java 8 特性的完全支持已经是很复杂的事情了。

华为设计的 Maple IR 实际上可以被看作是一种新的语言,它相较于 Java 等语言更接近底层,但是又和最终的基层代码存在一定区别,它的定位是高级语言和低级语言之间的一个中间表示。有了这个中间表示,只要华为能够对其他的编程语言进行到 Maple IR 的转化,方舟编译器就可以将这门语言的代码直接编译到最终的可执行文件。

你完全可以手写一段 Maple IR 并使用方舟编译器对其进行编译,就像你可以直接不用高级编程语言直接写一段汇编程序并在设备上运行一样。

华为方舟编译器开源了,Show you the code!

Maple IR 的设计是方舟编译器的一大核心,相关的文档在方舟编译器的官网可以下载到,通过它你可以详细地了解到华为是怎么样构建 Maple IR 的,以及它是怎么覆盖 Java 的 Class 以及 Interface 的,在 Maple IR 中这是相当重要的一部分。

在这一次的部分开源中,华为想要强调的正是方舟编译器的这个「支持多语言的设计」。方舟编译器并不是世界上第一个支持编译多个语言的编译器,但在国内,华为是第一个迈出这一步的公司。

除了 Maple IR,这一次华为还开源了 ITable、VTable 的具体实现,以及异常处理和 RC,这些对于编译器来说也是比较重要的内容,如果你对编译原理十分感兴趣的话,可以配合文档对这些代码进行阅读。

华为方舟编译器开源了,Show you the code!

这一次方舟编译器开源的只是整个方舟编译器中非常小的一部分,方舟编译器本身有前端、中端、后端三个部分组成,前端主要负责的是处理输入,生成 IR,而终端主要是对 IR 进行优化,后端主要是基于优化后的 IR 生成优化的二进制文件,从前到后是一个环环相扣的过程。


由于目前方舟编译器开源的部分还非常少,所以我们即使获取了现有的代码,我们也还不能对一个完整的 Android 应用做转化,我们甚至没有办法用它去编译一份 Java 代码。

从方舟编译器的结构图里我们可以看到,很多设计到优化的部分都还没有开源。对于一个编译器来说,优化也是非常重要的一部分,同时优化部分也是能够看出方舟编译器绝活的一部分,换句话说,方舟编译器的重头戏还在后面。

不得不承认的是,华为在软件这一方面确实是有很强硬实力的,但是现有的代码第一是不全,第二是还有一些比较粗糙的地方,代码不够精致,虽然你可以说这是别的开发者在鸡蛋里挑骨头,但是对于这样一个项目,笔者认为要求严苛一点也没什么大问题。

对于一些开发者来说,现有的代码是既有让人激动的地方,也有让人失望的地方,因为方舟编译器的 Maple IR 能够覆盖 Java 的各种特性确实是一个亮点,但是在其他部分,方舟编译器的实现有的是低于外界预期的,例如 GC,华为用到的就是引用计数,这个有不少开发者都猜到了,对于引用计数本身华为也并没有做什么很大的创新。

笔者个人预计接下来的一段时间网络上应该也比较难见到对方舟编译器的相对全面的深入剖析,因为现有的代码还只是前菜,现在还没到对编译器进行深入剖析的时间。

华为的工程师现在基本上是在极限施工,方舟编译器最终是一个什么样的质量还没有人知道,笔者个人的态度是技术细节上该批评的还是批评,不要抓着一些细枝末节的地方不放就好,例如一些可能是失误引起的版权声明问题,亦或是「按揭开源」这个概念,给华为太大的压力反而不太利于方舟编译器平稳向前推进。

对于普通的、非开发者的网友,如果你要支持它,默默支持就好,动不动就沸腾一波实际上也会给华为带来很大的舆论压力,实际上华为有跳票这一次开源的权利,通过跳票来花更多的时间对代码进行一个全面的 review,使最终开源出来的部分是精致的,但是如果华为跳票,网络上必然会多非常多的负面言论,相较于技术上的压力,笔者个人认为施加在方舟编译器团队上的舆论压力反而是要可怕得多。