重溫編譯原理(1)

2021-04-08 21:00:46 字數 1179 閱讀 9693

編碼完成之後,不論它能否正確的達到我們預期的目標,首先都需要通過編譯器的編譯,也就是說我們的編碼至少是在語法上是正確的。所謂語法的正確就是我們的**要符合所用語言的語法規定,其實質是使得編譯器能夠正確的解析,從而得到目標**在機器上執行。

如果我們能夠知道編譯器是如何工作的,那麼對這些問題的認識就會上公升乙個層次,許多困擾我們的不解與疑問或許就會迎刃而解,豁然開朗。因此,我們不妨抽出一段時間,重溫一下似乎早已遺忘的編譯原理教材吧!

編譯器的記憶體分配策略

假定編譯器從作業系統得到一塊儲存區,用於被編譯的程式執行。該儲存區將被分塊,用來儲存:

1.產生的目標**

2.靜態資料

3.記錄程式呼叫的控制棧4.堆

程式每次執行時所需的資訊都用一塊連續的儲存區來管理,稱作活動記錄。其中包括了以下資訊域:返回值,實參,控制鏈(可選),訪問鏈(可選),儲存的機器狀態,區域性資料和臨時資料。

其中,返回值儲存被呼叫程式返回給呼叫程式的值;實參域儲存呼叫函式傳給被呼叫函式的引數值;控制鏈指向呼叫者的活動紀錄;訪問鏈用來應用其他活動記錄中的非區域性資料;激起狀態域儲存程式呼叫前機器的狀態資訊,如:程式計數器的值和各種暫存器的值等等;區域性資料域儲存區域性於程式執行的資料;臨時資料儲存如計算表示式的中間結果這樣的臨時資料。

編譯器一般有三種記憶體分配策略:

1.靜態分配

2.棧式分配

3.堆式分配

靜態分配,變數在編譯時就確定了儲存空間,靜態變數的值被繫結到固定的儲存空間,因此每次函式呼叫後區域性於函式的靜態變數仍然繫結到同樣的儲存單元,即使呼叫完成,區域性變數的值仍然儲存。

棧式分配,把儲存空間組織為棧,而且隨著程式呼叫的開始和結束進行進棧和出棧。每次呼叫都將乙個活動記錄壓入堆疊,呼叫結束時彈棧。堆式分配,把連續的儲存區分成塊,當活動記錄或其他物件需要時就分配。塊的釋放可以按照任意順序進行。注意,這部分不是由編譯器自動釋放的,必須由程式設計師來處理。

了解了編譯器的記憶體分配方式,我們就可以理解一些經常遇到的問題的原因。

返回區域性變數的引用

過程每次呼叫時,區域性變數的儲存空間都包含在每次呼叫的活動紀錄中。由於每次呼叫都引起新的活動記錄進棧,所以每次呼叫時,區域性變數都分配到不同的儲存單元。而且在活動記錄彈棧的時候所有區域性變數的儲存空間將被釋放,儲存的值將被刪除。

引數傳遞(按值傳遞,按指標傳遞,按引用傳遞)

引數傳遞方法之間的區別主要是基於實參代表的是左值、右值還是實參的正文本身(待續)

編譯原理1

1 引論 1.1 什麼叫編譯程式 編譯程式是指能夠把某一種語言程式 稱為源語言程式 轉換成另一種語言程式 稱為目標語言程式 而後者與前者在邏輯上是等價的。1.2 編譯過程概述 1.2.1 詞法分析。對構成源程式的字串進行掃瞄和分解,識別單詞。例 for i 1 to 100 do,分析結果如下 基本...

《編譯原理》1

翻譯程式 將一種語言等價轉換另一種語言的程式 編譯程式 將某種高階語言等價轉換另一種低階語言的程式 解釋程式 將源語言寫的源程式作為輸入,但不會產生目標程式,而是邊解釋邊執行源程式 編譯執行 解釋執行 1 html xml分析 2 語言處理工具 模擬英文翻譯為中文 識別句子中乙個個單詞 詞法分析 分...

編譯原理(1)

什麼是宿主機,什麼是目標機?編譯程式的平台叫宿主機。編譯後產生的 的執行平台叫目標機。計算機思維包括什麼?計算機思維 抽象 自動化 分解 遞迴 權衡 折中 任務 輸入源程式,對構成源程式的字串進行掃瞄和分解,識別出乙個個單詞符號。依循的原則 構詞規則。描述工具 有限自動機 for i 1 to 10...