第六章運(yùn)行時(shí)存儲(chǔ)空間的組織和管理ppt課件_第1頁
第六章運(yùn)行時(shí)存儲(chǔ)空間的組織和管理ppt課件_第2頁
第六章運(yùn)行時(shí)存儲(chǔ)空間的組織和管理ppt課件_第3頁
第六章運(yùn)行時(shí)存儲(chǔ)空間的組織和管理ppt課件_第4頁
第六章運(yùn)行時(shí)存儲(chǔ)空間的組織和管理ppt課件_第5頁
已閱讀5頁,還剩92頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第六章 運(yùn)轉(zhuǎn)時(shí)存儲(chǔ)空間的 組織和管理 編譯程序在完成詞法、語法和語義分析后,在生成目的代碼之前,需求把程序的靜態(tài)正文和實(shí)現(xiàn)這個(gè)程序的運(yùn)轉(zhuǎn)時(shí)的活動(dòng)聯(lián)絡(luò)起來弄清楚未來在代碼運(yùn)轉(zhuǎn)時(shí)辰,源代碼中的各種變量、常量等用戶定義的量是如何存放的,如何去訪問它們。 在程序的執(zhí)行過程中,程序中數(shù)據(jù)的存取是經(jīng)過與之對應(yīng)的存儲(chǔ)單元來進(jìn)展的。在程序文語中,程序運(yùn)用的存儲(chǔ)單元都是由標(biāo)識(shí)符來表示的。它們對應(yīng)的內(nèi)存地址都是由編譯程序在編譯時(shí)或由其生成的目的程序運(yùn)轉(zhuǎn)時(shí)進(jìn)展分配。所以對于編譯程序來說存儲(chǔ)組織與管理是一個(gè)復(fù)雜而又非常重要的問題。本章內(nèi)容: 討論一個(gè)活動(dòng)記錄中的數(shù)據(jù)安排程序執(zhí)行過程中,一切活動(dòng)記錄的組織方式 存儲(chǔ)器的

2、組織與存儲(chǔ)分配的戰(zhàn)略非部分稱號(hào)的訪問參數(shù)傳送 6.1 部分存儲(chǔ)分配戰(zhàn)略過程的每一次運(yùn)轉(zhuǎn)稱為一次活動(dòng)activation?;顒?dòng)是一個(gè)動(dòng)態(tài)的概念,它有有限的生存期?;顒?dòng)的生存期是指從進(jìn)入活動(dòng)的第一條指令執(zhí)行到分開此活動(dòng)前的最后一條指令執(zhí)行的這段時(shí)間,其中包括調(diào)用其它過程時(shí)其它活動(dòng)的生存期。6.1.2 名字的作用域和綁定名字的作用域一個(gè)聲明起作用的程序部分稱為該聲明的作用域。即使一個(gè)名字在程序中只聲明一次,該名字在程序運(yùn)轉(zhuǎn)時(shí)也能夠表示不同的數(shù)據(jù)對象。名字的綁定 運(yùn)轉(zhuǎn)時(shí)為名字X分配存儲(chǔ)空間S,這一過程稱為綁定binding。 換句話說,綁定是名字X與存儲(chǔ)空間S的結(jié)合。X是一個(gè)對象: 既可以是數(shù)據(jù)對象,

3、如變量,與之結(jié)合的是一個(gè)存儲(chǔ)單元; 也可以是操作對象,如過程,與之結(jié)合的是可執(zhí)行的代碼。我們的討論僅限于X是一個(gè)數(shù)據(jù)對象。 名字的聲明與名字的綁定均需求有對應(yīng)的存儲(chǔ)空間,而存儲(chǔ)空間的對應(yīng)方式,一個(gè)是靜態(tài)的,一個(gè)是動(dòng)態(tài)的。 聲明時(shí)關(guān)懷的是聲明的作用域,即當(dāng)一個(gè)名字被援用時(shí),在不同的作用域中與該名字的不同聲明結(jié)合; 綁定時(shí)關(guān)懷的是綁定的生存期,即當(dāng)一個(gè)名字在運(yùn)轉(zhuǎn)時(shí)被實(shí)踐分配的存儲(chǔ)單元,名字與存儲(chǔ)單元結(jié)合的這段時(shí)間被稱為綁定的生存期,顯然此生存期應(yīng)該和名字的生存期一致。 靜 態(tài)動(dòng) 態(tài)過程的定義過程的活動(dòng)名字的聲明名字的綁定聲明的作用域綁定的生存期符號(hào)表活動(dòng)記錄 靜態(tài)與動(dòng)態(tài)變量與值的兩步映射 環(huán)境改動(dòng)

4、存儲(chǔ),形狀改動(dòng)值。例5.3 假設(shè)有變量聲明x: real和常量聲明const pi=3.14,那么賦值句中變量和常量的映射關(guān)系: 常量沒有左值存儲(chǔ)空間,所以不能被賦值。6.1.3 活動(dòng)記錄 為了管理過程在一次執(zhí)行中所需求的信息,運(yùn)用一個(gè)延續(xù)的存儲(chǔ)塊,我們把這樣的一個(gè)延續(xù)存儲(chǔ)塊稱為活動(dòng)紀(jì)錄。返 回 值臨 時(shí) 數(shù) 據(jù)參 數(shù)控 制 鏈訪 問 鏈機(jī) 器 狀 態(tài)局 部 數(shù) 據(jù)前往值真實(shí)參數(shù)控制鏈訪問鏈保管機(jī)器形狀部分?jǐn)?shù)據(jù)暫時(shí)變量控制鏈:指向調(diào)用過程活動(dòng)的活動(dòng)記錄。訪問鏈:指向本活動(dòng)要訪問的非部分?jǐn)?shù)據(jù)所在的活動(dòng)記錄。保管機(jī)器形狀:調(diào)用過程活動(dòng)在調(diào)用點(diǎn)的機(jī)器形狀,包括計(jì)數(shù)器,各種存放器的值。部分?jǐn)?shù)據(jù):過程中

5、定義的 部分量。暫時(shí)變量:編譯產(chǎn)生。6.1.4 部分?jǐn)?shù)據(jù)的安排字節(jié)是可編址內(nèi)存的最小單位。6.1.4 部分?jǐn)?shù)據(jù)的安排字節(jié)是可編址內(nèi)存的最小單位。變量所需的存儲(chǔ)空間可以根據(jù)其類型而靜態(tài)確定。6.1.4 部分?jǐn)?shù)據(jù)的安排字節(jié)是可編址內(nèi)存的最小單位。變量所需的存儲(chǔ)空間可以根據(jù)其類型而靜態(tài)確定。一個(gè)過程所聲明的部分變量,按這些變量聲明時(shí)出現(xiàn)的次序,在部分?jǐn)?shù)據(jù)域中依次分配空間。6.1.4 部分?jǐn)?shù)據(jù)的安排字節(jié)是可編址內(nèi)存的最小單位。變量所需的存儲(chǔ)空間可以根據(jù)其類型而靜態(tài)確定。一個(gè)過程所聲明的部分變量,按這些變量聲明時(shí)出現(xiàn)的次序,在部分?jǐn)?shù)據(jù)域中依次分配空間。 部分?jǐn)?shù)據(jù)的地址可以用相對于某個(gè)位置的地址來表示。6

6、.1.4 部分?jǐn)?shù)據(jù)的安排字節(jié)是可編址內(nèi)存的最小單位。變量所需的存儲(chǔ)空間可以根據(jù)其類型而靜態(tài)確定。一個(gè)過程所聲明的部分變量,按這些變量聲明時(shí)出現(xiàn)的次序,在部分?jǐn)?shù)據(jù)域中依次分配空間。 部分?jǐn)?shù)據(jù)的地址可以用相對于某個(gè)位置的地址來表示。數(shù)據(jù)對象的存儲(chǔ)安排還有一個(gè)對齊問題。6.1.5 程序塊本身含有部分變量聲明的語句可以嵌套最接近的嵌套作用域規(guī)那么并列程序塊不會(huì)同時(shí)活潑并列程序塊的變量可以重疊分配main() / begin of B0 /int a = 0;int b = 0; / begin of B1 / int b = 1; / begin of B2 / int a = 2; / end of

7、 B2 / / begin of B3 / int b = 3; / end of B3 / end of B1 / end of B0 /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;

8、B1 B3 int a = 2;B2int b = 3; B3 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 a0b0b1

9、a2, b3重疊分配存儲(chǔ)單元 6.2 全局存儲(chǔ)分配戰(zhàn)略引見程序運(yùn)轉(zhuǎn)時(shí)所需的各個(gè)活動(dòng)記錄在存儲(chǔ)空間的分配戰(zhàn)略6.2 全局存儲(chǔ)分配戰(zhàn)略引見程序運(yùn)轉(zhuǎn)時(shí)所需的各個(gè)活動(dòng)記錄在存儲(chǔ)空間的分配戰(zhàn)略描畫過程的目的代碼怎樣訪問綁定到部分名字的存儲(chǔ)單元6.2 全局存儲(chǔ)分配戰(zhàn)略引見程序運(yùn)轉(zhuǎn)時(shí)所需的各個(gè)活動(dòng)記錄在存儲(chǔ)空間的分配戰(zhàn)略描畫過程的目的代碼怎樣訪問綁定到部分名字的存儲(chǔ)單元引見三種分配戰(zhàn)略靜態(tài)分配戰(zhàn)略6.2 全局存儲(chǔ)分配戰(zhàn)略引見程序運(yùn)轉(zhuǎn)時(shí)所需的各個(gè)活動(dòng)記錄在存儲(chǔ)空間的分配戰(zhàn)略描畫過程的目的代碼怎樣訪問綁定到部分名字的存儲(chǔ)單元引見三種分配戰(zhàn)略靜態(tài)分配戰(zhàn)略棧式分配戰(zhàn)略6.2 全局存儲(chǔ)分配戰(zhàn)略引見程序運(yùn)轉(zhuǎn)時(shí)所需的各個(gè)

10、活動(dòng)記錄在存儲(chǔ)空間的分配戰(zhàn)略描畫過程的目的代碼怎樣訪問綁定到部分名字的存儲(chǔ)單元引見三種分配戰(zhàn)略靜態(tài)分配戰(zhàn)略棧式分配戰(zhàn)略堆式分配戰(zhàn)略 靜態(tài)分配戰(zhàn)略在編譯是對一切對象分配固定的存儲(chǔ)單元。且在運(yùn)轉(zhuǎn)是堅(jiān)持不變。 棧式動(dòng)態(tài)分配戰(zhàn)略在運(yùn)轉(zhuǎn)時(shí)把存儲(chǔ)器作為一個(gè)棧進(jìn)展管理,運(yùn)轉(zhuǎn)時(shí),每當(dāng)調(diào)用一個(gè)過程,它所需求的存儲(chǔ)空間就動(dòng)態(tài)的分配于棧頂,一旦退出,它所占空間就予以釋放。 堆式動(dòng)態(tài)存儲(chǔ)戰(zhàn)略在運(yùn)轉(zhuǎn)時(shí)把存儲(chǔ)器組織成堆構(gòu)造,以便用戶關(guān)于存儲(chǔ)空間的懇求與歸還回收,凡懇求者分給一塊,凡釋放者退回給堆。6.2.1 運(yùn)轉(zhuǎn)時(shí)內(nèi)存的劃分代 碼靜 態(tài) 數(shù) 據(jù)棧堆6.2.2 靜態(tài)存儲(chǔ)分配 假設(shè)在編譯時(shí)就可以確定一個(gè)程序在運(yùn)轉(zhuǎn)時(shí)所需求的存

11、儲(chǔ)空間的大小,那么在編譯時(shí)就可以安排好目的程序運(yùn)轉(zhuǎn)時(shí)的全部數(shù)據(jù)空間,并能確定每個(gè)數(shù)據(jù)項(xiàng)的單元地址。存儲(chǔ)空間的這種分配方法叫做靜態(tài)分配。 特點(diǎn):綁定是1對1的映射。名字在程序編譯時(shí)與存儲(chǔ)空間結(jié)合,每次過程活動(dòng)時(shí),它的名字映射到同一存儲(chǔ)單元。程序運(yùn)轉(zhuǎn)時(shí)不再有對存儲(chǔ)空間的分配。 靜態(tài)分配的限制: 數(shù)據(jù)對象的大小和它在內(nèi)存中位置的限制必需在編譯時(shí)確定,如數(shù)組的大小不能是動(dòng)態(tài)的; 不允許程序遞歸,由于一個(gè)過程的一切活動(dòng)運(yùn)用同樣的名字綁定,即綁定是一對一的; 不能動(dòng)態(tài)生成或吊銷數(shù)據(jù),由于運(yùn)轉(zhuǎn)時(shí)沒有存儲(chǔ)分配機(jī)制。完全采用靜態(tài)分配的言語:早期的FORTRAN。允許分別編譯的數(shù)據(jù)定義模塊如全程援用的數(shù)據(jù),也可以

