编译方舟编译器源码教程

前言:本博客主要是对华为开源平台的官方编译文档,做进一步的讲解,以及解决在编译时可能会到的问题。现在,先把编译成功的流程分享出来,后续再对各个工具和术语,以及如何使用编译出来的编译器,做进一步的讲解。

配置要求:Ubuntu系统一个,最好是16.04或18.04。

一、克隆方舟编译器源码到本地
1、仓库地址:https://code.opensource.huaweicloud.com/HarmonyOS/OpenArkCompiler.git

2、在home/目录下,打开终端,切换到root角色,执行以下命令。

git clone https://code.opensource.huaweicloud.com/HarmonyOS/OpenArkCompiler.git

二、下载依赖库

2.1、在终端,先执行以下命令:

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

2.2、再执行:

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

2.3、如果2.1和2.2没报错,请忽略2.3部分。 如果在执行2.1时,遇到以下错误: Unable to locate package python-jenkins。那么,我们重新执行如下命令(以下命令不带安装 python-jenkins):

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-requests python-xlwt libglib2.0-dev libpixman-1-dev linux-libc-dev:i386

再执行,以下命令,单独安装python-jenkins,成功后,再接着,执行2.2部分就行。

pip install python-jenkins

三、下载clang+llvm-8.0.0-x86_64-linux-gnu-ubuntu-16.04
打开以下面地址:clang+llvm-8.0.0-x86_64-linux-gnu-ubuntu-xx下载clang+llvm。请注意,下载你的ubuntu系统所对应的版本,我的是18.04,就下载18.04的,如图所示。
在这里插入图片描述
下载完后,在终端,进入文件所在的位置,执行以下命令,解压文件:

tar -xvf clang+llvm-8.0.0-x86_64-linux-gnu-ubuntu-18.04.tar.xz 

将解压出来的文件,放置在方舟编译器源码目录下的这个位置:openarkcompiler/tools(我的实际克隆下来的目录名是OpenArkCompiler/,官方指导的是openarkcompiler,本篇以官方指导的为主,编译过程,请以你实际克隆下来的项目的目录名为准)。并打开openarkcompiler/build/config/BUILDCONFIG.gn文件,将GN_C_COMPILER、GN_CXX_COMPILER和GN_AR_COMPILER三个变量配置为Clang编译器所在路径(其中${MAPLE_ROOT}为openarkcompiler源码根目录。),例如:

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"

实际,如下图所示:
在这里插入图片描述
四、下Ninja、GN。
1、Ninja(v1.9.0)下载地址:
https://github.com/ninja-build/ninja/releases
在这里插入图片描述
下载完后,在终端,进入文件所在的位置,执行以下命令,解压文件:

tar -zxvf ninja-1.9.0.tar.gz 

2、GN下载地址:https://archive.softwareheritage.org/browse/content/sha1_git:2dc0d5b26caef44f467de8120b26f8aad8b878be/raw/?filename=gn

下载完后,在终端,进入文件所在的位置,执行以下命令,让gn变成可执行文件:

chmod 777 gn

五、配置安装Ninja、GN。
1、复制解压后的ninja文件和下载的gn到openarkcompiler/tools目录下。然后,从终端进入ninja-1.9.0目录,并执行以下命令:

./configure.py --bootstrap

完成后,会生成一个ninja文件。
2、将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

实际,如下图所示(路径要根据实际的文件路径和命令而定):
在这里插入图片描述
在这里插入图片描述

四、编译源码。
做完成上述步骤后,在终端,回到**openarkcompiler/**目录下,执行以下命令,将上述配置,导到环境变量里面去:

source build/envsetup.sh

最后,执行编译命令:

make

编译成功后,如下图所示:
在这里插入图片描述
接着,由终端进入**openarkcompiler/out/bin/**目录下,就可以看到编译出来的,用于实现编译的相关工具,这里生成的不是一个类似于IDEA或Android Studio的可视化的编译工具。如下图所示:
在这里插入图片描述

五、Conclusion。
至此,我们已经成功的编译出了方舟编译器。接下来,我们需要进一步研究一下,如何使用它来编译我们的安卓代码。传说这个编译器,可以提高我们安卓程序的运行的流畅度,所以,很值得一学。现在,相关的资料较少,据知乎上的某大神的实验,现在方舟编译器仍然不能很好的运作。但是,据百度百科上,对方舟编译器的说明,已经有几十款流行APP,通过方舟编译,并成功上架华为市场。所以,但本博主,本着实践出真知的态度,一定要自己去试一遍,确定是不是真的,下篇见!Finally, Thank you for reading my post.

最后,附上官方文档地址:https://code.opensource.huaweicloud.com/HarmonyOS/OpenArkCompiler/file?ref=master&path=doc%252FDevelopment_Preparation.md

这个编译器的源代码是我原先为了完成编译原理实验课作业而写的,所以只具有教学价值,现在发出来和大家共享 ;-)<br/><br/>和网上流传的版本不同,它从文法开始,一直做到了符号表的实现. 想实现自己的编译器的话,只需在把Initializtion.h中的文法修改为自己的即可.<br/><br/>工程结构:<br/>Initializtion.h 初始化文法,便于进一步进行分析,它为构造GRAMMAR类提供了信息.其中默认非终极符用<>括上,修改时需要注意.<br/>Grammar.cpp Grammar.h 定义了文法GRAMMAR类,它通过initializtion.h的信息建立文法的内部表示。<br/>LL1_Analyser.cpp LL1_Analyser.h 定义了LL1分析器,即LL1_Analyser类.<br/>LL1_Recognizer.cpp LL1_Recognizer.h 为LL1语法分析驱动器,可以通过文法,TOKEN序列和LL1分析表,判定语法是否正确,同时驱动动作.<br/>Rec_Parse.cpp Rec_Pares.h 实现了递归下降分析器Rec_Parse类, 递归下降的思想和LL1驱动器一样,不过是把压栈改成调用自己,而把弹栈改成返回.<br/>Scanner.cpp Scanner.h 实现了词法分析器,可以将程序变为TOKEN序列. 扫描的源程序文件路径也在这里被定义(默认为.//demo.txt)<br/>Action.cpp Action.h 实现了语义栈的操作,_Action类定义了动作符号所对应的动作.<br/>SymTable.cpp SymTable.h 实现了符号表的建立和输出.<br/><br/>希望大家能通过该程序对STL和编译原理有更深刻的理解,Have Fun and Good Luck!<br/><br/> -- David.Morre
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值