編譯原理存儲(chǔ)組織演示文稿_第1頁(yè)
編譯原理存儲(chǔ)組織演示文稿_第2頁(yè)
編譯原理存儲(chǔ)組織演示文稿_第3頁(yè)
編譯原理存儲(chǔ)組織演示文稿_第4頁(yè)
編譯原理存儲(chǔ)組織演示文稿_第5頁(yè)
已閱讀5頁(yè),還剩68頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

編譯原理存儲(chǔ)組織演示文稿現(xiàn)在是1頁(yè)\一共有73頁(yè)\編輯于星期四編譯原理第章存儲(chǔ)組織現(xiàn)在是2頁(yè)\一共有73頁(yè)\編輯于星期四第十章目標(biāo)程序運(yùn)行時(shí)的存儲(chǔ)組織概述數(shù)據(jù)空間的使用方法和管理方法棧式存儲(chǔ)分配的實(shí)現(xiàn)參數(shù)傳遞過程操作練習(xí)現(xiàn)在是3頁(yè)\一共有73頁(yè)\編輯于星期四概述一般來講,假如編譯程序從操作系統(tǒng)中得到一塊存儲(chǔ)區(qū)以位目標(biāo)程序在其上運(yùn)行,該存儲(chǔ)區(qū)需容納生成的目標(biāo)代碼和目標(biāo)代碼運(yùn)行時(shí)的數(shù)據(jù)空間。數(shù)據(jù)空間應(yīng)包括:用戶定義的各種類型的數(shù)據(jù)對(duì)象(變量和常數(shù))所需的存儲(chǔ)空間、作為保留中間結(jié)果和傳遞參數(shù)的臨時(shí)工作單元,調(diào)用過程時(shí)所需的連接單元、以及組織輸入/輸出所需的緩沖區(qū)。運(yùn)行時(shí)的存儲(chǔ)區(qū)常常劃分成:目標(biāo)區(qū)、靜態(tài)數(shù)據(jù)區(qū)、棧區(qū)和堆區(qū)。運(yùn)行時(shí)存儲(chǔ)區(qū)的典型劃分編譯程序?qū)?shù)據(jù)空間的分配現(xiàn)在是4頁(yè)\一共有73頁(yè)\編輯于星期四運(yùn)行時(shí)存儲(chǔ)區(qū)的典型劃分代碼(code)區(qū)用以存放目標(biāo)代碼,這是固定長(zhǎng)度的,即編譯時(shí)能確定的。靜態(tài)數(shù)據(jù)區(qū)(staticdata)用以存放編譯時(shí)能確定所占用空間的數(shù)據(jù)。堆棧區(qū)(stackandheap)用于可變數(shù)據(jù)以及管理過程活動(dòng)的控制信息。目標(biāo)程序運(yùn)行時(shí)存儲(chǔ)區(qū)的典型劃分現(xiàn)在是5頁(yè)\一共有73頁(yè)\編輯于星期四編譯程序?qū)?shù)據(jù)空間的分配基本原則是程序語言設(shè)計(jì)時(shí)對(duì)程序運(yùn)行中存儲(chǔ)空間的使用和管理辦法的規(guī)定。數(shù)據(jù)空間的分配:本質(zhì)上看是將程序中的每個(gè)名字與一個(gè)存儲(chǔ)位置關(guān)聯(lián)起來,該存儲(chǔ)位置用以容納名字的值。在程序設(shè)計(jì)語言語義學(xué)中,使用術(shù)語environment表示將一個(gè)名字映射到一個(gè)存儲(chǔ)位置的函數(shù),術(shù)語state表示存儲(chǔ)位置到值的映射。名字到存儲(chǔ)、到值的映射現(xiàn)在是6頁(yè)\一共有73頁(yè)\編輯于星期四數(shù)據(jù)空間的使用方法和管理方法術(shù)語:靜態(tài):如果一個(gè)名字的性質(zhì)通過說明語句或隱或顯規(guī)則而定義,則稱這種性質(zhì)是“靜態(tài)”確定的。動(dòng)態(tài):如果名字的性質(zhì)只有在程序運(yùn)行時(shí)才能知道,則稱這種性質(zhì)為“動(dòng)態(tài)”確定的。靜態(tài)存儲(chǔ)分配動(dòng)態(tài)存儲(chǔ)分配現(xiàn)在是7頁(yè)\一共有73頁(yè)\編輯于星期四靜態(tài)存儲(chǔ)分配如果在編譯時(shí)能確定目標(biāo)程序運(yùn)行中所需的全部數(shù)據(jù)空間的大小,編譯時(shí)安排好目標(biāo)程序運(yùn)行時(shí)的全部數(shù)據(jù)空間,確定每個(gè)數(shù)據(jù)對(duì)象的存儲(chǔ)位置,那么則稱這種分配策略為靜態(tài)存儲(chǔ)分配。示例FORTRAN77的示例程序該程序中局部變量的靜態(tài)存儲(chǔ)位置現(xiàn)在是8頁(yè)\一共有73頁(yè)\編輯于星期四FORTRAN77的程序現(xiàn)在是9頁(yè)\一共有73頁(yè)\編輯于星期四局部變量的靜態(tài)存儲(chǔ)位置現(xiàn)在是10頁(yè)\一共有73頁(yè)\編輯于星期四動(dòng)態(tài)存儲(chǔ)分配如果一個(gè)程序設(shè)計(jì)語言允許遞歸過程、可變數(shù)組或可變數(shù)據(jù)結(jié)構(gòu),那么,就需要采用動(dòng)態(tài)存儲(chǔ)管理技術(shù)。因?yàn)閷?duì)于這種程序在編譯時(shí)無法知道它在運(yùn)行時(shí)需要多大的存儲(chǔ)空間,它所需要的數(shù)據(jù)空間的大小需待程序運(yùn)行時(shí)動(dòng)態(tài)地確定。分類:棧式動(dòng)態(tài)存儲(chǔ)分配堆式動(dòng)態(tài)存儲(chǔ)分配現(xiàn)在是11頁(yè)\一共有73頁(yè)\編輯于星期四棧式動(dòng)態(tài)存儲(chǔ)分配這種分配策略是將整個(gè)程序的數(shù)據(jù)空間設(shè)計(jì)為一個(gè)棧。它適用于Pascal,C,ALGOL之類的語言的實(shí)現(xiàn),每當(dāng)調(diào)用一個(gè)過程時(shí),它所需的數(shù)據(jù)空間就分配在棧頂,每當(dāng)過程工作結(jié)束時(shí)就釋放這部分空間。過程所需的數(shù)據(jù)空間包括兩部分:一部分是生存期在本過程這次活動(dòng)中的數(shù)據(jù)對(duì)象,如局部變量、參數(shù)單元、臨時(shí)變量等等;另一部分則是用以管理過程活動(dòng)的記錄信息,即當(dāng)一次過程調(diào)用出現(xiàn)時(shí),調(diào)用該過程的那個(gè)過程的活動(dòng)即被中斷,當(dāng)前機(jī)器的狀態(tài)信息,諸如程序計(jì)數(shù)器(返回地址)、寄存器的值等等,也都必須保留在棧中。當(dāng)控制從調(diào)用返回時(shí),便根據(jù)棧中記錄的信息恢復(fù)機(jī)器狀態(tài),使該過程的活動(dòng)重新開始。現(xiàn)在是12頁(yè)\一共有73頁(yè)\編輯于星期四堆式動(dòng)態(tài)存儲(chǔ)分配如果一個(gè)程序語言提供用戶自由地申請(qǐng)數(shù)據(jù)空間和退還數(shù)據(jù)空間的機(jī)制(如C++中的new,delete.Pascal的new,便是這種機(jī)制),或者不僅有過程而且有進(jìn)程的程序結(jié)構(gòu),即空間的使用未必服從“先申請(qǐng)后釋放,后申請(qǐng)先釋放”的原則,那么棧式的動(dòng)態(tài)分配方案就不適用了。這種情況下通常使用一種稱為堆式的動(dòng)態(tài)存儲(chǔ)分配方案。假設(shè)程序運(yùn)行時(shí)有一個(gè)大的存儲(chǔ)空間,每當(dāng)需要時(shí)就從這片空間中借用一塊,不用時(shí)再退還,由于借還的時(shí)間先后不一,經(jīng)一段運(yùn)行之后,程序運(yùn)行空間將被分劃成許多塊塊,有些占用,有些空閑。那么當(dāng)運(yùn)行程序要求一塊體積為N的空間時(shí),需要決定應(yīng)該從哪個(gè)空閑塊得到這個(gè)空間。理論上講,應(yīng)該從比N稍大一些的空間塊中取出N個(gè)單元,以便位大的空閑塊派更大的用場(chǎng),但實(shí)現(xiàn)難度很大,實(shí)際中常常采用的辦法是:先遇到哪塊比N大就從其中取出N個(gè)單元。即使這樣,也會(huì)發(fā)生找不到一塊比N大的空閑塊,但所有空閑塊的總和比N大得多的情況,這時(shí),有的分配管理系統(tǒng)采用廢品回收的辦法來應(yīng)付?,F(xiàn)在是13頁(yè)\一共有73頁(yè)\編輯于星期四棧式存儲(chǔ)分配的實(shí)現(xiàn)過程的活動(dòng)記錄簡(jiǎn)單的棧式動(dòng)態(tài)分配實(shí)現(xiàn)嵌套過程語言的棧式實(shí)現(xiàn)分程序結(jié)構(gòu)的存儲(chǔ)管理現(xiàn)在是14頁(yè)\一共有73頁(yè)\編輯于星期四過程的活動(dòng)記錄過程的活動(dòng)記錄是一段連續(xù)的存儲(chǔ)區(qū).用以存放過程的一次執(zhí)行所需要的信息。簡(jiǎn)單描述現(xiàn)在是15頁(yè)\一共有73頁(yè)\編輯于星期四簡(jiǎn)單描述1.臨時(shí)工作單元,比如計(jì)算表達(dá)式過程中需存放中間結(jié)果用的臨時(shí)值單元。2.局部變量,一個(gè)過程的局部變量。3.保存機(jī)器狀態(tài),容納該過程執(zhí)行前關(guān)于機(jī)器狀態(tài)信息,諸如程序計(jì)數(shù)器、寄存器的值,這些值都需要在控制從該過程返回時(shí)給予恢復(fù)。4.存取鏈,用以存取非局部變量,這些變量存放于其它過程活動(dòng)記錄中。并不是所有語言需要該信息。5.控制鏈,指向調(diào)用該過程的那個(gè)過程的活動(dòng)記錄,這也不是所有語言都需要的。6.實(shí)參,也稱形式單元,由調(diào)用過程向該被說過程提供實(shí)參的值(或地址)。當(dāng)然在實(shí)際編譯程序中,也常常使用機(jī)器寄存器傳遞實(shí)參。7.返回地址,保存該被調(diào)過程返回后的地址?,F(xiàn)在是16頁(yè)\一共有73頁(yè)\編輯于星期四簡(jiǎn)單的棧式動(dòng)態(tài)分配實(shí)現(xiàn)要求:沒有分程序結(jié)構(gòu)過程定義不嵌套允許過程遞歸調(diào)用示例:程序結(jié)構(gòu)分配策略存儲(chǔ)分配結(jié)構(gòu)圖活動(dòng)記錄內(nèi)容運(yùn)行?,F(xiàn)在是17頁(yè)\一共有73頁(yè)\編輯于星期四程序結(jié)構(gòu)現(xiàn)在是18頁(yè)\一共有73頁(yè)\編輯于星期四分配策略運(yùn)行時(shí),每當(dāng)進(jìn)入一個(gè)過程,則為該過程分配一段存儲(chǔ)區(qū)。當(dāng)一個(gè)過程工作完畢返回時(shí),它所占用的存儲(chǔ)區(qū)則可釋放。程序運(yùn)行時(shí)的存儲(chǔ)空間,(棧)中在某一時(shí)刻可能會(huì)包含某個(gè)過程的幾個(gè)活動(dòng)記錄(某個(gè)過程遞歸調(diào)用的情況);另外,同樣的一個(gè)存儲(chǔ)位置,可能不同運(yùn)行時(shí)刻分配給不同的數(shù)據(jù)對(duì)象?,F(xiàn)在是19頁(yè)\一共有73頁(yè)\編輯于星期四存儲(chǔ)分配結(jié)構(gòu)圖若主程序調(diào)用了過程Q,Q又調(diào)用了R,在R進(jìn)入運(yùn)行后的存儲(chǔ)結(jié)構(gòu)如圖(a)所示。若主程序調(diào)用了過程Q,Q遞歸調(diào)用自己,在Q過程第二次進(jìn)入運(yùn)行后的存儲(chǔ)結(jié)構(gòu)如圖(b)所示。若主程序先調(diào)用過程Q,然后主程序接著調(diào)用R,且Q過程不調(diào)用Q和R,這時(shí)Q和R進(jìn)入運(yùn)行后的存儲(chǔ)結(jié)構(gòu)分別如圖(c)和(d)所示。現(xiàn)在是20頁(yè)\一共有73頁(yè)\編輯于星期四活動(dòng)記錄內(nèi)容SP總是指向現(xiàn)行過程活動(dòng)記錄的起點(diǎn)。TOP則始終指向已占用的棧頂單元?,F(xiàn)在是21頁(yè)\一共有73頁(yè)\編輯于星期四運(yùn)行棧現(xiàn)在是22頁(yè)\一共有73頁(yè)\編輯于星期四嵌套過程語言的棧式實(shí)現(xiàn)具有嵌套過程的Pascal程序程序中過程定義的嵌套情況存儲(chǔ)棧的布局活動(dòng)記錄情況在過程活動(dòng)記錄中增設(shè)存儲(chǔ)鏈在過程活動(dòng)記錄中存取非局部變量現(xiàn)在是23頁(yè)\一共有73頁(yè)\編輯于星期四具有嵌套過程的Pascal程序現(xiàn)在是24頁(yè)\一共有73頁(yè)\編輯于星期四程序中過程定義的嵌套情況sortreadarrayexchangequicksonpartition可將整個(gè)程序sort看成最外層的過程,readarray、exchange、quickson、partition中引用的a均不是它們的局部變量,而是過程sort的局部變量?,F(xiàn)在是25頁(yè)\一共有73頁(yè)\編輯于星期四存儲(chǔ)棧的布局假如過程sort激活(調(diào)用)了過程quicksort,這時(shí)存儲(chǔ)棧小的情形示意如下圖所示,其中在quicksort過程活動(dòng)記錄中有一(或一些)存儲(chǔ)單元(用斜線描繪)用以記錄過程quicksort以引用sort中定義的變量a和x。現(xiàn)在是26頁(yè)\一共有73頁(yè)\編輯于星期四增設(shè)存儲(chǔ)鏈在活動(dòng)記錄過程中增設(shè)存取鏈,指向包含該過程的直接外層過程的最新活動(dòng)記錄的起始位置。示例:過程活動(dòng)記錄的內(nèi)容圖過程sort調(diào)用過程quicksort的存儲(chǔ)棧圖如果某次執(zhí)行的順序?yàn)?sort→quicksort→quicksort→partition→exchange→?進(jìn)入過程exchange之后的運(yùn)行棧圖?,F(xiàn)在是27頁(yè)\一共有73頁(yè)\編輯于星期四過程活動(dòng)記錄的內(nèi)容圖現(xiàn)在是28頁(yè)\一共有73頁(yè)\編輯于星期四過程sort調(diào)用過程quicksort的存儲(chǔ)棧圖現(xiàn)在是29頁(yè)\一共有73頁(yè)\編輯于星期四進(jìn)入過程exchange之后的運(yùn)行棧圖現(xiàn)在是30頁(yè)\一共有73頁(yè)\編輯于星期四存取非局部變量存取非局部變量的辦法是常用的有效辦法。即每進(jìn)入一個(gè)過程后,在建立它的活動(dòng)記錄的同時(shí)建立一張嵌套層次顯示表display。display是一個(gè)指針數(shù)組d,也可看作是一個(gè)小棧,自頂向下每個(gè)單元依次存放著現(xiàn)行層,直接外層,……直至最外層(0層,主程序?qū)?等每一層過程的最新活動(dòng)記錄的地址。示例:1)sort→quicksort?;2)sort→quicksort→quicksort?;3)sort→quicksort→quicksort→partition?;4)sort→quicksort→quicksort→partition→exchange?