12、采用靜態(tài)分配,由于它們普通在整個(gè)程序運(yùn)轉(zhuǎn)的期間是被共享的。 6.2.3 棧式存儲(chǔ)分配 存儲(chǔ)空間被組織成棧,活動(dòng)記錄的推入和彈出分別對應(yīng)于活動(dòng)的開場和終了。 與靜態(tài)分配不同的是,在每次活動(dòng)中把部分名字和新的存儲(chǔ)單元綁定,在活動(dòng)終了時(shí),活動(dòng)記錄從棧中彈出,因此部分名字的存儲(chǔ)空間也隨之消逝。6.2.3 棧式分配 活動(dòng)樹:用樹來描畫控制進(jìn)入和分開活動(dòng)的方式sq(1,9)rp(1,9)q(1,3)q(1,0)p(1,3)q(2,3)q(2,1)q(3,3)p(2,3)q(5,9)q(5,5)p(5,9)q(7,9)q(7,7)q(9,9)p(7,9)活動(dòng)樹的特點(diǎn):每個(gè)結(jié)點(diǎn)代表某過程的一個(gè)活動(dòng)根結(jié)點(diǎn)代表主

13、程序的活動(dòng)結(jié)點(diǎn)a是結(jié)點(diǎn)b的父結(jié)點(diǎn),當(dāng)且僅當(dāng)控制流從a的活動(dòng)進(jìn)入b的活動(dòng)結(jié)點(diǎn)a處于結(jié)點(diǎn)b的左邊,當(dāng)且僅當(dāng)a的生存期先于b的生存期活動(dòng)樹上各節(jié)點(diǎn)之間具有下述關(guān)系:同一層次的活動(dòng)生存期不交;任一時(shí)辰,處在生存期的活動(dòng)構(gòu)成一條從根到某節(jié) 點(diǎn)的途徑;途徑上各節(jié)點(diǎn)生存期是嵌套的后進(jìn)先出。 當(dāng)前活潑著的過程活動(dòng)可以保管在一個(gè)棧中控制棧的內(nèi)容:s, q (1, 9), q (1, 3), q (2, 3) sq(1,9)rp(1,9)q(1,3)q(1,0)p(1,3)q(2,3)q(2,1)q(3,3)p(2,3)q(5,9)q(5,5)p(5,9)q(7,9)q(7,7)q(9,9)p(7,9)運(yùn)轉(zhuǎn)棧:把

14、控制棧中的信息拓廣到包括過程活動(dòng)所需的一切部分信息即活動(dòng)記錄 運(yùn)轉(zhuǎn)棧:把控制棧中的信息拓廣到包括過程活動(dòng)所需的一切部分信息即活動(dòng)記錄 sa : arrays運(yùn)轉(zhuǎn)棧:把控制棧中的信息拓廣到包括過程活動(dòng)所需的一切部分信息即活動(dòng)記錄 si: integerra : arraysr運(yùn)轉(zhuǎn)棧:把控制棧中的信息拓廣到包括過程活動(dòng)所需的一切部分信息即活動(dòng)記錄 sk: integerq (1, 9)a : arraysq(1,9)r運(yùn)轉(zhuǎn)棧:把控制棧中的信息拓廣到包括過程活動(dòng)所需的一切部分信息即活動(dòng)記錄 sk: integerq (1, 9)a : arrayq (1, 3)k: integersq(1,9)rp

15、(1,9)q(1,3)q(1,0)p(1,3)過程調(diào)用和過程前往都需求執(zhí)行一些代碼來管理活動(dòng)記錄棧,保管或恢復(fù)機(jī)器形狀等過程調(diào)用和過程前往都需求執(zhí)行一些代碼來管理活動(dòng)記錄棧,保管或恢復(fù)機(jī)器形狀等過程調(diào)用序列過程調(diào)用時(shí)執(zhí)行的分配活動(dòng)記錄,把信息填入它的域中的代碼過程調(diào)用和過程前往都需求執(zhí)行一些代碼來管理活動(dòng)記錄棧,保管或恢復(fù)機(jī)器形狀等過程調(diào)用序列過程調(diào)用時(shí)執(zhí)行的分配活動(dòng)記錄,把信息填入它的域中的代碼過程前往序列過程前往時(shí)執(zhí)行的恢復(fù)機(jī)器形狀,釋放活動(dòng)記錄,使調(diào)用過程可以繼續(xù)執(zhí)行的代碼過程調(diào)用和過程前往都需求執(zhí)行一些代碼來管理活動(dòng)記錄棧,保管或恢復(fù)機(jī)器形狀等過程調(diào)用序列過程調(diào)用時(shí)執(zhí)行的分配活動(dòng)記錄,

