華為將推出“方舟編譯器”,編譯器是做什麼的?

1.引言

最近華為餘承東先生宣佈有關方舟編譯器的消息,使人們對華為後續推出的手機產品性能充滿期待。方舟編譯器擯棄了安卓虛擬機的邊解釋邊執行的機制,對自己的底層硬件使用更具針對性的方舟編譯器,可以大大提高其運行速度,革命性地改善手機使用的流暢度。這是國人第一次看到有國產的編譯器。

2.為什麼需要編譯器?

我們用手機打開計算器,輸入 1+2*3 然後按住一個等號,結果就出來了:7,那為什麼計算器就能計算結果呢?這裡其實是有一個步驟:

(1)開發人員用C寫了一個計算器程序,並編譯為 cal.exe,你運行的計算器其實打開的是這個程序。

(2)cal.exe是用高級語言c編寫。下面實現了一個簡單的加法偽代碼:

 public int Add(int a, int b)
{
int c=a+b;
return c;
}

但是,計算機並不能直接執行上面的程序,計算機只認識1010二進制數字,所以,需要編譯器把上面程序編譯為彙編語言:

Start Program
Segment Assume
CS:Program
Start:Mov AL,01H
Mov BL,02H
Add AL,BL
Program Ends
End Start

好傢伙,實現一個簡單的1+2,彙編語言都要寫很長,而且還要了解計算機內存,寄存機佈局,這對開發人員而言,簡直是噩夢。

而且,還有更麻煩的,不同硬件廠商,製造的硬件接口並不完全一樣,這意味著你為IBM寫的程序,在Intel機器上運行不了。也正是彙編語言太難,所以人們都不想學。

在上面彙編裡,核心就三句話,見註釋:

Start:Mov AL,01H //把1放到AL寄存器裡,H表示16進制
Mov BL,02H //把2放到BL寄存器裡,
Add AL,BL //然後把AL,BL寄存器相加,並把結果放到AL裡

從上面可以看到,彙編語言太難學了,所以,需要現在人們都學高級語言,例如Java,c#, php等等,但是不論哪種高級語言,最終都要編譯為計算機可以識別的機器語言(也就是101010)。

這個將上面高級語言編譯為機器語言的工作,就是由編譯器完成的。

我們拼命苦讀的編程語言,諸如C語言、C++是貝爾實驗室推出的,Java是Sun公司推出的編程語言。Go語言是谷歌設計的,而ASP,PHP等等都是美國人發明的,可以說,目前計算機編程語言,95%都是美國人發明的。

正是因為編譯器太難,國內就算是阿里,騰訊都不敢做。但是,編譯器又太重要,因此,華為是第一個敢想敢做的人。

3.編譯器是如何工作的?

編譯器最基本的就是代表語義分析。我們看一下下面一個簡單的計算式:

	表達式: 1+3*(4-1)+2

如果是“人”你會怎麼計算?

首先,我們會考慮運算符的優先級:括號優先級最高,所以先算 4-1=3
其次,乘除優先級比加減高。如果有乘除,按照從左到右運算,所以 3*3=9
再次,加減運算,也是從左到右: 1+9=10
最後,再運算右邊的加法:10+2=12
因此,最終我們得到結果:12

編譯器的原理和這個類似:拿到這個表達式,他會先掃描一下 1+3*(4-1)+2,然後,把運算符提取出來,並按照從右到左構造好語法樹,然後把數字填充進去

華為將推出“方舟編譯器”,編譯器是做什麼的?

這裡只是簡單的表達式,相對簡單,如果遇到複雜的代碼,編譯器要能正確理解代碼的本意,例如

 while (b != 0)
{
if a > b
a = a-b
else
b = b-a
}
return a

此時語法樹如下,複雜度急劇上升。

華為將推出“方舟編譯器”,編譯器是做什麼的?

是不是看著頭暈?

所以,個人感覺,會寫編譯器的人,都是天才。

4.如何學習計算機編譯

在大學計算機課程裡,有專門的《編譯原理》課程,不過,本站站長頭條是“數學之聲”,所以,我們還是談數學為主。

在大學裡,有一門課程《離散數學》他是編譯器原理的數學基礎。該課程包括了集合論,數論,圖論等。 離散數學有一個有名悖論:

理髮師悖論:1919年,羅素把他提出的集合論悖論通俗化如下:薩魏爾村有一位理髮師,他給自己訂下一條規則:他只給村子裡自己不給自己刮鬍子的人刮鬍子。請問他該不該給自己刮鬍子?

離散數學主要研究的是邏輯運算,例如:經典的三段論

所有的人都要死的
蘇格拉底是人
所以,蘇格拉底是要死的

根據常識,上面這個推理是正確的,如果用P,Q,R表示上面的條件,則可以寫成

P,Q=>R

但是,如果作為數學題,則上面題目是錯的,因為,他要求條件必須是原子命題。在如下的例子

華為將推出“方舟編譯器”,編譯器是做什麼的?

如果離散數學學好了,再學習編譯原理就簡單一些,因為,你學會了語義分析。

so easy~


分享到:


相關文章: