編譯原理課件_第1頁
編譯原理課件_第2頁
編譯原理課件_第3頁
編譯原理課件_第4頁
編譯原理課件_第5頁
已閱讀5頁,還剩43頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、第六章 運行時存儲空間的組織和管理 編譯程序在完成詞法、語法和語義分析后,在生成目標代碼之前,需要把程序的靜態(tài)正文和實現(xiàn)這個程序的運行時的活動聯(lián)系起來弄清楚將來在代碼運行時刻,源代碼中的各種變量、常量等用戶定義的量是如何存放的,如何去訪問它們。 在程序的執(zhí)行過程中,程序中數(shù)據(jù)的存取是通過與之對應的存儲單元來進行的。在程序語言中,程序使用的存儲單元都是由標識符來表示的。它們對應的內(nèi)存地址都是由編譯程序在編譯時或由其生成的目標程序運行時進行分配。所以對于編譯程序來說存儲組織與管理是一個復雜而又十分重要的問題。1第六章 運行時存儲空間的組織和管理 過程的活動過程的一次執(zhí)行稱為過程的一次活動活動記錄過

2、程的活動需要可執(zhí)行代碼和存放所需信息的存儲空間,后者稱為活動記錄本章內(nèi)容討論一個活動記錄中的數(shù)據(jù)安排程序執(zhí)行過程中,所有活動記錄的組織方式 2第六章 運行時存儲空間的組織和管理過程P一次活動的生存期,指的是從執(zhí)行該過程體第一步操作到最后一步操作之間的操作時間,包括執(zhí)行P時調(diào)用其它過程花費的時間。過程可以是遞歸的一個過程可對應多個活動3第六章 運行時存儲空間的組織和管理影響存儲分配策略的語言特征 過程能否遞歸當控制從過程的活動返回時,局部變量的值是否要保留過程能否訪問非局部變量過程調(diào)用的參數(shù)傳遞方式過程能否作為參數(shù)被傳遞過程能否作為結(jié)果值傳遞存儲塊能否在程序控制下動態(tài)地分配存儲塊是否必須顯式地釋

3、放本章在邏輯地址空間討論46.1 (過程內(nèi)部)局部存儲分配策略6.1.1 過程過程定義、過程調(diào)用、形式參數(shù)、實在參數(shù)、活動的生存期Procedure f(a:int, b:bool)int c;過程定義void main()f(3,true);過程調(diào)用56.1 局部存儲分配策略6.1.2 名字的作用域和綁定名字的作用域一個聲明起作用的程序部分稱為該聲明的作用域。int a;Function f(int b)int c;void main()a = 0;c = 0;f(3);正確,在a的作用域內(nèi)錯誤,超出了c的作用域66.1 局部存儲分配策略6.1.2 名字的作用域和綁定名字的作用域即使一個名字

4、在程序中只聲明一次,該名字在程序運行時也可能表示不同的數(shù)據(jù)對象。int a;Function f(int b)int c;void main()a = 0;f(3);f(5);兩次調(diào)用,函數(shù)f中變量c對應不同的數(shù)據(jù)對象保存值的存儲單元76.1 局部存儲分配策略名字到存儲單元的綁定環(huán)境把名字映射到左值(存儲單元),而狀態(tài)把左值映射到右值(值)。賦值改變狀態(tài),但不改變環(huán)境。 如果環(huán)境將名字x映射到存儲單元s,我們就說x被綁定到s。名字存儲單元狀態(tài)值環(huán)境6.1.2 名字(變量)的作用域和綁定A = b5A4bA586.1 局部存儲分配策略靜態(tài)概念和動態(tài)概念的對應靜 態(tài) 概 念 動 態(tài) 對 應 過程的

5、定義 過程的活動 名字的聲明 名字的綁定 聲明的作用域 綁定的生存期 96.1 局部存儲分配策略6.1.3 活動記錄編譯之后的程序每次運行時,從操作系統(tǒng)(OS)獲得一塊存儲區(qū)(內(nèi)存)。其內(nèi)容包括:編譯后的目標代碼 (可執(zhí)行程序 .exe)數(shù)據(jù)對象 (各種靜態(tài)變量和動態(tài)變量)用于管理過程活動的控制棧 (活動記錄)過程的活動中用于存放所需信息的存儲空間, 稱為活動記錄或幀106.1 局部存儲分配策略6.1.3 活動記錄目標程序每次運行時,編譯器從操作系統(tǒng)(OS)獲得一塊存儲區(qū)(內(nèi)存)。其空間安排:代 碼靜 態(tài) 數(shù) 據(jù)堆棧目標代碼(.exe)靜態(tài)變量和外部變量活動記錄活動記錄及動態(tài)變量116.1 局

6、部存儲分配策略6.1.3 活動記錄例子void p() void main() ; p(); .; 代 碼靜 態(tài) 數(shù) 據(jù)main的活動記錄堆p的活動記錄棧126.1 局部存儲分配策略6.1.3 活動記錄一般的活動記錄的布局返 回 值臨 時 數(shù) 據(jù)實 在 參 數(shù)控 制 鏈訪 問 鏈機 器 狀 態(tài)局 部 數(shù) 據(jù)本過程返回給調(diào)用過程的值調(diào)用過程傳遞給本過程的參數(shù)指向調(diào)用過程的指針用于引用存于其他活動記錄的非局部數(shù)據(jù)用于保存本過程調(diào)用前的機器狀態(tài)本過程內(nèi)部定義的局部變量臨時變量,中間結(jié)果136.1 局部存儲分配策略6.1.4 局部數(shù)據(jù)的安排字節(jié)是可編址內(nèi)存的最小單位。一個過程所聲明的局部變量,按這些變

7、量聲明時出現(xiàn)的次序,在活動記錄的局部數(shù)據(jù)區(qū)中依次分配空間。 局部數(shù)據(jù)的地址可以用相對于某個位置(本過程對應的活動記錄的起始位置)的偏移來表示。數(shù)據(jù)對象的存儲安排深受目標機器尋址方式的影響,存在對齊問題。例如,要求整數(shù)(int,long)的相對地址可以被4整除。由于對齊而引起的無用空間稱為襯墊空白區(qū)。14例題在X86/Linux工作站上,以下兩個結(jié)構(gòu)的size分別是20和16,為什么不一樣?typedef struct _atypedef struct _bchar c1; char c1;long i; char c2;charc2; long i;double f; double f;a;

8、b;第一部分 存儲區(qū)(內(nèi)存)的劃分15例題解答:typedef struct _achar c1;long i;charc2; double f;a;04812c1ic2f20襯墊空白區(qū)襯墊空白區(qū)19第一部分 存儲區(qū)(內(nèi)存)的劃分16例題解答:typedef struct _bchar c1;char c2;longi; double f;b;0c14816ic2f襯墊空白區(qū)12第一部分 存儲區(qū)(內(nèi)存)的劃分176.1 局部存儲分配策略6.1.5 程序塊語法如聲明 語句本身含有局部變量聲明的語句,可以嵌套最接近的嵌套作用域規(guī)則程序塊B中聲明的作用域包括B如果名字x沒有在B中聲明,那么B中x的出

9、現(xiàn)是在外圍程序塊B的x聲明的作用域中,且滿足B有x的聲明B比其他任何包含x聲明的程序塊更接近被嵌套的B并列程序塊不會同時活躍并列程序塊的變量可以重疊分配 int a; .int b; a = 3; .int a BB1B2可以把程序塊看成是不帶參數(shù)和返回值的函數(shù)186.1 局部存儲分配策略main() / begin of B0 /int a = 0;int b = 0; / begin of B1 / int b = 1; / begin of B2 / int a = 2; / end of B2 / / begin of B3 / int b = 3; / end of B3 / end

10、 of B1 / end of B0 /196.1 局部存儲分配策略main() / begin of B0 /int a = 0;int b = 0; / begin of B1 / int b = 1; / begin of B2 / int a = 2; / end of B2 / / begin of B3 / int b = 3; / end of B3 / end of B1 / end of B0 /聲 明 作 用 域 int a = 0; B0 B2 int b = 0; B0 B1 int b = 1; B1 B3 int a = 2;B2int b = 3; B3 206.

11、1 局部存儲分配策略main() / begin of B0 /int a = 0;int b = 0; / begin of B1 / int b = 1; / begin of B2 / int a = 2; / end of B2 / / begin of B3 / int b = 3; / end of B3 / end of B1 / end of B0 /聲 明 作 用 域 int a = 0; B0 B2 int b = 0; B0 B1 int b = 1; B1 B3 int a = 2;B2int b = 3; B3 a0b0b1a2, b3重疊分配存儲單元 216.2 全