16、把信息填入它的域中的代碼過程前往序列過程前往時(shí)執(zhí)行的恢復(fù)機(jī)器形狀,釋放活動(dòng)記錄,使調(diào)用過程可以繼續(xù)執(zhí)行的代碼調(diào)用序列和前往序列經(jīng)常都分成兩部分,分處于調(diào)用過程和被調(diào)用過程中調(diào)用者和被調(diào)用者之間的義務(wù)劃分前往值和參數(shù)控制鏈訪問鏈和機(jī)器形狀部分?jǐn)?shù)據(jù)暫時(shí)數(shù)據(jù)前往值和參數(shù)部分?jǐn)?shù)據(jù)暫時(shí)數(shù)據(jù) 控制鏈訪問鏈和機(jī)器形狀top_sp base_sp 被調(diào)用者的責(zé)任調(diào)用者的責(zé)任被調(diào)用者的活動(dòng)記錄調(diào)用者的活動(dòng)記錄棧過程p調(diào)用過程q的調(diào)用序列p計(jì)算實(shí)參,依次放入棧頂,并在棧頂留出放前往值的空間。top_sp的值在此過程中被改動(dòng)p把前往地址和當(dāng)前base_sp的值存入q的活動(dòng)記錄中,建立q的訪問鏈,添加base_sp的

17、值q保管存放器的值和其它機(jī)器形狀信息q根據(jù)部分?jǐn)?shù)據(jù)域和暫時(shí)數(shù)據(jù)域的大小添加top_sp的值,初始化它的部分?jǐn)?shù)據(jù),并開場執(zhí)行過程體調(diào)用者和被調(diào)用者之間的義務(wù)劃分前往值和參數(shù)控制鏈訪問鏈和機(jī)器形狀部分?jǐn)?shù)據(jù)暫時(shí)數(shù)據(jù)前往值和參數(shù)部分?jǐn)?shù)據(jù)暫時(shí)數(shù)據(jù) 控制鏈訪問鏈和機(jī)器形狀top_sp base_sp 被調(diào)用者的責(zé)任調(diào)用者的責(zé)任被調(diào)用者的活動(dòng)記錄調(diào)用者的活動(dòng)記錄棧過程p調(diào)用過程q的前往序列q把前往值置入臨近p的活動(dòng)記錄的地方q對應(yīng)調(diào)用序列的步驟4,減小top_sp的值 q恢復(fù)存放器包括base_sp和機(jī)器形狀,前往pp根據(jù)參數(shù)個(gè)數(shù)與類型和前往值類型調(diào)整top_sp,然后取出前往值調(diào)用者和被調(diào)用者之間的義務(wù)劃

18、分前往值和參數(shù)控制鏈訪問鏈和機(jī)器形狀部分?jǐn)?shù)據(jù)暫時(shí)數(shù)據(jù)前往值和參數(shù)部分?jǐn)?shù)據(jù)暫時(shí)數(shù)據(jù) 控制鏈訪問鏈和機(jī)器形狀top_sp base_sp 被調(diào)用者的責(zé)任調(diào)用者的責(zé)任被調(diào)用者的活動(dòng)記錄調(diào)用者的活動(dòng)記錄棧過程的參數(shù)個(gè)數(shù)可變的情況函數(shù)前往值改成用存放器傳送編譯器產(chǎn)生將這些參數(shù)逆序進(jìn)棧的代碼被調(diào)用函數(shù)能準(zhǔn)確地知道第一個(gè)參數(shù)的位置被調(diào)用函數(shù)根據(jù)第一個(gè)參數(shù)到棧中取第二、第三個(gè)參數(shù)等等調(diào)用者和被調(diào)用者之間的義務(wù)劃分前往值和參數(shù)控制鏈訪問鏈和機(jī)器形狀部分?jǐn)?shù)據(jù)暫時(shí)數(shù)據(jù)前往值和參數(shù)部分?jǐn)?shù)據(jù)暫時(shí)數(shù)據(jù) 控制鏈訪問鏈和機(jī)器形狀top_sp base_sp 被調(diào)用者的責(zé)任調(diào)用者的責(zé)任被調(diào)用者的活動(dòng)記錄調(diào)用者的活動(dòng)記錄?;顒?dòng)記

