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

下載本文檔

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

文檔簡(jiǎn)介

1、運(yùn)行時(shí)存儲(chǔ)空間的組織和管理運(yùn)行時(shí)存儲(chǔ)空間的組織和管理教材教材第六章第六章 運(yùn)行時(shí)存儲(chǔ)空間的組織和管理運(yùn)行時(shí)存儲(chǔ)空間的組織和管理 影響存儲(chǔ)分配策略的語言特征影響存儲(chǔ)分配策略的語言特征 過程能否遞歸過程能否遞歸 過程調(diào)用的參數(shù)傳遞方式過程調(diào)用的參數(shù)傳遞方式 過程能否作為參數(shù)被傳遞過程能否作為參數(shù)被傳遞 過程能否作為結(jié)果值傳遞過程能否作為結(jié)果值傳遞 存儲(chǔ)塊能否在程序控制下動(dòng)態(tài)地分配存儲(chǔ)塊能否在程序控制下動(dòng)態(tài)地分配 存儲(chǔ)塊是否必須顯式地釋放存儲(chǔ)塊是否必須顯式地釋放6.1 局部存儲(chǔ)分配局部存儲(chǔ)分配6.1.1 過程過程語言概念:語言概念:過程定義、過程定義、過程過程調(diào)用、形式參數(shù)、實(shí)在參調(diào)用、形式參數(shù)、實(shí)

