華為方舟編譯器深入解讀:已有45款第三方應用
華為方舟編譯器(OpenArkCompiler)正式開源,官網已上線,源代碼包、二進制包已提供下載,相關文檔、演示等資料也一應俱全。本次方舟編譯器開源的是編譯器框架部分源碼,包括編譯器中間表示(IR)和語言編譯實現,同時搭配編譯器其他二進制組件,實現Java程序到aarch64彙編指令的編譯過程。
開發者可基於開源代碼+二進制,編譯構建出編譯器工具鏈,嘗試對Java程序進行編譯。
社區參與者可以通過框架源碼學習方舟編譯器的編譯器中間表達(IR)及基本的中端編譯框架,熟悉方舟編譯器的架構思想,並參與諸如對編譯器中端優化的貢獻。
【方舟編譯器的優勢】
按照華為的介紹,方舟編譯器是為支持多種編程語言、多種芯片平台的聯合編譯、運行而設計的統一編程平台,包含編譯器、工具鏈、運行時等關鍵部件,目前還在持續演進中,上述能力將陸續實現和開源。
通過多語言統一IR表示,方舟編譯器可實現應用中多種編程語言聯合編譯優化提升性能,而且在支持多平台的同時,根據設備特徵提供便捷的開發與部署策略提升效率。
華為方舟編譯器提供了全新的系統及應用的編譯和運行機制,從動態編譯變為靜態編譯,就是直接將高級語言直接編譯成機器碼,徹底消除了虛擬機動態編譯的額外開銷,實現了開發和運行效率的兼容並舉。
1、多語言聯合
將同一應用中的不同語言代碼聯合編譯、聯合優化,消除語言間的性能“鴻溝”,降低開發者的優化成本
2、輕量運行時
通過編譯器的語言實現能力和優化能力增強,應用運行時的開銷更小
3、軟硬件協同
編譯器與芯片實現軟硬件協同優化,充分發揮硬件能效,應用體驗更佳
4、多平台支持
支持面向多樣化的終端設備平台進行編譯和運行,根據設備特徵提供便捷的開發與部署策略,提高開發效率
【方舟編譯器的架構設計】
當前方舟編譯器支持Java/Kotlin程序字節碼的前端輸入,C/C++/JS等其它編程語言的支持還在規劃中。
方舟編譯器的中間表示(IR)轉換器將前端輸入轉換成方舟IR,並輸送給後端的優化器,最終生成二進製文件,二進製文件與編譯器運行時庫文件鏈接生成可執行文件,在方舟的運行環境中就可執行該文件。
方舟編譯器IR是支持程序編譯和運行的中間程序表示。程序源代碼中的任何信息對於程序分析和優化都是有幫助的,所以方舟IR的目標是盡可能完整詳細地提供源程序的信息。
【方舟編譯器的環境配置】
- 硬件配置推薦
方舟編譯器的硬件配置需求不高,最低只需2GHz雙核心處理器、2GB內存、200GB硬盤空間,當然要獲得最高效率,更高配置是強烈推薦的。
- 開發環境推薦
需要64位版本的Linux,尤其推薦Ubuntu 16.04
sudo apt-get -y install openjdk-8-jdk git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache libgl1-mesa -dev libxml2-utils xsltproc unzip lib32z1-dev qemu g++-multilib gcc-multilib python3-paramiko python-paramiko python-jenkins python-requests python-xlwt libglib2.0-dev libpixman-1-dev linux-libc-dev:i386
sudo apt-get -y install gcc-5-aarch64-linux-gnu g++-5-aarch64-linux-gnu
- Clang編譯器
主要用於編譯方舟編譯器代碼。
下載clang+llvm-8.0.0-x86_64-linux-gnu-ubuntu-16.04,地址:
放置到openarkcompiler/tools目錄,打開openarkcompiler/build/config/BUILDCONFIG.gn文件,將GN_C_COMPILER、GN_CXX_COMPILER和GN_AR三個變量配置為Clang編譯器所在路徑。例如:
GN_C_COMPILER = “${MAPLE_ROOT}/tools/clang_llvm-8.0.0-x86_64-linux-gnu-ubuntu-16.04/bin/clang”
GN_CXX_COMPILER = “${MAPLE_ROOT}/tools/clang_llvm-8.0.0-x86_64-linux-gnu-ubuntu-16.04/bin/clang++”
GN_AR = “${MAPLE_ROOT}/tools/clang_llvm-8.0.0-x86_64-linux-gnu-ubuntu-16.04/bin/llvm-ar”
其中${MAPLE_ROOT}為openarkcompiler源碼根目錄。
安裝Ninja、GN並完成配置
- Ninja、GN
下載Ninja(v1.9.0)及GN(Linux Version) Ninja,地址:
GN下載地址:
將GN和Ninja可執行程序放置到openarkcompiler/tools目錄,打開openarkcompiler/Makefile文件,將GN和NINJA兩個變量配置為GN和Ninja可執行程序所在路徑。例如:
GN := ${MAPLE_ROOT}/tools/gn/gn
NINJA := ${MAPLE_ROOT}/tools/ninja_1.9.0/ninja
【方舟編譯器FAQ】
Q1:方舟編譯器開源有官方網站嗎?
A1:
孵化期間,官方網站為https://www.openarkcompiler.cn。正式畢業後的官網待定。
Q2:方舟編譯器是一次性全部代碼嗎?
A2:
首次開源範圍是編譯器IR(Intermediate Representation)、RC(Reference Counting)和多語言設計思想等,用於與業界、學術界溝通交流。後續將陸續開源編譯器前端、後端,支持其它語言(比如JavaScript)的編譯等。
當前部分Java語言特性和JVM虛擬機特性的支持未包括在本次開源代碼中,包括annotation、lambda表達式、泛型等。
目前仍有很多地方不完善,會在社區陸續迭代,遇到問題請在社區提交issue。
Q3:通過哪些渠道可以獲取方舟編譯器的框架源碼?
A3:
孵化期間,開發者可以通過如下代碼託管網址獲得相關代碼和文檔,供參考學習、了解方舟編譯器的架構和代碼。
華為雲託管地址:
開源中國碼雲託管地址:
Q4:方舟編譯器開源路標是怎樣的?
A4:
方舟編譯器從2019年8月開始開源,歡迎廣大的應用開發者、手機廠商、軟件從業人員一起共建開源社區和生態。
開源計劃大體上這樣安排:2019年8月重點開源框架部分;後續將陸續開源編譯器前端、後端;支持Jav程序編譯、JavaScript語言應用的編譯等。
Q5:還有哪些方式可以獲取方舟編譯器的相關信息?
A5:
方舟編譯器有官方微信公眾號:開源方舟編譯器
Q6:方舟編譯開源面向全球開發者嗎?英文網站何時上線?
A6:
方舟編譯器是向全球開發者進行開源,因此,官方網站和代碼託管平台均面向全球開發者開放。
目前英文版網站正在緊張的開發及內測,計劃將於2019年Q4上線。
Q7:方舟編譯器源碼託管計劃是怎麼的?
A7:
孵化委員會期間,方舟編譯器代碼是託管在華為雲上面。
在未來走向開放治理以後,將由所挂靠機構選擇的平台進行託管。如果挂靠的機構採取了X平台,就採用這個機構的代碼託管模式進行託管。
當前代碼託管的地址:
所有相關信息請以方舟編譯器開源官方網站發佈為準。
Q8:方舟編譯器開源使用的是什麼License?
A8:
方舟編譯器採用木蘭License,由業界眾多專家和公司集體共建,並非華為主導,具體好處詳見專業點評:
開源中國:https://www.oschina.net/news/108840/mulanpsl-the-1st-opensource-license-of-china
開源社:https://mp.weixin.qq.com/s/1xqxxiNKhcgw4RRspAaW2A
InfoQ:https://www.infoq.cn/article/KrZAbAcJrxCU27vKj*JE
Q9: 如何確認下載包來源可靠?MD5校驗碼是多少?
A9:
OpenArkCompiler-0.2-ubuntu-16.04-x86_64.tar.gz二進制包的MD5碼是:e7dc8b8c242f2d26429e2ad71dae3112
OpenArkCompiler-0.2.tar.gz源代碼包的MD5碼是:1bf859a67c8b9a2d4080bdaf25ef6181
【方舟編譯器的合作夥伴】
從官網給出的介紹看,目前已有至少45款第三方應用支持華為方舟編譯器,都是大家耳熟能詳的超大用戶量APP,不過尚未看到微信。
具體名單如下: