前阵子华为正式开源了方舟编译器,根据介绍,此次开源的是编译器框架部分源码,包括编译器中间表示(IR,Intermediate
Representation)和语言编译实现,同时搭配编译器其它二进制组件,实现 Java
程序到 aarch64 汇编指令的编译过程。

图片 1

图片 2

华为方舟编译器(OpenArkCompiler)正式开源,官网已上线,源代码包、二进制包已提供下载,相关文档、演示等资料也一应俱全。

代码开源之后,一方面,开发者可以基于开源代码+二进制代码,编译构建出编译器工具链,尝试对
Java 程序进行编译;另一边,社区参与者可以通过框架源码学习方舟编译器的 IR
及基本的中端编译框架,熟悉方舟编译器的架构思想,并参与诸如对编译器中端优化的贡献。

本次方舟编译器开源的是编译器框架部分源码,包括编译器中间表示(IR)和语言编译实现,同时搭配编译器其他二进制组件,实现Java程序到aarch64汇编指令的编译过程。

很快就有消息透露深圳大学正打算将方舟编译器引入课堂,我们借此就方舟编译器相关问题采访了计算机与软件学院院长明仲与软件工程系副主任蔡树彬,并向校方确认了该消息。

开发者可基于开源代码+二进制,编译构建出编译器工具链,尝试对Java程序进行编译。

开源中国:请问您从技术上怎么看方舟编译器?

社区参与者可以通过框架源码学习方舟编译器的编译器中间表达(IR)及基本的中端编译框架,熟悉方舟编译器的架构思想,并参与诸如对编译器中端优化的贡献。

明仲:我认为,方舟编译器技术上最大的变化是改用新的编译和运行机制,将原来安卓应用边解释边执行的即时编译改为先整体静态翻译再优化执行的预先编译模式,大幅度提升了安卓应用的运行效率。这可以说是近几年来能深刻影响整个安卓生态的基础性变化。从
JIT 编译到 AOT
编译的改进,中间有大量技术和工程上的问题需要一一克服,我们很可喜地看到,方舟编译器已经摸索、趟出了这样一条路出来。

按照华为的介绍,方舟编译器是为支持多种编程语言、多种芯片平台的联合编译、运行而设计的统一编程平台,包含编译器、工具链、运行时等关键部件,目前还在持续演进中,上述能力将陆续实现和开源。

开源中国:方舟编译器这次开源重点宣传了
IR(中间表示),其实意味着什么?

通过多语言统一IR表示,方舟编译器可实现应用中多种编程语言联合编译优化提升性能,而且在支持多平台的同时,根据设备特征提供便捷的开发与部署策略提升效率。

明仲:中间表示是编译器后端整个代码分析、优化工作的基础,优秀的 IR
设计才能够支撑起更好的代码优化处理。整体设计上,方舟编译器更关注静态编译,所以
IR 设计包括的程序信息比 LLVM
多了很多,这将非常有利于方舟编译器在代码优化阶段的处理,将能编译出更高效的代码。

华为方舟编译器提供了全新的系统及应用的编译和运行机制,从动态编译变为静态编译,就是直接将高级语言直接编译成机器码,彻底消除了虚拟机动态编译的额外开销,实现了开发和运行效率的兼容并举。

*注:**LLVM(Low Level Virtual Machine,低级虚拟机)
是一个模块化和可重复使用的编译器和工具技术的集合。提供了与编译器相关的支持,可以作为多种语言编译器的后台来使用,它能够进行程序语言的编译优化、链接优化、在线编译优化与代码生成。*

1、多语言联合

开源中国:方舟编译器开源出来的内容好像不完整,这点您怎么看?

将同一应用中的不同语言代码联合编译、联合优化,消除语言间的性能“鸿沟”,降低开发者的优化成本

明仲:首先,我们可以看到,方舟编译器有完整的开源计划时间表,作为一个原来是内部研发的项目,在开源前花一定时间进行必要的代码梳理,这个我们完全可以理解。

2、轻量运行时