2、在參數(shù)、數(shù)、活動(dòng)的活動(dòng)的生存期生存期6.1 局部存儲(chǔ)分配局部存儲(chǔ)分配6.1.2 名字的作用域和綁定名字的作用域和綁定1、名字的作用域、名字的作用域 一個(gè)聲明起作用的程序部分稱為該聲明的一個(gè)聲明起作用的程序部分稱為該聲明的作作用域用域 即使一個(gè)名字在程序中只聲明一次,該名字即使一個(gè)名字在程序中只聲明一次,該名字在程序運(yùn)行時(shí)也可能表示不同的數(shù)據(jù)對(duì)象在程序運(yùn)行時(shí)也可能表示不同的數(shù)據(jù)對(duì)象6.1 局部存儲(chǔ)分配局部存儲(chǔ)分配2、環(huán)境和狀態(tài)、環(huán)境和狀態(tài) 環(huán)境把名字映射到左值,而狀態(tài)把左值映射環(huán)境把名字映射到左值,而狀態(tài)把左值映射到右值(即到右值(即名字到值有兩步映射名字到值有兩步映射) 賦值改變狀態(tài),但不改變

3、環(huán)境賦值改變狀態(tài),但不改變環(huán)境 過程調(diào)用改變環(huán)境過程調(diào)用改變環(huán)境 如果環(huán)境將名字如果環(huán)境將名字x映射到存儲(chǔ)單元映射到存儲(chǔ)單元s,則說則說x被被綁定綁定到到s名字名字存儲(chǔ)單元存儲(chǔ)單元狀態(tài)狀態(tài)值值環(huán)境環(huán)境6.1 局部存儲(chǔ)分配局部存儲(chǔ)分配3、靜態(tài)概念和動(dòng)態(tài)概念的對(duì)應(yīng)、靜態(tài)概念和動(dòng)態(tài)概念的對(duì)應(yīng)靜靜 態(tài)態(tài) 概概 念念 動(dòng)動(dòng) 態(tài)態(tài) 對(duì)對(duì) 應(yīng)應(yīng) 過程的定義過程的定義 過程的活動(dòng)過程的活動(dòng) 6.1 局部存儲(chǔ)分配局部存儲(chǔ)分配3、靜態(tài)概念和動(dòng)態(tài)概念的對(duì)應(yīng)、靜態(tài)概念和動(dòng)態(tài)概念的對(duì)應(yīng)靜靜 態(tài)態(tài) 概概 念念 動(dòng)動(dòng) 態(tài)態(tài) 對(duì)對(duì) 應(yīng)應(yīng) 過程的定義過程的定義 過程的活動(dòng)過程的活動(dòng) 名字的聲明名字的聲明 名字的綁定名字的綁定

4、6.1 局部存儲(chǔ)分配局部存儲(chǔ)分配3、靜態(tài)概念和動(dòng)態(tài)概念的對(duì)應(yīng)、靜態(tài)概念和動(dòng)態(tài)概念的對(duì)應(yīng)靜靜 態(tài)態(tài) 概概 念念 動(dòng)動(dòng) 態(tài)態(tài) 對(duì)對(duì) 應(yīng)應(yīng) 過程的定義過程的定義 過程的活動(dòng)過程的活動(dòng) 名字的聲明名字的聲明 名字的綁定名字的綁定 聲明的作用域聲明的作用域 綁定的生存期綁定的生存期 6.1 局部存儲(chǔ)分配局部存儲(chǔ)分配6.1.3 活動(dòng)記錄活動(dòng)記錄活動(dòng)記錄的常見布局活動(dòng)記錄的常見布局返返 回回 值值臨臨 時(shí)時(shí) 數(shù)數(shù) 據(jù)據(jù)參參 數(shù)數(shù)控控 制制 鏈鏈訪訪 問問 鏈鏈機(jī)機(jī) 器器 狀狀 態(tài)態(tài)局局 部部 數(shù)數(shù) 據(jù)據(jù)6.1 局部存儲(chǔ)分配局部存儲(chǔ)分配6.1.4 局部數(shù)據(jù)的布局局部數(shù)據(jù)的布局 字節(jié)是可編址內(nèi)存的最小單位字節(jié)是

5、可編址內(nèi)存的最小單位 變量所需的存儲(chǔ)空間可以根據(jù)其類型而靜態(tài)變量所需的存儲(chǔ)空間可以根據(jù)其類型而靜態(tài)確定確定 一個(gè)過程所聲明的局部變量,按這些變量聲一個(gè)過程所聲明的局部變量,按這些變量聲明時(shí)出現(xiàn)的次序,在局部數(shù)據(jù)域中依次分配明時(shí)出現(xiàn)的次序,在局部數(shù)據(jù)域中依次分配空間空間 局部數(shù)據(jù)的地址可以用相對(duì)于某個(gè)位置的地局部數(shù)據(jù)的地址可以用相對(duì)于某個(gè)位置的地址來表示址來表示 數(shù)據(jù)對(duì)象的存儲(chǔ)布局還有一個(gè)對(duì)齊問題數(shù)據(jù)對(duì)象的存儲(chǔ)布局還有一個(gè)對(duì)齊問題6.1 局部存儲(chǔ)分配局部存儲(chǔ)分配 例例 在在SPARC/Solaris工作站上下面兩個(gè)結(jié)構(gòu)體工作站上下面兩個(gè)結(jié)構(gòu)體的的size分別是分別是24和和16,為什么不一樣?,

6、為什么不一樣?typedef struct _atypedef struct _bchar c1; char c1;long i; char c2;char c2; long i;double f; double f;a; b;對(duì)齊:對(duì)齊:char : 1, long : 4, double : 86.1 局部存儲(chǔ)分配局部存儲(chǔ)分配 例例 在在SPARC/Solaris工作站上下面兩個(gè)結(jié)構(gòu)體工作站上下面兩個(gè)結(jié)構(gòu)體的的size分別是分別是24和和16,為什么不一樣?,為什么不一樣?typedef struct _atypedef struct _bchar c1;0 char c1;0long i

7、;4 char c2; 1char c2;8 long i; 4double f; 16 double f; 8a; b;對(duì)齊:對(duì)齊:char : 1, long : 4, double : 86.1 局部存儲(chǔ)分配局部存儲(chǔ)分配 例例 在在X86/Linux機(jī)器的結(jié)果和機(jī)器的結(jié)果和SPARC/Solaris工工作站不一樣,是作站不一樣,是20和和16。typedef struct _atypedef struct _bchar c1;0 char c1;0long i;4 char c2; 1char c2;8 long i; 4double f; 12 double f; 8a; b;對(duì)齊:對(duì)

8、齊:char : 1, long : 4, double : 46.1 局部存儲(chǔ)分配局部存儲(chǔ)分配 程序塊程序塊 本身含有局部變量聲明的語句本身含有局部變量聲明的語句 可以嵌套可以嵌套 最接近的嵌套最接近的嵌套作用域規(guī)則作用域規(guī)則 并列程序塊不會(huì)同時(shí)活躍并列程序塊不會(huì)同時(shí)活躍 并列程序塊的變量可以重疊分配并列程序塊的變量可以重疊分配6.1 局部存儲(chǔ)分配局部存儲(chǔ)分配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

9、/ / 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重疊分配存儲(chǔ)單元重疊分配存儲(chǔ)單元 6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配本節(jié)介紹本節(jié)介紹 介紹程序運(yùn)行時(shí)所需的各個(gè)活動(dòng)記錄在存儲(chǔ)介紹程序運(yùn)行時(shí)所需的各個(gè)活動(dòng)記錄在存儲(chǔ)空間的分配策略空間的分配策略 描述過程的目標(biāo)代碼怎樣訪問綁定到局部名描述過程的目標(biāo)代碼怎

10、樣訪問綁定到局部名字的存儲(chǔ)單元字的存儲(chǔ)單元 介紹三種分配策略介紹三種分配策略 靜態(tài)分配策略靜態(tài)分配策略 棧式分配策略棧式分配策略 堆式分配策略堆式分配策略6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配 運(yùn)行時(shí)內(nèi)存的劃分運(yùn)行時(shí)內(nèi)存的劃分代代 碼碼靜靜 態(tài)態(tài) 數(shù)數(shù) 據(jù)據(jù)堆堆棧棧6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配1、靜態(tài)分配、靜態(tài)分配 名字在程序被編譯時(shí)綁定到存儲(chǔ)單元,不需名字在程序被編譯時(shí)綁定到存儲(chǔ)單元,不需要運(yùn)行時(shí)的任何支持要運(yùn)行時(shí)的任何支持 綁定的生存期是程序的整個(gè)運(yùn)行期間綁定的生存期是程序的整個(gè)運(yùn)行期間6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配2、靜態(tài)分配給語言帶來限制、靜態(tài)分配給語言帶來限制

11、 遞歸過程不被允許遞歸過程不被允許 數(shù)據(jù)對(duì)象的長(zhǎng)度和它在內(nèi)存中位置的限制,數(shù)據(jù)對(duì)象的長(zhǎng)度和它在內(nèi)存中位置的限制,必須是在編譯時(shí)可以知道的必須是在編譯時(shí)可以知道的 數(shù)據(jù)結(jié)構(gòu)不能動(dòng)態(tài)建立數(shù)據(jù)結(jié)構(gòu)不能動(dòng)態(tài)建立6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配 例例 C程序的外部變量、靜態(tài)局部變量以及程程序的外部變量、靜態(tài)局部變量以及程序中出現(xiàn)的常量都可以靜態(tài)分配序中出現(xiàn)的常量都可以靜態(tài)分配 聲明在函數(shù)外面聲明在函數(shù)外面 外部變量外部變量 靜態(tài)分配靜態(tài)分配 靜態(tài)外部變量靜態(tài)外部變量 靜態(tài)分配靜態(tài)分配 聲明在函數(shù)里面聲明在函數(shù)里面 靜態(tài)局部變量靜態(tài)局部變量 也是靜態(tài)分配也是靜態(tài)分配 自動(dòng)變量自動(dòng)變量 不能靜態(tài)分配

12、不能靜態(tài)分配6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配 活動(dòng)樹和運(yùn)行?;顒?dòng)樹和運(yùn)行棧1、活動(dòng)樹、活動(dòng)樹 用樹來描繪控制進(jìn)入和離開活動(dòng)的方式用樹來描繪控制進(jìn)入和離開活動(dòng)的方式mq(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)6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配 活動(dòng)樹的特點(diǎn)活動(dòng)樹的特點(diǎn) 每個(gè)結(jié)點(diǎn)代表某過程的一個(gè)活動(dòng)每個(gè)結(jié)點(diǎn)代表某過程的一個(gè)活動(dòng) 根結(jié)點(diǎn)代表主程序的活動(dòng)根結(jié)點(diǎn)代表主程序的活動(dòng) 結(jié)點(diǎn)結(jié)點(diǎn)a是結(jié)點(diǎn)是結(jié)點(diǎn)b的父結(jié)點(diǎn),當(dāng)且僅當(dāng)控制流從的父結(jié)點(diǎn),當(dāng)

13、且僅當(dāng)控制流從a的的活動(dòng)進(jìn)入活動(dòng)進(jìn)入b的活動(dòng)的活動(dòng) 結(jié)點(diǎn)結(jié)點(diǎn)a處于結(jié)點(diǎn)處于結(jié)點(diǎn)b的左邊,當(dāng)且僅當(dāng)?shù)淖筮?,?dāng)且僅當(dāng)a的生存期先的生存期先于于b的生存期的生存期6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配 當(dāng)前活躍著的過程活動(dòng)可以保存在一個(gè)棧中當(dāng)前活躍著的過程活動(dòng)可以保存在一個(gè)棧中 例例 控制棧的內(nèi)容:控制棧的內(nèi)容:m, q (1, 9), q (1, 3), q (2, 3) mq(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)6.2 全局棧式存儲(chǔ)分配全局棧

14、式存儲(chǔ)分配2、運(yùn)行棧:、運(yùn)行棧:把控制棧中的信息拓廣到包括過程把控制棧中的信息拓廣到包括過程活動(dòng)所需的所有局部信息(即活動(dòng)記錄)活動(dòng)所需的所有局部信息(即活動(dòng)記錄) 6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配2、運(yùn)行棧:、運(yùn)行棧:把控制棧中的信息拓廣到包括過程把控制棧中的信息拓廣到包括過程活動(dòng)所需的所有局部信息(即活動(dòng)記錄)活動(dòng)所需的所有局部信息(即活動(dòng)記錄) ma : arraym6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配2、運(yùn)行棧:、運(yùn)行棧:把控制棧中的信息拓廣到包括過程把控制棧中的信息拓廣到包括過程活動(dòng)所需的所有局部信息(即活動(dòng)記錄)活動(dòng)所需的所有局部信息(即活動(dòng)記錄) mi: intege

15、rra : arraymr6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配2、運(yùn)行棧:、運(yùn)行棧:把控制棧中的信息拓廣到包括過程把控制棧中的信息拓廣到包括過程活動(dòng)所需的所有局部信息(即活動(dòng)記錄)活動(dòng)所需的所有局部信息(即活動(dòng)記錄) mk: integerq (1, 9)a : arraymq(1,9)r6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配2、運(yùn)行棧:、運(yùn)行棧:把控制棧中的信息拓廣到包括過程把控制棧中的信息拓廣到包括過程活動(dòng)所需的所有局部信息(即活動(dòng)記錄)活動(dòng)所需的所有局部信息(即活動(dòng)記錄) mk: integerq (1, 9)a : arrayq (1, 3)k: integermq(1,9)rp

16、(1,9) q(1,3)q(1,0)p(1,3)6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配 調(diào)用序列調(diào)用序列 過程調(diào)用和過程返回都需要執(zhí)行一些代碼來過程調(diào)用和過程返回都需要執(zhí)行一些代碼來管理活動(dòng)記錄棧,保存或恢復(fù)機(jī)器狀態(tài)等管理活動(dòng)記錄棧,保存或恢復(fù)機(jī)器狀態(tài)等 過程調(diào)用序列過程調(diào)用序列過程調(diào)用時(shí)執(zhí)行的分配活動(dòng)記錄,把信息填入它的域中的過程調(diào)用時(shí)執(zhí)行的分配活動(dòng)記錄,把信息填入它的域中的代碼代碼 過程返回序列過程返回序列過程返回時(shí)執(zhí)行的恢復(fù)機(jī)器狀態(tài),釋放活動(dòng)記錄,使調(diào)用過程返回時(shí)執(zhí)行的恢復(fù)機(jī)器狀態(tài),釋放活動(dòng)記錄,使調(diào)用過程能夠繼續(xù)執(zhí)行的代碼過程能夠繼續(xù)執(zhí)行的代碼 調(diào)用序列和返回序列調(diào)用序列和返回序列常

17、常都分成兩部分,分常常都分成兩部分,分處于調(diào)用過程和被調(diào)用過程中處于調(diào)用過程和被調(diào)用過程中6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配 即使是同一種語言,過程調(diào)用序列、返回序即使是同一種語言,過程調(diào)用序列、返回序列和活動(dòng)記錄中各域的排放次序,也會(huì)因?qū)嵙泻突顒?dòng)記錄中各域的排放次序,也會(huì)因?qū)崿F(xiàn)而異現(xiàn)而異 設(shè)計(jì)這些序列和活動(dòng)記錄設(shè)計(jì)這些序列和活動(dòng)記錄的一些原則的一些原則 以活動(dòng)記錄中間的某個(gè)以活動(dòng)記錄中間的某個(gè)位置作為基地址位置作為基地址 長(zhǎng)度能較早確定的域放在長(zhǎng)度能較早確定的域放在活動(dòng)記錄的中間活動(dòng)記錄的中間返返 回回 值值臨臨 時(shí)時(shí) 數(shù)數(shù) 據(jù)據(jù)參參 數(shù)數(shù)控控 制制 鏈鏈訪訪 問問 鏈鏈機(jī)機(jī) 器器 狀

18、狀 態(tài)態(tài)局局 部部 數(shù)數(shù) 據(jù)據(jù)6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配 即使是同一種語言,過程調(diào)用序列、返回序即使是同一種語言,過程調(diào)用序列、返回序列和活動(dòng)記錄中各域的排放次序,也會(huì)因?qū)嵙泻突顒?dòng)記錄中各域的排放次序,也會(huì)因?qū)崿F(xiàn)而異現(xiàn)而異 設(shè)計(jì)這些序列和活動(dòng)記錄設(shè)計(jì)這些序列和活動(dòng)記錄的一些原則的一些原則 一般把臨時(shí)數(shù)據(jù)域放在一般把臨時(shí)數(shù)據(jù)域放在局部數(shù)據(jù)域的后面局部數(shù)據(jù)域的后面 把參數(shù)域和可能有的返回把參數(shù)域和可能有的返回值域放在緊靠調(diào)用者活動(dòng)值域放在緊靠調(diào)用者活動(dòng)記錄的地方記錄的地方返返 回回 值值臨臨 時(shí)時(shí) 數(shù)數(shù) 據(jù)據(jù)參參 數(shù)數(shù)控控 制制 鏈鏈訪訪 問問 鏈鏈機(jī)機(jī) 器器 狀狀 態(tài)態(tài)局局 部部

