【正文】
一則,每逢進入 一個分程序,就照樣建立連接數(shù)據(jù)和 DISPLAY表 ,這是不必要的。 B4:begin array C[1:m]。 ?全局 DISPLAY地址 棧式存儲組織 review 數(shù)據(jù)空間的存儲管理:棧式存儲分配 – 過程 (函數(shù) )的活動記錄:是一段連續(xù)的存儲區(qū),存放過程 (函數(shù) )的一次執(zhí)行所需要的信息。 局部變量 中間結果 目標代碼的解釋執(zhí)行 運行棧S ? M調用過程 P RA DL SL b . . t t b P M 解決對非局部量的引用(存?。? 用 Display表 Display表 嵌套層次顯示表 當前激活過程的層次為 K,它的 Display表含有 K+1個單元,依次存放著現(xiàn)行層,直接外層 … 直至最外層的每一過程的最新活動記錄的基地址 例:pr og ra m m ai n(i , 0)。 end。 ? 關鍵技術:解決對非局部量的引用(存取)。 一個過程的一次執(zhí)行所需要的信息使用一個連續(xù)的存儲區(qū)來 管理,這個區(qū) (塊)叫做一個活動記錄 AR或 frame 幀 一般這個段要記錄: l 臨時值,如計算表達式時的中間工作單元。 ? begin real z。 ? array B[m:n]。 l 局部變量 (數(shù)據(jù)) l 保存運行過程前的狀態(tài) (返回地址,寄存器值 …… ) l 存取鏈 (可選) 對于非局部量的引用。 ? 設法跟蹤每個外層過程的最新活動記錄AR的位置。 begin read(b)。 程序結構圖 ?? pr oc R( c , d)。 – 過程 (函數(shù) )活動記錄的內容:聯(lián)系單元(靜態(tài)鏈 ,動態(tài)鏈和返回地址)、局部變量和臨時變量 棧式存儲分配的實現(xiàn): ? 設置兩個指針:棧頂指針 Top和當前活動記錄指針 SP; ? 調用一個過程 (函數(shù) )前,先把過程 (函數(shù) )的參數(shù)壓入數(shù)據(jù)棧; ? 在數(shù)據(jù)棧中為過程 (函數(shù) )的活動記錄分配空間; ? 填寫聯(lián)系單元內容; ? 執(zhí)行過程 (函數(shù) )代碼; ? 過程 (函數(shù) )返回前,根據(jù)當前 SP恢復 Top指針,根據(jù)動態(tài)鏈恢復 SP為外層過程 (函數(shù) )的活動記錄起始地址,根據(jù)返回地址得到下一條指令地址; ? 繼續(xù)執(zhí)行外層過程 (函數(shù) )代碼。 1 B5:begin real e。 二則 ,當從內層分程序向外層轉移時,可能同時要結束若干個分程序。每個分程序都隸屬于某個確定的過程,分程序的層次是相對于它所屬的那個過程進行編號的。當進入分程序時它含現(xiàn)行棧頂?shù)刂?,以后,用來定義棧的新高度(分程序的 TOP值); ( 2)分程序的局部變量, 數(shù)組內情向量和臨時工作單元。 a[j]:=x (5) end。 (10)begin (11) a:=1。 swap(a,b); 其結果: a,b調用前的值不改變。 其結果等價于執(zhí)行下列運算: x :=a; y :=b; temp :=x; x :=y; y :=temp 傳地址 的實現(xiàn) ( call by reference )(callbyaddress)(callbylocation) 把實在參數(shù)的地址傳遞給相應的形參,即 調用過程把一個指向實參的存儲地址的指針傳遞給被調用過程相應的形參: 1實在參數(shù)是一個名字,或具有左值的表達式 傳遞左值 2實在參數(shù)是無左值的表達式 計算值,放入一存儲單元,傳此存儲單元地址 3目標代碼中,被調用過程對形參的引用變成對傳遞給被調用過程的指針的間接引用 procedure swap( x,y:integer)。 *y=temp。 ? (2)procedure b(function h(n:integer):integer)。 ? (9)begin ? (10) c ? (11)end 嵌套過程作為參數(shù)傳遞 p a r a m c 存取鏈 m b f . 存取鏈 連同存取鏈一起 傳遞過程實參 堆式動態(tài)存儲分配 ? 需求: – 一個程序語言允許用戶自由地申請數(shù)據(jù)空間和退還數(shù)據(jù)空間,或者不僅有過程而且有進程( process)的程序結構, ? 操作: – 堆提供兩個操作,分配操作和釋放操作 ? 情況 : – 經一段運行時間之后,這個大空間就必定被分劃成許多塊塊,有些占用,有些無用(空閑) 碎片問題 程序語言允許用戶自由地申請數(shù)據(jù)空間和退還數(shù)據(jù)空間 ? C++語言中 new操作符施加在一個類型標識符上 ( 包括類名 ) ? Pascal語言中 , 標準過程 new能夠動態(tài)建立存儲空間并相應地置上指針 。此時,只記錄一次方法指針(在類結構中),而且對于每個對象并不將其復制到存儲器中。 void f1(){…} } class B extends A {void f2(){…} } class C entends B {void f2(){…} } class D extends C{bool m2。 void init(int p,string s){price=p。 (100,apple)。 day=Tuesday。} void print(){ Print(On ,day, the price of ,name, is ,price,\n)。 class B b。其缺點在于:雖然實例變量具有可預測的偏移量(正如在標準環(huán)境中的局部變量一樣),方法卻沒有,而且它們必須由帶有查詢功能的符號表結構中的名字維護。 ? C語言中有這些操作的若干個版本 , 但最基本的是 malloc和 free, 它們都是標準庫 ( stdlib)的一部分 面向對象的語言的動態(tài)存儲 面向對象的語言在運行時環(huán)境中要求特殊的機制以完成其增添的特性:對象 、 方法 、繼承以及動態(tài)綁定 。 ? (4)procedure c。 (8) swap(amp。 begin temp:=x。 ? ,并將其放在對應形式單元開辟的空間中。 (12) swap(a,b)。 (2)var a,b:integer。 B 的 內 情 向 量 Z B1的 T O P D I S P L A Y 形式單元 m , n 2 連 接 數(shù) 據(jù) A 的 T O P ∶