上篇文章中我们对OpenArkCompiler的编译作了简单介绍。这次我们将试着让Toolchain跑起来(并不可能).
编译产物在OpenArkCompiler/out/bin中,有mplcg,jbc2mpl两个二进制文件,java2jar脚本(shell script)以及irbuild,maple两个库文件(shared library).回头看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/)
很显然,只有irbuild,maple是先前的编译产物,而另外三个可执行文件都是直接cp过来的。我们在此逐个分析一下这些可执行文件的作用。
既然java2jar是shell script,我们不妨来看看里面都写了啥:
#!/bin/bash
OUTPUT=$1
CORE_ALL_JAR=$2
shift 2
javac -g -d . -bootclasspath ${CORE_ALL_JAR} $@
jar -cvf ${OUTPUT} *.class
是先用javac将.java编译成.class,再用jar打包。
再看jbc2mpl,inclass/-injar参数传入.class/.jar,然后输出为.mpl/.mplt:
//HelloWorld.java
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
HelloWorld测试一下:
报错。但是jbc2mpl并没开源,自然也不知道发生了啥。
试着反编译查一下fe_type_manager这个值,无果。
mplcg,从它支持的parameters来看大概是输入.mpl然后输出.s文件供MapleLinker用?
maple和irbuild,大概是针对编译器中间语言的工具。由于刚才jbc2mpl没能跑起来,这里我们也无法对其进行测试。
在官方文档中我找到了如下的表述,解释了Maple IR的作用:
MAPLE IR is an internal program representation to support program compilation and execution. Because any information in the source program may be useful for program analysis and optimization, MAPLE IR aims to provide information about the source program that is as complete as possible.
所以要让Toolchain跑起来,关键就是jbn2mpl.回头看OpenArkCompiler/build/core/目录下的几个makefile,我似乎发现了一些有趣的东西。
也就是说,我们需要java-core.jar,而出于某些原因这个包并不在开源列表中,也没有被官方文档提及。
(此处忽略笔者的吐槽)
Google上可以查到一些同名文件,不过显然不适用。不管怎样,反正我没有咕咕咕(滑稽)如果能解决这个问题,或许能在后续的文章中对Maple IR和OpenArkCompiler/samples中的测试用例作更深入的探讨。
写到这里,笔者回头看了下方舟编译器的“开源计划”,仍然停留在2019年8月,并且因为必要文件的缺失,开发者并不能“构建出完整编译器工具链”。
算了,我们还是一起沸腾吧…
本文首发于淀粉月刊:https://dfkan.com
本文作者:无用挂件