12、局存儲分配策略介紹程序運行時所需的各個活動記錄在存儲空間的分配策略描述過程的目標代碼怎樣訪問綁定到局部名字的存儲單元介紹三種分配策略靜態(tài)分配策略堆式分配策略棧式分配策略代 碼靜 態(tài) 數(shù) 據(jù)堆棧226.2 全局存儲分配策略6.2.1 運行時內(nèi)存的劃分代 碼靜 態(tài) 數(shù) 據(jù)堆棧236.2 全局存儲分配策略6.2.2 靜態(tài)分配名字在程序被編譯時綁定到存儲單元,不需要運行時的任何支持。綁定的生存期是程序的整個運行時間??刂圃俅芜M入該過程時,局部變量的值和控制上一次離開時的一樣。每個活動記錄的大小是固定的。過程調(diào)用時保存信息的地址在編譯時也是已知的。246.2 全局存儲分配策略靜態(tài)分配的應用:Fortra

13、n語言被設計成允許靜態(tài)存儲分配C語言程序的外部變量和程序中出現(xiàn)的常量都可以靜態(tài)分配。聲明在函數(shù)外面外部變量聲明在函數(shù)里面靜態(tài)局部變量常量25 像FORTRAN這樣的語言,其程序是段結(jié)構(gòu)的,即由主程序段和若干子程序段組成。 各程序段中定義的名字一般是彼此獨立的,也即各段的數(shù)據(jù)對象名的作用域在各段中,同一個名字在不同的程序段表示不同的存儲單元,不會在不同段間互相引用、賦值。 另外它的每個數(shù)據(jù)名所需的存儲空間大小都是常量(即不許含可變體積的數(shù)據(jù),如可變數(shù)組),且所有數(shù)據(jù)名的性質(zhì)是完全確定的。 這樣,整個程序所需數(shù)據(jù)空間的總量在編譯時完全確定,換句話說,一旦存儲空間的某個位置分配給了某個數(shù)據(jù)名(關聯(lián)起

14、來)之后,在目標程序的整個運行過程中,此位置(地址)就屬于該數(shù)據(jù)名了。 266.2 全局存儲分配策略靜態(tài)分配給語言帶來限制遞歸過程不被允許數(shù)據(jù)對象的長度和它在內(nèi)存中位置,必須是在編譯時可以知道的數(shù)據(jù)結(jié)構(gòu)不能動態(tài)建立276.2 全局存儲分配策略6.2.3 棧式分配棧式分配主要用于管理過程的活動記錄。局部變量的生存期是過程活動的時間??刂七M入該過程時,局部變量綁定到存儲單元,過程活動結(jié)束后,局部變量的空間釋放。286.2 全局存儲分配策略6.2.3 棧式分配活動樹:用樹來描繪控制進入和離開活動的方式srq(2,3)q(2,1)q(3,3)p(2,3) 活動樹的特點每個結(jié)點代表某過程的一個活動根結(jié)點

15、代表主程序的活動結(jié)點a是結(jié)點b的父結(jié)點,當且僅當控制流從a的活動進入b的活動結(jié)點a 處于結(jié)點b 的左邊,當且僅當a的生存期先于b的生存期活動執(zhí)行的順序?深度優(yōu)先搜索296.2 全局存儲分配策略當前活躍著的過程活動可以保存在一個棧中控制棧的內(nèi)容:s, q (2, 3), p(2, 3) srq(2,3)q(2,1)q(3,3)p(2,3)306.2 全局存儲分配策略運行棧:把控制棧中的信息拓廣到包括過程活動所需的所有局部信息(即活動記錄) sa : arrays316.2 全局存儲分配策略運行棧:把控制棧中的信息拓廣到包括過程活動所需的所有局部信息(即活動記錄) si: integerra :

16、arraysr326.2 全局存儲分配策略運行棧:把控制棧中的信息拓廣到包括過程活動所需的所有局部信息(即活動記錄) sk: integerq (2, 3)a : arraysq(2,3)r336.2 全局存儲分配策略運行棧:把控制棧中的信息拓廣到包括過程活動所需的所有局部信息(即活動記錄) sk: integerq (2, 3)a : arrayp(2, 3)k: integersq(2,3)rp(2,3)34/48346.2 全局存儲分配策略運行棧的管理:過程調(diào)用和過程返回都需要執(zhí)行一些代碼來管理活動記錄棧,保存或恢復機器狀態(tài)等過程調(diào)用序列過程調(diào)用時執(zhí)行的分配活動記錄,把信息填入它的域中的