過程調(diào)用時(shí)display的建立現(xiàn)在是31頁(yè)\一共有73頁(yè)\編輯于星期四1的運(yùn)行棧和display現(xiàn)在是32頁(yè)\一共有73頁(yè)\編輯于星期四2的運(yùn)行棧和display現(xiàn)在是33頁(yè)\一共有73頁(yè)\編輯于星期四3的運(yùn)行棧和display現(xiàn)在是34頁(yè)\一共有73頁(yè)\編輯于星期四4的運(yùn)行棧和display現(xiàn)在是35頁(yè)\一共有73頁(yè)\編輯于星期四過程調(diào)用時(shí)display的建立當(dāng)過程P1調(diào)用過程P2而進(jìn)入P2后,P2為了建立自己的display,P2必須知道它的直接外層過程(記為P0)的display。這意味著,當(dāng)P1調(diào)用P2時(shí)必須把P0的display地址作為連接數(shù)據(jù)之一傳給P2。display的構(gòu)造P2是真實(shí)過程時(shí)的構(gòu)造P2是形式參數(shù)時(shí)的構(gòu)造現(xiàn)在是36頁(yè)\一共有73頁(yè)\編輯于星期四真實(shí)過程時(shí)的構(gòu)造P0或者就是P1自身或者既是P1又是P2的直接外層(示意圖)。不論哪一種情形,只要在進(jìn)入P2后能夠知道P1的display就能知道P0的display,從而可直接構(gòu)造出P2的display。事實(shí)上,只需從P1的display中自底而上地取過l2個(gè)單元(l2為P2的層數(shù))再添上進(jìn)入P2后新建立的SP值就構(gòu)成了P2的display。也就是說,在這種情況下,只需把P1的display地址作為連接數(shù)據(jù)之一傳送給P2就能夠建立P2的display?,F(xiàn)在是37頁(yè)\一共有73頁(yè)\編輯于星期四P1調(diào)用P2的兩種不同嵌套示意圖現(xiàn)在是38頁(yè)\一共有73頁(yè)\編輯于星期四形式參數(shù)時(shí)的構(gòu)造調(diào)用P2意味著調(diào)用P2當(dāng)前相應(yīng)的實(shí)在過程。此時(shí)的P0應(yīng)是這個(gè)實(shí)在過程的直接外層過程。假定P0的display地址可從形式單元P2所指示的地方獲得。為了能在P2中獲得P0的display地址,必須在P1調(diào)用P2時(shí)設(shè)法把P1的display地址作為連接數(shù)據(jù)之一(稱為“全局display地址”)傳送給P2。于是連接數(shù)據(jù)變?yōu)槿?xiàng):(1)老SP值;(2)返回地址;(3)全局display地址?,F(xiàn)在是39頁(yè)\一共有73頁(yè)\編輯于星期四分程序結(jié)構(gòu)的存儲(chǔ)管理概述聲明作用域遵循的原則——最近嵌套原則分程序結(jié)構(gòu)的存儲(chǔ)管理分程序結(jié)構(gòu)的存儲(chǔ)實(shí)現(xiàn)方法視分程序?yàn)椤盁o參過程”視分程序?yàn)橥暾倪^程體活動(dòng)記錄的內(nèi)容分程序的進(jìn)入和退出時(shí)活動(dòng)記錄的情況現(xiàn)在是40頁(yè)\一共有73頁(yè)\編輯于星期四概述一個(gè)分程序是一個(gè)含有它自己的局部數(shù)據(jù)(變量)聲明的語句。示例:C語言,一個(gè)分程序的語法形式是:{聲明語句}C語言的一個(gè)分程序分程序的特征是它們的嵌套結(jié)構(gòu),使用界符標(biāo)明分程序的開始和結(jié)束。界符保證一個(gè)分程序要么與別的分程序無關(guān),要么是嵌在別的分程序中,這種嵌套性有時(shí)稱作“分程序結(jié)構(gòu)”現(xiàn)在是41頁(yè)\一共有73頁(yè)\編輯于星期四C語言的一個(gè)分程序現(xiàn)在是42頁(yè)\一共有73頁(yè)\編輯于星期四最近嵌套原則1、一個(gè)分程序B中的一個(gè)聲明的作用域包含在B中。2、如果某個(gè)名字x未在分程序B中聲明。那么,若B中出現(xiàn)的x的聲明的作用域是在B的包含層B’中,則應(yīng)該:(1)B’中有x的聲明;(2)B’與任何別的包含有x聲明的分程序相比,它是最近包圍B的分程序?,F(xiàn)在是43頁(yè)\一共有73頁(yè)\編輯于星期四分程序結(jié)構(gòu)的存儲(chǔ)管理分程序結(jié)構(gòu)用棧式存儲(chǔ)分配實(shí)現(xiàn),是因?yàn)橐粋€(gè)聲明的作用域不會(huì)落在它出現(xiàn)的分程序之外,該聲明的空間可以在分程序進(jìn)入時(shí)分配。現(xiàn)在是44頁(yè)\一共有73頁(yè)\編輯于星期四無參過程把分程序看成一個(gè)“無參過程”,只不過是在該分程序前調(diào)用,分程序之后返回,分程序在哪里定義就在哪里被調(diào)用。效率低下的原因解決效率低的辦法現(xiàn)在是45頁(yè)\一共有73頁(yè)\編輯于星期四效率低下的原因第一分程序不存在被調(diào)用的問題,不必要在進(jìn)入一個(gè)分程序時(shí),將連接數(shù)據(jù)(如動(dòng)態(tài)鏈、返回地址等)和display都放進(jìn)活動(dòng)記錄中;第二,當(dāng)從內(nèi)層分程序向外轉(zhuǎn)移時(shí)可能同時(shí)要結(jié)束若干個(gè)分程序,恢復(fù)所要到達(dá)的那個(gè)分程序的數(shù)據(jù)區(qū)需要順序退出,浪費(fèi)時(shí)間,降低效率?,F(xiàn)在是46頁(yè)\一共有73頁(yè)\編輯于星期四解決效率低的辦法首先,代替原來的那個(gè)統(tǒng)一的棧頂指示器,讓每個(gè)過程和分程序都有自己的棧頂指示器TOP,它的值保存在各自的活動(dòng)記錄中。這樣上述第二個(gè)問題即可解決;其次,不把分程序看作“無參過程”,而讓每個(gè)分程序享用包圍它的那個(gè)最小過程的display。每個(gè)分程序都隸屬于某個(gè)確定的過程,分程序的層次是相對(duì)于它所屬的那個(gè)過程進(jìn)行編號(hào)的。每個(gè)過程被當(dāng)作0層分程序,而過程體分程序(假定是一個(gè)分程序)當(dāng)作是它所管轄的第一層分程序?,F(xiàn)在是47頁(yè)\一共有73頁(yè)\編輯于星期四完整過程體每次為一個(gè)完整的過程體分配存儲(chǔ),即把一個(gè)過程體中的所有分程序所需的存儲(chǔ)一次分配好?,F(xiàn)在是48頁(yè)\一共有73頁(yè)\編輯于星期四活動(dòng)記錄的內(nèi)容內(nèi)容:1.過程的TOP單元,指向活動(dòng)記錄的棧頂位置;2.連接數(shù)據(jù),共4項(xiàng):(1)老SP值;(2)返回地址;(3)全局display地址;(4)調(diào)用時(shí)的棧頂單元地址,稱作老TOP。3.參數(shù)個(gè)數(shù)和形式單元。4.display表。5.過程所管轄的各分程序的局部數(shù)據(jù)單元對(duì)每個(gè)分程序來說,它們包括:(1)一個(gè)名為TOP的單元,當(dāng)進(jìn)入時(shí)它含現(xiàn)行棧頂?shù)刂?,以后用來存放棧的新高度?2)分程序的局部變量、數(shù)組內(nèi)情向量和臨時(shí)工作單元。示例:程序活動(dòng)記錄現(xiàn)在是49頁(yè)\一共有73頁(yè)\編輯于星期四ALGOL的一個(gè)程序現(xiàn)在是50頁(yè)\一共有73頁(yè)\編輯于星期四ALGOL的活動(dòng)記錄現(xiàn)在是51頁(yè)\一共有73頁(yè)\編輯于星期四活動(dòng)記錄的情況分程序進(jìn)入時(shí)分程序退出時(shí)分程序結(jié)構(gòu)數(shù)據(jù)區(qū)變化圖現(xiàn)在是52頁(yè)\一共有73頁(yè)\編輯于星期四分程序進(jìn)入時(shí)的活動(dòng)記錄每個(gè)分程序在進(jìn)入時(shí),都有它自己的一個(gè)TOP單元,剛進(jìn)入時(shí),它的TOP值是由其直接外層分程序的TOP單元的內(nèi)容所賦予的。一旦定義了TOP值后,就對(duì)該分程序的所有局部數(shù)組進(jìn)行地址分配。每分配一個(gè)數(shù)組區(qū)后,TOP的值隨即調(diào)整指向新的棧頂位置。過程看成0層分程序、它是通過調(diào)用而進(jìn)入的,它的TOP值是調(diào)用時(shí)的棧頂?shù)刂芳由纤幕顒?dòng)記錄的長(zhǎng)度L,L是在編譯時(shí)靜態(tài)計(jì)算出來的。運(yùn)行中每逢進(jìn)入分程序(除0層分程序外),即執(zhí)行分程序的begin語句時(shí),只需把直接外層分程序的TOP值抄進(jìn)自己的TOP單元中。由于分程序的數(shù)據(jù)區(qū)起點(diǎn)(分程序TOP單元所在處)可在編譯時(shí)靜態(tài)地確定,因此,這個(gè)抄送動(dòng)作只需用兩條指令就可完成。所以,進(jìn)入分程序所要做的工作是非常簡(jiǎn)單的。在進(jìn)入分程序建立TOP單元的值之后,執(zhí)行第一個(gè)執(zhí)行句之前,如果有數(shù)組說明則應(yīng)對(duì)所定義的數(shù)組分配存儲(chǔ)空間。數(shù)組空間分配之后,TOP調(diào)整為指向新的棧頂(新分配的數(shù)組區(qū)的頂端)?,F(xiàn)在是53頁(yè)\一共有73頁(yè)\編輯于星期四分程序退出時(shí)的活動(dòng)記錄在分程序工作完畢正常退出時(shí),即到達(dá)分程序的end語句時(shí),無需進(jìn)行任何退棧的工作。換句話說,分程序的正常出口不需要執(zhí)行任何指令?,F(xiàn)在是54頁(yè)\一共有73頁(yè)\編輯于星期四分程序結(jié)構(gòu)數(shù)據(jù)區(qū)變化圖現(xiàn)在是55頁(yè)\一共有73頁(yè)\編輯于星期四參數(shù)傳遞傳值傳地址傳結(jié)果傳名字過程參數(shù)現(xiàn)在是56頁(yè)\一共有73頁(yè)\編輯于星期四傳值傳值,即call-by-value,也稱值調(diào)用,是最簡(jiǎn)單的參數(shù)傳遞方法。即將實(shí)參計(jì)算出它的值.然后把它傳給被調(diào)過程。參數(shù)傳遞方法的不同主要基于實(shí)在參數(shù)是表達(dá)一個(gè)右值,一個(gè)左值,還是實(shí)在參數(shù)本身的文本(字)?!白蟆焙汀坝摇眮碜再x值語句的“左”端和“右”端。左值:(l-value)指表達(dá)式代表的存儲(chǔ)。右值:(r-value)指該存儲(chǔ)位置中含有的值。傳值的具體內(nèi)容傳值的特點(diǎn)傳值的示例現(xiàn)在是57頁(yè)\一共有73頁(yè)\編輯于星期四傳值的具體內(nèi)容1、形式參數(shù)當(dāng)作過程的局部變量處理,即在被調(diào)過程的活動(dòng)記錄中開辟了形參的存儲(chǔ)空間,這些存儲(chǔ)位置即是實(shí)參或形式單元。2、調(diào)用過程計(jì)算實(shí)參的值,并將它們的右值(r-value)放在為形式單元開辟的空間中。3、被調(diào)用過程執(zhí)行時(shí),就像使用局部變量一樣使用這些形式單元?,F(xiàn)在是58頁(yè)\一共有73頁(yè)\編輯于星期四傳值的特點(diǎn)傳值或值調(diào)用的重要特點(diǎn)是對(duì)形式參數(shù)的任何運(yùn)算不影響調(diào)用過程的活動(dòng)記錄中實(shí)參的值?,F(xiàn)在是59頁(yè)\一共有73頁(yè)\編輯于星期四傳值的示例該程序的輸出是:a=2,b=l如果將第3行的關(guān)鍵字var去掉,則是以傳值方式將x和y傳遞給過程swap,第12行swap(a,b)調(diào)用過程將不會(huì)影響a和b的值,則該程序的輸出是:a=1,b=2?,F(xiàn)在是60頁(yè)\一共有73頁(yè)\編輯于星期四傳地址當(dāng)參數(shù)通過引用傳遞時(shí),稱作傳地址,或引用調(diào)用(call-by-reference)。調(diào)用過程傳給被調(diào)過程的是指針,指向?qū)崊⒋鎯?chǔ)位置的指針。1、如實(shí)參是一個(gè)名字或是具有左值的表達(dá)式,則左值本身傳遞過去。2、如實(shí)參是一表達(dá)式,比方a+b或2,而沒有左值,則表達(dá)式先求值,并存入某一位置,然后該位置的地址傳遞過去。3、被調(diào)過程中對(duì)形式參數(shù)的任何引用和賦值都通過傳遞到被調(diào)過程的指針被處理成間接訪問。示例

