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

下載本文檔

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

文檔簡介

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

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

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

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

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

6、.1.4 部分數(shù)據(jù)的安排字節(jié)是可編址內存的最小單位。變量所需的存儲空間可以根據(jù)其類型而靜態(tài)確定。一個過程所聲明的部分變量,按這些變量聲明時出現(xiàn)的次序,在部分數(shù)據(jù)域中依次分配空間。 部分數(shù)據(jù)的地址可以用相對于某個位置的地址來表示。數(shù)據(jù)對象的存儲安排還有一個對齊問題。6.1.5 程序塊本身含有部分變量聲明的語句可以嵌套最接近的嵌套作用域規(guī)那么并列程序塊不會同時活潑并列程序塊的變量可以重疊分配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重疊分配存儲單元 6.2 全局存儲分配戰(zhàn)略引見程序運轉時所需的各個活動記錄在存儲空間的分配戰(zhàn)略6.2 全局存儲分配戰(zhàn)略引見程序運轉時所需的各個活動記錄在存儲空間的分配戰(zhàn)略描畫過程的目的代碼怎樣訪問綁定到部分名字的存儲單元6.2 全局存儲分配戰(zhàn)略引見程序運轉時所需的各個活動記錄在存儲空間的分配戰(zhàn)略描畫過程的目的代碼怎樣訪問綁定到部分名字的存儲單元引見三種分配戰(zhàn)略靜態(tài)分配戰(zhàn)略6.2 全局存儲分配戰(zhàn)略引見程序運轉時所需的各個活動記錄在存儲空間的分配戰(zhàn)略描畫過程的目的代碼怎樣訪問綁定到部分名字的存儲單元引見三種分配戰(zhàn)略靜態(tài)分配戰(zhàn)略棧式分配戰(zhàn)略6.2 全局存儲分配戰(zhàn)略引見程序運轉時所需的各個

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

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

12、采用靜態(tài)分配,由于它們普通在整個程序運轉的期間是被共享的。 6.2.3 棧式存儲分配 存儲空間被組織成棧,活動記錄的推入和彈出分別對應于活動的開場和終了。 與靜態(tài)分配不同的是,在每次活動中把部分名字和新的存儲單元綁定,在活動終了時,活動記錄從棧中彈出,因此部分名字的存儲空間也隨之消逝。6.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)活動樹的特點:每個結點代表某過程的一個活動根結點代表主

13、程序的活動結點a是結點b的父結點,當且僅當控制流從a的活動進入b的活動結點a處于結點b的左邊,當且僅當a的生存期先于b的生存期活動樹上各節(jié)點之間具有下述關系:同一層次的活動生存期不交;任一時辰,處在生存期的活動構成一條從根到某節(jié) 點的途徑;途徑上各節(jié)點生存期是嵌套的后進先出。 當前活潑著的過程活動可以保管在一個棧中控制棧的內容: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)運轉棧:把

14、控制棧中的信息拓廣到包括過程活動所需的一切部分信息即活動記錄 運轉棧:把控制棧中的信息拓廣到包括過程活動所需的一切部分信息即活動記錄 sa : arrays運轉棧:把控制棧中的信息拓廣到包括過程活動所需的一切部分信息即活動記錄 si: integerra : arraysr運轉棧:把控制棧中的信息拓廣到包括過程活動所需的一切部分信息即活動記錄 sk: integerq (1, 9)a : arraysq(1,9)r運轉棧:把控制棧中的信息拓廣到包括過程活動所需的一切部分信息即活動記錄 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)過程調用和過程前往都需求執(zhí)行一些代碼來管理活動記錄棧,保管或恢復機器形狀等過程調用和過程前往都需求執(zhí)行一些代碼來管理活動記錄棧,保管或恢復機器形狀等過程調用序列過程調用時執(zhí)行的分配活動記錄,把信息填入它的域中的代碼過程調用和過程前往都需求執(zhí)行一些代碼來管理活動記錄棧,保管或恢復機器形狀等過程調用序列過程調用時執(zhí)行的分配活動記錄,把信息填入它的域中的代碼過程前往序列過程前往時執(zhí)行的恢復機器形狀,釋放活動記錄,使調用過程可以繼續(xù)執(zhí)行的代碼過程調用和過程前往都需求執(zhí)行一些代碼來管理活動記錄棧,保管或恢復機器形狀等過程調用序列過程調用時執(zhí)行的分配活動記錄,

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

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

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

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

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

21、程嵌套深度sort1readarray2exchange2quicksort2partition3變量的嵌套深度:它的聲明所在過程的嵌套深度作為該名字的嵌套深度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訪問鏈6.3 非部分名字的訪問假定過程p的嵌套深度為np,

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

23、。如何訪問a的存儲單元?從棧頂?shù)幕顒佑涗涢_場,追蹤訪問鏈np na次。到達a的聲明所在過程的活動記錄。訪問鏈的追蹤用間接操作就可完成。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 partitio

24、n6.3 非部分名字的訪問過程p對變量a訪問時,a的地址由下面的二元組表示:np na,a在活動記錄中的偏移6.3 非部分名字的訪問建立訪問鏈假定嵌套深度為np的過程p調用嵌套深度為nx的過程xnp nx的情況sort1readarray2exchange2quicksort2partition36.3 非部分名字的訪問建立訪問鏈假定嵌套深度為np的過程p調用嵌套深度為nx的過程xnp nx的情況x一定就聲明在p中6.3 非部分名字的訪問建立訪問鏈假定嵌套深度為np的過程p調用嵌套深度為nx的過程xnp nx的情況x一定就聲明在p中被調用過程的訪問鏈必需指向調用過程的活動記錄的訪問鏈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調用嵌套深度為nx的過程xnp nx的情況sort1readarray2exchange2quic

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

27、訪問鏈np nx + 1次,到達了靜態(tài)包圍x和p的且離它們最近的那個過程的最新活動記錄所到達的訪問鏈就是x的活動記錄中的訪問鏈應該指向的那個訪問鏈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ù)傳送時,怎樣在該過程被激活時建立它的訪問鏈。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ù)傳送時,怎樣在該過程被激活時建立它的訪問鏈 從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ù),它們分配在活動記錄棧頂?shù)哪莻€活動記錄中外部變量包括定義在其它源文件中的外部變量和靜態(tài)的部分變量,它們都分配在靜態(tài)數(shù)據(jù)區(qū) 6.3 非部

34、分名字的訪問6.3.3 動態(tài)作用域被調用過程的非部分名字a和它在調用過程中援用的是同樣的存儲單元。6.3 非部分名字的訪問6.3.3 動態(tài)作用域被調用過程的非部分名字a和它在調用過程中援用的是同樣的存儲單元。新的綁定僅為被調用過程的部分名字建立,這些名字在被調用過程的活動記錄中占用的存儲單元。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動態(tài)作用域 r := 0.25;0.250 0.125 show; small; writeln;0.250 0.125 show; small; writeln end.dynamicshowsmallsmallshowshowshow6.3 非部分名字的訪問實現(xiàn)動態(tài)作用域的方法深訪問用控制鏈搜索運轉棧,尋覓包含該非部分名字的第一個活動記錄淺訪問為每個

溫馨提示

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

評論

0/150

提交評論