其次,尽管方舟编译器已经做了许多工作,克服了不少困难,也取得了一些成果,但与成熟的
LLVM
相比,还是存在差距。在当前国内外环境下,除了方舟编译器项目团队自身需要加紧时间完善外,还需要借力于我们整个社区一起努力共建,才有可能能更快形成整个自主可控的软件生态。所以,方舟编译器先开源部分内容的做法我们完全可以理解。

通过编译器的语言实现能力和优化能力增强,应用运行时的开销更小

在内存泄露或溢出的源码分析方面,我们学院一直有团队在进行研究,也取得一些不错的结果,我们也愿意一起参与到方舟编译器社区的建设中。

3、软硬件协同

此外,方舟编译器的开源对我们当前的人才培养和教学改革来说也非常有意义。IR
设计、RC
优化等具体技术可以扩充我们的教学内容。更重要的是,在方舟编译器的基础上,我们能更好地培养自主可控的基础、系统软件人才,满足我国当前的发展战略要求。

编译器与芯片实现软硬件协同优化,充分发挥硬件能效,应用体验更佳

开源中国:也就是说深圳大学打算把方舟编译器搬到大学课堂?

4、多平台支持

蔡树彬:我们这次计划把方舟编译器搬到课堂是一件非常顺利、开心的事情。一方面,以学生为中心,面向产出的计算机系统能力培养是我们教学的一个重要目标。

支持面向多样化的终端设备平台进行编译和运行,根据设备特征提供便捷的开发与部署策略,提高开发效率

近几年来,我们学生的能力水平提升很快,原本的编译原理教学内容开始不能满足学生的学习需求。于是,我们计划在后续课程中,增加更多编译器中后端的内容,促使学生能够形成更完整、全面的计算机系统能力。

当前方舟编译器支持Java/Kotlin程序字节码的前端输入,C/C++/JS等其它编程语言的支持还在规划中。

另一方面,在当前国内外形势下,自主可控已经成为国家重要的发展战略。编译器是计算机非常重要的基础系统软件,自主可控自然也变得非常重要。就在这个时间节点,方舟编译器宣布计划开源。通过与华为工程师几次沟通下来,我们不但发现华为工程师很热心,非常愿意帮助我们一起利用方舟编译器来改进编译课程教学,而且方舟编译器的
IR 设计和 RC 实现优化,也刚好能够成为我们编译器中后端内容教学的范例。

方舟编译器的中间表示(IR)转换器将前端输入转换成方舟IR,并输送给后端的优化器,最终生成二进制文件,二进制文件与编译器运行时库文件链接生成可执行文件,在方舟的运行环境中就可执行该文件。

整体上,我们这次与华为合作,把方舟编译器搬到课堂,真是一件非常顺利并且开心的事情。我们也很期待后续跟方舟编译器团队继续进行更深入的合作,一起建设完善整个方舟编译器社区。

方舟编译器IR是支持程序编译和运行的中间程序表示。程序源代码中的任何信息对于程序分析和优化都是有帮助的,所以方舟IR的目标是尽可能完整详细地提供源程序的信息。

(文/开源中国)    

- 硬件配置推荐

方舟编译器的硬件配置需求不高,最低只需2GHz双核心处理器、2GB内存、200GB硬盘空间,当然要获得最高效率,更高配置是强烈推荐的。

- 开发环境推荐

需要64位版本的Linux,尤其推荐Ubuntu 16.04

sudo apt-get -y install openjdk-8-jdk git-core gnupg flex bison gperf
build-essential zip curl zlib1g-dev libc6-dev-i386 lib32ncurses5-dev
x11proto-core-dev libx11-dev lib32z-dev ccache libgl1-mesa-dev
libxml2-utils xsltproc unzip lib32z1-dev qemu g++-multilib gcc-multilib
python3-paramiko python-paramiko python-jenkins python-requests
python-xlwt libglib2.0-dev libpixman-1-dev linux-libc-dev:i386

sudo apt-get -y install gcc-5-aarch64-linux-gnu g++-5-aarch64-linux-gnu

- Clang编译器

主要用于编译方舟编译器代码。

下载clang+llvm-8.0.0-x86_64-linux-gnu-ubuntu-16.04,地址:

放置到openarkcompiler/tools目录,打开openarkcompiler/build/config/BUILDCONFIG.gn文件,将GN_C_COMPILER、GN_CXX_COMPILER和GN_AR三个变量配置为Clang编译器所在路径。例如:

