編譯原理淺析

目前程序員開發(fā)中基本都在使用高級(jí)語言,比如OC、Android、Java等。使用這些高級(jí)語言開發(fā)的程序,想要在計(jì)算機(jī)上順利執(zhí)行,都必須經(jīng)歷編譯過程。 我們知道,計(jì)算機(jī)能夠識(shí)別的只有0和1,被稱為“大腦”的CPU,就是不斷地從內(nèi)存中讀入0和1而不知疲倦的工作著。

在一定程度上說,正是通過編譯工具架起的高級(jí)語言二進(jìn)制語言的橋梁,才不斷涌現(xiàn)出越來越多的高級(jí)語言武器庫,供程序員在軟件的世界里縱橫馳騁、大殺四方。對(duì)其機(jī)制的理解,能夠讓一個(gè)程序員撥開不同高級(jí)語言表面差異的迷霧,找到它們背后共同的淵源。

一個(gè)程序的編譯過程,可以分為如下幾個(gè)階段:


編譯過程

1 以中間代碼為界,編譯器分為前端(front-end)和后端(back-end);

2 中間代碼是程序的通用表示,屏蔽了不同目標(biāo)機(jī)器平臺(tái)的差異;有了中間代碼,編譯器獨(dú)立為前端和后端兩個(gè)模塊,有助于分開優(yōu)化;

3 前端將源程序作為一個(gè)字符串作為輸入流,先經(jīng)詞法分析(使用正則實(shí)現(xiàn)),識(shí)別變量、字符串/整型/浮點(diǎn)型常量、函數(shù)、運(yùn)算符和關(guān)鍵字等標(biāo)識(shí),解析為一個(gè)個(gè) token 流。然后語法分析(上下文無關(guān)語法表示,自底向上分析,LR(1)分析器)對(duì)輸入的 token 流進(jìn)行語法有效性檢查,將符合規(guī)則的語法,轉(zhuǎn)變?yōu)橹虚g代碼進(jìn)行表示。

4 中間代碼根據(jù)選定的平臺(tái)架構(gòu)(CPU指令), 轉(zhuǎn)變?yōu)樽罱K的目標(biāo)代碼(二進(jìn)制表示)。將不同源程序轉(zhuǎn)變的目標(biāo)代碼進(jìn)行鏈接,最終成為在選定平臺(tái)上可執(zhí)行的目標(biāo)程序。

作為 iOS 的開發(fā)者,使用的編譯工具是 LLVM,相比它的前輩 GCC有了大幅的性能和實(shí)現(xiàn)優(yōu)化。clangLLVM 的前端,用于生成中間代碼。lldbLLVM 的調(diào)試器,類似 GCCgdb。

參考:
1 自己動(dòng)手寫編譯器
2 Clang/LLVM/lldb/GCC/gdb 關(guān)系

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 第1課-OC對(duì)象原理基礎(chǔ) [TOC] 在探索OC對(duì)象原理之前,我們首先需要了解以下知識(shí)點(diǎn) 1. lldb lldb...
    落淚無痕的博客空間閱讀 612評(píng)論 0 0
  • 在說這篇文章之前,首先我們帶入一個(gè)問題,在Xcode中我們最常使用的一個(gè)組合鍵cmd+b按下之后都進(jìn)行了哪一些工作...
    瞇大帥閱讀 11,897評(píng)論 1 57
  • 1. 加固的緣由? 我們都知道,在越獄機(jī)型上,如果程序的可執(zhí)行文件被獲取到,就可以通過一些逆向工具來反編譯我們的程...
    純情_小火雞閱讀 4,006評(píng)論 1 8
  • 引言 維基百科: 編譯語言(英語:Compiled language)是一種以編譯器來實(shí)現(xiàn)的編程語言。它不像解釋型...
    素還真人閱讀 2,438評(píng)論 0 7
  • 引言 維基百科:編譯語言(英語:Compiled language)是一種以編譯器來實(shí)現(xiàn)的編程語言。它不像解釋型語...
    Flame_Dream閱讀 8,701評(píng)論 5 52

友情鏈接更多精彩內(nèi)容