首页 > 数据库 > 数据库开发技术 > 华为方舟编译器理解:初探
华为踩着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对应的权限就可以了。

看到上面就编译成功了。
参考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文件进行处理为LLVM-IR可以看到:与上面方舟编译器处理的结果有异曲同工之妙。

但是从整体的形式上来看,LLVM-IR的可读性更强一点。
原文作者:不知世事;如有侵权,请联系管理员删除。