19、錄的長度在編譯時(shí)不能確定的情況部分?jǐn)?shù)組的大小要等到過程激活時(shí)才干確定在活動(dòng)記錄中為這樣的數(shù)組分別存放數(shù)組指針的單元運(yùn)轉(zhuǎn)時(shí),這些指針指向分配在棧頂?shù)拇鎯?chǔ)空間訪問動(dòng)態(tài)分配的數(shù)組q的數(shù)組q的活動(dòng)記錄p的數(shù)組控制鏈top_sp base_sp p的活動(dòng)記錄數(shù)組A的指針數(shù)組B的指針數(shù)組A數(shù)組B控制鏈懸空援用:援用某個(gè)已被釋放的存儲(chǔ)單元懸空援用:援用某個(gè)已被釋放的存儲(chǔ)單元main()|int dangle ( ) |int q;|int j = 20; q = dangle ( );|return &j;|6.3.3 堆式存儲(chǔ)分配 1部分名的值在活動(dòng)終了時(shí)必需被保管。 2. 被調(diào)用者的活動(dòng)生存期超越調(diào)用者

20、。 用活動(dòng)樹不可以正確描畫這種言語的過 程之間的控制流。 new(p); dispose(p);6.3 非部分名字的訪問本節(jié)引見無過程嵌套的靜態(tài)作用域C言語有過程嵌套的靜態(tài)作用域Pascal言語動(dòng)態(tài)作用域Lisp言語6.3.1 無過程嵌套的靜態(tài)作用域過程體中的非部分援用可以直接運(yùn)用靜態(tài)確定的地址部分變量在棧頂?shù)幕顒?dòng)記錄中,可以經(jīng)過base_sp指針來訪問無須深化棧中取數(shù)據(jù),無須訪問鏈過程可以作為參數(shù)來傳送,也可以作為結(jié)果來前往6.3.2 有過程嵌套的靜態(tài)作用域過程嵌套深度sort1readarray2exchange2quicksort2partition36.3.2 有過程嵌套的靜態(tài)作用域過

21、程嵌套深度sort1readarray2exchange2quicksort2partition3變量的嵌套深度:它的聲明所在過程的嵌套深度作為該名字的嵌套深度6.3 非部分名字的訪問尋覓非部分名字存儲(chǔ)單元的訪問鏈 sa, xq (1, 9)k, v訪問鏈sa, xq (1, 3)k, v訪問鏈q (1, 9)k, v訪問鏈sa, xq (1, 3)k, v訪問鏈q (1, 9)k, v訪問鏈p (1, 3)i, j訪問鏈e (1, 3)訪問鏈sa, xq (1, 3)k, v訪問鏈q (1, 9)k, v訪問鏈p (1, 3)i, j訪問鏈6.3 非部分名字的訪問假定過程p的嵌套深度為np,

22、它援用嵌套深度為na的變量a,na np。如何訪問a的存儲(chǔ)單元?sort1readarray2exchange2quicksort2partition36.3 非部分名字的訪問假定過程p的嵌套深度為np,它援用嵌套深度為na的變量a,na np。如何訪問a的存儲(chǔ)單元?從棧頂?shù)幕顒?dòng)記錄開場,追蹤訪問鏈np na次。6.3 非部分名字的訪問假定過程p的嵌套深度為np,它援用嵌套深度為na的變量a,na np。如何訪問a的存儲(chǔ)單元?從棧頂?shù)幕顒?dòng)記錄開場,追蹤訪問鏈np na次。到達(dá)a的聲明所在過程的活動(dòng)記錄。6.3 非部分名字的訪問假定過程p的嵌套深度為np,它援用嵌套深度為na的變量a,na np