19、數(shù)數(shù) 據(jù)據(jù)6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配 即使是同一種語言,過程調(diào)用序列、返回序即使是同一種語言,過程調(diào)用序列、返回序列和活動(dòng)記錄中各域的排放次序,也會(huì)因?qū)嵙泻突顒?dòng)記錄中各域的排放次序,也會(huì)因?qū)崿F(xiàn)而異現(xiàn)而異 設(shè)計(jì)這些序列和活動(dòng)記錄設(shè)計(jì)這些序列和活動(dòng)記錄的一些原則的一些原則 用同樣的代碼來執(zhí)行各個(gè)用同樣的代碼來執(zhí)行各個(gè)活動(dòng)的保存和恢復(fù)活動(dòng)的保存和恢復(fù)返返 回回 值值臨臨 時(shí)時(shí) 數(shù)數(shù) 據(jù)據(jù)參參 數(shù)數(shù)控控 制制 鏈鏈訪訪 問問 鏈鏈機(jī)機(jī) 器器 狀狀 態(tài)態(tài)局局 部部 數(shù)數(shù) 據(jù)據(jù)6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配1、過程、過程p調(diào)用過程調(diào)用過程q的調(diào)用序列的調(diào)用序列返回值和參數(shù)返回值和參

20、數(shù)top_sp base_sp 臨時(shí)數(shù)據(jù)局部數(shù)據(jù)臨時(shí)數(shù)據(jù)局部數(shù)據(jù)控制鏈控制鏈 和保存的機(jī)器狀態(tài)和保存的機(jī)器狀態(tài) 6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配1、過程、過程p調(diào)用過程調(diào)用過程q的調(diào)用序列的調(diào)用序列(1) p計(jì)算實(shí)參,依計(jì)算實(shí)參,依次放入棧頂,并在次放入棧頂,并在棧頂留出放返回值棧頂留出放返回值的空間。的空間。top_sp的值的值在此過程中被改變?cè)诖诉^程中被改變返回值和參數(shù)返回值和參數(shù)top_sp base_sp 臨時(shí)數(shù)據(jù)局部數(shù)據(jù)臨時(shí)數(shù)據(jù)局部數(shù)據(jù)控制鏈控制鏈 和保存的機(jī)器狀態(tài)和保存的機(jī)器狀態(tài) 返回值和參數(shù)返回值和參數(shù)6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配1、過程、過程p調(diào)用過程調(diào)用過

21、程q的調(diào)用序列的調(diào)用序列(2) p把返回地址和把返回地址和當(dāng)前當(dāng)前base_sp的值存的值存入入q的活動(dòng)記錄中的活動(dòng)記錄中,建立,建立q的訪問鏈,的訪問鏈,增加增加base_sp的值的值返回值和參數(shù)返回值和參數(shù)top_sp base_sp 臨時(shí)數(shù)據(jù)局部數(shù)據(jù)臨時(shí)數(shù)據(jù)局部數(shù)據(jù)控制鏈控制鏈 和保存的機(jī)器狀態(tài)和保存的機(jī)器狀態(tài) 返回值和參數(shù)返回值和參數(shù)控制鏈和返回地址控制鏈和返回地址6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配1、過程、過程p調(diào)用過程調(diào)用過程q的調(diào)用序列的調(diào)用序列(3) q保存寄存器的保存寄存器的值和其它機(jī)器狀態(tài)值和其它機(jī)器狀態(tài)信息信息返回值和參數(shù)返回值和參數(shù)top_sp base_sp 臨

22、時(shí)數(shù)據(jù)局部數(shù)據(jù)臨時(shí)數(shù)據(jù)局部數(shù)據(jù)控制鏈控制鏈 和保存的機(jī)器狀態(tài)和保存的機(jī)器狀態(tài) 返回值和參數(shù)返回值和參數(shù)控制鏈控制鏈 和保存的機(jī)器狀態(tài)和保存的機(jī)器狀態(tài)6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配1、過程、過程p調(diào)用過程調(diào)用過程q的調(diào)用序列的調(diào)用序列(4) q根據(jù)局部數(shù)據(jù)根據(jù)局部數(shù)據(jù)域和臨時(shí)數(shù)據(jù)域的域和臨時(shí)數(shù)據(jù)域的大小增加大小增加top_sp的的值,初始化它的局部值,初始化它的局部數(shù)據(jù),并開始執(zhí)行過數(shù)據(jù),并開始執(zhí)行過程體程體臨時(shí)數(shù)據(jù)局部數(shù)據(jù)臨時(shí)數(shù)據(jù)局部數(shù)據(jù)返回值和參數(shù)返回值和參數(shù)返回值和參數(shù)返回值和參數(shù) 控制鏈控制鏈 和保存的機(jī)器狀態(tài)和保存的機(jī)器狀態(tài)top_sp base_sp 臨時(shí)數(shù)據(jù)局部數(shù)據(jù)臨時(shí)數(shù)

23、據(jù)局部數(shù)據(jù)控制鏈控制鏈 和保存的機(jī)器狀態(tài)和保存的機(jī)器狀態(tài) 6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配調(diào)用者調(diào)用者p和被調(diào)用者和被調(diào)用者q之間的任務(wù)劃分之間的任務(wù)劃分被調(diào)用者被調(diào)用者q的責(zé)任的責(zé)任調(diào)用者調(diào)用者p的責(zé)任的責(zé)任調(diào)用者調(diào)用者p的的活動(dòng)記錄活動(dòng)記錄被被調(diào)用者調(diào)用者q的活動(dòng)記錄的活動(dòng)記錄臨時(shí)數(shù)據(jù)局部數(shù)據(jù)臨時(shí)數(shù)據(jù)局部數(shù)據(jù)返回值和參數(shù)返回值和參數(shù)返回值和參數(shù)返回值和參數(shù) 控制鏈控制鏈 和保存的機(jī)器狀態(tài)和保存的機(jī)器狀態(tài)top_sp base_sp 棧棧增增長(zhǎng)長(zhǎng)方方向向臨時(shí)數(shù)據(jù)局部數(shù)據(jù)臨時(shí)數(shù)據(jù)局部數(shù)據(jù)控制鏈控制鏈 和保存的機(jī)器狀態(tài)和保存的機(jī)器狀態(tài) 6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配2、過程、過

