標籤:

一文看懂華為方舟編譯器,安卓的一大進步

華為P30發布會上一起發布的方舟編譯器

引起了業內廣泛的關注,更多的人是不明覺厲,方舟編譯器是什麼?厲害在哪?解決了什麼問題?有什麼意義?作為一個曾經的程序員為大家解讀一下,也歡迎知乎各位大神提意見。

方舟編譯器是什麼?

爪哇島上一位富豪家裡有很多菲佣,富豪只會爪哇語,他每次用爪哇語吩咐管家需要菲佣幹什麼都是管家聽完後一句句翻譯給菲佣聽,雖然效率不高但是語言不通沒辦法。某天,一位叫方舟的人來應聘管家的職位說:我能讓菲佣幹活更快,於是他成了新管家。這位叫方舟的新管家給富豪建議:給我一個手冊,寫好菲佣每天要幹什麼。方舟拿到手冊後將手冊翻譯成菲佣的語言然後發給菲佣,從此菲佣再也不用聽吩咐就知道該幹什麼了,幹活變快了。

備註:爪哇島是印尼小道,英文JAVA,也是JAVA編程語言的來源,JAVA是Android的主要編程語言。

方舟這位管家就是方舟編譯器,什麼是編譯器呢?其實就跟這位管家一樣充當了「翻譯官」的角色,將程序員看的懂的語言(C++,JAVA等高級語言)翻譯成處理器看的懂的語言(機器碼,都是0和1的組合)。

不管是早期的電子管還是現在的半導體晶體管,這些計算的基本單位能識別的只有電平的高低,在計算機中我們就用0和1來表示。1和0的各種組合就是機器是能看懂的語言,也就是機器碼。計算機的初期,人們就是用0和1來寫成程序命令的,這種反人類的編碼顯然是程序員痛恨的,於是有了彙編語言,用字元來表示命令編碼,這就方便了很多,但是大型程序依然不可行,CC++,JAVA等高級語言應運而生。可以說高級語言是為程序員設計的,也是為大型的軟體工程設計的,因此逐步誕生了面向對象編程的繼承、多態以及回調、反射等機制,不管高級語言怎麼變化,處理器能夠識別的都只是機器碼,編譯器就承擔了這個翻譯轉化的角色,這也是方舟編譯器要做的事兒。

做好編譯器並不容易

我們都學過英語,可是翻譯並不是每個人都能做,《刺激1995》這部電影看過嗎?《月黑高飛》這部電影看過嗎?都沒看過?那《肖申克的救贖》你一定看過吧,其實他們是同一部電影,這是陸港台三地根據英文名《The Shawshank Redemption》的不同翻譯,是不是差異很大?

就像這個電影名字的中英文翻譯一樣,要做好編譯器也勢必要對上層開發語言和底層硬體都有非常深刻的理解,才能做好高級語言與機器碼的翻譯。

做一個編譯器並不難,難的是做出一個能夠高效準確翻譯的編譯器,並且進行長期的維護迭代,所以絕大多數廠商是不願意碰觸編譯器也缺乏動力去改變的動力。當前最主要的編譯器是有兩個:GCC與LLVM。現代編譯器的結構基本就如下圖LLVM的結構差不多,分為前後端,前段主要是處理程序員用的C/C++,JAVA等,後端主要處理硬體架構相關的優化。方舟編譯器應該也是如此,具體的實現如何要等開源後才能得知了。

幹掉虛擬機

當今移動終端領域分為IOS和Android兩大陣營,說起IOS很多人會說「快!流暢!」。這是建立在蘋果強大的A系列處理器,精心設計的swift語言,集成swiftc編譯命令的Xcode工具,高效的IOS系統,嚴格的許可權管理等基礎上的快,可以稱之為軟硬體結合一體化的典範。

反觀Android陣營,處理器性能在不斷提升,JAVA開發語言搭配虛擬機的效率確實低了些,許可權管理的問題也是老生常談,如何改進呢?最直接有效的方式就是去掉虛擬機。

