方舟编译器的总体架构
![69d62ea3b7167a51a6532a64d13e6294.png](https://i-blog.csdnimg.cn/blog_migrate/d0c0d77b953bfdb46efdfddb922a027a.jpeg)
官方演示结果如何?
![200fe7db943255af7e059e680eb2b384.png](https://i-blog.csdnimg.cn/blog_migrate/780438a40e92e5be056f58a94704688b.jpeg)
开源了哪些代码?
首次开源范围是IR、RC和多语言设计思想等,用于与业界、学术界沟通交流。
未开源编译前端、后端和对其他语言的支持
![e00236da3f93f409e886c91c4586f3b3.png](https://i-blog.csdnimg.cn/blog_migrate/666526aaeee34405be3b230911f8b804.jpeg)
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
虚方法表和接口表是如何生成的?
虚方法-
![750c5fe28d57a4cea299e763d5792016.png](https://i-blog.csdnimg.cn/blog_migrate/5742a09371d21e5ccb9d4e9ad658e946.jpeg)
![55685cd814718423b029c35213ad2fc3.png](https://i-blog.csdnimg.cn/blog_migrate/a3a24f280bd90c7800ebfb37475c210c.jpeg)
接口表-
![8049dee7b08054a484dc8c8cef012e6f.png](https://i-blog.csdnimg.cn/blog_migrate/d65b0c42eb790a0c3b49f0f427fca2bf.jpeg)
![dd5b67879c486ceda7a2fa1a8f37563e.png](https://i-blog.csdnimg.cn/blog_migrate/145b19fe37b1395843ea055ef9fa8cd7.png)
![693e90aa6f7a670d9e314cc44efd7632.png](https://i-blog.csdnimg.cn/blog_migrate/0139ba0d5e7526d78417b07aff4b0c9b.png)
![22afd21e824bf8f4c2e53455ef8dbd45.png](https://i-blog.csdnimg.cn/blog_migrate/a9624098c73e1c299cbb7ae662ca80b6.png)
RC是啥?如何处理的?
引用计数,一种内存管理计数,保存对象被引用的次数,当为0的时候,将对象释放。
提供了31个API支持RC操作:
MCC_IncRef_NativeRCFast
MCC_DecRef_NativeRCFast
。。。
在me_rc_lowering之中,大量使用了这样的操作
![6e7f4d1ad307c7297752c84cbf0550b5.png](https://i-blog.csdnimg.cn/blog_migrate/ad6ed8100ff364ad773a33fe512b83c2.jpeg)
![67d3603078a799ac75fb5f4ef7168896.png](https://i-blog.csdnimg.cn/blog_migrate/9d78cf7c1b4bd09628ee5dd9571b0dea.jpeg)
mplt如何处理的?
由DriverRunner::Run()发起
由ProcessMpl2mplAndMePhases具体实现
该函数使用InterleavedManager创建各个phase,由ModulePhaseManager和
MeFuncPhaseManager分别各自运行,最终是由每个注册的phase运行
而每个phase,就是某些优化措施
![ef436a8e95e747bab517aaf9eae41e3a.png](https://i-blog.csdnimg.cn/blog_migrate/3989ea8106d77fecff1ccbdb6d485719.jpeg)
我分析的结论如何?
•开源协议是木兰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,还需要释放相应文件