24、程p調(diào)用過程調(diào)用過程q的返回序列的返回序列臨時(shí)數(shù)據(jù)局部數(shù)據(jù)臨時(shí)數(shù)據(jù)局部數(shù)據(jù)返回值和參數(shù)返回值和參數(shù)返回值和參數(shù)返回值和參數(shù) 控制鏈控制鏈 和保存的機(jī)器狀態(tài)和保存的機(jī)器狀態(tài)top_sp base_sp 棧棧增增長(zhǎng)長(zhǎng)方方向向臨時(shí)數(shù)據(jù)局部數(shù)據(jù)臨時(shí)數(shù)據(jù)局部數(shù)據(jù)控制鏈控制鏈 和保存的機(jī)器狀態(tài)和保存的機(jī)器狀態(tài) 6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配2、過程、過程p調(diào)用過程調(diào)用過程q的返回序列的返回序列臨時(shí)數(shù)據(jù)局部數(shù)據(jù)臨時(shí)數(shù)據(jù)局部數(shù)據(jù)返回值和參數(shù)返回值和參數(shù)返回值和參數(shù)返回值和參數(shù) 控制鏈控制鏈 和保存的機(jī)器狀態(tài)和保存的機(jī)器狀態(tài)top_sp base_sp 棧棧增增長(zhǎng)長(zhǎng)方方向向臨時(shí)數(shù)據(jù)局部數(shù)據(jù)臨時(shí)數(shù)據(jù)局部

25、數(shù)據(jù)控制鏈控制鏈 和保存的機(jī)器狀態(tài)和保存的機(jī)器狀態(tài) (1) q把返回值置入鄰把返回值置入鄰近近p的活動(dòng)記錄的地的活動(dòng)記錄的地方方 參數(shù)個(gè)數(shù)可變場(chǎng)合參數(shù)個(gè)數(shù)可變場(chǎng)合難以確定存放返回值難以確定存放返回值的位置,因此通常用的位置,因此通常用寄存器傳遞返回值寄存器傳遞返回值6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配2、過程、過程p調(diào)用過程調(diào)用過程q的返回序列的返回序列(2) q對(duì)應(yīng)調(diào)用序列的對(duì)應(yīng)調(diào)用序列的步驟步驟(4),減小,減小top_sp的值的值返回值和參數(shù)返回值和參數(shù)top_sp base_sp 臨時(shí)數(shù)據(jù)局部數(shù)據(jù)臨時(shí)數(shù)據(jù)局部數(shù)據(jù)控制鏈控制鏈 和保存的機(jī)器狀態(tài)和保存的機(jī)器狀態(tài) 返回值和參數(shù)返回值和參

26、數(shù)控制鏈控制鏈 和保存的機(jī)器狀態(tài)和保存的機(jī)器狀態(tài)6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配2、過程、過程p調(diào)用過程調(diào)用過程q的返回序列的返回序列(3) q恢復(fù)寄存器恢復(fù)寄存器(包括包括base_sp)和機(jī)器狀態(tài)和機(jī)器狀態(tài),返回,返回p返回值和參數(shù)返回值和參數(shù)top_sp base_sp 臨時(shí)數(shù)據(jù)局部數(shù)據(jù)臨時(shí)數(shù)據(jù)局部數(shù)據(jù)控制鏈控制鏈 和保存的機(jī)器狀態(tài)和保存的機(jī)器狀態(tài) 返回值和參數(shù)返回值和參數(shù)6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配2、過程、過程p調(diào)用過程調(diào)用過程q的返回序列的返回序列返回值和參數(shù)返回值和參數(shù)top_sp base_sp 臨時(shí)數(shù)據(jù)局部數(shù)據(jù)臨時(shí)數(shù)據(jù)局部數(shù)據(jù)控制鏈控制鏈 和保存的機(jī)器狀態(tài)

27、和保存的機(jī)器狀態(tài) (4) p根據(jù)參數(shù)個(gè)數(shù)根據(jù)參數(shù)個(gè)數(shù)與類型和返回值類與類型和返回值類型調(diào)整型調(diào)整top_sp,然后然后取出返回值取出返回值6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配3、過程的參數(shù)個(gè)數(shù)可變的情況、過程的參數(shù)個(gè)數(shù)可變的情況臨時(shí)數(shù)據(jù)局部數(shù)據(jù)臨時(shí)數(shù)據(jù)局部數(shù)據(jù)參參 數(shù)數(shù)參參 數(shù)數(shù) 控制鏈控制鏈 和保存的機(jī)器狀態(tài)和保存的機(jī)器狀態(tài)top_sp base_sp 棧棧增增長(zhǎng)長(zhǎng)方方向向臨時(shí)數(shù)據(jù)局部數(shù)據(jù)臨時(shí)數(shù)據(jù)局部數(shù)據(jù)控制鏈控制鏈 和保存的機(jī)器狀態(tài)和保存的機(jī)器狀態(tài) (1) 函數(shù)返回值改函數(shù)返回值改成用寄存器傳遞成用寄存器傳遞6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配3、過程的參數(shù)個(gè)數(shù)可變的情況、過程的參

28、數(shù)個(gè)數(shù)可變的情況臨時(shí)數(shù)據(jù)局部數(shù)據(jù)臨時(shí)數(shù)據(jù)局部數(shù)據(jù)參數(shù)參數(shù)1, , 參數(shù)參數(shù)n參數(shù)參數(shù)1, ,參數(shù)參數(shù)m 控制鏈控制鏈 和保存的機(jī)器狀態(tài)和保存的機(jī)器狀態(tài)top_sp base_sp 棧棧增增長(zhǎng)長(zhǎng)方方向向臨時(shí)數(shù)據(jù)局部數(shù)據(jù)臨時(shí)數(shù)據(jù)局部數(shù)據(jù)控制鏈控制鏈 和保存的機(jī)器狀態(tài)和保存的機(jī)器狀態(tài) (2) 編譯器產(chǎn)生將實(shí)編譯器產(chǎn)生將實(shí)參表達(dá)式逆序計(jì)算并參表達(dá)式逆序計(jì)算并將結(jié)果進(jìn)棧的代碼將結(jié)果進(jìn)棧的代碼 自上而下依次是自上而下依次是參數(shù)參數(shù)1, , 參數(shù)參數(shù)n6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配3、過程的參數(shù)個(gè)數(shù)可變的情況、過程的參數(shù)個(gè)數(shù)可變的情況臨時(shí)數(shù)據(jù)局部數(shù)據(jù)臨時(shí)數(shù)據(jù)局部數(shù)據(jù)參數(shù)參數(shù)1, , 參數(shù)參數(shù)n參數(shù)

