編譯原理
1.1編譯器就是個程式,讀入某種語言編寫的程式,翻譯成另一種語言的程式。並能告知源程式的錯誤。
1.11
編譯的分析綜合模型
編譯由兩部分組成,分析和綜合。
分析部分將源程式切分成一些基本塊並形成源程式的中間表示,綜合部分把源程式的中間表示轉換成目標程式。
分析期間:
源程式的操作將被確定下來並表示成為乙個語法樹的分層結構:
賦值語句
position :=initial + rate * 60;
語法樹如下圖所示:
1.12
編譯器的前驅和後繼
源程式可能被分成模組存在不同的檔案中,把儲存在不同檔案中的程式模組集成為完整的乙個源程式的任務由預處理器完成,當然預處理器也能進行巨集替換。
典型的「編譯」過程如下圖所示:由編譯器建立的目標程式需要進一步處理才能執行。左圖中編譯器產生彙編**,彙編**需要由彙編器翻譯成機器**,然後與庫程式連線在一起形成可在計算機上機執行的**。
1.2
源程式分析
源程式的分析過程由
3個階段組成: 1.
線形分析
在編譯器中,線性分析被稱為詞法分析或掃瞄 2.
層次分析
層次分析被稱為語法分析 3.
語義分析
語義分析階段檢測源程式的語義錯誤,並收集**生成階段要用到的型別資訊。
1.3
編譯器的各個階段
從概念講,編譯器是分階段的,每個階段將源程式從一種表示轉換成另一種表示。
1.31
符號表管理器
符號表是乙個資料結構。每個標誌符在符號表都有一條記錄,記錄的每個域對應於該標誌服的乙個屬性。但是標誌符屬性一般不再詞法分析中確定。將在詞法分析以後的各個階段陸續寫入符號表,並以各種方式被使用。
1.33
各階段分析
編譯最後乙個階段為目標**生成,生成可重定為的機器**或者彙編**。在這一階段,編譯器為源程式定義和使用的變數選擇儲存單元,並把中間指令翻譯完成相同任務的機器**指令序列。
gcc 中: gcc -s a.i -o a.s 能夠生成彙編**
1.4
編譯器的夥伴
1.41
預處理器
預處理器產生編譯器的輸入,一般具有以下的功能: 1.
巨集處理 2.
檔案包含
把頭檔案包含到程式正文中 3.
理性預處理器 4.
語言擴充
gcc 中: gcc -e a.c -o a.i 產生預處理後的檔案a.i,能看到巨集的擴充套件
1.42
彙編器
某些編譯器產生彙編**,彙編**需要彙編器做進一步處理。也有些編譯器完成彙編的操作,產生可重定為的機器**,交給裝配器或者連線編輯器處理。
1.43
兩編彙編
4個位元組,且從
0位址開始。
在第二遍掃瞄中,彙編器再次從頭掃瞄輸入檔案。這一次將每個操作符翻譯成機器**中代表相應操作的二進位制位序列。第二遍掃瞄的輸出是可重定位的機器**。可重定為指的是裝入的起始位址可以是任意的記憶體單元
lc,也就是說,如果將
l加到**的所有位址上,整個程式對所有儲存位址的引用都是正確的。
gcc 中: as a.s -o a.o 生成目標檔案
1.44
裝配器和連線編輯器
裝配器完成程式的裝入和連線編輯兩項功能。裝入過程包括讀入可重定為的機器**,修改重定為位址,並將修改後的指令和資料放到記憶體中適當的位置。
連線編輯器將我們多個可重入機器**的檔案組裝成乙個程式。這些可重入機器**的檔案可以是多次編譯的結果,其中乙個或多個可能是庫檔案程式。
外部引用:乙個檔案中的**引用另乙個檔案中的儲存單元,這種引用可以是資料單元的引用,或者是出現在乙個檔案中**而在另乙個檔案中被呼叫的過程的入口點的引用。
gcc 中: gcc a.o -o a.out 生成執行**
編譯原理預習筆記(一)
有窮狀態自動機根據確定性可以分為 確定有窮狀態自動機 dfa deterministic finite automaton 和 非確定有窮自動機 nfa non deterministic finite automaton dfa的確定性表現在轉換函式f sx2 s是 乙個單值函式,也就是說對任何狀...
編譯原理 筆記
第一講 編譯過過程概述 主要介紹了 1 什麼是編譯是編譯程式?2 編譯程式的作用 3 編譯過程 4 編譯程式的組成及各部分的作用。第二講 上下文無關文法和語言 主要介紹了 1 語法 語義等概念,2 回顧了關於程式語言定義,初等資料型別,資料結構,高階高階語言的一般特性,程式結構,語句與控制結構等內容...
編譯原理筆記
機器無關的優化 基於target 的優化 生成 由於tvm中新增自定義硬體加速器的最後一步,需要llvm編譯器支援自定義pass,所以就大概看了下編譯原理,下面mark一下。編譯可大概歸納為 前端 中間 後端,下面引用教程上的一張圖 剝去源程式中的注釋和空白符。對程式開頭的巨集定義和檔案包含進行處理...