23、。如何訪問a的存儲(chǔ)單元?從棧頂?shù)幕顒?dòng)記錄開場,追蹤訪問鏈np na次。到達(dá)a的聲明所在過程的活動(dòng)記錄。訪問鏈的追蹤用間接操作就可完成。6.3 非部分名字的訪問訪問非部分名字的存儲(chǔ)單元 sa, xq (1, 9)k, v訪問鏈sa, xq (1, 3)k, v訪問鏈q (1, 9)k, v訪問鏈sa, xq (1, 3)k, v訪問鏈q (1, 9)k, v訪問鏈p (1, 3)i, j訪問鏈e (1, 3)訪問鏈sa, xq (1, 3)k, v訪問鏈q (1, 9)k, v訪問鏈p (1, 3)i, j訪問鏈sort readarray exchange quicksort partitio

24、n6.3 非部分名字的訪問過程p對變量a訪問時(shí),a的地址由下面的二元組表示:np na,a在活動(dòng)記錄中的偏移6.3 非部分名字的訪問建立訪問鏈假定嵌套深度為np的過程p調(diào)用嵌套深度為nx的過程xnp nx的情況sort1readarray2exchange2quicksort2partition36.3 非部分名字的訪問建立訪問鏈假定嵌套深度為np的過程p調(diào)用嵌套深度為nx的過程xnp nx的情況x一定就聲明在p中6.3 非部分名字的訪問建立訪問鏈假定嵌套深度為np的過程p調(diào)用嵌套深度為nx的過程xnp nx的情況x一定就聲明在p中被調(diào)用過程的訪問鏈必需指向調(diào)用過程的活動(dòng)記錄的訪問鏈6.3 非

25、部分名字的訪問建立訪問鏈sa, xq (1, 9)k, v訪問鏈sa, xq (1, 3)k, v訪問鏈q (1, 9)k, v訪問鏈sa, xq (1, 3)k, v訪問鏈q (1, 9)k, v訪問鏈p (1, 3)i, j訪問鏈e (1, 3)訪問鏈sa, xq (1, 3)k, v訪問鏈q (1, 9)k, v訪問鏈p (1, 3)i, j訪問鏈sort readarray exchange quicksort partition6.3 非部分名字的訪問建立訪問鏈假定嵌套深度為np的過程p調(diào)用嵌套深度為nx的過程xnp nx的情況sort1readarray2exchange2quic

26、ksort2partition36.3 非部分名字的訪問建立訪問鏈假定嵌套深度為np的過程p調(diào)用嵌套深度為nx的過程xnp nx的情況p和x的嵌套深度分別為1,2,nx 1的外圍過程一定一樣6.3 非部分名字的訪問建立訪問鏈假定嵌套深度為np的過程p調(diào)用嵌套深度為nx的過程xnp nx的情況p和x的嵌套深度分別為1,2,nx 1的外圍過程一定一樣追蹤訪問鏈np nx + 1次,到達(dá)了靜態(tài)包圍x和p的且離它們最近的那個(gè)過程的最新活動(dòng)記錄6.3 非部分名字的訪問建立訪問鏈假定嵌套深度為np的過程p調(diào)用嵌套深度為nx的過程xnp nx的情況p和x的嵌套深度分別為1,2,nx 1的外圍過程一定一樣追蹤

27、訪問鏈np nx + 1次,到達(dá)了靜態(tài)包圍x和p的且離它們最近的那個(gè)過程的最新活動(dòng)記錄所到達(dá)的訪問鏈就是x的活動(dòng)記錄中的訪問鏈應(yīng)該指向的那個(gè)訪問鏈6.3 非部分名字的訪問建立訪問鏈sa, xq (1, 9)k, v訪問鏈sa, xq (1, 3)k, v訪問鏈q (1, 9)k, v訪問鏈sa, xq (1, 3)k, v訪問鏈q (1, 9)k, v訪問鏈p (1, 3)i, j訪問鏈e (1, 3)訪問鏈sa, xq (1, 3)k, v訪問鏈q (1, 9)k, v訪問鏈p (1, 3)i, j訪問鏈sort readarray exchange quicksort partition6

