方舟編譯器是將java代碼像C++靜態編譯,那麼為什麼安卓當時一開始為啥不用C++?

頭髮總也長不長


華為方舟編譯器可以編譯C/C++,Java,JavaScript以及Kotlin,方舟編譯器可以說是實現了幾乎所有操作系統平臺的通用開發語言的編譯環境。

不過要強調的是方舟編譯器並沒有實現Java像C/C++一樣的靜態編譯,方舟編譯器本質上還是基於GCC的交叉編譯套件,本身還是採用的預編譯的方式,至於效率到底怎麼樣,目前也只是華為官方給出了一些數據,而且我找遍了華為開發者官網也沒有找到這個工具。

安卓為什麼不直接把C++作為主要開發語言

C++作為應用開發語言其實並不奇怪,在Windows上除了基於C#和.NET的Windows Form,macOS下則是Objective-C以及Swift,C++可以實現對幾乎Linux/macOS/Windows三大平臺的應用開發,諾基亞就曾將C++作為應用開發語言,當然最終也沒能把生態搭建起來。那麼作為以C/C++為核心技術棧的Google為什麼不選擇C++作為Android的核心開發語言呢?主要原因還是幾點:

  • C++開發門檻相當高。C++是主流編程語言當中學習難度最大,學習成本最高,C++正式因為功能太強大了,一方面要兼容結構編程,又增加了面向對象編程,不夠徹底的面向對象編程語言,又要做很多C語言才能做的事,學習門檻相對就高了很多。相對應的Java卻是比較徹底的面向對象編程,學習門檻要低了很多。

  • C++代碼能在任何平臺下運行,不過在每個平臺都需要單獨重寫、重新編譯。這一點就相當的麻煩,Java本身就是完全跨平臺的,也是完全開源免費的,一次開發到處運行,這樣可以極大的降低研發成本。
  • Java擁有最豐富的開發者群體、最好的開源社區支持。不論是在美國本土,還是在其他國家,尤其是我國市場Java編程語言是行業第一大編程語言,是連續多年佔據著TIOBLE編程語言榜單第一的編程語言,Java開發者群體的壯大讓Android企業在人力方面的成本大大降低,基本上內部Java Web或者做企業級應用的都可以輕鬆轉崗Android開發。

選擇開發語言的時候我相信Google是做了很大的權衡的,毫無疑問Google最重要的技術棧是C/C++,要滿足開發者群體足夠、開源免費、門檻足夠低、完全跨平臺、兼顧到性能等等眾多特點,你就會發現除了自己像蘋果或者微軟那樣做一門編程語言,也就是Java最適合了。

方舟編譯器到底如何還不確定

儘管華為已經明確表示了方舟編譯器和鴻蒙OS操作系統都是開源的,不過到現在為止這兩款工具都還沒有正式開源,也許是華為還沒有完全準備好將這兩個重量級的產品推向開發者市場。

根據華為的資料顯示,方舟編譯器對於體驗的提升是非常明顯的,方舟編譯器讓系統操作流暢度提升24%,系統響應速度提升44%,第三方應用的操作流暢度提升了60%,不過目前這些數據都還是華為的實驗室數據,一旦進入真正大規模使用的階段,是不是能達到實驗室的數據,我們還不得而知。

華為方舟編譯器這事兒,如果要有機會還是的華為自己的鴻蒙操作系統上完全重新構建方舟編譯器,方舟編譯器本質上是基於GCC開發的交叉編譯器套件,而華為方舟編譯器僅僅也只是構建在Android這一個成熟的商業生態之上。從技術本質上講,華為採用的是預編譯技術,這玩意兒也不是新鮮事兒,Android也嘗試過,可是預編譯技術會產生一些大家眾所周知的後遺症,你會產生大很多的固件文件。

華為是否能夠有足夠的號召力讓開發者來使用方舟編譯器,華為的消費者業務最終要走蘋果封閉的商業模式還是Android開放的商業模式,目前華為選擇了後者,可是華為自己也做手機,怎麼處理和其他廠商的關係,這幾年華為懟天懟地懟友商,不管是誰都要噴上幾句,尤其是三星和小米,那麼華為如何和這些廠商相處。

