方舟編譯器開源,華為自家開源平臺面世!(附編譯過程)
大資料文摘出品
作者:曹培信
8月9日,華為EMUI官方微博發了這麼一條微博。
對奉行實用至上的程式設計師來說,Linux的創始人Linus Torvalds的名言“Talk is cheap,show me the code.”這句話確實是戳到了心裡。
8月31日,華為如約開源方舟編譯器,並將原始碼放出。然而開源並非是在GitHub上,而是自建了一個“華為開源平臺”。
這意味著華為自己的開源平臺也一併問世。
坊間猜測,這是由於7月底GitHub封禁了一批伊朗賬戶,讓華為意識到了將方舟編譯器和鴻蒙系統在GitHub上開源的風險,因此趕工趕出來一個開源平臺。
目前平臺上只有兩個倉庫,一是HarmonyOS/OpenArkComplier,另一個是測試用的example。
難怪有人表示:“這是我見過的最簡潔的網站了”。
同時,華為還在碼雲(gitee)上建立了方舟編譯器開原始碼官方映象倉庫,如今標星已達3.6k。
打響了鴻蒙OS開源的第一槍
打響了鴻蒙OS開源的第一槍
8月9日,在廣東東莞舉辦的華為開發者大會HDC.2019上,華為消費者業務CEO餘承東正式釋出了鴻蒙HarmonyOS,並宣佈鴻蒙OS全部開源!
次日,華為消費者軟體副總裁劉丹對華為開源的系統設計和運作模式作了更詳細的說明。
劉丹表示,華為軟體開源,秉承的是自信、包容、公平、共建和共贏五大基本準則,在運作模式上,華為會參考國際常規模式,先以"孵化委員會"的簡化模式進行初期探索,方舟編譯器首先開源,隨後其他模組也將分批開源。
對於未來的開源計劃,現場也放出了一張表。
方舟編譯器作為“排頭兵”,打響了鴻蒙OS開源的第一槍。
方舟編譯器開源範圍
如今,方舟編譯器首先在自家平臺上開源了自定的編譯器IR(Intermediate Representation)——MAPLE IR,RC(Reference Counting)和多語言設計思想等,用於與業界,學術界溝通交流。後續將陸續開源編譯器前端,後端,支援其它語言(如JavaScript)的編譯。
後續華為也會按照計劃在2020年開始開源Java編譯器工具鏈,支援Java程式編譯;到2021年開始開源JavaScript編譯器工具鏈,可用於JS程式的編譯。
安卓卡頓的“終結者”
安卓卡頓的“終結者”
華為開發方舟編譯器花了十年,為了解決安卓系統的“四大命門”,華為工程師們夜以繼日,只為“再造安卓”。
方舟編譯器官網上的一篇文章,生動地訴說了這一段歷程。
文章地址:
2009年,華為啟動5G基礎技術研究的同時,開始建立編譯組,第一批海內外研究人員加入。
2013年,華為推出面向基站領域的自研編譯器,並正式提出編譯器框架構想。
2014年,眾多海內外專家加入華為,方舟專案正式啟動。
2016年,成立編譯器與程式語言實驗室。
2019年,華為方舟編譯器正式面世!
2018年春節前一週,方舟編譯器跑通安卓系統所有後臺服務,併成功移植到手機。成功開機後,專案組成員甚至流下了激動的淚水!
大年初一清晨,總架構師發來了第一條方舟經編譯器編譯的程式發出來的拜年訊息:
春節快樂,方舟大吉!
方舟編譯器的優勢在兩方面,一是首次在Java領域將去掉了虛擬機器,也是史上首次將Java/C/C++等混合程式碼一次編譯成機器碼直接在手機上執行,徹底告別Java的JNI額外開銷,也徹底告別了虛擬機器GC記憶體回收帶來的應用程式掉線,使操作流暢度大幅提升。
二是方舟編譯器用空間換效能,直接將編譯器的程式碼優化搬到了開發者環境,不再被手機端的硬體資源所限制,為程式碼優化提供了無限可能。
根據華為官方測試,方舟編譯器提升手機系統操作流暢度高達24%,系統響應效能提升44%。
方舟編譯器原始碼編譯
方舟編譯器原始碼編譯
方舟編譯器開源之後,引起了業界廣泛關注,方舟編譯器倉庫的文件也表示開發者可以根據方舟官方文件編譯出OpenArkCompiler。
其中知乎網友“小乖他爹”根據文件進行了編譯並撰寫了《方舟編譯器學習筆記》系列,文摘菌在取得作者授權後,將原始碼編譯過程轉載如下,快跟文摘菌一起一睹為快吧!
1、作業系統環境:
64位版本的Ubuntu(官方推薦Ubuntu 16.04)。我自己本身就有Ubuntu 16.04的虛擬機器,所以直接就在上面編譯了。
2、基礎配置:
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
官方推薦安裝上述庫,但是即使是在Ubuntu 16.04上,這裡很多庫的版本較低。但是小版本號應該沒什麼太大的影響,我的本地環境以前編譯過別的程式,所以導致很多庫的版本都比這個推薦的要高,最終沒有影響我的編譯。所以不用太苛求其版本號。
3、原始碼下載:
git clone https://code.opensource.huaweicloud.com/HarmonyOS/OpenArkCompiler.git
4、llvm和clang的下載及配置:
從LLVM Download Page下載LLVM8.0.0的Ubuntu 16.04 (.sig) 二進位制包。解壓之後,放到OpenArkCompiler/tools目錄之下。
LLVM Download Page:
Ubuntu 16.04 (.sig):
開啟openarkcompiler/build/config/BUILDCONFIG.gn檔案,將其中的GN_C_COMPILER、GN_CXX_COMPILER和GN_AR_COMPILER 三個變數配置為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_COMPILER = "${MAPLE_ROOT}/tools/clang_llvm-8.0.0-x86_64-linux-gnu-ubuntu-16.04/bin/llvm-ar"
5、下載和配置Ninja、GN:
從下載Ninja v1.9.0,在tools下新建目錄ninja_1.9.0,將ninja可執行檔案放到ninja_1.9.0目錄之下。
Ninja v1.9.0:
下載GN,在tools下新建目錄GN,將GN可執行檔案放到GN目錄之下。
GN:
開啟openarkcompiler/Makefile檔案,將GN和NINJA兩個變數配置為GN和Ninja可執行程式所在路徑。例如:
GN := ${MAPLE_ROOT}/tools/gn/gn NINJA := ${MAPLE_ROOT}/tools/ninja_1.9.0/ninja
6、在OpenArkCompiler目錄之下依次執行如下命令:
source build/envsetup.sh make
命令說明:
source build/envsetup.sh初始化環境,將OpenArkCompiler工具鏈路徑openarkcompiler/src/bin設定到環境變數中make編譯OpenArkCompiler的Release版本make BUILD_TYPE=DEBUG編譯OpenArkCompiler的Debug版本。
至此,完成方舟編譯器原始碼的編譯。編譯完成之後的介面如圖所示:
編譯完成之後,在OpenArkCompiler/out目錄之下,會有如下幾個檔案:
其實這幾個檔案在未編譯之前,在OpenArkCompiler/src/bin目錄下就有。讀了下OpenArkCompiler目錄下的Makefile,其中java2jar\jbc2mpl\mplcg都是直接從src/bin目錄之下copy到out/bin目錄之下的。只有maple有點特殊,它應該是編譯生成的,然後install的時候反向copy到了src/bin目錄之下,所以編譯完成之後檢視狀態(git status),會發現src/bin/maple發生了變化。
OpenArkCompiler/Makefile中關於install的程式碼:
PHONY: install install: mapleall $(shell cp -rf $(MAPLE_ROOT)/src/bin/java2jar $(MAPLE_ROOT)/out/bin/) $(shell cp -rf $(MAPLE_ROOT)/src/bin/jbc2mpl $(MAPLE_ROOT)/out/bin/) $(shell cp -rf $(MAPLE_ROOT)/src/bin/mplcg $(MAPLE_ROOT)/out/bin/) $(shell cp -rf $(MAPLE_ROOT)/out/bin/maple $(MAPLE_ROOT)/src/bin/)
另外附上作者方舟編譯器學習筆記系列連結。
方舟編譯器學習筆記1:方舟相關資料
方舟編譯器學習筆記2:原始碼編譯
方舟編譯器學習筆記3:方舟可執行檔案簡介
方舟編譯器學習筆記4:文件導讀
方舟編譯器學習筆記5:方舟開始接受程式碼合併請求
方舟編譯器學習筆記6:方舟開源目錄簡介
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31562039/viewspace-2656031/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 開源編譯工具和編譯軟體編譯
- 阿里開源COLA 4.0原始碼編譯和部署過程阿里原始碼編譯
- 寫給小白的開源編譯器編譯
- 編譯開源 Swift Foundation 庫編譯Swift
- 說說 方舟編譯器編譯
- 阿里 BladeDISC 深度學習編譯器正式開源阿里深度學習編譯
- 編譯過程編譯
- VS2017平臺編譯 zmq-4.2.5 過程編譯MQ
- 編譯修改*火GPS除錯助手(開源)編譯除錯
- 跨平臺編譯編譯
- 源語言、目標語言、翻譯器、編譯器、直譯器編譯
- GCC編譯過程(預處理->編譯->彙編->連結)GC編譯
- 2.深入一點理解C源程式的編譯過程編譯
- 編譯連結過程編譯
- C++ 編譯過程C++編譯
- 編譯過程簡介編譯
- ios底層 編譯過程iOS編譯
- 痛苦的過程,編譯glomap編譯
- Go跨平臺交叉編譯Go編譯
- JavaScript的預編譯過程分析JavaScript編譯
- GCC編譯和連結過程GC編譯
- 預編譯過程(AO+GO)編譯Go
- 詳解Linux 程式編譯過程Linux編譯
- go語言編譯過程概述Go編譯
- linux源瑪包編譯安裝Linux編譯
- Unity開源技能編輯器Unity
- kestra: 無限可擴充套件的開源編排和排程平臺套件
- .NET探索平臺條件編譯編譯
- 編譯原理入門篇|一篇文章理解編譯全過程編譯原理
- Windows 下 Laravel Mix 資源編譯過程以及產生的錯誤解決WindowsLaravel編譯
- [轉]:xmake編譯配置過程詳解編譯
- 3- C語言編譯過程C語言編譯
- 淺談彙編器、編譯器和直譯器編譯
- Python程式到計算圖一鍵轉化,詳解清華開源深度學習編譯器MagPyPython深度學習編譯
- 英特爾重磅開源nGraph:相容所有框架的深度學習系統編譯器框架深度學習編譯
- Ubuntu20.04linux核心(5.4.0版本)編譯準備與實現過程-編譯過程(2)UbuntuLinux編譯
- OSG開發筆記(三十六):osg3.4.0基於windows平臺msvc2017x64編譯器編譯並移植Demo筆記Windows編譯
- OSG開發筆記(三十八):osg3.0.0基於windows平臺msvc2017x64編譯器編譯並移植Demo筆記Windows編譯