华为方舟编译器
1.1、华为方舟编译器简介
是什么 ?:国产的类似于LLVM的编译器平台
开发语言:C++
官方主页:https://www.openarkcompiler.cn
源码仓库:

华为方舟编译器的目标与Oracle GraalVM中的native-image的目标是类似的,不过, 它的首要目标是将Java字节码编译为AArch64CPU架构的机器码,以提高Android的运行速度。

注意:2019/08/31开源的华为方舟编译器不是完整的, 只是它的中端,只明确支持64bitUbuntu16.04

1.2、华为方舟编译器的架构

华为方舟编译器参考了LLVM的架构, 如果你熟悉LLVM的架构,那么,华为方舟编译器的架构很容易理解。

1.3、通过下载编译好的二进制压缩包安装华为方舟编译器

1、安装依赖

下载时cURL
解压时targzip
运行时bashJDK
sudo apt-get install -y curl tar gzip openjdk-8-jdk

step2、使用curl命令下载编译好的华为方舟编译器二进制压缩包 (

curl -LO https://www.openarkcompiler.cn/download/OpenArkCompiler-0.2-ubuntu-16.04-x86_64.tar.gz

step3、使用tar解压压缩包

tar vxf OpenArkCompiler-0.2-ubuntu-16.04-x86_64.tar.gz

step4、进入OpenArkCompiler-0.2-ubuntu-16.04-x86_64目录,并查看它的内容

step5、将OpenArkCompiler-0.2-ubuntu-16.04-x86_64/bin加入PATH环境变量中

export PATH=~/OpenArkCompiler-0.2-ubuntu-16.04-x86_64/bin:$PATH
1.4、通过源码编译安装华为方舟编译器
step1:通过apt-get安装依赖
下载时gitcURL
解压时tarxzunzip
编译时POSIX shGNU CoreUtilsmakeawksedgccGnuPGgperfbisonflex
运行时bashJDK
sudo apt-get -y update
sudo apt-get -y install curl git-core tar xz-utils unzip gnupg flex bison gperf build-essential ccache openjdk-8-jdk
sudo apt-get -y install zlib1g-dev libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev libgl1-mesa-dev libxml2-utils xsltproc lib32z1-dev qemu g++-multilib gcc-multilib libglib2.0-dev libpixman-1-dev linux-libc-dev:i386
sudo apt-get -y install python3-paramiko python-paramiko python-jenkins python-requests python-xlwt
sudo apt-get -y install gcc-5-aarch64-linux-gnu g++-5-aarch64-linux-gnu
step2:下载华为方舟编译器源码

1、使用git下载华为方舟编译器源码:

git clone https://gitee.com/harmonyos/OpenArkCompiler.git

2、进入OpenArkCompiler目录,并查看它的内容:

step3:配置ninja

1、查看MakefileNINJA变量的值:

2、创建tools/ninja_1.9.0目录:

mkdir -p tools/ninja_1.9.0

3、使用curl命令下载1.9.0版本的ninja

curl -LO https://github.com/ninja-build/ninja/releases/download/v1.9.0/ninja-linux.zip

4、使用unzip解压ninja-linux.zipOpenArkCompiler/tools/ninja_1.9.0目录下:

unzip ninja-linux.zip -d tools/ninja_1.9.0
step4:配置gn

1、查看MakefileGN变量的值:

2、创建tools/gn目录:

mkdir -p tools/gn

3、使用curl命令下载gn,并放到OpenArkCompiler/tools/gn目录下:

curl -L -o tools/gn/gn https://archive.softwareheritage.org/browse/content/sha1_git:2dc0d5b26caef44f467de8120b26f8aad8b878be/raw/?filename=gn

4、给tools/gn/gn赋予执行权限:

chmod a+x tools/gn/gn
step4:配置clang + LLVM

一个成熟的编译器是能够完成自举的。自举就是可以用它自己编译自己,比如你要通过源码编译GCC,编译GCC的编译器可以是GCC,这就是自举

2019/08/31开源的华为方舟编译器不能自举, 主要是因为这次开源的不是完整的华为方舟编译器,这次开源的只是它的中端,编译它要使用Clang + LLVM

1、查看build/config/BUILDCONFIG.gnGN_C_COMPILER变量的值:

grep "GN_C_COMPILER" build/config/BUILDCONFIG.gn

结果如下:

2、使用curl命令下载clang+llvm-8.0.0-x86_64-linux-gnu-ubuntu-16.04

curl -C - -LO http://releases.llvm.org/8.0.0/clang+llvm-8.0.0-x86_64-linux-gnu-ubuntu-16.04.tar.xz

3、使用tar解压:

tar vxf clang+llvm-8.0.0-x86_64-linux-gnu-ubuntu-16.04.tar.xz -C tools

4、修改clang+llvm-8.0.0-x86_64-linux-gnu-ubuntu-16.04目录为clang_llvm-8.0.0-x86_64-linux-gnu-ubuntu-16.04

mv tools/clang+llvm-8.0.0-x86_64-linux-gnu-ubuntu-16.04 tools/clang_llvm-8.0.0-x86_64-linux-gnu-ubuntu-16.04
step5:编译华为方舟编译器

1、使用make进行编译:

make MAPLE_ROOT=$(pwd)

2、编译结果在out目录中,看看它:

3、将OpenArkCompiler/out加入PATH环境变量中:

export PATH=~/OpenArkCompiler/out:$PATH
1.5、华为方舟编译器Docker镜像

2019/08/31开源的华为方舟编译器不是完整的,只是它的中端, 只明确支持64bitUbuntu16.04, 没有此环境的要不使用虚拟机,要不使用Docker体验了。

我已经编写了一个Dockerfile,构建方法如下:

docker build -t openarkcompiler:0.2 https://raw.githubusercontent.com/leleliu008/auto/master/OpenArkCompiler/Dockerfile

创建Docker容器:

docker run -it --rm --hostname ubuntu openarkcompiler:0.2 /bin/bash
1.6、华为方舟编译器能干什么

真正的华为方舟编译器已经在实际中使用了,2019/08/31开源的华为方舟编译器不是完整的, 只是它的中端,它原来的工程里有很多资源,这次有选择性的开源了一部分。毕竟,开源涉及到很多法律问题,不能一蹴而就,一步一步的走。 大家一定要先仔细去读读文档,不要放过每一个字

华为在万众期待的目光下仓促开源了华为方舟编译器, 目的仅仅是让关心的人初步了解其架构,让学术讨论更流畅,不要天天在那里猜测了,流言满天飞。 让你初步体验一下下,你看它只是带了几个简单的例子。这些例子也运行不起来。你不仔细研究当然是运行不起来啦!

我始终觉得学习最好的方法是出错,不出错是学不会的,出现错误了,分析才能学通透。很多人遇到错误就慌了、毛愣了, 要喜欢上出错,如果惧怕出错,就是在隐藏问题,终有一天一个巨大的错误会打倒你,所以,学习的过程中多出错,真正上了战场就会少出错。

我下面以两个例子说说从华为方舟编译器的开源中如何学习的问题:

java2jar命令,它实际上就是一个Shell脚本,最终调用的是javacjar两个命令,这两个命令有多少人会用呢? 平时用惯了IDE,这时候,你会发现没招架之力了。基础没掌握好啊!!如果发现自己不会、或者用的时候不流畅,你可以深入学习这两个命令嘛, 然后你觉得它那个Shell脚本可以优化,你写好了,测试没问题了, 在issue列表里详细说说你的merge request的计划,人家管理员看到了会联系你,你们达成共识了,你发起merge request,这样你也学到知识了,也给人家做了贡献,多好~

maple命令,总是出错, 你怎么就不自己分析分析为啥会出现错误呢?他是用C++写的,其实都很基础, 大部分就是参数的解析之类的,有几个Linux系统调用,仔细分析一下,就理清脉络了, 这正是你学习的好机会啊,可是很多人,一看到错误,分析也不分析,直接把错误贴到issue列表里,这一点儿意义也没有,对自己没好处, 丧失了学习的机会;对团队也没好处,其实人家知道这些问题,你提的这些问题对人家没有任何意义,人家是希望你借此机会熟悉代码,然后能贡献点儿你的智慧, 结果都是伸手党,只要结果,不想参与,这就与开源精神背离了。

你有没有想过一个深层次的问题:是不是非得熟悉它了的代码之后才能知道问题出在哪里呢? 这就上升到方法论的层次了,给你一个陌生的东西,那如何快速定位到问题,这是门学问,你一旦掌握了方法,那就是举一反三,成批成批的会, 比如这里面出错了,打印出了一些日志,通过这些日志你有没有什么方法追踪到哪里出现问题了,问题定位与它的逻辑是怎么样的完全没有关系, 只要掌握了方法,就很简单,虽然你没看过它的代码逻辑,依然能快速定位到出错的位置,看看造成该问题的原因。这样给人家提问题才有意义,不然毫无意义。

1.7、为华为方舟编译器做贡献

从源码编译华为方舟编译器中,我们已经看出来了,刚刚开源,很不完善。 很多人会说,华为方舟编译器这么基础性的东西也没弄好,似乎不咋地,实际上,华为方舟编译器已经在实际中使用了, 开源是从原来的项目中剥离了一部分出来,有些流程之类的都变了,出现问题在所难免。因为它的某些东西可能为了配合开源而临时写的,没怎么测试,也没时间测试嘛。 比如只明确支持64bitUbuntu16.04, 换成其他的版本或者系统要出现一大堆错误;Makefile是手写的,显然不符合大型工程的要求,一般的,很小的项目才手写Makefile, 大型工程肯定要用cmake之类的工具产生Makefile, 由于是手写的Makefile,兼容性自然是不好的,所以它的配置才那么麻烦。不能够智能猜测各个工具,系统兼容性完全没有; 生成的可执行文件有的没有可执行权限等。

华为这次开源华为方舟编译器目的最重要的是便于学术交流,不是提供给大家一个已经完善的、免费的东西让大家用的, 所以,对于这些不完善,也不要抱怨,参与进来就很好。

很多人不管三七二十一,一出现问题就上去问问题,你至少相关的知识要懂吧,啥也不懂就问问题,这不是给添堵嘛,而且也不利于你的进步。 提问题要慎重,出现问题,自己先尝试解决,确认确实是它的问题,你再提问题。开源的目的是为了让大家做贡献的,不是为了让你给他添麻烦的。 一定要把这个道理记在心里。你是要做个有用的人呢?还是要做个麻烦制造者呢?

如何贡献