編譯器簡要介紹

2021-09-27 11:26:28 字數 3592 閱讀 4627

三、編譯器的分析/綜合模式

四、編譯器的編寫工具

複雜就是將簡單的事情重複一萬遍

計算機只能識別簡單的0-1串,高低電平控制著計算機內部各種簡單的暫存器、邏輯門、觸發器完成對應的功能,然後,這些暫存器、邏輯門、觸發器會以不同的組合方式重組為更複雜的功能硬體。這個過程一再重複,最終生成了複雜的計算機晶元,如cpu、記憶體晶元等。

可是,0-1串只是計算機的語言,它並不符合人類的思維習慣。

為了解決這個問題,有人想出了乙個辦法:把各種特定的0-1串與單詞聯絡在一起,組成乙個對映表,如果我們輸入某個單詞,便會啟動乙個簡單的程式將它翻譯為對映表中對應的0-1串。這些「單詞」就是助記符,這個「簡單的程式」就是彙編器。

然而這些助記符只是特定0-1串的別名,晶元內部最微不足道的一次操作,如修改暫存器的值、給資料分配記憶體區域,都需要我們自己動手。

彙編並沒有把人類從繁重的細節中拯救出來,它只是讓不易理解的0-1串好記了點,僅此而已。

但人類天生就是愛征服的,為此他們又發明了各類高階語言。

高階語言的出現真正是計算機發展史上的乙個重要里程碑,它擁有自己的一套詞法、語法和語義,就像自然語言一樣完善。它只關注怎麼做,而把具體的細節交給編譯器來承擔。比如,我說「上天」,編譯器會解析這條指令,然後根據含義幫我把飛機組裝好,油加滿,然後點燃發動機一飛沖天,我只看到了「上天」這個結果,而不知道到底是怎麼上天的。

一條簡單的高階語言指令往往對應著幾十甚至幾百條的彙編指令,編譯器即是這兩者之間的一座橋梁。

那麼現在我們有了最底層的0-1串、組合語言和高階語言,如何完成語言的翻譯,這正是編譯原理回答的問題。

編譯是指高階語言轉換為組合語言或機器語言,彙編是指組合語言轉換為機器語言。

開啟黑盒子!

編譯器是乙個黑盒子。

高階語言程式被編譯器翻譯為二進位制目標程式,並最終鏈結相關庫的二進位制檔案成為可執行檔案。然而,在這裡,我們只知道『what』,而不知道『how』。

那麼我們開啟這個盒子,一**竟!

編譯器內部基本是乙個順序執行的過程,按階段可依次劃分為詞法分析、語法分析、語義分析、中間**生成及優化、目標**生成,有時候詞法分析是語法分析的子程式。除此之外,還有兩個管理器貫穿全域性:符號表管理器出錯管理器

世界具有靈魂,事物之間的關係簡直剝離不開。

計算機理論是對現實世界的提取、抽象和模擬。

回想一下你把英語翻譯為漢語的過程:識別單詞、識別句子、理解意思、腦海中生成印象、表述為中文並做恰當的修飾。

把這個過程用到編譯器上便是:詞法分析、語法分析、語義分析、中間**生成、目標**生成。

詞法分析的主要任務是識別記號。

每乙個記號都代表一類單詞,常見的記號有關鍵字、識別符號、字面量、特殊符號,每乙個記號都有不同的構詞規則,即「模式」。詞法分析器根據「模式」匹配到不同的記號,然後交給語法分析器處理。

除此之外,詞法分析還承擔以下任務:

詞法分析的工具:

語法分析的任務是識別句子,構造語法樹。

根據高階語言的語法規則,語法分析器對前一階段產生的記號流進行結構上的識別,它在回答乙個問題:」單詞「的特定組合是否能組成結構正確的」句子「?

語法分析的工具:

語法分析方法:

語法分析保證句子結構正確,語義分析保證句子語義正確。

