目前程序員開發(fā)中基本都在使用高級語言绣夺,比如OC吏奸、Android、Java等陶耍。使用這些高級語言開發(fā)的程序奋蔚,想要在計算機上順利執(zhí)行,都必須經(jīng)歷編譯過程物臂。 我們知道旺拉,計算機能夠識別的只有0和1,被稱為“大腦”的CPU棵磷,就是不斷地從內(nèi)存中讀入0和1而不知疲倦的工作著蛾狗。
在一定程度上說,正是通過編譯工具
架起的高級語言
到二進制語言
的橋梁仪媒,才不斷涌現(xiàn)出越來越多的高級語言武器庫沉桌,供程序員在軟件的世界里縱橫馳騁谢鹊、大殺四方。對其機制的理解留凭,能夠讓一個程序員撥開不同高級語言表面差異的迷霧佃扼,找到它們背后共同的淵源。
一個程序的編譯過程蔼夜,可以分為如下幾個階段:
1 以中間代碼為界兼耀,編譯器分為前端(front-end)和后端(back-end);
2 中間代碼是程序的通用表示求冷,屏蔽了不同目標機器平臺的差異瘤运;有了中間代碼,編譯器獨立為前端和后端兩個模塊匠题,有助于分開優(yōu)化拯坟;
3 前端將源程序作為一個字符串作為輸入流,先經(jīng)詞法分析(使用正則實現(xiàn))韭山,識別變量颁独、字符串/整型/浮點型常量嫡锌、函數(shù)度宦、運算符和關鍵字等標識宪潮,解析為一個個 token
流。然后語法分析(上下文無關語法表示续搀,自底向上分析塞琼,LR(1)分析器)對輸入的 token
流進行語法有效性檢查,將符合規(guī)則的語法禁舷,轉變?yōu)橹虚g代碼進行表示。
4 中間代碼根據(jù)選定的平臺架構(CPU指令), 轉變?yōu)樽罱K的目標代碼(二進制表示)毅往。將不同源程序轉變的目標代碼進行鏈接牵咙,最終成為在選定平臺上可執(zhí)行的目標程序。
作為 iOS 的開發(fā)者攀唯,使用的編譯工具是 LLVM
洁桌,相比它的前輩 GCC
有了大幅的性能和實現(xiàn)優(yōu)化。clang
是 LLVM
的前端侯嘀,用于生成中間代碼另凌。lldb
是 LLVM
的調(diào)試器,類似 GCC
的 gdb
戒幔。
參考:
1 自己動手寫編譯器
2 Clang/LLVM/lldb/GCC/gdb 關系