“它就是能讓安卓上的應(yīng)用,跑得跟蘋果iOS上一樣快?!泵鎸?duì)臺(tái)下的記者,華為消費(fèi)者BG軟件部總裁王成錄這么描述方舟編譯器的作用。
此時(shí),距離這個(gè)吊起了安卓應(yīng)用開發(fā)者們興趣的編譯器在發(fā)布會(huì)上被公開,正好過去了兩周。
什么是方舟編譯器?
在4月11日的華為P30中國發(fā)布會(huì)上,華為消費(fèi)者業(yè)務(wù)CEO余承東正式發(fā)布了華為方舟編譯器,并表示這個(gè)編譯器能改善安卓應(yīng)用編譯效率,從原先的邊解釋邊執(zhí)行轉(zhuǎn)變?yōu)槿虣C(jī)器碼高效運(yùn)行程序。
編譯器,就是將“一種計(jì)算機(jī)語言(通常為高級(jí)語言)”翻譯為“另一種計(jì)算機(jī)語言(通常為低級(jí)語言)”的程序。高級(jí)計(jì)算機(jī)語言便于開發(fā)者們編寫、閱讀交流以及維護(hù),如Pascal、C、C++、Java等,而低級(jí)機(jī)器語言是計(jì)算機(jī)能直接解讀、運(yùn)行的機(jī)器代碼(Machine code)。
華為的方舟編譯器,就是將安卓應(yīng)用開發(fā)者們所使用的JAVA、C/C++們轉(zhuǎn)換成機(jī)器代碼。據(jù)王成錄透露,華為從2009年就開始考慮做編譯器,“因?yàn)樵蹅?a href="http://www.socialnewsupdate.com/tags/海思/" target="_blank">海思做了芯片以后,需要有自己的編譯器才能真正發(fā)揮芯片的能力,從2013年開始,有華為自己的自研編譯器了,叫HCC?!?/p>
根據(jù)時(shí)間表顯示,在2012年,華為成立了編譯器與編程語言實(shí)驗(yàn)室,在2014年,技術(shù)大牛Fred Chow加入華為負(fù)責(zé)編譯器的主架構(gòu),經(jīng)過十年的摸索,華為終于推出了方舟編譯器。
根據(jù)華為官方公布的數(shù)據(jù)顯示,與此前的安卓應(yīng)用開發(fā)相比,方舟編譯器能夠提升24%的系統(tǒng)操作流暢度,提升44%的系統(tǒng)響應(yīng)能力,還能提升60%的第三方應(yīng)用(微博極速版)操作流暢度。
它是怎么做到的?
01
消除了跨語言調(diào)用開銷
王成錄向記者們?cè)敿?xì)闡述了方舟編譯器能提升流暢度、響應(yīng)能力的工作原理。
首先,方舟編譯器是多語言聯(lián)合優(yōu)化編譯器,“消除了跨語言調(diào)用開銷,這是影響Android性能開銷比較大的核心原因之一?!?/p>
據(jù)王成錄介紹,目前Android應(yīng)用市場里95%的APP都是多種開發(fā)語言:“邏輯部分,都是Java代碼,但是為了增強(qiáng)它的能力,可能所有的APP的開發(fā)者,都會(huì)用C寫個(gè)庫供Java來調(diào)用?!?/p>
Java是一門面向?qū)ο缶幊陶Z言,具有簡單性、面向?qū)ο?、分布式等特點(diǎn),雖然運(yùn)行效率不及C++,但開發(fā)效率高、跨平臺(tái)性更強(qiáng)的優(yōu)勢(shì),讓JAVA成為了安卓開發(fā)的首選,而通過JNI調(diào)用本地C/C++庫也是目前開發(fā)者們都在做的。
但,Java和C語言之間使用接口調(diào)用,必然會(huì)形成額外的性能開銷;王成錄表示,華為方舟編譯器將不同語言代碼在開發(fā)環(huán)境中編譯成一套可執(zhí)行文件,這樣執(zhí)行效率更高。
02
消除了影響性能的虛擬機(jī)機(jī)制并實(shí)時(shí)回收內(nèi)存
王成錄認(rèn)為華為方舟編譯器的第二大特點(diǎn)是消除了影響性能的虛擬機(jī)機(jī)制。
在安卓系統(tǒng)發(fā)展過程中,虛擬機(jī)不可被忽視:Android系統(tǒng)是以Linux為內(nèi)核構(gòu)建的,為了降低應(yīng)用的開發(fā)難度,并將其適配到不同硬件配置的設(shè)備上,Google在Linux內(nèi)核之上構(gòu)建了一個(gè)虛擬機(jī),Android應(yīng)用使用java開發(fā),運(yùn)行在虛擬機(jī)之上。
在安卓4.4之前,Dalvik就是安卓系統(tǒng)上使用的虛擬機(jī),基于寄存器。從Android 2.2開始,Dalvik開始使用JIT(Just In Time)技術(shù)來進(jìn)行代碼轉(zhuǎn)譯,將頻繁調(diào)用的代碼轉(zhuǎn)換為二進(jìn)制碼,不用每次解釋,而在此前Dalvik虛擬機(jī)將所有的Java語句逐句解釋執(zhí)行,效率很低。
但Dalvik越來越不能滿足需求,從Android 5.0開始,虛擬機(jī)從Dalvik換成了ART。
ART(Android RunTime)虛擬機(jī),采用AOT(Ahead Of Time)技術(shù),會(huì)在應(yīng)用程序安裝時(shí)就預(yù)編譯字節(jié)碼到機(jī)器語言,不再在執(zhí)行時(shí)解釋,從而優(yōu)化了應(yīng)用運(yùn)行的速度。
所以,到目前為止,安卓系統(tǒng)的任何機(jī)器只要裝上應(yīng)用裝上就會(huì)分配好虛擬機(jī),占用額外的系統(tǒng)資源,消費(fèi)者從應(yīng)用市場下載APP以后,真正解釋成機(jī)器指令和執(zhí)行文件是在手機(jī)上的虛擬機(jī)里做的,因此對(duì)系統(tǒng)資源要求高。
王成錄表示,ART的執(zhí)行效率雖然提高了,但是對(duì)于那些Java動(dòng)態(tài)特性的部分,仍然做不到直接編譯,還是要解釋執(zhí)行。
這源于Java不是Python那樣的動(dòng)態(tài)語言,但開發(fā)者經(jīng)常會(huì)用到它一個(gè)非常突出的動(dòng)態(tài)相關(guān)機(jī)制:反射機(jī)制。Java反射機(jī)制主要提供了以下功能:在運(yùn)行時(shí)判斷任意一個(gè)對(duì)象所屬的類、在運(yùn)行時(shí)構(gòu)造任意一個(gè)類的對(duì)象、在運(yùn)行時(shí)判斷任意一個(gè)類所具有的成員變量和方法、在運(yùn)行時(shí)調(diào)用任意一個(gè)對(duì)象的方法、生成動(dòng)態(tài)代理。
王成錄表示,Java動(dòng)態(tài)特性使得開發(fā)者“不需要把所有的程序都寫好,只要能夠運(yùn)行時(shí)實(shí)現(xiàn)調(diào)用就可以了?!钡@部分往往只能在運(yùn)行時(shí)進(jìn)行處理。而方舟編譯器最大的突破就在于此:把動(dòng)態(tài)的部分全部靜態(tài)編譯掉。
這確實(shí)很難。
王成錄認(rèn)為,這就像一個(gè)優(yōu)秀的翻譯官,一定要對(duì)漢語言文學(xué)理解的非常到位,然后再對(duì)英語理解非常到位;所以,核心是一定要對(duì)Java語言動(dòng)態(tài)特性非常深入的了解和理解,“Java有非常多的庫和業(yè)務(wù)邏輯,這些業(yè)務(wù)邏輯它生成各種各樣的應(yīng)用和代碼和業(yè)務(wù)邏輯,這些業(yè)務(wù)邏輯就需要團(tuán)隊(duì)不斷地去理解它,這個(gè)理解有點(diǎn)類似于做代碼測試的遍歷一樣,我讓這個(gè)代碼全跑到,才知道可不可以,它需要非常多的時(shí)間去積累,我對(duì)于庫的理解,當(dāng)然需要技術(shù),我理解這個(gè)庫本身的具體含義,有點(diǎn)像AI里面,我要收集東西,訓(xùn)練一個(gè)模型。如果這個(gè)東西沒有的話,我訓(xùn)練出來的模型不好,我這個(gè)機(jī)器沒法執(zhí)行,這個(gè)道理特別像?!?/p>
然后還需要對(duì)這些安卓現(xiàn)有的應(yīng)用可能會(huì)用到哪些庫、這些庫之間需要怎么用,需要大量的分析運(yùn)行狀態(tài),才能夠?qū)⑦@些動(dòng)態(tài)特性完成提前的編譯?!皩?shí)際上華為對(duì)于Android整個(gè)系統(tǒng)各種應(yīng)用的運(yùn)行,做了非常仔細(xì)去確認(rèn),相當(dāng)于一個(gè)應(yīng)用從底層起來,一直跑完以后,到底經(jīng)過哪些過程,這些過程可能會(huì)帶來什么問題?去哪些庫取東西,這些東西積累越多,放到動(dòng)態(tài)庫里面,把它編譯完了。有了這2個(gè)積累,才能做成這件事情?!?/p>
對(duì)于效果,有開發(fā)者向網(wǎng)易科技表示,“做成了靜態(tài)編譯,速度肯定會(huì)更快?!?/p>
方舟編譯器還能提供更高效的內(nèi)存回收機(jī)制。
王成錄表示,Android的原生內(nèi)存回收,在全局回收時(shí)需要暫停應(yīng)用,等待回收完成,這是產(chǎn)生隨機(jī)卡頓的重要原因,“而在方舟編譯器里,會(huì)在編譯時(shí)為程序配備及時(shí)回收的內(nèi)存處理機(jī)制,在程序執(zhí)行過程當(dāng)中實(shí)時(shí)處理。”
03
可以靈活實(shí)現(xiàn)不同應(yīng)用的性能優(yōu)化
王成錄表示,方舟編譯器的第三個(gè)亮點(diǎn)是可以靈活實(shí)現(xiàn)不同應(yīng)用的性能優(yōu)化。
他表示,現(xiàn)有的安卓編譯大部分代碼在虛擬機(jī)環(huán)境運(yùn)行,而虛擬機(jī)的創(chuàng)建由于來自于同一套“模板”,難以作深度的優(yōu)化:不同應(yīng)用的優(yōu)化訴求不一樣;相比之下,方舟編譯器不一樣,每個(gè)應(yīng)用編譯優(yōu)化方案自己來定,分別形成不同應(yīng)用優(yōu)化后的機(jī)器碼,“相當(dāng)于說,我們給每一個(gè)有追求的應(yīng)用開發(fā)者,都有了一個(gè)把自己的應(yīng)用做的更好的機(jī)會(huì),不再受限于Android虛擬機(jī)的限制?!?/p>
王成錄稱,方舟編譯器最理想的目標(biāo)就是“上層業(yè)務(wù)代碼不需要改,大家只需要通過華為的方舟編譯器做重新編譯就足夠了?!?/p>
他希望,Android陣營所有合作伙伴大家一起努力,從各自場景、各自平臺(tái)不斷去打磨它。
-
華為
+關(guān)注
關(guān)注
216文章
35207瀏覽量
255843 -
編譯器
+關(guān)注
關(guān)注
1文章
1662瀏覽量
50202 -
方舟編譯器
+關(guān)注
關(guān)注
0文章
63瀏覽量
439
原文標(biāo)題:讓華為P30運(yùn)行如飛的,是這個(gè)叫方舟的……
文章出處:【微信號(hào):smartman163,微信公眾號(hào):網(wǎng)易智能】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
【「鴻蒙操作系統(tǒng)設(shè)計(jì)原理與架構(gòu)」閱讀體驗(yàn)】02-華為鴻蒙設(shè)計(jì)理念
什么樣的代碼會(huì)被編譯器優(yōu)化
Triton編譯器與GPU編程的結(jié)合應(yīng)用
Triton編譯器如何提升編程效率
Triton編譯器在高性能計(jì)算中的應(yīng)用
Triton編譯器的優(yōu)化技巧
Triton編譯器的優(yōu)勢(shì)與劣勢(shì)分析
Triton編譯器在機(jī)器學(xué)習(xí)中的應(yīng)用
Triton編譯器支持的編程語言
Triton編譯器與其他編譯器的比較
Triton編譯器功能介紹 Triton編譯器使用教程
C7000優(yōu)化C/C++編譯器

評(píng)論