29、參數(shù)1, ,參數(shù)參數(shù)m 控制鏈控制鏈 和保存的機(jī)器狀態(tài)和保存的機(jī)器狀態(tài)top_sp base_sp 棧棧增增長(zhǎng)長(zhǎng)方方向向臨時(shí)數(shù)據(jù)局部數(shù)據(jù)臨時(shí)數(shù)據(jù)局部數(shù)據(jù)控制鏈控制鏈 和保存的機(jī)器狀態(tài)和保存的機(jī)器狀態(tài) (3) 被調(diào)用函數(shù)能準(zhǔn)被調(diào)用函數(shù)能準(zhǔn)確地知道第一個(gè)參確地知道第一個(gè)參數(shù)的位置數(shù)的位置6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配3、過程的參數(shù)個(gè)數(shù)可變的情況、過程的參數(shù)個(gè)數(shù)可變的情況臨時(shí)數(shù)據(jù)局部數(shù)據(jù)臨時(shí)數(shù)據(jù)局部數(shù)據(jù)參數(shù)參數(shù)1, , 參數(shù)參數(shù)n參數(shù)參數(shù)1, ,參數(shù)參數(shù)m 控制鏈控制鏈 和保存的機(jī)器狀態(tài)和保存的機(jī)器狀態(tài)top_sp base_sp 棧棧增增長(zhǎng)長(zhǎng)方方向向臨時(shí)數(shù)據(jù)局部數(shù)據(jù)臨時(shí)數(shù)據(jù)局部數(shù)據(jù)控制鏈

30、控制鏈 和保存的機(jī)器狀態(tài)和保存的機(jī)器狀態(tài) (4) 被調(diào)用函數(shù)根據(jù)被調(diào)用函數(shù)根據(jù)第一個(gè)參數(shù)到棧中取第一個(gè)參數(shù)到棧中取第二、第三個(gè)參數(shù)等第二、第三個(gè)參數(shù)等等等6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配6.2.4 棧上可變長(zhǎng)數(shù)據(jù)棧上可變長(zhǎng)數(shù)據(jù)活動(dòng)記錄的長(zhǎng)度在編譯時(shí)不能確定的情況活動(dòng)記錄的長(zhǎng)度在編譯時(shí)不能確定的情況 例:局部數(shù)組的大小要等到過程激活時(shí)才能例:局部數(shù)組的大小要等到過程激活時(shí)才能確定確定備注:備注: Java語言的實(shí)現(xiàn)是將它們分配在堆上語言的實(shí)現(xiàn)是將它們分配在堆上6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配訪問動(dòng)態(tài)分配的數(shù)組訪問動(dòng)態(tài)分配的數(shù)組控制鏈控制鏈數(shù)組數(shù)組A的指針的指針數(shù)組數(shù)組B的指針的指

31、針top_sp base_sp . . . . . . .棧棧(1) 編譯時(shí),在編譯時(shí),在活動(dòng)記錄中為這活動(dòng)記錄中為這樣的數(shù)組分別存樣的數(shù)組分別存放數(shù)組指針的單放數(shù)組指針的單元元6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配訪問動(dòng)態(tài)分配的數(shù)組訪問動(dòng)態(tài)分配的數(shù)組(2) 運(yùn)行時(shí),這運(yùn)行時(shí),這些指針指向分些指針指向分配在棧頂?shù)拇媾湓跅m數(shù)拇鎯?chǔ)空間儲(chǔ)空間控制鏈控制鏈數(shù)組數(shù)組A的指針的指針數(shù)組數(shù)組B的指針的指針top_sp base_sp . . . . . . .棧棧數(shù)組數(shù)組A數(shù)組數(shù)組B6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配訪問動(dòng)態(tài)分配的數(shù)組訪問動(dòng)態(tài)分配的數(shù)組(3) 運(yùn)行時(shí),對(duì)運(yùn)行時(shí),對(duì)數(shù)組數(shù)組A和和B的

32、訪的訪問都要通過相應(yīng)問都要通過相應(yīng)指針來間接訪問指針來間接訪問控制鏈控制鏈數(shù)組數(shù)組A的指針的指針數(shù)組數(shù)組B的指針的指針top_sp base_sp . . . . . . .棧棧數(shù)組數(shù)組A數(shù)組數(shù)組B6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配訪問動(dòng)態(tài)分配的數(shù)組訪問動(dòng)態(tài)分配的數(shù)組q的數(shù)組的數(shù)組q的活動(dòng)記錄的活動(dòng)記錄p的數(shù)組的數(shù)組p的活動(dòng)記錄的活動(dòng)記錄控制鏈控制鏈top_sp base_sp 數(shù)組數(shù)組A的指針的指針數(shù)組數(shù)組B的指針的指針數(shù)組數(shù)組A數(shù)組數(shù)組B控制鏈控制鏈. . . . . . .棧棧6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配6.2.5 懸空引用懸空引用懸空引用:懸空引用:引用某個(gè)已被釋放的

33、存儲(chǔ)單元引用某個(gè)已被釋放的存儲(chǔ)單元6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配6.2.5 懸空引用懸空引用懸空引用:懸空引用:引用某個(gè)已被釋放的存儲(chǔ)單元引用某個(gè)已被釋放的存儲(chǔ)單元main()|int dangle ( ) |int q;|int j = 20; q = dangle ( );|return &j;|6.3 非局部名字的訪問非局部名字的訪問本節(jié)介紹本節(jié)介紹 無過程嵌套的靜態(tài)作用域(無過程嵌套的靜態(tài)作用域(C語言)語言) 有過程嵌套的靜態(tài)作用域有過程嵌套的靜態(tài)作用域(Pascal語言)語言) 動(dòng)態(tài)作用域動(dòng)態(tài)作用域(Lisp語言)語言)6.3 非局部名字的訪問非局部名字的訪問 無