28、.3 非部分名字的訪問program param(input, output);過程作為參數(shù)procedure b(function h(n: integer): integer); begin writeln(h(2) end b;procedure c; var m: integer; function f(n: integer): integer; begin f := m+n end f; begin m := 0; b(f) end c; begin cend.6.3 非部分名字的訪問program param(input, output);過程作為參數(shù)procedure b(fun

29、ction h(n: integer): integer); begin writeln(h(2) end b;procedure c; var m: integer; function f(n: integer): integer; begin f := m+n end f; begin m := 0; b(f) end c; begin cend.過程作為參數(shù)傳送時(shí),怎樣在該過程被激活時(shí)建立它的訪問鏈。6.3 非部分名字的訪問program param(input, output);過程作為參數(shù)procedure b(function h(n: integer): integer); be

30、gin writeln(h(2) end b;procedure c; var m: integer; function f(n: integer): integer; begin f := m+n end f; begin m := 0; b(f) end c; begin cend.過程作為參數(shù)傳送時(shí),怎樣在該過程被激活時(shí)建立它的訪問鏈 從b的訪問鏈難以建立f的訪問鏈6.3 非部分名字的訪問program param(input, output);過程作為參數(shù)procedure b(function h( begin writeln(h(2) end ;procedure c; var m

31、: integer; function f(n: integer) begin f := m+n end f; begin m := 0; b(f) end c; begin cend.訪 問 鏈訪 問 鏈paramcmb 6.3 非部分名字的訪問program ret (input, output);過程作為前往值 var f: function (integer): integer;function a: function (integer): integer; var m: integer; function addm (n: integer): integer; begin retur

32、n m+n end; begin m:= 0; return addm end; procedure b (g: function (integer): integer); begin writeln ( g(2) end; begin f := a; b(f) end.6.3 非部分名字的訪問program ret (input, output);過程作為前往值 var f: function (integer): integer;function a: function (integer): integer; var m: integer; function addm (n: intege

33、r): integer; begin return m+n end; begin m:= 0; return addm end; procedure b (g: function (integer): integer); begin writeln ( g(2) end; begin f := a; b(f) end.retabaddm6.3 非部分名字的訪問C言語的函數(shù)聲明不能嵌套,函數(shù)不論在什么情況下激活,要訪問的數(shù)據(jù)分成兩種情況:非靜態(tài)部分變量包括方式參數(shù),它們分配在活動(dòng)記錄棧頂?shù)哪莻€(gè)活動(dòng)記錄中外部變量包括定義在其它源文件中的外部變量和靜態(tài)的部分變量,它們都分配在靜態(tài)數(shù)據(jù)區(qū) 6.3 非部

34、分名字的訪問6.3.3 動(dòng)態(tài)作用域被調(diào)用過程的非部分名字a和它在調(diào)用過程中援用的是同樣的存儲(chǔ)單元。6.3 非部分名字的訪問6.3.3 動(dòng)態(tài)作用域被調(diào)用過程的非部分名字a和它在調(diào)用過程中援用的是同樣的存儲(chǔ)單元。新的綁定僅為被調(diào)用過程的部分名字建立,這些名字在被調(diào)用過程的活動(dòng)記錄中占用的存儲(chǔ)單元。6.3 非部分名字的訪問program dynamic(input, output); var r: real; procedure show; begin write(r: 5: 3) end; procedure small; var r: real; begin r := 0.125; show e

35、nd; begin r := 0.25; show; small; writeln; show; small; writeln end.6.3 非部分名字的訪問program dynamic(input, output); var r: real; procedure show; begin write(r: 5: 3) end; procedure small; var r: real; begin r := 0.125; show end; begin r := 0.25; show; small; writeln; show; small; writeln end.dynamicshow

36、smallsmallshowshowshow6.3 非部分名字的訪問program dynamic(input, output); var r: real; procedure show; begin write(r: 5: 3) end; procedure small; var r: real; begin r := 0.125; show end; begin靜態(tài)作用域 r := 0.25;0.2500.250 show; small; writeln;0.2500.250 show; small; writeln end.dynamicshowsmallsmallshowshowsho

37、w6.3 非部分名字的訪問program dynamic(input, output); var r: real; procedure show; begin write(r: 5: 3) end; procedure small; var r: real; begin r := 0.125; show end; begin動(dòng)態(tài)作用域 r := 0.25;0.250 0.125 show; small; writeln;0.250 0.125 show; small; writeln end.dynamicshowsmallsmallshowshowshow6.3 非部分名字的訪問實(shí)現(xiàn)動(dòng)態(tài)作用域的方法深訪問用控制鏈搜索運(yùn)轉(zhuǎn)棧,尋覓包含該非部分名字的第一個(gè)活動(dòng)記錄淺訪問為每個(gè)

溫馨提示

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

評論

0/150

提交評論