17、代碼過程返回序列過程返回時執(zhí)行的恢復機器狀態(tài),釋放活動記錄,使調(diào)用過程能夠繼續(xù)執(zhí)行的代碼調(diào)用序列和返回序列都分常常分成兩部分,分處于調(diào)用過程和被調(diào)用過程中356.2 全局存儲分配策略即使是同一種語言,過程調(diào)用序列、返回序列和活動記錄中各域的排放次序,也會因?qū)崿F(xiàn)而異設計這些序列和活動記錄的一些原則是把參數(shù)域和可能有的返回值域放在緊靠調(diào)用者活動記錄的地方以活動記錄中間的某個位置作為基地址長度能較早確定的域放在活動記錄的中間一般把臨時數(shù)據(jù)域放在局部數(shù)據(jù)域的后面用同樣的代碼來執(zhí)行各個活動的保存和恢復366.2 全局存儲分配策略調(diào)用者和被調(diào)用者之間的任務劃分被調(diào)用者的責任調(diào)用者的責任調(diào)用者的活動記錄被調(diào)

18、用者的活動記錄過程p調(diào)用過程q局部數(shù)據(jù)臨時數(shù)據(jù)控制鏈訪問鏈和機器狀態(tài)返回值和參數(shù)局部數(shù)據(jù)臨時數(shù)據(jù)返回值和參數(shù) 控制鏈訪問鏈和機器狀態(tài)top_sp base_sp 棧qP376.2 全局存儲分配策略過程p調(diào)用過程q的調(diào)用序列p在棧上留出放返回值的空間,并計算實參,依次放入棧頂,同時改變top_sp的值。p把返回地址存入q的活動記錄中,建立q的訪問鏈q保存寄存器的值和其它機器狀態(tài)信息,將base_sp的值壓棧,并將當前的top_sp作為自己的base_sp 。q根據(jù)局部數(shù)據(jù)域和臨時數(shù)據(jù)域的大小減小top_sp的值,初始化它的局部數(shù)據(jù),并開始執(zhí)行過程體。局部數(shù)據(jù)臨時數(shù)據(jù)控制鏈訪問鏈和機器狀態(tài)返回值和

19、參數(shù)局部數(shù)據(jù)臨時數(shù)據(jù)返回值和參數(shù) 控制鏈訪問鏈和機器狀態(tài)top_sp base_sp 棧qP386.2 全局存儲分配策略過程p調(diào)用過程q的返回序列q把返回值置入鄰近p的活動記錄的地方q增加top_sp的值 q恢復寄存器(包括base_sp)和機器狀態(tài),返回pp根據(jù)參數(shù)個數(shù)與類型和返回值類型調(diào)整top_sp,然后取出返回值39/48局部數(shù)據(jù)臨時數(shù)據(jù)控制鏈訪問鏈和機器狀態(tài)返回值和參數(shù)局部數(shù)據(jù)臨時數(shù)據(jù)返回值和參數(shù) 控制鏈訪問鏈和機器狀態(tài)top_sp base_sp 棧qP396.2 全局存儲分配策略過程的參數(shù)個數(shù)可變的情況函數(shù)返回值改成用寄存器傳遞編譯器產(chǎn)生將這些參數(shù)逆序進棧的代碼被調(diào)用函數(shù)能準確地知道第一個參數(shù)的位置被調(diào)用函數(shù)根據(jù)第一個參數(shù)到棧中取第二、第三個參數(shù)等等局部數(shù)據(jù)臨時數(shù)據(jù)控制鏈訪問鏈和機器狀態(tài)返回值和參數(shù)局部數(shù)據(jù)臨時數(shù)據(jù)返回值和參數(shù) 控制鏈訪問鏈和機器狀態(tài)top_sp base_sp 棧qP406.2 全局存儲分配策略活動記錄的長度在編譯時不能確定的情況局部數(shù)組的大小要等到過程激活時才能確定在活動記錄中為這樣的數(shù)組分別存放數(shù)組指針的單元運行時,這些指針指向分配在棧頂?shù)拇鎯臻g訪問動態(tài)分配的數(shù)組q的數(shù)組q的活動記錄p的數(shù)組

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論