方舟编译器的总体架构
官方演示结果如何?
开源了哪些代码?
首次开源范围是IR、RC和多语言设计思想等,用于与业界、学术界沟通交流。
未开源编译前端、后端和对其他语言的支持
Driver是干什么的?如何实现的?
driver在代码里面是src/maple_driver,生成的目标文件是maple,依赖
libmplipa/libmplir/libmplme/libmplmewpo/libmpl2mpl 以及闭源库libmplphase.a/libmempool.a/libmaple_driverutil.a
maple就是用于处理mpl文件
1)me –quiet
2) mpl2mpl –quiet –regnativefunc –maplelinker
3)mplcg –quiet –no-pie –verbose-asm –maplelinker --fpic
虚方法表和接口表是如何生成的?
虚方法-
接口表-
RC是啥?如何处理的?
引用计数,一种内存管理计数,保存对象被引用的次数,当为0的时候,将对象释放。
提供了31个API支持RC操作:
MCC_IncRef_NativeRCFast
MCC_DecRef_NativeRCFast
。。。
在me_rc_lowering之中,大量使用了这样的操作
mplt如何处理的?
由DriverRunner::Run()发起
由ProcessMpl2mplAndMePhases具体实现
该函数使用InterleavedManager创建各个phase,由ModulePhaseManager和
MeFuncPhaseManager分别各自运行,最终是由每个注册的phase运行
而每个phase,就是某些优化措施
我分析的结论如何?
•开源协议是木兰License
•基于clang + llvm前端编译技术,C++11
•IR是基于Maple IR
•Ninja、gn是编译工具
•开源部分不多,目前仅能编译maple,pml部分还没有释放出来,是以.a的方式提供
jbc2mpl/mplcg是以二进制形式提供,java2jar就是一个javac和打包的脚本
•Java-core的mplt没有提供,samples完整编译有问题
我实践的情况如何?
•代码可以编译吗?
可以编译生成出maple,其他compile组件以二进制提供
•代码可以运行吗?
对于HelloWorld.java的测试显示,可以编译出HelloWorld.jar,
但是无法继续编译出二进制文件,原因是缺少libjava-core.mplt,还需要释放相应文件