虛擬機很容易理解,顧名思義就是虛擬的計算機也可以這麼簡單的理解,虛擬機與真實的計算機一樣無法直接識別程序員使用的高級語言JAVA,所以程序員在開發完成後需要編譯為位元組碼打包成DEX文件,與機器的硬體無關,這也是JAVA可以跨平台的原因。程序的執行終究還是要靠處理器來完成,所以虛擬機可以識別的位元組碼文件還需要再次編譯才能變成機器碼來執行。換句話說程序員在用JAVA開發完成後需要編譯兩次才可以執行,而IOS只需要一次。

Android 在5.0之後將Dalvik虛擬機替換為ART虛擬機,這也是Android Run Time,在幾經更改之後現在Android採用的是 解釋執行+ JIT + AOT 的混合編譯策略。一款APP在安裝時不再進行AOT編譯提高安裝速度,第一次執行時邊解釋邊執行,程序運行時,系統統計並記錄經常用到的熱代碼編譯為機器碼(JIT),這些機器碼在程序退出後會消失,系統根據記錄分析這些熱代碼並在空閑時將這些熱代碼編譯為機器碼(AOT)。

AOT (Ahead of time):在程序運行之前或者空閑時將JAVA位元組碼碼編譯為機器碼。

JIT(Just in time):在程序運行時實時將JAVA位元組碼編譯為機器語言然後執行,應用退出後消失。

如果用翻譯來描述現在的Android運行機制的話就是:一位CEO在記者招待會上用母語回答各國記者提問題,為了在座的記者都能聽懂採用了同聲傳譯(解釋執行),翻譯人員發現有些回答會重複多次就將這部分翻譯成稿件,再遇到就直接念稿(JIT)這樣會快一些,記者招待會結束後翻譯在空閑時間將這些常用問答正式整理成稿件(AOT),這樣下次再召開發布會更高效。如果在招待會開始前把所有要說的都寫在稿件上直接念不是更高效嗎?沒錯!這就是方舟要乾的事兒。

方舟編譯器捨棄了現在Android中的ART虛擬機,所以也不需要編譯為位元組碼文件(DEX),在生成APK安裝包時直接編譯生成適合的機器碼,在終端設備上安裝後直接就可以執行。省去了虛擬機,省去了JIT與AOT編譯,採用了與IOS一樣的方式,從機制上來說保證了App的快速運行。

說的這麼好,「那麼,古爾丹,代價是什麼呢?

代價就是文件的體積會變大,與IOS安裝包大於Android安裝包一樣的道理,以往的App安裝包是打包位元組碼的DEX文件,而方舟編譯器的安裝包是直接打包的二進位機器碼文件。微博極速版為例,安卓9.0安裝後37.5M(APK為9.7M),使用方舟後安裝後約為50M(APK為23M)。在存儲越來越大的今天,安裝文件的大小已經不是主要問題,而且安裝包安裝完成後還會刪除,所以不用太在意,至於體積大的遊戲也不需要太在意,因為遊戲的安裝包中資源文件佔比很大,這是與編譯無關的。

去掉虛擬機還不夠

有一家叫安卓的公司展開了一個新項目需要兩個部門一起來完成,項目儘速有點緩慢,經過分析查找原因發現大部分時間都浪費在兩個部門之間的協調上了。負責項目的主管認為這是公司架構劃分不合理造成的,應該打破部門的壁壘,將聯繫頻繁的部門合併成一個部門。從此這家公司的工作效率得到了大大的提升,這主要歸功於這位叫做「方舟」的項目主管。

這樣的「跨部門協調」導致效率不高的問題同樣發生在Android應用身上。Android中ART虛擬機的存在是因為JAVA是Android APP的開發語言,但是絕大多數的APP因為各種原因還會用到其它語言開發的庫,比如C語言。這樣就存在一個顯而易見的問題,這兩個語言之間勢必會產生調用、通信,這會產生很大的損耗。方舟編譯器將不同的語言統一為

如何將不同的語言統一為同一個語言呢?有兩種方式:

  1. 把不同的語言都翻譯中間代碼IR(Intermediate Representation),然後再由IR去對應不同的硬體架構翻譯成二進位機器碼。這樣有一個好處就是,可以方便的支持新的開發語言與硬體架構。
  2. 都直接翻譯成二進位的機器碼,這樣做需要對編程用的語言有非常深刻的理解,尤其是JAVA這樣動態特性很豐富的語言。

編譯器是重要突破

