究竟LLVM關我什麼事啊?

先前對於編譯器毫無概念的我,第一場講座的主軸就是編譯器框架—LLVM。第一次接觸編譯器從大會上的講座理解來的,若有什麼錯誤請在文章下留言指正喔~

llvm-1
(截圖自講者簡報)

LLVM 是什麼呢?網絡上有人把它叫做編譯器,可是對我而言它更像是寫編譯器的框架。例如寫網站可能會用Django, Ruby on Rails, Node js, laravel.這些框架能快速的讓你開發網頁,但開發網頁也不一定要使用框架來寫。而LLVM能讓開發人員迅速的將某種語言最佳化,再將語言轉譯成能在目標CPU結構上跑的組合語言(例如ARM與x86都有各自的組合語言)最後再變成機器語言。

這個過程中,大略可以分為三個流程:

llvm-process
(截圖自講者簡報)

1)前端:前段的工作是在得到程式代码之后做掃描、parsing與建立parse-tree(AST)。

2)最佳化:往往程式在編譯過程中為了顧及閱讀性與擴充性,而顧及這兩個前題下寫出的結果對於電腦而言不會是最佳化的程式。這時變會在不改變程式功能的前提下在做刪減的動作。有趣的是 GCC編譯器便用了200多類的最佳化方式,確保程式能以最精簡的方式運行。

3)後端:到了最後的步驟便是將最佳化的程式轉成適合在各種CPU架構上的組合語言。這裡雖然使用LLVM框架可以省去很多步驟(處理變成DAG結構的程式),可是由於不同架構支援的運算能力不同(例如有些處理器不支持除法,所以要將除法變為一堆減法計算)所以需要人手進行一些更動。當然除了這個之外,還有處理不同架構scheduling方式不一樣所以需要做順序最佳化還有register分配最佳化…等問題。

以上介紹了LLVM並非框架的全部,當中還有許多細節與過程我選擇省略掉了。我覺得在這軟體工具繁榮的年代,許多人已經漸漸忘了一行編譯指令背後的血汗過程了。不僅僅需要面對難讀的語言(雖然講者不斷說“LLVM IR 很好讀…”)還要對於CPU架構瞭如指掌,能善用所有的功能確保結果是最適合在該框架上運作的組合語言。

希望各位在寫完程式後,在compile程式時,對於輸出結果能有不一樣的理解,而不再是程式經過一些魔術變成屏幕上能動的魔法。

 

講者浪打與Hydai的簡報網址:http://www.slideshare.net/zongfanyang

 

Leave a comment