比如"人有翅膀」這句話,從句子結構上看,「人」是主語,「有」是謂語,「翅膀」是賓語,簡直無懈可擊;然而人是不可能有翅膀的,這裡的賓語只能 是「腿」、「手」、「眼睛」,而不能是「翅膀」,所以從語義的角度看,此處存在型別錯誤,理當被改正或丟棄。

語義分析根據語義規則對語法樹中的語法單元進行靜態語義檢查,檢測到不符合語義規則就會生成乙個錯誤。

與具體平台無關,這是中間**的最大優勢。

理論上說,語義分析完成之後,執行計算的基本元素已經具備,可以直接生成目標**並加以執行了。然而各種機器之間的指令集存在差異,此時如果在一台機器上直接生成目標**,則無法遷移到其他機器上執行,最好的解決辦法就是生成一種與機器無關的中間碼,然後每一台機器能針對中間碼生成與平台相適應的底層硬體指令,皆大歡喜!

另外,在中間**這一階段還會有優化,通過去除中間**中的冗餘部分以達到提高空間和時間效率的作用。

生成依賴平台的目標**。

它有多種形式:

組合語言形式。簡單易讀,仍需一次彙編才能執行。

可重定位二進位制**形式。二進位制**模組,沒有鏈結庫檔案,最常見的編譯形式。

記憶體形式。立刻執行,不寫入磁碟。

這兩個管理器貫穿全域性。

符號表記錄了源程式中符號的必要資訊,以便編譯器在需要時可以進行快速、準確的查詢。符號表管理器維護這個符號表。

出錯管理器負責對編譯過程中檢測的錯誤,如詞法錯誤、語法錯誤、語義錯誤等進行處理,要麼停止並指出錯誤的地方,要麼是修復這個錯誤。出錯管理器是錯誤處理策略的集合。

了不起的中間**!

為了便於分析問題,編譯器被分為兩種模式:分析、綜合

分析模式包括詞法分析、語法分析、語義分析,整個過程與具體機器無關。

綜合模式則是生成目標**直至最後的所有過程,它與機器緊密相關。

連線這兩種模式的,是中間**。

通過一種這樣的劃分,我們可以使用不同的前端、後端,只要保證中間**是相同的,編譯器就照樣能翻譯乙個程式。

工欲善其事,必先利其器。

最初的編譯器是純彙編手工編制的,由於編譯器結構的複雜性,手動編寫的效率極其低下,如早期的fortran用了18年才編完,簡直慘不忍睹。

為了提高效率,人們開始著手編寫能自動生成編譯器元件的工具。只要給定必要的引數,這些工具就可以為你自動生成相應的編譯器元件,從而快速完成編譯器編寫,如詞法分析器生成器、語法分析器生成器等等。

所以希望快速部署到工程應用上的話,可以充分利用這些生成工具,但如果還希望有所優化的話,那就非得啃透編譯原理不可了。

編譯器歷史簡要

一 歷史背景 上世紀50 年代,ibm 的john backus 帶領乙個研究小組對 fortran 語言及其編譯器進行開發。但由於當時人們對編譯理論了解不多,開發工作變得既複雜又艱苦。與此同時,noam chomsky 開始了他對自然語言結構的研究。他的發現最終使得編譯器的結構異常簡單,甚至還帶有...

MPI編譯環境及編譯器介紹

一 基本編譯器介紹 集群配置有三套基本的編譯器 1 gcc編譯器,2 pgi編譯器,3 intel編譯器。介紹如下 gccc編譯器 gccc 編譯器 g fortran 77編譯器 g77fortran 90編譯器 gfortran pgic編譯器 pgcc c 編譯器 pgcc fortran 7...

arm交叉編譯器簡單介紹

交叉編譯工具鏈的命名規則為 arch vendor os gnu eabi 根據對作業系統的支援與否,arm gcc可分為支援和不支援作業系統,如 arm none eabi 這個是沒有作業系統的,自然不可能支援那些跟作業系統關係密切的函式,比如fork 2 他使用的是newlib這個專用於嵌入式系...