打响了鸿蒙OS开源的第一枪OS全部开源!(组图)

8月9日,华为EMUI官方微博发布了这样一条微博。

对于追求实用性第一的程序员来说,Linux 创始人 Linus Torvalds 的名言“Talk is Cheap, show me the code”。这句话真是戳中人心了。

8月31日,华为按照承诺开源方舟编译器并发布源代码。不过开源不在GitHub上,而是搭建了一个“华为开源平台”。

这意味着华为自己的开源平台也出来了。

推测这是因为 GitHub 在 7 月底封禁了一批伊朗账号,让华为意识到 GitHub 上开源方舟编译器和鸿蒙系统的风险,所以冲出了一个开源平台。

目前平台上只有两个仓库,一个是HarmonyOS/OpenArkComplier,一个是用于测试的例子。

难怪有人说:“这是我见过的最干净的网站”。

同时,华为还在gitee上建立了方舟编译器开源代码的官方镜像仓库,目前star数已经达到3.6k。

打响鸿蒙OS开源第一枪

8月9日,在广东东莞召开的华为开发者大会HDC.2019上,华为消费者业务CEO余承东正式发布鸿蒙OS,并宣布鸿蒙OS全部开源!

次日,华为消费者软件副总裁刘丹对华为的开源系统设计和运行模式进行了更详细的讲解。

刘丹表示,华为的软件是开源的,秉承自信、包容、公平、共建、共赢五项基本原则。在运营模式上,华为将参照国际常规模式,首先以“孵化委员会”的简化模式进行初步探索。,方舟编译器会先开源,其他模块再分批开源。

对于未来的开源计划c语言在线编译器手机,现场还发布了一张表格。

作为“排头兵”,方舟编译器打响了鸿蒙OS开源的第一枪。

方舟编译器开源范围

如今,方舟编译器已经在自己的平台上首次开源了自己的自定义编译器IR(Intermediate Representation)——MAPLE IR、RC(Reference Counting)以及多语言的设计思路,与业界和学术界进行交流。未来编译器的前后端都将开源,以支持其他语言(如JavaScript)的编译。

后续,华为还将在2020年开源Java编译器工具链,支持Java程序编译;到2021年,将开源JavaScript编译器工具链,可用于JS程序编译。

安卓卡顿的“终结者”

华为花了十年时间开发方舟编译器。为了破解安卓系统的“四大命门”,华为工程师夜以继日地“重构安卓”。

方舟编译机关网站上的一篇文章生动地讲述了这个故事。

文章地址:

2018年春节前一周,方舟编译器跑遍了安卓系统所有后台服务,成功移植到手机上。开机成功后,项目组成员更是激动的流下了激动的泪水!

大年初一一大早,总架构师从方舟发出了编译器编译的第一条新年讯息:

新年快乐,方舟好运!

方舟编译器的优势体现在两个方面。首先,虚拟机将在Java领域首次被移除。这也是历史上第一次将Java/C/C++等混合代码编译成机器码直接在手机上运行,​​彻底告别Java的JNI extra。开销也彻底告别了虚拟机GC内存回收导致的​​应用进程断线,大大提高了运行的流畅度。

方舟编译器整体框架

二是方舟编译器以空间换性能,直接将编译器的代码优化移到开发者环境中,不再受限于手机硬件资源,为代码优化提供无限可能。

根据华为官方测试,方舟编译器将手机系统运行流畅度提升高达24%,系统响应性能提升44%。

方舟编译器源码编译

方舟编译器开源后,引起了业界的广泛关注。方舟编译器仓库的文档也表明开发者可以根据方舟官方文档编译OpenArkCompiler。

其中,知乎网友“小家伙的爸爸”根据文档整理编写了《方舟编译器学习笔记》系列。Digest Bacteria在获得作者授权后,将源码编译过程转载如下,一起来看看Digest Bacteria吧!

图片[1]-打响了鸿蒙OS开源的第一枪OS全部开源!(组图)-老王博客

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: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 下载页面下载 LLVM8.0.0 的 Ubuntu 16.04 (.sig) 二进制包。解压后放在OpenArkCompiler/tools目录下。

LLVM 下载页面:

#8.0.0

Ubuntu 16.04 (.sig):

打开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 目录。

忍者v1.9.0:

下载GN,在tools下新建一个目录GN,将GN可执行文件放到GN目录下。

GN:

:2dc0d5b26caef44f467de8120b26f8aad8b878be/raw/?文件名=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目录下的Makefilec语言在线编译器手机,其中java2jar\jbc2mpl\mplcg直接从src/bin目录复制到out/bin目录下。只有maple有点特殊,应该是编译生成的,然后安装的时候复制到src/bin目录下,所以编译完成后查看status(git status)会发现src/bin/maple已经改变。

OpenArkCompiler/Makefile中关于安装的代码:

.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:方舟相关信息

方舟编译器学习笔记2:源码编译

方舟编译器学习笔记3:方舟可执行文件简介

方舟编译器学习笔记4:文档指南

方舟编译器学习笔记5:方舟开始接受代码合并请求

方舟编译器学习笔记六:方舟开源目录介绍

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论