編譯原理淺析

目前程序員開發(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ù)、運算符和關(guān)鍵字等標識,解析為一個個 token 流。然后語法分析(上下文無關(guān)語法表示,自底向上分析,LR(1)分析器)對輸入的 token 流進行語法有效性檢查,將符合規(guī)則的語法,轉(zhuǎn)變?yōu)橹虚g代碼進行表示。

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

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

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

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

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

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

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