處理器、操作系統、資料庫、編譯器、編程語言這些是IT領域真正核心且基礎的東西,也是我們落後美國的地方,在上層應用上我們應該處於領先的地位。晶元處理器這幾年已經有了很大的起色,Android系統國產廠商也貢獻良多,其它領域最好的突破口就是與這兩者結合較為緊密的編譯器。但是國內有實力和動力做的公司屈指可數。

海思晶元的成功讓華為決定試一試,2013年華為自研的編譯器HCC取得初步成功,這也是華為在4G及5G時代移動通信領域取得領先的關鍵支撐,但是這還遠遠不夠,要做編譯器好必須要找行業大牛並長期投入。2014年,Fred Chow(周志德)加入了華為,這是編譯器領域的頂級權威,著名的Open64編譯器就是他主持開發的。Fred Chow發出了華為召集令,是否有千軍萬馬來相應我們不得而知,但是可以肯定「前途是光明的,過程是艱苦的」,隨後2012編譯器與編程語言實驗室成立,剩下的就是「十年磨一劍」了。

現在方舟編譯器出來了,但是這只是一個開始,編譯器是需要長期維護優化的。方舟編譯器未來如何也不僅僅取決於華為,還要看谷歌的態度。

方舟編譯器的價值

方舟編譯器並不是為了「填補XXXX空白」,而是為了在不改變現有代碼和編程習慣的基礎上進行編譯的優化,使得APP的運行更加流暢,方舟編譯器的最終的目的是成為一個跨硬體平台、跨系統、跨語言的軟體編譯平台。編譯器是一個橋樑,連接著上層的開發語言與底層硬體,又與操作系統緊密結合,掌握了編譯器,更換開發語言,更換硬體架構甚至更換操作系統都會有很大的幫助。值得注意的華為成立的「編譯器與編程語言實驗室」從名字來看除了編譯器還有編程語言,因為設計的原因JAVA脫離虛擬機後並非最好的開發語言,與其它語言的連接再如何優化也沒有同一個語言方便,所以推出一個自己的編程語言可能是最佳的選擇,然而這一步可能更加艱難,因為程序員要為此改變編程習慣。

擁有自己的編程語言,甚至在操作系統、硬體架構方面有所作為目前僅僅是幻想,也許有一天會實現,夢總是要有的。拋去幻想,面對現實,方舟編譯器同樣有著非常重大的意義。

  1. 鍛煉人才:編譯器的開發需要紮實的基本功,需要對編程語言和底層硬體都非常的熟悉,能夠鍛煉一批人才這是毋庸置疑的,這些技術人才是公司寶貴的財富。
  2. 為Android注入新活力:Android的誕生和維護主要歸功於谷歌,雖然隨著版本的迭代一直在進步但是多年來始終沒有打破固有框架也因此無法再進一步,方舟編譯器的出現顯然為Android提供了另一種可能,華為已經從幾年前的使用者變成了重要貢獻者。
  3. 更好的用戶體驗:Android的生態需要谷歌、手機廠家、App開發商共同維護才能給消費者更好的體驗,這點在國內尤其突出,綠色聯盟和統一推送聯盟在著手治理App生態亂象,方舟編譯器則是從系統框架層面提供了更深一層的優化。
  4. 提高效率:華為在ICT領域涉及的業務眾多,晶元、Server、終端、IoT、雲、通信,涉及的硬體和軟體系統也很多,如果能夠有一個統一的軟體開發平台對自己本身也是非常好的,從晶元到編譯器再到系統這種高度整合的軟硬體一體化可以帶來最佳的效果。

中國的IT行業發展的很好,但是在基礎領域缺少突破,中國的IT業需要唐吉可德,需要為探索者鼓掌,當然麵包也很重要,方舟編譯器我認為乾的不錯。關於方舟編譯器的具體細節與是非我們等下半年開源後再討論。


推薦閱讀:

六項世界第一!華為7納米超級恐怖晶元,麒麟980讓世界顫抖
華為Mate 20系列新機或搭載第二代GPU Turbo技術
華為Fellow艾偉:Mate20的心臟—麒麟980全揭秘
任正非如何用1%的股份控制華為,還不推華為上市?
搶灘智慧城市 華為:我們不一樣!

TAG:華為 | Android | iOS |