華爲方舟編譯器理解:初探

華爲踩着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的可讀性更強一點。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章