34、過程嵌套的靜態(tài)作用域無過程嵌套的靜態(tài)作用域 過程體中的非局部引用可以直接使用靜態(tài)確過程體中的非局部引用可以直接使用靜態(tài)確定的地址定的地址 局部變量在棧頂?shù)幕顒?dòng)記錄中,可以通過局部變量在棧頂?shù)幕顒?dòng)記錄中,可以通過base_sp指針來訪問指針來訪問 無須深入棧中取數(shù)據(jù),無須訪問鏈無須深入棧中取數(shù)據(jù),無須訪問鏈 過程可以作為參數(shù)來傳遞,也可以作為結(jié)果過程可以作為參數(shù)來傳遞,也可以作為結(jié)果來返回來返回6.3 非局部名字的訪問非局部名字的訪問 有過程嵌套的靜態(tài)作用域有過程嵌套的靜態(tài)作用域sortreadarrayexchangequicksortpartition6.3 非局部名字的訪問非局部名字的訪問

35、 有過程嵌套的靜態(tài)作用域有過程嵌套的靜態(tài)作用域 過程過程嵌套深度嵌套深度sort1readarray2exchange2quicksort2partition3 變量的嵌套深度:它的聲明所在過程的嵌套變量的嵌套深度:它的聲明所在過程的嵌套深度作為該名字的嵌套深度深度作為該名字的嵌套深度6.3 非局部名字的訪問非局部名字的訪問 訪問鏈訪問鏈 用來尋找非局部用來尋找非局部名字的存儲(chǔ)單元名字的存儲(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訪問

36、鏈訪問鏈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 非局部名字的訪問非局部名字的訪問 訪問非局部名字的存儲(chǔ)單元訪問非局部名字的存儲(chǔ)單元 假定過程假定過程p的嵌套深度為的嵌套深度為np,它引用嵌套深度為它引用嵌套深度為na的變量的變量a,na np。如何訪問如何訪問a的存儲(chǔ)單元的存儲(chǔ)單元sort1readarray 2exchange2quicksort2partition36.3 非局部名字的訪問非局部名字的訪問 訪問非局部名字的存儲(chǔ)單元訪問非局部名

37、字的存儲(chǔ)單元 假定過程假定過程p的嵌套深度為的嵌套深度為np,它引用嵌套深度為它引用嵌套深度為na的變量的變量a,na np。如何訪問如何訪問a的存儲(chǔ)單元的存儲(chǔ)單元 從棧頂?shù)幕顒?dòng)記錄開始,追蹤訪問鏈從棧頂?shù)幕顒?dòng)記錄開始,追蹤訪問鏈np na次次 到達(dá)到達(dá)a的聲明所在過程的活動(dòng)記錄的聲明所在過程的活動(dòng)記錄 訪問鏈的追蹤用間接操作就可完成訪問鏈的追蹤用間接操作就可完成sort1readarray 2exchange2quicksort2partition36.3 非局部名字的訪問非局部名字的訪問 訪問非局部名字的存儲(chǔ)單元訪問非局部名字的存儲(chǔ)單元 sort readarray exchange qu

38、icksort partitionsa, 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對(duì)變量對(duì)變量a訪問時(shí),訪問時(shí),a的地址由下面的二元的地址由下面的二元組表示:組表示:(np na,a在活動(dòng)記錄中的偏移)在

39、活動(dòng)記錄中的偏移)6.3 非局部名字的訪問非局部名字的訪問 建立訪問鏈建立訪問鏈 假定嵌套深度為假定嵌套深度為np的過程的過程p調(diào)用嵌套深度為調(diào)用嵌套深度為nx的過的過程程x(1) np nx的情況的情況sort1readarray2exchange2quicksort2partition3 這時(shí)這時(shí)x肯定就肯定就聲明在聲明在p中中6.3 非局部名字的訪問非局部名字的訪問 建立訪問鏈建立訪問鏈 假定嵌套深度為假定嵌套深度為np的過程的過程p調(diào)用嵌套深度為調(diào)用嵌套深度為nx的過的過程程x(1) np nx的情況的情況 被調(diào)用過程的訪問鏈必須指向調(diào)用過程的活動(dòng)記被調(diào)用過程的訪問鏈必須指向調(diào)用過程的

40、活動(dòng)記錄的訪問鏈錄的訪問鏈6.3 非局部名字的訪問非局部名字的訪問 訪問非局部名字的存儲(chǔ)單元訪問非局部名字的存儲(chǔ)單元 sort readarray exchange quicksort partitionsa, 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.

41、3 非局部名字的訪問非局部名字的訪問 建立訪問鏈建立訪問鏈 假定嵌套深度為假定嵌套深度為np的過程的過程p調(diào)用嵌套深度為調(diào)用嵌套深度為nx的過的過程程x(2) np nx的情況的情況sort1readarray2exchange2quicksort2partition3 這時(shí)這時(shí)p和和x的的嵌套深度分別嵌套深度分別為為1,2,nx 1的外圍過的外圍過程肯定相同程肯定相同6.3 非局部名字的訪問非局部名字的訪問 建立訪問鏈建立訪問鏈 假定嵌套深度為假定嵌套深度為np的過程的過程p調(diào)用嵌套深度為調(diào)用嵌套深度為nx的過的過程程x(2) np nx的情況的情況 追蹤訪問鏈追蹤訪問鏈np nx + 1次

42、,到達(dá)了靜態(tài)包圍次,到達(dá)了靜態(tài)包圍x和和p的的且離它們最近的那個(gè)過程的最新活動(dòng)記錄且離它們最近的那個(gè)過程的最新活動(dòng)記錄 所到達(dá)的活動(dòng)記錄就是所到達(dá)的活動(dòng)記錄就是x的活動(dòng)記錄中的訪問鏈的活動(dòng)記錄中的訪問鏈應(yīng)該指向的那個(gè)活動(dòng)記錄應(yīng)該指向的那個(gè)活動(dòng)記錄6.3 非局部名字的訪問非局部名字的訪問 訪問非局部名字的存儲(chǔ)單元訪問非局部名字的存儲(chǔ)單元 sort readarray exchange quicksort partitionsa, xq (1, 9)k, v訪問鏈訪問鏈sa, xq (1, 3)k, v訪問鏈訪問鏈q (1, 9)k, v訪問鏈訪問鏈sa, xq (1, 3)k, v訪問鏈訪問鏈q

