大数据文摘出品
作者:曹培信
8月9日,华为EMUI官方微博发了这么一条微博。

对奉行实用至上的程序员来说,Linux的创始人Linus Torvalds的名言“Talk is cheap,show me the code.”这句话确实是戳到了心里。
8月31日,华为如约开源方舟编译器,并将源代码放出。然而开源并非是在GitHub上,而是自建了一个“华为开源平台”。
这意味着华为自己的开源平台也一并问世。
坊间预测,这是由于7月尾GitHub封禁了一批伊朗账户,让华为意识到了将方舟编译器和鸿蒙系统在GitHub上开源的风险,因此赶工赶出来一个开源平台。
目前平台上只有两个仓库,一是HarmonyOS/OpenArkComplier,另一个是测试用的example。
难怪有人表示:“这是我见过的最简洁的网站了”。
同时,华为还在码云(gitee)上建立了方舟编译器开源代码官方镜像仓库,如今标星已达3.6k。
打响了鸿蒙OS开源的第一枪
8月9日,在广东东莞举办的华为开拓者大会HDC.2019上,华为消费者业务CEO余承东正式发布了鸿蒙HarmonyOS,并宣告鸿蒙OS全部开源!
越日,华为消费者软件副总裁刘丹对华为开源的系统设计和运作模式作了更详细的解释。
刘丹表示,华为软件开源,秉承的是自傲、原谅、公正、共建和共赢五大基本准则,在运作模式上,华为会参考国际常规模式,先以\公众孵化委员会\"大众的简化模式进行初期探索,方舟编译器首先开源,随后其他模块也将分批开源。
对付未来的开源操持,现场也放出了一张表。
方舟编译器作为“排头兵”,打响了鸿蒙OS开源的第一枪。
方舟编译器开源范围
如今,方舟编译器首先在自家平台上开源了自定的编译器IR(Intermediate Representation)——MAPLE IR,RC(Reference Counting)和多措辞设计思想等,用于与业界,学术界沟通互换。后续将陆续开源编译器前端,后端,支持其它措辞(如JavaScript)的编译。
后续华为也会按照操持在2020年开始开源Java编译器工具链,支持Java程序编译;到2021年开始开源JavaScript编译器工具链,可用于JS程序的编译。
安卓卡顿的“闭幕者”华为开拓方舟编译器花了十年,为理解决安卓系统的“四大命门”,华为工程师们夜以继日,只为“再造安卓”。
方舟编译器官网上的一篇文章,生动地诉说了这一段进程。
文章地址:
https://www.openarkcompiler.cn/news/detail/news5
2009年,华为启动5G根本技能研究的同时,开始创建编译组,第一批海内外研究职员加入。2013年,华为推出面向基站领域的自研编译器,并正式提出编译器框架构想。2014年,浩瀚海内外专家加入华为,方舟项目正式启动。2016年,成立编译器与编程措辞实验室。2019年,华为方舟编译器正式面世!2018年春节前一周,方舟编译器跑通安卓系统所有后台做事,并成功移植得手机。成功开机后,项目组成员乃至流下了激动的泪水!
大年初一清晨,总架构师发来了第一条方舟经编译器编译的程序发出来的拜年:
春节快乐,方舟大吉!
方舟编译器的上风在两方面,一是首次在Java领域将去掉了虚拟机,也是史上首次将Java/C/C++等稠浊代码一次编译成机器码直接在手机上运行,彻底告别Java的JNI额外开销,也彻底告别了虚拟机GC内存回收带来的运用进程掉线,使操作流畅度大幅提升。
方舟编译器整体框架
二是方舟编译器用空间换性能,直接将编译器的代码优化搬到了开拓者环境,不再被手机真个硬件资源所限定,为代码优化供应了无限可能。
根据华为官方测试,方舟编译器提升手机系统操作流畅度高达24%,系统相应性能提升44%。
方舟编译器源码编译方舟编译器开源之后,引起了业界广泛关注,方舟编译器仓库的文档也表示开拓者可以根据方舟官方文档编译出OpenArkCompiler。
个中知乎网友“小乖他爹”根据文档进行了编译并撰写了《方舟编译器学习条记》系列,文摘菌在取得作者授权后,将源码编译过程转载如下,快跟文摘菌一起一睹为快吧!
1、操作系统环境:
64位版本的Ubuntu(官方推举Ubuntu 16.04)。我自己本身就有Ubuntu 16.04的虚拟机,以是直接就在上面编译了。
2、根本配置:
sudo apt-get -y install openjdk-8-jdk git-core gnupg flex bison gperf build-essential zip curl zlib1g-devlibc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache libgl1-mesa-dev libxml2-utilsxsltproc unzip lib32z1-dev qemu g++-multilib gcc-multilib python3-paramiko python-paramiko python-jenkinspython-requests python-xlwt libglib2.0-dev libpixman-1-dev linux-libc-dev:i386sudo apt-get -y install gcc-5-aarch64-linux-gnu g++-5-aarch64-linux-gnu
官方推举安装上述库,但是纵然是在Ubuntu 16.04上,这里很多库的版本较低。但是小版本号该当没什么太大的影响,我确当地环境以前编译过别的程序,以是导致很多库的版本都比这个推举的要高,终极没有影响我的编译。以是不用太苛求其版本号。
3、源码下载:
git clone https://code.opensource.huaweicloud.com/HarmonyOS/OpenArkCompiler.git
4、llvm和clang的下载及配置:
从LLVM Download Page下载LLVM8.0.0的Ubuntu 16.04 (.sig) 二进制包。解压之后,放到OpenArkCompiler/tools目录之下。
LLVM Download Page:
http://releases.llvm.org/download.html#8.0.0
Ubuntu 16.04 (.sig):
http://releases.llvm.org/8.0.0/
打开openarkcompiler/build/config/BUILDCONFIG.gn文件,将个中的GN_C_COMPILER、GN_CXX_COMPILER和GN_AR_COMPILER 三个变量配置为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_COMPILER = \"大众${MAPLE_ROOT}/tools/clang_llvm-8.0.0-x86_64-linux-gnu-ubuntu-16.04/bin/llvm-ar\"大众
5、下载和配置Ninja、GN:
从下载Ninja v1.9.0,在tools下新建目录ninja_1.9.0,将ninja可实行文件放到ninja_1.9.0目录之下。
Ninja v1.9.0:
https://github.com/ninja-build/ninja/releases
下载GN,在tools下新建目录GN,将GN可实行文件放到GN目录之下。
GN:
https://archive.softwareheritage.org/browse/content/sha1_git:2dc0d5b26caef44f467de8120b26f8aad8b878be/raw/?filename=gn
打开openarkcompiler/Makefile文件,将GN和NINJA两个变量配置为GN和Ninja可实行程序所在路径。例如:
GN := ${MAPLE_ROOT}/tools/gn/gnNINJA := ${MAPLE_ROOT}/tools/ninja_1.9.0/ninja
6、在OpenArkCompiler目录之下依次实行如下命令:
source build/envsetup.shmake
命令解释:
source build/envsetup.sh初始化环境,将OpenArkCompiler工具链路径openarkcompiler/src/bin设置到环境变量中make编译OpenArkCompiler的Release版本make BUILD_TYPE=DEBUG编译OpenArkCompiler的Debug版本。
至此,完成方舟编译器源码的编译。编译完成之后的界面如图所示:
编译完成之后,在OpenArkCompiler/out目录之下,会有如下几个文件:
实在这几个文件在未编译之前,在OpenArkCompiler/src/bin目录下就有。读了下OpenArkCompiler目录下的Makefile,个中java2jar\jbc2mpl\mplcg都是直接从src/bin目录之下copy到out/bin目录之下的。只有maple有点分外,它该当是编译天生的,然后install的时候反向copy到了src/bin目录之下,以是编译完成之后查看状态(git status),会创造src/bin/maple发生了变革。
OpenArkCompiler/Makefile中关于install的代码:
.PHONY: installinstall: mapleall $(shell cp -rf $(MAPLE_ROOT)/src/bin/java2jar $(MAPLE_ROOT)/out/bin/) $(shell cp -rf $(MAPLE_ROOT)/src/bin/jbc2mpl $(MAPLE_ROOT)/out/bin/) $(shell cp -rf $(MAPLE_ROOT)/src/bin/mplcg $(MAPLE_ROOT)/out/bin/) $(shell cp -rf $(MAPLE_ROOT)/out/bin/maple $(MAPLE_ROOT)/src/bin/)
其余附上作者方舟编译器学习条记系列链接。
方舟编译器学习条记1:方舟干系资料
https://zhuanlan.zhihu.com/p/80624361
方舟编译器学习条记2:源码编译
https://zhuanlan.zhihu.com/p/80643681
方舟编译器学习条记3:方舟可实行文件简介
https://zhuanlan.zhihu.com/p/80693868
方舟编译器学习条记4:文档导读
https://zhuanlan.zhihu.com/p/80783831
方舟编译器学习条记5:方舟开始接管代码合并要求
https://zhuanlan.zhihu.com/p/80905553
方舟编译器学习条记6:方舟开源目录简介
https://zhuanlan.zhihu.com/p/81046562