這些都是擺在華為面前要必須解決的問題,華為在技術方面一直都比較保守,到現在為止很多技術比如麒麟處理器也不願意和其他廠商分享,很明顯華為還是想自己佔據技術的制高點,並不希望將自己核心的技術分享給其他廠商,那麼華為會不會差別對待其他廠商,因此華為會不會對其他廠商一視同仁將直接決定華為這次革命的成敗。


本文為字節跳動簽約作者EmacserVimer悟空問答原創文章,未經允許轉載、抄襲必究!

EmacserVimer


作為一個被C++差點整禿了的前程序員,我覺得我很有資格來回答這個問題(撥一撥頭上為數不多的幾根毛)

方舟編譯器到底意味著什麼?

方舟編譯器基於GCC開發,是一款交叉編譯器套件,它包括了C、C++、Fortran的前端,同時也包含了這些語言的庫,於今年4月公佈,預計在2020年全面完善開源(目前在部分華為機型上已經適配)。

需要強調的是,方舟是一款交叉式的編譯套件,他的工作模式還是傳統的預編譯—編譯—彙編—鏈接這樣的流程,在效率上可能會有提升,但提升的程度怎麼樣,我沒有親身體會過,聽身邊用華為的朋友講,感覺不錯,但實際如何就不得而知了。

回到問題本身——為啥不用C++?

眾所周知,C++一門非常強大的編程語言,可面向對象的同時還能兼容結構化編程。同時,C++也是是世界上最為複雜,難度最高的編程語言之一。<strong>
<strong>
<strong>

和另一門主流開發語言java相比,C++有個致命的缺陷:移植性。只要換個操作平臺,就得重新編譯,浪費時間浪費精力還浪費資源。同樣是面向對象,java要比C++簡單太多,語句精簡,結構清晰,單單一個內存自動管理就要比C++高到不知哪裡去了。另外,java的開發環境非常好,群體眾多,連續多年佔據開發語言榜首的位置。所以很多公司都選擇使用java作為開發語言,其中就包括安卓現在的“老父親”Google。


華為曾宣稱會將方舟編譯器完整開源,幫助開發者構建完整的工具鏈。屆時華為還將提供代碼調優工具,開發者可以選擇根據工具的優化建議來調整自己的代碼,和方舟編譯器配合獲得更優的執行效果,對於整個市場來講是個好消息。

華為在技術上是比較保守的,這和國內目前的大環境也相對吻合,很難講會對華為自身或者其他廠商造成什麼影響,不過,當下華為已經選擇了開源路線,想來今後的舉措即使有差池,也會遵守這一綱領。

<strong>


愛思考的奧特曼


Google設計安卓的時候目標很大,不想侷限在某一個特定的硬件平臺上,當時ARM、MIPS、x86乃至68K都佔有一定的市場,所以為了最大限度低保證app編寫一次到處運行,就不能使用直接編譯成本機代碼的方式,必須是編譯成某種中間代碼,再由解釋器解釋運行。這個解釋器可以是各種硬件平臺的本機代碼編譯的。

符合這種要求的方式很多,古老的有Pascal語言的P-code,現代的有Java語言的字節碼和JVM。Google選擇了Java,但是為了規避SUN公司的許可證限制,改造了JVM,換成了另外一種虛擬機Davik,標準的JVM

是一個面向堆棧的體系結構,所有操作都是針對堆棧頂的操作,而Davik是一種面向寄存器堆的體系結構,更類似常用的RISC機器。儘管有這些不同,但解釋運行硬件無關中間代碼的本質還是一樣的。

搞“華為編譯器”,說白了就是一夜回到解放前,徹底否定了Google的硬件平臺無關戰略思想,僅僅只針對ARM平臺一家玩了。


老饅頭簸箕


我想先說明一下,其實安卓一開始就是支持c++的。

谷歌提供給開發者的常見工具叫android sdk(Software Development Kit軟件開發工具包),這個主要是使用Java(現在添加了對kotlin的支持)。同時還提供了另一套開發工具ndk(native development kit),這個是支持開發者使用c/c++進行應用開發的。

也就是說谷歌一直支持開發商使用多種語言開發安卓應用,但是有個現實的問題是Java程序員多而且便宜,c/c++程序員少而且貴,Java代碼更好生產和維護,所以更多的應用開發商會選擇Java。

