大数据文摘出品
作者:曹培信
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-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
官方推荐安装上述库,但是即使是在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/gn NINJA := ${MAPLE_ROOT}/tools/ninja_1.9.0/ninja
6、在OpenArkCompiler目录之下依次执行如下命令:
source build/envsetup.sh make
命令说明:
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: install
install: 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:方舟开源目录简介