华为方舟编译器理解:初探

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/feibabeibei_beibei/article/details/100709967

华为踩着2019年8月的尾巴开源了方舟编译器:

github:https://github.com/Himself65/OpenArkCompiler

背景:

方舟编译器主要要做的事情:

1.将多语言之间联合优化,比如c/c++、 java包括前端等,然后自己设计一个IR,不同的前端分析完后,然后转为统一的IR,这个是编译原理上常做的事;

具体可见对于mapleIR的说明:

https://github.com/Himself65/OpenArkCompiler/blob/master/doc/MapleIRDesign.md

2.由于目前形成了一个以移动端手机为中心的智能中心,但是不能满足目前Android7.0以后以上的AOT+JIT的联合编译解释的模式,说到底感觉无论是启动什么的还是慢。

方舟编译器把所有的Android系统上的框架全部编译为native层。减少java与C++ 之间的JNI调用开销。然后这个事交给开发者在编译的时候处理。

3.打造成自己的一个生态环,你要想用这个方舟编译器带来好的用户体验就得用我华为自己的runtime;要不然自己开发代价高。

4.同时对于jdk中内存回收机制,最常见的RC机制,需要进一步的优化;

代码解读:后面会慢慢更新吧,毕竟水平有限,(逃:

先放几张官方的图片,比较浅显易懂。

一、方舟编译器的编译:

参照官方文档:

https://gitee.com/harmonyos/OpenArkCompiler/blob/master/doc/Development_Preparation.md

计得给Ninja(v1.9.0)和NG对应的权限就可以了。

看到上面就编译成功了。

二、使用FZ编译HelloWorld:

参考https://zhuanlan.zhihu.com/p/81340230,感谢从Android源码中找到并提供java-core库。建议编译的时候编译成debug版本的。这样可以对照详细日志有利于后面的编译理解。

第一步:

调用javac处理java文件为.class文件;

第二步:

调用jbc2mpl处理.jar文件为xx.maple文件,即方舟编译器的中间文件;

第三步:

调用maple对中间文件进行优化;

第四步:

前端执行完以后就调用mplcg对于中间文件生成后端文件;

以上就编译通过了,

三、过程分析:

1.首先对HelloWorld.class进行反汇编

2. 观察HelloWorld.mpl文件

可以看到#UBSTIDX对应的是上面java字节码反汇编以后的可读文件形式:

下面是方舟编译器对于这些字节码方法的翻译:

3.接着我们继续看一下HelloWorld.VatbleImpl.mpl文件

可以看到的是在上面的基础上进行优化增加了对于引用的管理:

MCCIncRef:类似于dvmAddToReferenceTable,加入引用表

MCCDecRef:类似于dvmRemoveFromReferenceTable,从引用表中移除

以及MPL_CLEANUP_LOCALREFVARS,清除引用表。

同样的去看HelloWorld.VtableImpl.s文件,可以清晰的看到对于RC机制管理的相关函数的调用。

四、LLVM对java文件进行编译处理为IR:

同样的文件使用LLVM对java文件进行处理为LLVM-IR可以看到:与上面方舟编译器处理的结果有异曲同工之妙。

但是从整体的形式上来看,LLVM-IR的可读性更强一点。

猜你喜欢

转载自blog.csdn.net/feibabeibei_beibei/article/details/100709967