43、 (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 非局部名字的訪問非局部名字的訪問program param(input, output);(過程作為參數(shù))過程作為參數(shù))procedure b(function h(n: integer): integer); begin writeln(h(2) end b;procedure c; var m: integer; function f(n: integer): inte

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

45、: integer) begin f := m+n end f; begin m := 0; b(f) end c; begin cend.訪訪 問問 鏈鏈訪訪 問問 鏈鏈paramcmb f的起始地址連同的起始地址連同它的訪問鏈一起傳它的訪問鏈一起傳遞遞6.3 非局部名字的訪問非局部名字的訪問program ret (input, output);(過程作為返回值)過程作為返回值) var f: function (integer): integer;function a: function (integer): integer; var m: integer; function addm

46、(n: integer): 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.aretbaddm 執(zhí)行執(zhí)行addm時(shí),時(shí),a的活動(dòng)記錄已不存的活動(dòng)記錄已不存在,取不到在,取不到m的值的值6.3 非局部名字的訪問非局部名字的訪問 C語言的函數(shù)聲明不能嵌套,函數(shù)不論在什么語言的函數(shù)聲明不能嵌套,函數(shù)不論在什么情況下激活,要訪問的數(shù)據(jù)分成兩種情

47、況情況下激活,要訪問的數(shù)據(jù)分成兩種情況 非靜態(tài)局部變量(包括形式參數(shù)),它們分配在非靜態(tài)局部變量(包括形式參數(shù)),它們分配在活動(dòng)記錄棧頂?shù)哪莻€(gè)活動(dòng)記錄中活動(dòng)記錄棧頂?shù)哪莻€(gè)活動(dòng)記錄中 外部變量(包括定義在其它源文件之中的外部變外部變量(包括定義在其它源文件之中的外部變量)和靜態(tài)的局部變量,它們都分配在靜態(tài)數(shù)據(jù)量)和靜態(tài)的局部變量,它們都分配在靜態(tài)數(shù)據(jù)區(qū)區(qū)6.3 非局部名字的訪問非局部名字的訪問 動(dòng)態(tài)作用域動(dòng)態(tài)作用域 被調(diào)用過程的非局部名字被調(diào)用過程的非局部名字a和它在調(diào)用過程中和它在調(diào)用過程中引用的是同樣的存儲(chǔ)單元引用的是同樣的存儲(chǔ)單元 新的綁定僅為被調(diào)用過程的局部名字建立,新的綁定僅為被調(diào)用過

48、程的局部名字建立,這些名字在被調(diào)用過程的活動(dòng)記錄中占用的這些名字在被調(diào)用過程的活動(dòng)記錄中占用的存儲(chǔ)單元存儲(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 end; begin r := 0.25; show; small; writeln; show; small; writeln end.dynamicshowsmall

49、smallshowshowshow6.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)作用域靜態(tài)作用域 r := 0.25;0.250 0.250 show; small; writeln;0.250 0.250 show; small; writeln end.dynamicshowsmallsmalls

50、howshowshow6.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)動(dòng)態(tài)作用域態(tài)作用域 r := 0.25;0.250 0.125 show; small; writeln;0.250 0.125 show; small; writeln end.dynamicshowsmallsmallshowsho

51、wshow6.3 非局部名字的訪問非局部名字的訪問實(shí)現(xiàn)動(dòng)態(tài)作用域的方法實(shí)現(xiàn)動(dòng)態(tài)作用域的方法 深訪問深訪問 用控制鏈搜索運(yùn)行棧,尋找包含該非局部名字用控制鏈搜索運(yùn)行棧,尋找包含該非局部名字的第一個(gè)活動(dòng)記錄的第一個(gè)活動(dòng)記錄 淺訪問淺訪問 為每個(gè)名字在靜態(tài)分配的存儲(chǔ)空間中保存它的當(dāng)為每個(gè)名字在靜態(tài)分配的存儲(chǔ)空間中保存它的當(dāng)前值前值 當(dāng)當(dāng)過程過程p的新活動(dòng)出現(xiàn)時(shí),的新活動(dòng)出現(xiàn)時(shí),p的局部名字的局部名字n使用在使用在靜態(tài)數(shù)據(jù)區(qū)分配給靜態(tài)數(shù)據(jù)區(qū)分配給n的存儲(chǔ)單元。的存儲(chǔ)單元。n的先前值保存的先前值保存在在p的活動(dòng)記錄中,當(dāng)?shù)幕顒?dòng)記錄中,當(dāng)p的活動(dòng)結(jié)束時(shí)再恢復(fù)的活動(dòng)結(jié)束時(shí)再恢復(fù)6.3 非局部名字的訪問非局部

52、名字的訪問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 (綠色表示已執(zhí)行部分綠色表示已執(zhí)行部分) r := 0.25; show; small; writeln; show; small; writeln end.dynamicshowsmallsmallshowshowshow?r 靜態(tài)區(qū)靜態(tài)區(qū)使用值的地方使用值的地方 棧區(qū)棧區(qū)暫存值的地方

53、暫存值的地方dynamicr?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 (綠色表示已執(zhí)行部分綠色表示已執(zhí)行部分) r := 0.25; show; small; writeln; show; small; writeln end.dynamicshowsmallsmallshowshowshow0.

54、25rdynamicr? 靜態(tài)區(qū)靜態(tài)區(qū)使用值的地方使用值的地方 棧區(qū)棧區(qū)暫存值的地方暫存值的地方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 (綠色表示已執(zhí)行部分綠色表示已執(zhí)行部分) r := 0.25; show; small; writeln; show; small; writeln end.dy

55、namicshowsmallsmallshowshowshow0.25rdynamicr?show 靜態(tài)區(qū)靜態(tài)區(qū)使用值的地方使用值的地方 棧區(qū)棧區(qū)暫存值的地方暫存值的地方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 (綠色表示已執(zhí)行部分綠色表示已執(zhí)行部分) r := 0.25; show; small;

56、 writeln; show; small; writeln end.dynamicshowsmallsmallshowshowshow0.25rdynamicr?smallr0.25 靜態(tài)區(qū)靜態(tài)區(qū)使用值的地方使用值的地方 棧區(qū)棧區(qū)暫存值的地方暫存值的地方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 (綠色表示已執(zhí)行部分綠色表示已執(zhí)行部分) r

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論