GN_C_COMPILER =
“${MAPLE_ROOT}/tools/clang_llvm-8.0.0-x86_64-linux-gnu-ubuntu-16.04/bin/clang”

GN_CXX_COMPILER =
“${MAPLE_ROOT}/tools/clang_llvm-8.0.0-x86_64-linux-gnu-ubuntu-16.04/bin/clang++”

GN_AR =
“${MAPLE_ROOT}/tools/clang_llvm-8.0.0-x86_64-linux-gnu-ubuntu-16.04/bin/llvm-ar”

其中${MAPLE_ROOT}为openarkcompiler源码根目录。

安装Ninja、GN并完成配置

- Ninja、GN

下载Ninja(v1.9.0)及GN(Linux Version) Ninja,地址:

GN下载地址:

将GN和Ninja可执行程序放置到openarkcompiler/tools目录,打开openarkcompiler/Makefile文件,将GN和NINJA两个变量配置为GN和Ninja可执行程序所在路径。例如:

GN := ${MAPLE_ROOT}/tools/gn/gn

NINJA := ${MAPLE_ROOT}/tools/ninja_1.9.0/ninja

Q1:方舟编译器开源有官方网站吗?

A1:

孵化期间,官方网站为

Q2:方舟编译器是一次性全部代码吗?

A2:

首次开源范围是编译器IR(Intermediate Representation)、RC(Reference
Counting)和多语言设计思想等,用于与业界、学术界沟通交流。后续将陆续开源编译器前端、后端,支持其它语言(比如JavaScript)的编译等。

当前部分Java语言特性和JVM虚拟机特性的支持未包括在本次开源代码中,包括annotation、lambda表达式、泛型等。

目前仍有很多地方不完善,会在社区陆续迭代,遇到问题请在社区提交issue。

Q3:通过哪些渠道可以获取方舟编译器的框架源码?

A3:

孵化期间,开发者可以通过如下代码托管网址获得相关代码和文档,供参考学习、了解方舟编译器的架构和代码。

华为云托管地址:

开源中国码云托管地址:

Q4:方舟编译器开源路标是怎样的?

A4:

方舟编译器从2019年8月开始开源,欢迎广大的应用开发者、手机厂商、软件从业人员一起共建开源社区和生态。

开源计划大体上这样安排:2019年8月重点开源框架部分;后续将陆续开源编译器前端、后端;支持Jav
程序编译、JavaScript语言应用的编译等。

Q5:还有哪些方式可以获取方舟编译器的相关信息?

A5:

方舟编译器有官方微信公众号:开源方舟编译器

Q6:方舟编译开源面向全球开发者吗?英文网站何时上线?

A6:

方舟编译器是向全球开发者进行开源,因此,官方网站和代码托管平台均面向全球开发者开放。

目前英文版网站正在紧张的开发及内测,计划将于2019年Q4上线。

Q7:方舟编译器源码托管计划是怎么的?

A7:

孵化委员会期间,方舟编译器代码是托管在华为云上面。

在未来走向开放治理以后,将由所挂靠机构选择的平台进行托管。如果挂靠的机构采取了X平台,就采用这个机构的代码托管模式进行托管。

当前代码托管的地址:

所有相关信息请以方舟编译器开源官方网站发布为准。

Q8:方舟编译器开源使用的是什么License?

A8:

方舟编译器采用木兰License,由业界众多专家和公司集体共建,并非华为主导,具体好处详见专业点评:

开源中国:

开源社:

InfoQ:

Q9: 如何确认下载包来源可靠?MD5校验码是多少?

A9:

OpenArkCompiler-0.2-ubuntu-16.04-x86_64.tar.gz二进制包的MD5码是:e7dc8b8c242f2d26429e2ad71dae3112

OpenArkCompiler-0.2.tar.gz源代码包的MD5码是:1bf859a67c8b9a2d4080bdaf25ef6181

从官网给出的介绍看,目前已有至少45款第三方应用支持华为方舟编译器,都是大家耳熟能详的超大用户量APP,不过尚未看到微信。

具体名单如下: