新智元報導
編輯:張佳、小芹
【新智元導讀】昨日,華為方舟編譯器開源官網正式上線,代碼沒有放在GitHub,而是放到了開源中國的碼雲上。此次方舟編譯器的開源打響了鴻蒙OS開源的第一槍,未來將有更多開源陸續放出。
Show you the code!
8月31日,華為方舟編譯器開源官網正式上線,余承東也在微博上公布了相關消息。
方舟編譯器是為支持多種編程語言、多種芯片平台的聯合編譯、運行而設計的統一編程平台,包含編譯器、工具鏈、運行時等關鍵部件。
方舟編譯器整體框架
值得關注的是,此次方舟代碼沒有放在GitHub,而是放到華為自建的開源平台,以及開源中國的碼雲上,目前已收獲876顆星。
官方網站:
https://www.openarkcompiler.cn
代碼託管網站:
https://code.opensource.huaweicloud.com/HarmonyOS/OpenArkCompiler
碼雲鏡像倉庫地址:
https://gitee.com/harmonyos/OpenArkCompiler
鴻蒙OS開源第一槍,更多開源陸續放出
此次方舟編譯器的開源打響了鴻蒙OS開源的第一槍,首次開源範圍是編譯器 IR( Intermediate Representation)、RC(Reference Counting)和多語言設計思想等,用於與業界、學術界溝通交流。
後續將陸續開源編譯器前端、後端,支持其它語言(如 JavaScript)的編譯等,當前部分Java語言特性和JVM虛擬機特性的支持未包括在本次開源代碼中,包括:annotation、lambda表達式、泛型等。
華為消費者 BG 軟體部總裁王成錄表示方舟編譯器代碼會陸續開源
根據之前華為在開發者大會上公布的信息,作為鴻蒙OS的重要工具,方舟編譯器從2019年8月開始,將分步驟持續進行開源。
具體的開源計劃如下:
2020年:開始對Java編譯器工具鏈開源,支持Java程序編譯。
2021年:開始對JavaScript編譯器工具鏈開源,可用於JS程序的編譯。
方舟編譯器開源路標(綠色部分是本期開源內容,藍色部分待開源)
演示樣例
華為提供了HelloWorld、Exception 異常處理、RC 引用計數、Tread多線程等多個演示樣例:
樣例:HelloWorld
方舟編譯器的4大優勢:
1、多語言聯合
將同一應用中的不同語言代碼聯合編譯、聯合優化,消除語言間的性能“鴻溝”,降低開發者的優化成本
2、軟硬體協同
編譯器與芯片實現軟硬體協同優化,充分發揮硬體能效,應用體驗更佳
3、輕量運行時
通過編譯器的語言實現能力和優化能力增強,應用運行時的開銷更小
4、多平台支持
支持面向多樣化的終端設備平台進行編譯和運行,根據設備特徵提供便捷的開發與部署策略,提高開發效率
方舟編譯開源面向全球開發者
方舟編譯器面向全球開發者進行開源,因此,官方網站和代碼託管平台均面向全球開發者開放。目前英文版網站正在開發及內測,計劃將於 2019 年 Q4 上線。
45 家合作夥伴
此外,從官網給出的介紹看,目前已有至少45款第三方應用支持華為方舟編譯器,都是大家耳熟能詳的超大用戶量APP。
如何評價方舟編譯器?不如去讀代碼
既然華為已經Show you the code,代碼是檢驗成色的唯一標準,開發者也可以通過代碼託管平台參與社區貢獻。
開發者可基於開源代碼+二進製,編譯構建出編譯器工具鏈,嘗試對Java程序進行編譯。社區參與者可以通過框架源碼學習方舟編譯器的編譯器中間表達(IR)及基本的中端編譯框架,熟悉方舟編譯器的架構思想,並參與諸如對編譯器中端優化的貢獻。
根據說明,目前方舟編譯器的代碼託管在華為雲,在未來走向開放治理以後,將按照所掛靠機構的模式來託管。開發者可通過代碼託管平台參與社區貢獻,包括文檔貢獻和代碼貢獻,同時也可在此平台上反饋相關問題和需求。
下面是知乎用戶周剛的評論,新智元經授權轉載:
的確是通過中間語言 (IR) 來實現的,被 IR 接管的部分不管是不是靜態語言,都變成了一種前端描述語言;因為是部分實現 (只可能做到部分),那其他語言的 runtime 必須得保留,從邏輯上講在 Android 上 JVM 還得繼續存在,好像和之前華為開發者大會說的完全靜態化不太一樣;語言層面的靜態化並不是一個新鮮概念,但基本上都是針對單一語言而言,多語言的靜態化對我來說的確是第一次看到 (想了下這種做法其實是華為目前最好的選擇了),考慮到語言的衍生面,這種做法從工作量來講的確非常非常硬核,並且這種硬核更多的應該還是 runtime 部分的工作量:相當於做了一個 runtime 中間層來負責 API 轉發 (這部分不開源);
開發者大會被吹上天際的 GC 機制的確是我當時預測的 Reference Counting 機制;
vTable 的實現有點意思,我一直挺喜歡 js 的原型鏈設計,方舟的實現相當於一種固定長度 (24 個) 的原型鏈設計,這種做法很務實;
最後吐槽一下:
文檔的排版,用例和組合方式為什麽看起來象實習生做的;
C/C++ 的編程規範雖然很務實,但既然要開源拿出來見人,能不能也好好組織一下前後邏輯;
為什麽 3 分鐘開源就由 Public 轉成了 Private;
十年方舟,再造安卓
關於方舟編譯器的前世今生,可以參考新智元之前推薦的“菊廠搞機”的一篇文章《十年磨一劍!萬字長文剖析華為方舟編譯器的前世今生》:
可能很多人不知道,華為為方舟編譯器準備了十年。
2009年,華為啟動5G基礎技術研究的同時,開始創建編譯組,第一批海內外研究人員加入。
2013年,華為推出面向基地台領域的自研編譯器HCC,並正式提出編譯器框架構想。
2014年,眾多海內外專家加入華為,方舟項目正式啟動。
2016年,成立編譯器與編程語言實驗室。
2019年,華為方舟編譯器正式面世!
這十年,每一次突破都蘊含著華為軟體工程師們的傾力投入,每一個進展都值得銘記。
2017年5月,方舟編譯器上第一個Java程序“Hello World”跑通。
2017年8月的一個凌晨,在華為的一個實驗室裡,項目組已經連續數日24小時不間斷突破,卻始終看不到success的返回信息。絕望之下,工程師把所有通信數據列印出來,逐個字節排查,最終發現有一處字節的順序不一致。糾正後,華為方舟跑通了第一個安卓後台服務DiskStatus,這標誌著對安卓的換心手術進入了實操階段。
2018年春節前一周,方舟編譯器跑通安卓系統所有後台服務,並成功移植到手機。當晚,所有人聚集在實驗室的機房中,等待首個開機畫面加載成功的神聖時刻。秒針滴答,如同過了一個世紀那麽久,螢幕終於點亮。
歡呼,擁抱,一蹦三尺高,項目組成員們到底沒忍住,留下了激動的淚水。
接下來,項目組在除夕前夜啟動了方舟編譯手機的Beta測試。大年初一清晨,總架構師發來了第一條經編譯器編譯的運行程序發出來的拜年消息:
春節快樂,方舟大吉!
當P30發布會上“方舟”甫一出現,就在中國軟體行業“炸”了鍋。無數軟體從業者從一開始的質疑,到弄清方舟真相後的驚歎……這些都是對華為軟體工程師們十年如一日、一點一滴“啃硬骨頭”的致敬!
實際上,方舟已經不是傳統意義上從高級語言到機器碼的“萬能翻譯”,更是一個編譯運行系統。
一方面,方舟編譯器首次在Java領域將虛擬機乾掉了,也是軟體史上首次將Java/C/C++等混合代碼一次編譯成機器碼直接在手機上運行,徹底告別Java的JNI額外開銷,也徹底告別了虛擬機GC記憶體回收帶來的應用進程掉線,使操作流暢度大幅提升。如果說目前最新的安卓系統是和諧號動車,那麽經方舟編譯的安卓系統便是高鐵,是“複興號”。
華為手機直接通過方舟編譯器替換了Android system-server的所有後台服務,這一項就已經足夠讓華為EMUI比其他安卓系統更快一步。根據華為官方測試,方舟編譯器提升手機系統操作流暢度高達24%,系統響應性能提升44%。入手P30系列的用戶,應該已經體驗到了。
另一方面,方舟編譯器用空間換性能,直接將編譯器的代碼優化搬到了開發者環境,不再被手機端的硬體資源所限制,為代碼優化提供了無限可能。
此外,經測試,新浪微博極速版APP經方舟編譯後,操作流暢度提升高達60%。
解決安卓的四大命門,出於安卓,勝於安卓,超越iOS,並且全面兼容安卓,這就是華為方舟編譯器的使命!
安卓卡頓再見!
方舟的一個使命,就是解決安卓虛擬機GC記憶體回收帶來的“Stop World”。
目前安卓手機記憶體資源不夠用的時候,GC直接叫停所有應用,所以偶爾會遭遇莫名卡頓。
方舟編譯器採用了引用計數法(RC,Reference Counting)來進行記憶體的實時回收,並且配合使用了專門的消除環算法(消除對象互相引用帶來的無法回收問題),來避免GC集中式回收帶來的系統卡頓。相比GC,方舟的記憶體回收是實時的而非集中式的,且不需要暫停應用進程,這樣便大大消除了卡頓。
如果把記憶體回收比作成打掃房間,那麽GC的策略是專門有一個衛生員,看房間裡垃圾太多了,就把所有人請出去,打掃完了再讓大家回來。而方舟的RC則是每個人收拾自己的垃圾,用完就清理,保持清潔的同時不影響人的正常活動。
軟體有一個大家很熟悉的死循環,就是電腦被一個無限循環的運行程序把計算機資源佔光。
這種“死循環”在軟體中叫“環引用”。為了從機制避免手機記憶體被環引用“吃掉”,方舟編譯器引入annotation的“告警”標示,對基礎類的環進行標注。當然,Java程序員也可以對業務代碼中的環進行標注。經過豐富的實踐驗證,方舟這種機制可減少大部分程序中環的出現。
另外一方面,方舟編譯器在運行狀態下引入了高效的環回收機制,允許有選擇的智能回收某個APP的記憶體佔用,這對傳統的環回收算法是一個非常棒的改進。
Stop World,安卓卡頓,再見!