現(xiàn)在是61頁(yè)\一共有73頁(yè)\編輯于星期四傳地址示例若用實(shí)參i和a[i]對(duì)過程swap進(jìn)行調(diào)用,即swap(i,a[i]),其效果如下步驟所述:1、將i和a[i]的地址(左值)拷貝到被調(diào)過程的活動(dòng)記錄中,比如說分別對(duì)應(yīng)形參x和y的單元arg1和arg2。2、將局部變量temp設(shè)為由arg1所指單元的內(nèi)容(即令temp等于I0,其中I0是i的初值),這一步對(duì)應(yīng)于swap定義中的第6行語句temp=x。3、將arg1所指單元的內(nèi)容設(shè)為arg2所指單元的值,即i:=a[I0],這一步對(duì)應(yīng)于swap定義中第7行的x:=y(tǒng)。4、將arg2所指單元的內(nèi)容設(shè)為等于temp的值,即,設(shè)a[I0]=i,這一步對(duì)應(yīng)y:=temp?,F(xiàn)在是62頁(yè)\一共有73頁(yè)\編輯于星期四傳結(jié)果傳結(jié)果(call-by-value-result):處理的每一形參,需分配兩個(gè)形式單元,分別稱為該形參的第一形式單元和第二形式單元,其中第二形式單元被視為過程體的局部單元。實(shí)現(xiàn)這種傳遞的方法是:在進(jìn)行入過程時(shí),將實(shí)參的地址送入相應(yīng)形參的第一形式單元,將實(shí)參之值送入第二形式單元。在退出過程時(shí),再將第二形式單元中形參的終值再按第一形式單元中的實(shí)參地址賦給相應(yīng)的實(shí)參,所以有時(shí)又將這種參數(shù)傳遞稱為復(fù)寫存貯連接?,F(xiàn)在是63頁(yè)\一共有73頁(yè)\編輯于星期四傳名字傳名字(call-by-name)。這種數(shù)據(jù)傳遞方式是:將實(shí)在參數(shù)的名字傳給過程中相應(yīng)的形式參數(shù),也就是,過程體中的形式參數(shù)都要用相應(yīng)的實(shí)在參數(shù)的名字進(jìn)行替換。這種名字替換的實(shí)質(zhì)是:在過程說明的目標(biāo)程序中,在形式參數(shù)出現(xiàn)的地方都要使用相應(yīng)實(shí)在參數(shù)當(dāng)時(shí)的值或地址?,F(xiàn)在是64頁(yè)\一共有73頁(yè)\編輯于星期四過程參數(shù)一個(gè)嵌套過程(函數(shù))可以作為參數(shù)傳遞。示例:嵌套過程代碼過程參數(shù)傳遞情況現(xiàn)在是65頁(yè)\一共有73頁(yè)\編輯于星期四嵌套過程程序代碼(1)programparam(input,ouput);(2)procedureb(fuctionh(n:integer):integer);(3)beginwriteln(h(2))end;(4)procedurec;(5)varm;integer;(6)functionf(n:integer):integer;(7)beginf:=m+nend{f};(8)beginm:=0;b(f)end{c};(9)begin(10)c(11)end現(xiàn)在是66頁(yè)\一共有73頁(yè)\編輯于星期四過程參數(shù)傳遞情況過程c把f作為參數(shù)傳遞給b,而b通過引用形參h調(diào)用f。要注意的是:函數(shù)f有一非局部量m。但m的作用域并不包括b的過程體。b中的語句writeln(h(2))激活f,是因

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(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)論