而且在方舟編譯器之前,安卓運行時已經支持預編譯AOT(Ahead Of Time)。工作方式是在應用安裝的過程中,將dalvik字節碼轉換成Arm本地指令集。但APK在運行時,還是需要依賴虛擬機。

方舟的這個編譯器,將轉換過程提前到生產過程,這個應該能夠帶來巨大的性能提升。畢竟電腦的CPU和手機cpu性能不是一個檔次,而且編譯過程對速度不敏感,安裝過程則對速度極度敏感,編譯過程可以進行更深度的優化。另一個是完全拋棄了虛擬機,理論上也會帶來性能的巨大提升。


RealAlexander


因為C++跨平臺性不如Java好。C++有時候編譯依賴動態鏈接庫,而動態鏈接庫實際上是隨系統環境決定的,所以很多時候會出現動態鏈接庫不存在或者版本不正確的問題,如果這個問題放在手機上,就需要所有的設備都更新到開發者使用平臺以後的版本才行,也就是不向前兼容,雖然在安裝上面可能有好處,但是大大提高了安裝失敗的幾率,對於移動APP來說,並不方便,也不可行,所以才採用建立在JVM上面的Java,使用JVM來擺脫對底層的依賴。


榻榻米的榻榻


因為C++跨平臺性不如Java好。C++有時候編譯依賴動態鏈接庫,而動態鏈接庫實際上是隨系統環境決定的,所以很多時候會出現動態鏈接庫不存在或者版本不正確的問題,如果這個問題放在手機上,就需要所有的設備都更新到開發者使用平臺以後的版本才行,也就是不向前兼容,雖然在安裝上面可能有好處,但是大大提高了安裝失敗的幾率,對於移動APP來說,並不方便,也不可行,所以才採用建立在JVM上面的Java,使用JVM來擺脫對底層的依賴。


專注財富積累30年


這裡要追溯到unix了。相比蘋果的IOS操作系統,安卓操作系統提供了對JAVA的支持。而蘋果的IOS是重寫了unix,IOS設計之初,就提供了對C或這類C如OBJECT C等語言的支持。而JAVA是運行在JAVA虛擬機基礎上的,其垃圾回收機制是要犧牲部分性能的。所以,從安卓架構之初,性能上就存在缺陷(相比IOS哈)。

不知我的回答是否令你滿意?


Josewu2007


運行速度,跨平臺,2選1


東橋西看


目前大量開發者在通過Java開發過程中,會調用多個庫文件,而庫文件本身則多是調用C和C++編寫,這樣應用無法直接被系統進行讀取調用,在現有的安卓系統中,不同語言代碼會保持獨立,無法通過編譯器來混編不同的語言,這就會大大影響系統的流暢性,也是使得安卓系統在流暢性上難以趕超iOS的原因。而華為方舟編譯器則可以把Java和C、C++統一做中間表示,統一來做優化以後進行編輯,實現統一的程序表示,不需要在手機上做二次編譯。

另外,方舟編譯器也針對垃圾回收進行了優化,通過方舟編譯器可以實現線程本身誰使用誰負責清理,不再是停線等垃圾回收的做法,這樣就能夠讓系統對手機內存的硬件要求更低。根據王成錄介紹,目前已經有40多個頂級應用通過方舟的編譯上架到華為應用商城,並且歡迎未來有更多的第三方使用方舟編譯器。同時,方舟編譯器所有代碼也將開源給業界。

那麼,方舟編譯器的原理究竟是如何實現的?

實際上,華為所謂的 “方舟編譯器” 與其說是一個編譯器,不如說是一個編譯運行系統;這個系統的運行需要開發環境和終端(也就是智能手機)的配合,其目的是繞過 Android 操作系統中 App 的運行所必須依賴的虛擬機,將 Java/C/C++ 等混合代碼一次編譯成機器碼直接在手機上運行,徹底告別 Java 的 JNI 額外開銷,也徹底告別了虛擬機的 GC 內存回收帶來的應用進程掉線——從而最終實現 Android 操作系統的流暢度。總體上的核心創新點是混合語言的統一中間表示和完全靜態編譯,但更重要的是華為在解決 Android 操作系統 App 運行問題的嶄新思路。


系統之家


是因為無法使用C++。手機型號繁多、CPU各異,用C++生成什麼指令集呢?只能用Java生成字節碼,運行時靠JⅤM去適應各種手機CPU。


分享到:


相關文章: