去年 8 月,華爲將鴻蒙操做系統的配套軟件方舟編譯器的部分源碼開源,引起了國內開發者的關注。目前在 Gitee 上,方舟編譯器已經擁有 6.8K star 和 1.1K fork。前端
方舟編譯器
做爲華爲新系統的配套編譯器,與還沒有公佈源碼的鴻蒙操做系統不一樣,方舟編譯器最先是華爲於去年 4 月在 P30 系列手機發佈會上公佈的,並在去年 8 月將部分源碼公佈在了代碼託管平臺上。 git
華爲曾表示方舟編譯器早期是用於大幅提高手機端安卓系統的運行效率。官方給出的資料顯示,方舟不是傳統意義上從高級語言到機器碼的「萬能翻譯」,更像是一個編譯運行系統。一方面,方舟編譯器首次在 Java 領域繞過虛擬機,首次嘗試將 Java/C/C++ 等混合代碼一次編譯成機器碼直接在系統上運行,完全告別 Java 的 JNI 額外開銷,也完全告別了虛擬機 GC 內存回收帶來的應用進程掉線,使手機系統操做流暢度大幅提高。程序員
而隨着跨端操做系統鴻蒙的發佈,方舟編譯器的方向則開始往協助鴻蒙操做系統佈局邊緣計算、服務器等跨端領域轉移。編程
操做系統與編譯器
若是說計算機是汽車,那麼操做系統就像汽車的控制檯,而編譯器則是鏈接控制檯和汽車發動機裏最核心的汽油燃燒技術,將軟件變成計算機的動力。能夠說,編譯器的編譯性能和效率,將直接影響終端用戶的使用體驗。後端
目前市面上流行的操做系統,基本上都擁有本身配套的編譯器組件。服務器
Linux 系統編程語言
各類發行版的 Linux 系統基本上都使用開源的 GCC 編譯器。GCC 是由自由軟件運動之父 Richard Stallman 在上個世紀 80 年代創立。它本來只處理 C 語言,後續擴展能夠處理 C++、Objective-C、Java 等其餘語言。GCC 被認爲是跨平臺軟件的編譯器首選。 分佈式
微軟 Windows 系統工具
使用 CL 編譯器。它直接集成在 Visual Studio 或 Visual C++ 的開發者環境中,通常不單獨使用。 佈局
蘋果 Mac 和 iOS 系統
最初使用 GCC 編譯器,現已替代爲 Clang + LLVM。蘋果之因此將 GCC 更換爲本身旗下的 LLVM,是由於他們發現開源的 GCC 開發者根本使喚不動,他們不肯意專門爲了蘋果公司的要求優化和改進 GCC 代碼,因此蘋果索性將編譯器後端直接替換爲 LLVM(Low Level Virtual Machine,底層虛擬機),而且將 LLVM 的發明者 —— 天才少年 Chris Lattner 招入麾下,後來還順帶讓他帶頭搞了編譯器前端 Clang 和新編程語言 Swift 。
安卓系統
安卓主要使用預編譯的 Java 語言開發,還有近年新推出的與 Java 兼容的 Kotlin。安卓的最第一版本經過虛擬機運行,不須要編譯器,後續版本加入了 JIT 和 AOT 編譯機制。
Intel 的 ICC 編譯器
ICC 編譯器,全稱 Intel C++ Compiler,是 Intel 開發的 C/C++/Fortran 編譯器套裝,適用於 Linux、Microsoft 和 Mac OS X 操做系統,普遍應用於高性能計算、分佈式計算等商業計算領域。
SGI 等公司推出的 Open64 編譯器
SGI(S 表明超級計算機,G 表明圖形工做站,I 表明具備突破性的洞察力)生產的超級計算機,主要應用於巨大的實驗室,採用的是 Open64 編譯器。
編譯器的瓶頸
對傳統編譯器而言,編譯時點、跨語言編譯是制約應用程序執行效率的瓶頸。應用程序的執行要通過字節碼到機器碼的轉換,程序員在編程時使用上述 C、C++、Java、C# 等程序語言,但硬件的執行邏輯是基於 0 和 1 的二進制。所以要讓硬件可以「讀懂」指令,就須要編譯器把「程序語言」轉譯成「機器語言」。
(1)編譯時點:根據編譯器工做時點的不一樣,編譯方式可分爲兩種,但執行效率仍有提高空間。一種是「邊執行、邊翻譯」,程序調用了某一句指令,編譯器就實時將其轉譯爲二進制碼(早期版本安卓使用該方案,程序執行效率低下);另外一種是引進高性能虛擬機(在安卓系統中爲 ART,即 Android Run Time),在程序安裝時或系統空閒時就提早將代碼轉譯完畢,進一步提高了程序執行效率,但新的問題在於程序安裝時間長。
(2)跨語言編譯:程序每每使用不一樣語言編寫,對編譯效率產生較大影響。例如採用 Java 和 C/C++ 等多種語言混合開發的應用程序,在運行時須要藉助通用接口來協調不一樣代碼(即 Java Native Interface,JNI)。通用接口須要佔用硬件資源,同時不一樣代碼的協調自己就低效,因此傳統編譯器下跨語言應用的執行效率較低。
據官方介紹,方舟編譯器對以上兩大瓶頸的解決方案是:將編譯過程提早至開發者環節。在安卓的體系下,一些複雜動態語義的編譯仍需交由虛擬機完成。方舟編譯器開發團隊經過梳理 Java 的動態語義,進行了大規模的數據建模,尤爲是在跨語言編譯時,提升了動態語義分析的精度;另外,華爲設計了一套動態語義匹配機制,下降了運行時動態語義的開銷。最終結果是,方舟編譯器可以在應用程序執行以前,就將 Java 代碼編譯成機器語言,極大釋放了硬件資源,這一點對於多終端尤爲是物聯網邊緣計算而言尤其重要。
方舟的應用實例
雖然已經開源並公佈了一些特性,但方舟編譯器目前僅開源了部分代碼,普通開發者很難窺知全貌。所以,關於方舟如今究竟能不能用仍然是不少吃瓜羣衆討論的話題。
去年 6 月,貼吧的搞機大佬經過 root 後的華爲手機得到了系統固件信息,證明了手機上已經在跑着方舟。
去年 10 月,隸屬於中科院軟件研究所的程序語言與編譯技術實驗室(PLCT) 在一個培訓項目 pacific 上實現了基於方舟編譯器的 Hello World 程序,成爲業內首個方舟編譯器 runtime 實現,「實現了從 0 到 1 的一個跨越」。該項目代碼目前在 Gitee 的方舟編譯器孵化器中。
今年 4 月,方舟編譯器孵化器開源 MapleEngine 項目,完善了方舟編程體系的版圖。MapleEngine 也叫方舟引擎,是方舟編程體系的重要環節。據悉,方舟編程體系的總體目標是構建一個軟件開發的全棧技術,包括編程語言、多語言前端、編譯器、執行引擎以及一系列工具鏈。
整個方舟體系依靠 MapleIR 貫穿先後,MapleIR 是程序的中間表示,是編程體系中程序的表達方式。編譯器把 MapleIR 轉換成機器碼或者保留 MapleIR 中間碼,方舟引擎則擔負着執行該中間碼的任務。能夠認爲方舟引擎和 JVM 相似,但超越了 JVM,由於它再也不是執行單一的 Java 程序。理論上說,只要能翻譯成 MapleIR 的程序,均可以由方舟引擎執行。
此外,最近知乎上也有大神對支持方舟編譯器的某新聞類 APP 進行了測試,結果證明該 APP 確實可以經過方舟跑通。
不管如何,現在距離方舟編譯器開源已通過去了一年,但願今年咱們能夠看到鴻蒙與方舟使人心服口服的 「 code show 」 。
參考連接:
https://www.oschina.net/question/2918182_2310841
https://www.oschina.net/news/110785/pacific-0-1-released
https://zhuanlan.zhihu.com/p/161995928