




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第9章符號表Evaluation Warning: The document was created with Spire.Doc for .NET.第十章 目標程序運行時的存儲組織課前索引【課前思考考】 回顧一一般的編編譯過程程,能否否找到本本章所講講內(nèi)容在在哪個過過程? 為什么么編譯程程序要考考慮目標標程序運運行時存存儲區(qū)的的管理和和組織? 請歸歸納C語語言和PPASCCAL語語言的程程序結(jié)構(gòu)構(gòu)和數(shù)據(jù)據(jù)類型的的不同點點【學習習目標】全面了解目標程序運行時存儲區(qū)的整體布局;每種存儲區(qū)的組織方式和管理方法;并通過實例著重掌握,對允許過程嵌套定義的情況,棧式動態(tài)存儲分配的組織方式和運行時進棧退棧
2、的活動實現(xiàn)方法?!緦W習指南】在代碼生成前,編譯程序必須進行目標程序運行環(huán)境的配置和數(shù)據(jù)空間的分配。一般來講,假如編譯程序從操作系統(tǒng)中得到一塊存儲區(qū)以使目標程序在其上運行,該存儲區(qū)需容納生成的目標代碼和目標代碼運行時的數(shù)據(jù)空間。我們這里所說的運行時的存儲區(qū)組織,是指目標程序運行時的數(shù)據(jù)空間的管理和組織。【難重點】 目標程序運行時,存儲區(qū)域的整體布局,以及各區(qū)域的作用。 各種不同類型的數(shù)據(jù)表示。 允許過程嵌套定義的情況,棧式動態(tài)分配的組織管理。 對過程的調(diào)用,進入和退出時,棧式動態(tài)分配的工作原理。 過程活動紀錄的各項內(nèi)容和它們的作用,以及活動紀錄的組織方式。 過程參數(shù)傳遞的不同方式?!局R結(jié)構(gòu)】第
3、11章代碼優(yōu)化從邏輯上看看,在代代碼生成成前,編編譯程序序必須進進行目標標程序運運行環(huán)境境的配置置和數(shù)據(jù)據(jù)空間的的分配。一一般來講講,假如如編譯程程序從操操作系統(tǒng)統(tǒng)中得到到一塊存存儲區(qū)以以使目標標程序在在其上運運行,該該存儲區(qū)區(qū)需容納納生成的的目標代代碼和目目標代碼碼運行時時的數(shù)據(jù)據(jù)空間。數(shù)數(shù)據(jù)空間間應(yīng)包括括:用戶戶定義的的各種類類型的數(shù)數(shù)據(jù)對象象(變量量和常數(shù)數(shù))所需需的存儲儲空間,作作為保留留中間結(jié)結(jié)果和傳傳遞參數(shù)數(shù)的臨時時工作單單元,調(diào)調(diào)用過程程時所需需的連接接單元,以以及組織織輸入/輸出所所需的緩緩沖區(qū)。目目標代碼碼所占用用空間的的大小在在編譯時時能確定定。有些些數(shù)據(jù)對對象所占占用的空
4、空間也能能在編譯譯時確定定,其地地址可以以編譯進進目標代代碼中。而而有些數(shù)數(shù)據(jù)對象象具有可可變體積積和待分分配性質(zhì)質(zhì),無法法在編譯譯時確定定存儲空空間的位位置。因此運行時時的存儲儲區(qū)常常常劃分成成:目標標區(qū)、靜靜態(tài)數(shù)據(jù)據(jù)區(qū)、棧棧區(qū)和堆堆區(qū),如如圖100.1就就是一種種典型劃劃分,代代碼(ccodee)區(qū)用用以存放放目標代代碼,這這是固定定長度的的,即編編譯時能能確定的的;靜態(tài)態(tài)數(shù)據(jù)區(qū)區(qū)(sttatiic ddataa)用以以存放編編譯時能能確定所所占用空空間的數(shù)數(shù)據(jù);堆堆棧區(qū)(staack andd heeap)用于可可變數(shù)據(jù)據(jù)以及管管理過程程活動的的控制信信息。圖10.11 目標標程序運運行
5、時存存儲區(qū)的的典型劃劃分codestatiic ddataastackk heap所謂數(shù)據(jù)空空間的分分配,本本質(zhì)上看看,是將將程序中中的每個個名字與與一個存存儲位置置關(guān)聯(lián)起起來,該該存儲位位置用以以容納名名字的值值。編譯譯程序分分配目標標程序運運行時的的數(shù)據(jù)空空間的基基本依據(jù)據(jù)是程序序語言設(shè)設(shè)計時對對程序運運行中存存儲空間間的使用用和管理理辦法的的規(guī)定。我我們知道道,即便便有些名名字在程程序中只只聲明了了一次,但但該名字字可能對對應(yīng)運行行時不同同的存儲儲位置,比比如,一一個遞歸歸調(diào)用的的過程,在在執(zhí)行時時,其同同一個局局部名字字應(yīng)該對對應(yīng)不同同的運行行空間位位置以容容納每次次執(zhí)行時時的值。在在
6、程序設(shè)設(shè)計語言言語義學學中,使使用術(shù)語語envviroonmeent表表示將一一個名字字映射到到一個存存儲位置置的函數(shù)數(shù),術(shù)語語staate表表示存儲儲位置到到值的映映射,使使用術(shù)語語eenviironnmennt函數(shù)數(shù)表示ennv: NSS (NN到S的的映射)如如圖100.2所所示。圖10.22 名字字 到存存儲、到到值的映映射編譯程序分分配目標標程序運運行時的的數(shù)據(jù)空空間的基基本依據(jù)據(jù)是程序序語言設(shè)設(shè)計時對對程序運運行中存存儲空間間的使用用和管理理辦法的的規(guī)定。決決定存儲儲管理復復雜程度度的因素素-源源語言本本身,比比如源語語言允許許的數(shù)據(jù)據(jù)類型有有多少?語言中中允許的的數(shù)據(jù)項項是靜態(tài)態(tài)
7、確定還還是動態(tài)態(tài)確定?程序結(jié)結(jié)構(gòu)有什什么特點點,是段段結(jié)構(gòu)還還是分程程序結(jié)構(gòu)構(gòu)?過程程定義是是否允許許嵌套?等等。 源源語言的的結(jié)構(gòu)特特點、源源語言的的數(shù)據(jù)類類型、源源語言中中決定名名字作用用域的規(guī)規(guī)則等因因素影響響存儲空空間的管管理和組組織的復復雜程度度,決定定數(shù)據(jù)空空間分配配的基本本策略。本章將介紹存儲空間的使用管理方法,重點針對棧式動態(tài)存儲分配的實現(xiàn)進行討論。10.1 數(shù)據(jù)空空間的三三種不同同使用方方法和管管理方法法數(shù)據(jù)空間的的使用和和管理方方法分成成三種:靜態(tài)存存儲分配配、棧式式動態(tài)存存儲分配配和堆式式動態(tài)存存儲分配配。100.1.1 靜靜態(tài)存儲儲分配這種種存儲分分配非常常簡單,如如果
8、在編編譯時能能確定目目標程序序運行中中所需的的全部數(shù)數(shù)據(jù)空間間的大小小,編譯譯時安排排好目標標程序運運行時的的全部數(shù)數(shù)據(jù)空間間,確定定每個數(shù)數(shù)據(jù)對象象的存儲儲位置,稱稱這種分分配策略略為靜態(tài)態(tài)存儲分分配。如如果一個個名字的的性質(zhì)通通過說明明語句或或隱式或或顯式規(guī)規(guī)則而定定義,則則稱這種種性質(zhì)是是靜態(tài)態(tài)確定定的。像FORTTRANN這樣的的語言,其其程序是是段結(jié)構(gòu)構(gòu)的,即即由主程程序段和和若干子子程序段段組成。各各程序段段中定義義的名字字一般是是彼此獨獨立的(除除公共塊塊和等價價語句說說明的名名字以外外),也也即各段段的數(shù)據(jù)據(jù)對象名名的作用用域在各各段中,同同一個名名字在不不同的程程序段表表示不
9、同同的存儲儲單元,不不會在不不同段間間互相引引用、賦賦值。另另外它的的每個數(shù)數(shù)據(jù)名所所需的存存儲空間間大小都都是常量量(即不不許含可可變體積積的數(shù)據(jù)據(jù),如可可變數(shù)組組),且且所有數(shù)數(shù)據(jù)名的的性質(zhì)是是完全確確定的。這這樣,整整個程序序所需數(shù)數(shù)據(jù)空間間的總量量在編譯譯時完全全確定,從從而每個個數(shù)據(jù)名名的地址址就可靜靜態(tài)進行行分配。換換句話說說,一旦旦存儲空空間的某某個位置置分配給給了某個個數(shù)據(jù)名名(關(guān)聯(lián)聯(lián)起來)之之后,在在目標程程序的整整個運行行過程中中,此位位置(地地址)就就屬于該該數(shù)據(jù)名名了。圖10.44給出一一個FOORTRRAN 77的的程序例例子。在在圖100.5中中描述了了該程序序中局
10、部部變量的的靜態(tài)存存儲位置置。圖10.44 一個個FORRTRAAN 777的例例子 (1) PRROGRRAM CNSSUMEE(2) CHAARACCTERR * 50 BUFF /程序體體所擁有有的靜態(tài)態(tài)量BUUF(3) INNTEGGER NEXXT /程序序體所擁擁有的靜靜態(tài)量NNEXTT(4) CHAARACCTERR C, PRRDUCCE /程序序體所擁擁有的靜靜態(tài)量CC(5) DATTA NNEXTT /11/, BUFF / /(66) 66 CC=PRRDUCCE()(7) BBUF(NEXXT:NNEXTT)=CC (8) NEXXT=NNEXTT+1(99) IFF(
11、C .ENN. )GOOTO 6(100) WRRITEE ( *, (A) )BBUF(111) ENDD(12) CHHARAACTEER FFUNCCTIOON PPRDUUCE()(133) CHAARACCTERR * 80 BUFFFERR(14) IINTEEGERR NEEXT(115) SAAVE BUFFFERR, NNEXTT/PPRDUUCE函函數(shù)體所所擁有的的靜態(tài)量量BUFFFERR, NNEXTT(16) DDATAA NEEXT /811/(177) IF (NEEXT .GTT.800)THHEN(118) RREADD ( *, (A) )BBUFFFER(1
12、19) NNEXTT=1(220) ENND IIF(211)PPRDUUCE=BUFFFERR(NEEXT:NEXXT)(222) NEEXT=NEXXT+11(23)ENND圖10.55 FOORTRRAN777的靜靜態(tài)存儲儲分配10.1.2 動動態(tài)存儲儲分配如果果一個程程序設(shè)計計語言允允許遞歸歸過程、可可變數(shù)組組或允許許用戶自自由申請請和釋放放空間,那那么,就就需要采采用動態(tài)態(tài)存儲管管理技術(shù)術(shù)。因為為對于這這種程序序在編譯譯時無法法知道它它在運行行時需要要多大的的存儲空空間,它它所需要要的數(shù)據(jù)據(jù)空間的的大小需需待程序序運行時時動態(tài)地地確定。若一個數(shù)組組所需的的存儲空空間的大大小在編編譯時
13、就就已知道道,則稱稱它為確確定數(shù)組組,否則則稱為可可變數(shù)組組。例 : proocedduree A(m,nn:inntegger);beggin reaal zz;arrrayy Bm:nn;beeginn ennd;ennd;Bm:nn 為為可變數(shù)數(shù)組,BB的上下下界是過過程A的的實參,AA被調(diào)用用時才能能確定。動動態(tài)存儲儲管理技技術(shù)有兩兩種方式式:棧式式(sttackk)和堆堆式(hheapp)。下下面簡述述這兩種種方式的的原則。1.棧式動動態(tài)存儲儲分配這種種分配策策略是將將整個程程序的數(shù)數(shù)據(jù)空間間設(shè)計為為一個棧棧。在具具有遞歸歸結(jié)構(gòu)的的語言程程序中,每每當調(diào)用用一個過過程時,它它所需的的
14、數(shù)據(jù)空空間就分分配在棧棧頂,每每當過程程工作結(jié)結(jié)束時就就釋放這這部分空空間。過過程所需需的數(shù)據(jù)據(jù)空間包包括兩部部分:一一部分是是生存期期在本過過程這次次活動中中的數(shù)據(jù)據(jù)對象,如如局部變變量、參參數(shù)單元元、臨時時變量等等等;另另一部分分則是用用以管理理過程活活動的記記錄信息息。即當當一次過過程調(diào)用用出現(xiàn)時時,調(diào)用用該過程程的那個個過程的的活動即即被中斷斷,當前前機器的的狀態(tài)信信息,諸諸如程序序計數(shù)器器(返回回地址)、寄寄存器的的值等等等,也都都必須保保留在棧棧中。當當控制從從調(diào)用返返回時,便便根據(jù)棧棧中記錄錄的信息息恢復機機器狀態(tài)態(tài),使該該過程的的活動繼繼續(xù)進行行。至于于在這種種分配策策略下,如
15、如何實現(xiàn)現(xiàn)動態(tài)地地分配和和釋放一一個過程程的數(shù)據(jù)據(jù)空間,如如何實現(xiàn)現(xiàn)對非局局部變量量的引用用、參數(shù)數(shù)傳遞以以及對可可變數(shù)據(jù)據(jù)結(jié)構(gòu)(如如可變數(shù)數(shù)組)的的空間分分配辦法法等等,將將在后面面幾節(jié)給給予詳細細討論。棧式動態(tài)存儲分配策略適用于PASCAL,C,ALGOL之類具有遞歸結(jié)構(gòu)的語言的實現(xiàn)。 2堆式動態(tài)存儲分配如果一個程序語言提供用戶自由地申請數(shù)據(jù)空間和退還數(shù)據(jù)空間的機制(如+中的new,delete,PASCAL的new,等機制),或者不僅有過程而且有進程的程序結(jié)構(gòu)的情況下,空間的使用未必服?quot;先申請后釋放,后申請先釋放的原則,那么棧式的動態(tài)分配方案就不適用了。通常使用一種稱為堆式的動
16、態(tài)存儲分配方案。Pascaal語言言中,標標準過程程neww能夠動動態(tài)建立立一個新新記錄,它它實際上上是從未未使用的的自由區(qū)區(qū)(空閑閑空間)中中找一個個大小合合適的存存儲空間間并相應(yīng)應(yīng)地置上上指針。標標準過程程dissposse是釋釋放記錄錄neww與diispoose不不斷改變變著堆存存儲器的的使用情情況。這種分配方方式的存存儲管理理技術(shù)甚甚為復雜雜,我們們這里舉舉出這種種分配方方法必須須考慮的的幾個問問題。首先先,當運運行程序序要求一一塊體積積為N的的空同時時,我們們應(yīng)該分分配哪一一塊給它它呢?理理論上說說,應(yīng)從從比N稍稍大一點點的一個個空閑塊塊中取出出N個單單元,以以便使大大的空閑閑塊派
17、更更大的用用場。但但這種做做法較麻麻煩。因因此,常常常仍采采用先先碰上哪哪塊比NN大就從從其中分分出N個個單元的原則則。但不不論采用用什么原原則,整整個大存存區(qū)在一一個定時時間之后后必然會會變面零零碎不堪堪??傆杏幸粋€時時候會出出現(xiàn)變樣樣的情形形:運行行程序要要求一塊塊體積為為N的空空間,但但發(fā)現(xiàn)沒沒有比NN大的空空閑塊了了,然而而所有空空閑塊的的總和卻卻要比NN大得多多!出現(xiàn)現(xiàn)這種情情形時怎怎么辦呢呢?這是是一個比比前面的的問題難難得多的的問題。解解決辦法法似乎很很簡單,這這就是,把把所有空空閑塊連連接在一一起,形形成一片片可分配配的連續(xù)續(xù)空間。這這里主要要問題是是,我們們必須調(diào)調(diào)整運行行程
18、序?qū)Ω髡加糜脡K的全全部引用用點。還有有,如果果運行程程序要求求一塊體體積為NN的空間間,但所所有空閑閑塊的總總和也不不夠N,那那又應(yīng)怎怎么辦呢呢?有的的管理系系統(tǒng)采用用一種吊吊做廢品品回收的的辦法來來對付這這種局面面。即尋尋找那些些運行程程序業(yè)己己無用但但尚未釋釋放在占占用塊,或或者那些些行程序序目前很很少使用用的點用用塊,把把這此占占用塊收收回來,重重新分配配。但是是,我們們?nèi)绾沃滥男┬K運行行時在使使用或者者目前很很少使用用呢?即即便知道道了,一一經(jīng)收回回后運行行程序在在某個時時候又要要用它時時又應(yīng)該該怎么辦辦呢?要要使用廢廢品回收收技術(shù),除除了在語語言上要要有明確確的具體體限制外外
19、,還需需要有特特別的硬硬件措施施,否則則回收幾幾乎不能能實現(xiàn)。堆式動態(tài)儲儲分配的的實現(xiàn)通通常有如如下三種種途徑:1 定長塊塊管理堆式式動態(tài)儲儲分配最最簡單的的實現(xiàn)是是按定長長塊進行行。初始始化時,將將堆存儲儲空間分分成長度度相等的的若干塊塊,每塊塊中指定定一個鏈鏈域,按按照鄰塊塊的順序序把所有有塊鏈成成一個鏈鏈表,用用指針aavaiilabble指指向鏈表表中的第第一塊。分配時每次都分配指針available所指的塊,然后available指向相鄰的下一塊。歸還時,把所歸還的塊插入鏈表。考慮插入方便,可以把所歸還的塊插在available所指的塊之前,然后available指向新歸還的塊。2
20、變長塊管理除了按定長塊進行分配之外,還可以根據(jù)需要分配長度不同的存儲塊,可以隨要求而變。按這種方法,初始化時存儲空間是一個整塊。按照用戶的需要,分配時先是從一個整塊里分割出滿足需要的一小塊,以后,歸還時,如果新歸還的塊能和現(xiàn)有的空間能合并,則合并成一塊;如果不能和任何空閑塊合并,則可以把空閑塊鏈成一個鏈表。再進行分配時,從空閑塊鏈表中找出滿足需要的一塊,或者整塊分配出去,或者從該塊上分割一小塊分配出去。若空閑塊表中有若干個滿足需要的空閑塊時,該分配哪一塊呢?通常有三種不同的分配策: 首次滿滿足去:只要在在空閑塊塊鏈表中中找到滿滿足需要要的一塊塊,就進進行分配配。如果果該塊很很大,則則按申請請的
21、大小小進行分分割,剩剩余的塊塊仍留在在空閑塊塊鏈表中中;如果果該塊不不很大,比比如說,比比申請的的塊大不不了幾個個字節(jié),則則整塊分分配出去去,以免免使空閑閑鏈表中中留下詐詐多無用用的小碎碎塊。 最優(yōu)滿滿足法:將空閑閑塊鏈表表中一個個不小于于申請塊塊且最接接近于申申請塊的的空閑塊塊分配給給用戶,則則系統(tǒng)在在分配前前首先要要對空閑閑塊鏈表表從頭至至尾描一一遍,然然后從中中找出一一塊不小小于申請請塊且最最接近于于申請塊塊的空閑閑塊分配配,在用用最優(yōu)滿滿足法進進行分配配時,為為避免每每次分配配都要掃掃描整個個鏈表,通通常將空空閑塊鏈鏈表空間間的大小小從小到到大排序序。這樣樣,只要要找到第第一塊大大小申
22、請請塊的空空閑塊即即可進行行分配。當當然,在在回收時時變需將將釋放在在空閑塊塊插入到到鏈表的的適當位位置上去去。 最差滿滿足法:將空閑閑塊表中中不小于于申請塊塊且是最最大的空空閑的一一部全分分配給用用戶。此此時的空空閑塊鏈鏈表按空空閑的塊塊的大小小從大到到小排序序。這樣樣每次分分配無需需查找,只只需從鏈鏈表中刪刪除第一一個結(jié)點點,并將將其中一一部分分分配給用用戶,而而其它部部分作為為一個新新的結(jié)點點插入到到空閑塊塊表的適適當置上上去。上上述三種種分配策策略各有有所長。一一般來說說,最優(yōu)優(yōu)滿足法法適用于于請求分分配的內(nèi)內(nèi)存大小小范圍較較廣的系系統(tǒng)。因因為按最最優(yōu)滿足足法分配配時,總總是找大大小最
23、接接近于請請求的空空閑塊,系系統(tǒng)中可可能產(chǎn)生生一些存存儲量很很小而無無法利用用的小片片內(nèi)存,事事時也保保留那些些很大的的內(nèi)存塊塊以備響響應(yīng)后面面可能發(fā)發(fā)生的內(nèi)內(nèi)存量較較大的請請求。反反之,由由于最差差滿足法法每次都都是從內(nèi)內(nèi)存最大大的結(jié)點點開始分分配,從從而使鏈鏈表中的的結(jié)點趨趨于均勻勻。因此此,它適適用于請請求分配配的內(nèi)存存大小范范圍較窄窄的系統(tǒng)統(tǒng),而首首次滿足足法的分分配是隨隨機的,因因此它介介于兩者者之間,通通常適用用于系統(tǒng)統(tǒng)事先不不掌握運運行期間間可能出出現(xiàn)的請請求分配配和釋放放的信息息情況。從從時間上上來比較較,首次次滿足法法在分配配時需查查詢空閑閑塊鏈表表,而回回收時僅僅需插入入到
24、表頭頭即可,最最差滿足足法恰好好相反,分分配時無無需查表表,回收收時則為為將新的的空閑塊塊插入表表中適當當?shù)奈恢弥?,需先先進行查查找,最最優(yōu)滿足足法則不不論分配配與回收收,均需需查找鏈鏈表,因因此最費費時間。不同的情況應(yīng)采用不同的方法。通常在選擇時需考慮下列因素:用戶的要求;請求分配量的大小分布;分配和釋放的頻率以及效率對系統(tǒng)的重要性等等。至于存儲回收的實現(xiàn)我們這里不進行討論。第11章代碼優(yōu)化10.2 棧式存存儲分配配的實現(xiàn)現(xiàn)前面提到,使使用棧式式存儲分分配策略略意味著著,運行行時每當當進入一一個過程程,就在在棧頂為為該過程程的臨時時工作單單元,局局部變量量,機器器狀態(tài)及及返回地地址等信信息分
25、配配所需的的數(shù)據(jù)空空間,當當一個過過程工作作完畢返返回時,它它在棧頂頂?shù)臄?shù)據(jù)據(jù)空間也也即釋放放。本節(jié)節(jié)我們將將以三種種語言結(jié)結(jié)構(gòu)為例例,詳細細討論棧棧式存儲儲分配的的實現(xiàn)。為討論方便,首先引入一個術(shù)語-過程的活動記錄AR(Activation Record)。過程的活動記錄是一段連續(xù)的存儲區(qū),用以存放過程的一次執(zhí)行所需要的動態(tài)信息,這些信息可以如圖10.6所示。圖 10.6 過過程的活活動記錄錄臨時工作單單元局部變量機器狀態(tài)信信息存取鏈控制鏈實參返回地址對它們的簡簡單描述述如下: 臨時時工作單單元:比比如計算算表達式式過程中中需存放放中間結(jié)結(jié)果用的的臨時值值單元。 局部變量:一個過程的局部變量
26、。 機器狀態(tài)信息:保存該過程執(zhí)行前關(guān)于機器狀態(tài)的信息,諸如程序計數(shù)器、寄存器的值,這些值都需要在控制從該過程返回時給予恢復。 存取鏈:用以存取非局部變量,這些變量存放于其它過程的活動記錄中。并不是所有語言需要該信息。 控制鏈:指向調(diào)用該過程的那個過程的活動記錄,這也不是所有語言都需要的。 實參:也稱形式單元,由調(diào)用過程向該被調(diào)過程提供實參的值(或地址)。當然在實際編譯程序中,也常常使用機器寄存器傳遞實參。 返回地址:保存該被調(diào)過程返回后的地址。這些域的大小在編譯時是已知的,如果局部變量中包含有可變數(shù)組,那么則采用第9.2節(jié)中所介紹的內(nèi)情向量,將內(nèi)情向量置于過程活動記錄中。另外,有些語言的編譯程
27、序還將參數(shù)個數(shù)存放于活動記錄中,以便進行參數(shù)個數(shù)的檢查。10.2.1 簡簡單的棧棧式存儲儲分配的的實現(xiàn)首先先從一種種最簡單單的程序序設(shè)計語語言結(jié)構(gòu)構(gòu)講起:沒有分分程序結(jié)結(jié)構(gòu),過過程定義義不嵌套套,但允允許過程程遞歸調(diào)調(diào)用。其程程序結(jié)構(gòu)構(gòu)如圖110.77所示。圖 10.7過程程定義不不嵌套的的程序結(jié)結(jié)構(gòu)proograam mmainn; /主程序序頭全局變變量或數(shù)數(shù)組的說說明;prroc R; /過程程R的頭頭 /過程程R的體體eend (R); /過過程R的的尾prooc QQ; /過程QQ的頭 /過程程Q的體體eend (Q); /過過程Q的的尾主程序序執(zhí)行語語句 /主主程序體體eend.(
28、maain) /主程序序尾這種情況下下,采用用棧式動動態(tài)分配配策略,即即,運行行時,每每當進入入一個過過程,則則為該過過程分配配一段存存儲區(qū),當當一個過過程工作作完畢返返回時,它它所占用用的存儲儲區(qū)可釋釋放。程程序運行行時的存存儲空間間(棧)中在某某一時刻刻可能會會包含某某個過程程的幾個個活動記記錄(某某個過程程遞歸調(diào)調(diào)用的情情況);另外,同同樣的一一個存儲儲位置,在在不同運運行時刻刻可能分分配給不不同的數(shù)數(shù)據(jù)對象象。例如如圖100.7的的程序結(jié)結(jié)構(gòu)中,若若主程序序調(diào)用了了過程QQ,Q又又調(diào)用了了R,在在R進入入運行后后的存儲儲結(jié)構(gòu)如如圖100.8(aa)所示示。若主主程序調(diào)調(diào)用了過過程Q,Q
29、Q遞歸調(diào)調(diào)用自己己,在QQ過程第第二次進進入運行行后的存存儲結(jié)構(gòu)構(gòu)如圖110.88(b)所所示。若若主程序序先調(diào)用用過程QQ,然后后主程序序接著調(diào)調(diào)用R,且且Q過程程不調(diào)用用Q和RR,這時時Q和RR進入運運行后的的存儲結(jié)結(jié)構(gòu),先先后分別別如圖110.88(c)和和10.8(dd)所示示。 圖 10.8棧式式存儲分分配常常使用兩兩個指針針指示棧棧最頂端端的數(shù)據(jù)據(jù)區(qū),一一個稱為為SP,一一個稱為為TOPP。SPP總是指指向現(xiàn)行行過程活活動記錄錄的起點點,TOOP則始始終指向向已占用用的棧頂頂單元。這種語言若若含有可可變數(shù)組組,則其其過程活活動記錄錄的內(nèi)容容可如圖圖10.9所示示。圖10.99無嵌套
30、套定義的的過程活活動記錄錄內(nèi)容圖10.110分配配了數(shù)組組區(qū)之后后的運行行棧這里把控制制鏈也稱稱作老SSP,即即調(diào)用該該過程的的那個過過程的最最新活動動記錄的的起點。假定圖10.9所示為圖10.8(a)中現(xiàn)行過程R的活動記錄,SP為此過程活動記錄的起點,TOP指向為此過程創(chuàng)設(shè)的活動記錄的頂端,并假定R含有可變數(shù)組,則在分配了數(shù)組區(qū)之后TOP就指向數(shù)組區(qū)(整個運行棧)的頂端。圖10.10表明分配數(shù)組區(qū)之后的運行棧情況,可以與圖10.8(a)對照。在過程段中對任何局部變量x的引用可表示為變址訪問xSP,此處x代表變量x的相對數(shù),也就是相對于活動記錄起點的地址。這個相對數(shù)在編譯時可完全確定下來。過程
31、的局部數(shù)組的內(nèi)情向量的相對地址在編譯時也同樣可確定下來。數(shù)組空間分配之后,對數(shù)組元素的引用也就容易用變址訪問的方式來實現(xiàn)。10.2.2 嵌嵌套過程程語言的的棧式實實現(xiàn)我們所所熟悉的的PASSCALL語言程程序結(jié)構(gòu)構(gòu)的特點點是允許許過程嵌嵌套定義義,一個個過程可可以引用用包圍它它的任一一外層過過程所定定義的標標識(如如變量,數(shù)數(shù)組或過過程等)。如如圖100.111所示。若若不考慮慮它的文件和指指針類類型,它它的存儲儲分配也也是采用用棧式動動態(tài)分配配策略,只只是它的的過程活活動記錄錄中應(yīng)增增設(shè)一些些內(nèi)容,用用以解決決對非局局部變量量的引用用問題。圖10.111具有有嵌套過過程的PPASCCAL程程
32、序(1) prrogrram sorrt(iinpuut, outtputt); /ssortt的過程程頭(2)vvar a: arrray 0.100 oof iinteegerr;(3)xx: iinteegerr;(4)pprocceduure reaadarrrayy; /soort內(nèi)內(nèi)嵌套定定義的rreaddarrray的的過程頭頭(5)vvar i: inttegeer;(66)beeginnaenddreeadaarraay; /reaadarrrayy的過程程體(7)pprocceduure excchannge(i,jj: iinteegerr);/ssortt內(nèi)嵌套套定義的
33、的excchannge的的過程頭頭(8)bbegiin(9) x=ai; ai=aj; aj=x; /excchannge的的過程體體(10) enddexxchaangee;(111) prroceedurre qquiccksoort(m,nn: iinteegerr);/ssortt內(nèi)嵌套套定義的的quiickssortt的過程程頭(122) vaar kk,v: inntegger; (133) fuuncttionn paartiitioon(yy,z:inttegeer):inttegeer;/qquiccksoort內(nèi)內(nèi)嵌套定定義的pparttitiion的的函數(shù)頭頭(14)va
34、ar ii.j:inttegeer;(115)beggin a /parrtittionn的函數(shù)數(shù)體(166)v(117) eexchhangge(ii,j);(118) enndpparttitiion;(199) beeginnenndqquiccksoort; /quuickksorrt的過過程體(220) begginenddsoort. /soort的的例程體體圖10.111的PPASCCAL程程序中過過程定義義的嵌套套情況如如下:soortrreaddarrrayeexchhanggequuickksorrtpparttitiion這里里不妨將將整個程程序soort看看成最外外層的
35、過過程。過過程reeadaarraay,eexchhangge和pparttitiion中中引用的的a均不不是它們們的局部部變量,而而是過程程sorrt的局局部變量量。假如如過程ssortt激活(調(diào)用)了過程程quiickssortt,這時時存儲棧棧中的情情形示意意如圖110.112,其其中在qquiccksoort過過程活動動記錄中中有一(或一些些)存儲儲單元(用斜線線描繪)用以記記錄過程程quiickssortt可以引引用soort中中定義的的變量aa和x。也也就是說說,為了了解決對對非局部部量的存存取問題題,必須須設(shè)法跟跟蹤每個個外層過過程的最最新活動動記錄的的位置。圖 10.12存存儲
36、棧布布局實現(xiàn)對非局局部量的的存取的的方法-跟蹤每每個外層層過程的的最新活活動記錄錄AR的的位置。跟蹤辦法: 用靜態(tài)鏈(如PL/0的SL)。 用DISPLAY表。跟蹤的辦法法很多,我我們介紹紹兩種,一一種是在在過程活活動記錄錄中增設(shè)設(shè)存取鏈鏈,指向向包含該該過程的的直接外外層過程程的最新新活動記記錄的起起始位置置。過程程活動記記錄的內(nèi)內(nèi)容如圖圖10.13(aa)所示示。圖110.112所提提到的情情況可用用圖100.133(b)說說明。圖 10.13 嵌套定定義過程程的活動動記錄和和存儲棧?;仡橮L/0編譯譯程序,其其假想機機匯編解解釋程序序的環(huán)境境之一是是數(shù)據(jù)棧棧staack,它它的存儲儲分配
37、策策略便是是棧式動動態(tài)分配配的,因因為PLL/0是是PASSCALL的一個個子集,它它的過程程允許嵌嵌套定義義,它的的過程活活動記錄錄中便有有存取鏈鏈,在PPL/00編譯程程序中我我們稱作作靜態(tài)鏈鏈。因為為PL/0的過過程是無無參過程程,PLL/0也也無動態(tài)態(tài)數(shù)組,所所以它的的過程活活動記錄錄的內(nèi)容容如圖110.114所示示。圖 10.14 PL/0編譯譯程序的的過程活活動記錄錄再回到圖110.111的例例子。如如果該程程序的某某次執(zhí)行行順序為為:sorrtqquiccksoortquiickssorttpaartiitiooneexchhangge即主主程序(最外層層過程)sorrt開始始執(zhí)
38、行,繼而進進入過程程quiickssortt,而又又一次進進入過程程quiickssortt,接著著進入過過程paartiitioon,進進入過程程excchannge。圖100.155給出了了進入過過程exxchaangee之后運運行棧的的示意,我我們僅把把存取鏈鏈和控制制鏈的值值標明。圖 10.15 運行棧??梢钥闯?,過過程exxchaangee由過程程(函數(shù)數(shù))paartiitioon調(diào)用用,但eexchhangge的直直接外層層過程是是sorrt,所所以過程程excchannge的的活動記記錄的存存取鏈指指向soort的的活動記記錄的始始址。 另另外,過過程paartiitioon中引
39、引用了第第(2)行說明明的變量量a,而而parrtittionn的直接接外層是是quiickssortt,quuickksorrt的直直接外層層過程是是sorrt,pparttitiion對對非局部部量a的的引用通通過兩次次拉鏈實實現(xiàn)。另外一種存存取非局局部變量量的辦法法,也是是常用的的有效辦辦法。即即每進入入一個過過程后,在在建立它它的活動動記錄的的同時建建立一張張嵌套層層次顯示示表diispllay。這里所提到的嵌套層次,是指過程定義的層數(shù),始終假定主程序的層數(shù)為0,因此主程序稱為0層過程。如某過程p是在層次為i的過程q內(nèi)定義的,并且q是包圍p的直接外層,那么p的過程層數(shù)為i+1。一般編譯
40、程序處理過程說明時,將把過程層數(shù)作為重要的屬性登記在符號表中。計數(shù)過程的層數(shù)很容易實現(xiàn),用一個計數(shù)器Level,初值為0,每遇到過程說明則增1,過程說明結(jié)束則減1,PL/0編譯程序就是這樣處理的。displlay是是一個指指針數(shù)組組d,也也可看做做是一個個小棧,自自頂向下下每個單單元依次次存放著著現(xiàn)行層層,直接接外層,直至至最外層層(0層層,主程程序?qū)樱┑鹊让恳粚訉舆^程的的最新活活動記錄錄的地址址。也即即,嵌套套層次ii的過程程的局部部變量aa是在由由dissplaay元素素dii所指指的那個個活動記記錄中存存放的。也也就是說說,嵌套套層次ii+1過過程中的的非局部部變量可可能在ii,i-1,
41、0層層,對它它的存取取是通過過dissplaay元素素dii,ddi-,d0而而獲得的的。假定現(xiàn)現(xiàn)在進入入的過程程的層數(shù)數(shù)為i,則則它的ddispplayy表含有有i+11個元素素,依次次指向現(xiàn)現(xiàn)行層、直直接外層層直直至最外外層(00層)等等每一層層過程的的最新活活動記錄錄的地址址。例如如圖100.111的程序序,假定定有如下下四種調(diào)調(diào)用情況況:(aa)soortquiickssortt;(b)ssorttquuickksorrtqquiccksoort;(cc)soortquiickssorttquuickksorrtpparttitiion;(dd)soortquiickssorttquu
42、ickksorrtpparttitiionexcchannge。則圖圖10.16的的(a),(bb),(cc),(dd)分別別說明了了上述四四種情形形的運行行棧和ddispplayy。確實實看出,ddispplayy顯示了了存取鏈鏈的信息息。圖 10.16 dissplaay表displlay本本身的體體積在編編譯時可可確定。至至于diispllay本本身作為為單獨的的表分配配存儲,還還是作為為活動記記錄的一一部分,比比如置于于實參(形形式單元元)的上上端(如如圖100.177所示),則則取決于于編譯程程序的設(shè)設(shè)計者。假定將display作為活動記錄的一部分,由于每個過程的形式單元數(shù)目在編譯時
43、是知道的,那么display的相對地址d(相對于活動記錄起點)在編譯時也是完全確定的。因此,若現(xiàn)行過程中引用了某一外層過程的變量,則很容易生成相應(yīng)的存取指令?,F(xiàn)在我們要要討論,當當過程PP1調(diào)用用過程PP2而進進入P22后,PP2應(yīng)如如何建立立起自己己的diispllay。為為了建立立自己的的dissplaay,PP2必須須知道它它的直接接外層過過程(記記為P00)的ddispplayy。這意意味著,當當P1調(diào)調(diào)用P22時必須須把P00的diispllay地地址作為為連接數(shù)數(shù)據(jù)之一一傳給PP2。圖 10.17 dissplaay作為為活動記記錄的一一部分圖 10.18 P1調(diào)調(diào)用P22的兩種種
44、不同嵌嵌套圖 10.18(a)調(diào)用情情形一 圖 110.118(bb)調(diào)調(diào)用情形形二如果P2是是一個真真實過程程(P22不是形形式參數(shù)數(shù)),那那么,PP0或者者就是PP1自身身或者既既是P11又是PP2的直直接外層層(見圖圖10.18的的(a)、(bb)兩種種情形)。不論論哪一種種情形,只只要在進進入P22后能夠夠知道PP1的ddispplayy就能知知道P00的diispllay,從從而可直直接構(gòu)造造出P22的diispllay。事實上,只需從P1的display中自底而上地取過l2個單元(l2為P2的層數(shù))再添上進入P2后新建立的SP值就構(gòu)成了P2的display。也就是說,在這種情況下,
45、我們只需把P1的display地址作為連接數(shù)據(jù)之一傳送給P2就能夠建立P2的display。如果P2是形式參數(shù),那么,調(diào)用P2意味著調(diào)用P2當前相應(yīng)的實在過程。此時的P0應(yīng)是這個實在過程的直接外層過程。我們假定P0的display地址可從形式單元P2所指示的地方獲得。為了能在P2中獲得P0的display地址,我們必須在P1調(diào)用P2時設(shè)法把P1的display地址作為連接數(shù)據(jù)之一(稱為全局display地址)傳送給P2。于是連接數(shù)據(jù)變?yōu)槿?(1) 老SP值;(2) 返回地址;(3) 全局display地址。這樣,整個活動記錄的組織就如圖10.17所示。注意,0層過程(主程序)的display
46、只含一項,這一項就是主程序開始工作時所建立的第一個SP值。10.3 參數(shù)傳傳遞當一個過程程調(diào)用其其它過程程時,調(diào)調(diào)用過程程和被調(diào)調(diào)過程之之間的通通信經(jīng)由由非局部部量或者者經(jīng)由參參數(shù)傳遞遞。如圖10.19的的過程eexchhanggel既既使用了了非局部部量數(shù)組組,又又使用了了形式參參數(shù)(簡簡稱形參參)i和和j,將將aii和aaj的值進進行交換換。圖 10.19 帶有非非局部變變量和形形參的PPASCCAL過過程 (1) prroceedurre eexchhanggel(i,jj: iinteegerr);/過程eexchhanggel的的頭,帶帶有形式式參數(shù)ii , j(2)vaar xx:
47、 iinteegerr;(3) bbegiin;(44)x=ai; ai=aj; aj =x/數(shù)組組a是非非局部變變量(5) eend;語句eexchhanggel(m,nn);表表示了對對圖100.199中過程程excchanngell的一次次調(diào)用,其其中m,nn為實在在參數(shù),簡簡稱實參參。我們們所討論論的問題題是,為為執(zhí)行eexchhanggel(m,nn),形形參i,jj應(yīng)按何何種方式式同實參參m,nn相聯(lián),換換句話說說,如何何把實在在參數(shù)傳傳遞給相相應(yīng)的形形式參數(shù)數(shù)呢?有有幾種形形實參對對應(yīng)的方方法,分分別稱作作值調(diào)用用,地址址(引用用)調(diào)用用,名字字調(diào)用以以及宏擴擴展。也也就是說說,
48、參數(shù)數(shù)傳遞的的幾種不不同途徑徑是傳值值,傳地地址,傳傳名及宏宏擴展等等等。知道道一個語語言使用用的參數(shù)數(shù)傳遞的的方法非非常重要要,因為為一個程程序的結(jié)結(jié)果依賴賴于所使使用的方方法。觀觀察圖110.220的PPASCCAL程程序。我我們知道道該程序序的輸出出是a=2,bb=1如如果將第第3行的的關(guān)鍵字字varr去掉,則則該程序序的輸出出是a=1,bb=2。圖 10.20 帶有過過程swwap的的PASSCALL程序(1) prrogrram reffereencee(innputt, ooutpput);/reffereencee過程定定義頭(22) vvar a, b: inttegeer;(
49、33) pprocceduure swaap(vvar x, y: inttegeer);/rrefeerennce過過程內(nèi)定定義的sswapp的過程程(4) vaar ttempp iinteegerr;(5) bbegiin /swwap的的過程體體(6)teemp=x;(7) x=y;(88) yy=ttempp(9) ennd;(110) beggin /rrefeerennce的的過程體體(11)a=1; b=2;(12)swwap(a,bb);(113)wriitelln(aa=,aa); wriitelln(bb=,bb)(144) eend.有關(guān)鍵鍵字vaar時,PPASCCA
50、L語語言的參參數(shù)傳遞遞使用的的方式是是傳地址址;去掉掉varr,則使使用的方方式是傳傳值。PAASCAAL語言言的變量量參數(shù)是是在參數(shù)數(shù)前加關(guān)關(guān)鍵字vvar。這這種參數(shù)數(shù)的傳遞遞方式是是傳地址址例例如:過過程 sswapp(vaar xx,y:inttegeer);sswapp(a,b);(a,b為調(diào)調(diào)用時的的實參)調(diào)用結(jié)結(jié)果:aa,b的的值被改改變。在參參數(shù)前不不加關(guān)鍵鍵字vaar時是是值調(diào)用用。這種種參數(shù)的的傳遞方方式是傳傳值。例如如:過程程 swwap(x,yy:inntegger);swaap(aa,b);其結(jié)結(jié)果:aa,b調(diào)調(diào)用前的的值不被被改變。10.3.1 傳傳值現(xiàn)在討討論傳值值
51、的實現(xiàn)現(xiàn)。傳值值,即ccalll byy vaaluee,也稱稱值調(diào)用用。這是是最簡單單的參數(shù)數(shù)傳遞方方法。具具體來講講是這樣樣的: 在被調(diào)調(diào)過程的的活動記記錄中開開辟形參參的存儲儲空間,這這些存儲儲位置即即是我們們所說的的形參或或形式單單元。 調(diào)用過過程計算算實參的的值,并并將它們們的右值值(r vallue)放放在為形形式單元元開辟的的空間中中。 被被調(diào)用過過程執(zhí)行行時,就就像使用用局部變變量一樣樣使用這這些形式式單元。在圖10.20程序中,第12行swap(a,b)調(diào)用過程將不會影響a和b的值。其結(jié)果等價于執(zhí)行下列運算:x =ay =btemp =xx =yy =temp這里,x,y和t
52、emp局部于swap,雖然賦值改變了局部量x,y和temp的值,但當控制從該調(diào)用返回而swap的該活動記錄釋放后,這些改變即消失,這種調(diào)用方式不影響調(diào)用過程的活動記錄。10.3.2 傳傳地址當參參數(shù)通過過引用傳傳遞時,也也稱作傳傳地址,或或引用調(diào)調(diào)用。調(diào)調(diào)用過程程傳給被被調(diào)過程程的是指指針,指指向?qū)崊⒋鎯ξ晃恢玫闹钢羔槨?. 如實實參是一一個名字字或是具具有左值值的表達達式,則則左值本本身傳遞遞過去。2. 如實參是一表達式,比方a+b或2,而沒有左值,則表達式先求值,并存入某一位置,然后該位置的地址傳遞過去。3. 被調(diào)過程中對形式參數(shù)的任何引用和賦值都通過傳遞到被調(diào)過程的指針被處理成間接訪問
53、。例如,在圖10.20的程序中,若用實參i和ai對過程swap進行調(diào)用,即swap(i,ai),其效果如下步驟所述:1. 將i和ai的地址(左值)拷貝到被調(diào)過程的活動記錄中,比如說分別對應(yīng)形參x和y的單元arg1和arg2。2. 將局部變量temp設(shè)為由arg1所指單元的內(nèi)容(即令temp等于i0,其中i0是i的初值),這一步對應(yīng)于swap定義中的第6行語句:temp =x。3. 將arg1所指單元的內(nèi)容設(shè)為arg2所指單元的值,即i=ai0,這一步對應(yīng)swap中第7行的x=y。4. 將arg2所指單元的內(nèi)容設(shè)為等于temp的值,即,設(shè)ai0=i,這一步對應(yīng)y=temp。通過值調(diào)用的過程可以由
54、非局部量或由指針而對調(diào)用過程發(fā)生影響。比如圖10.21的C程序中,x和y聲明為整型指針(在第2行),第8行調(diào)用swap(&a,&b)中的&操作符導致將指向a和b的指針傳給過程swap。該程序的輸出為: a is now 2, b is now 1該例中指針的使用恰好提示了一個編譯程序怎樣實現(xiàn)引用調(diào)用。圖 10.21在在一個值值調(diào)用過過程中使使用指針針的C程程序(1) swwap(x,yy) /定義義swaap過程程(2) intt *xx,*yy;(3) intt teemp; /swaap的過過程體(44)temmp=x; x=y; yy=teemp;(5) (6) maain() /主程程
55、序 (77) innt aa=1, b=2;(88)swaap(&a, &b); /調(diào)用用swaap,其其實在參參數(shù)是aa和b的的地址(99)priintff(aa iss noow%dd,b is noww%dn, a, b);(100) C語言言過程的的參數(shù)只只有值參參,要實實現(xiàn)傳地地址可采采用傳遞遞指針型型實參。除了傳值和傳地址兩種參數(shù)傳遞方法之外,還有得結(jié)果(valueresult),傳名call by name等等。這里我們不予討論。10.3.3 過過程參數(shù)數(shù)一一個過程程(函數(shù)數(shù))可以以作為參參數(shù)傳遞遞,比如如圖100.222的PAASCAAL程序序中,過過程c把把f作為為參數(shù)傳傳遞
56、給bb,而bb通過引引用形參參h調(diào)用用f。我我們要注注意的是是:函數(shù)數(shù)f有一一非局部部量m,圖圖中特地地將m圈圈起來。但但m的作作用域并并不包括括b的過過程體。bb中的語語句wrriteeln(hh(2)激激活f,是是因為形形參h引引用f,wwrittelnn打印的的是調(diào)用用f(22)的結(jié)結(jié)果。那那么b激激活f時時,怎樣樣設(shè)置ff活動記記錄的存存取鏈(ddispplayy)呢?答案是是,當一一個嵌套套過程作作為參數(shù)數(shù)傳遞時時,必須須連同它它的存取取鏈(ddispplayy)一同同傳遞過過去。圖圖10.23說說明了這這點,當當過程cc傳遞ff時,cc可以決決定f的的存取鏈鏈,或者者說f的的存取鏈
57、鏈或diispllay可可以根據(jù)據(jù)c的存存取鏈或或dissplaay來建建立。cc必須把把f連同同f的存存取鏈一一起傳給給b,那那么在bb中激活活f時,bb活動記記錄的存存取鏈就就可以正正確設(shè)置置了。圖10.222 嵌嵌套過程程作為參參數(shù)傳遞遞(1) prrogrram parram(inpput, outtputt);/例例程paaramm的頭(22) pprocceduure b(ffuncctioon hh(n:inttegeer): inntegger);/嵌套套過程bb的頭,其其形式參參數(shù)是一一個具有有一個整整型形參參n的整整型函數(shù)數(shù)h(3) bbegiin wwrittelnn(h
58、(2) ennd b;/bb的過程程體(4) prroceedurre cc; /嵌套套過程cc的頭(55) varr :iinteegerr;(6) ffuncctioon ff(n;inttegeer): inntegger;/過程程c中嵌嵌套定義義的具有有一個整整型形參參n的整整型函數(shù)數(shù)f(7) beggin f=+n enddf;/f的函函數(shù)體(88) beggin =00;b(f) enddc;/cc的過程程體,其其中b(f)調(diào)調(diào)用b函函數(shù),/而實參參是函數(shù)數(shù)f,調(diào)調(diào)用時替替換形參參函數(shù)hh(9) beggin(110) c (111) endd圖10.223 連連同存取取鏈一起起傳
59、遞過過程實參參一般來講,過過程P把把過程TT做為實實參傳遞遞給Q時時,也是是一種傳地址址方式式,P可可以先建建立兩個個相繼的的臨時單單元,第第一個單單元B11存放過過程T的的入口地地址;第第二單元元B2存存放現(xiàn)行行dissplaay地址址或存取取鏈地址址。然后后把第一一臨時單單元地址址傳送給給Q(即即放置于于Q活動動記錄的的形式單單元,比比方說ZZ中)。假假定過程程Q執(zhí)行行到引用用形參ZZ時,ZZ中已含含有上述述B1的的地址,則則B1的的內(nèi)容將將用來作作為轉(zhuǎn)子子指令的的目的地地址(即即轉(zhuǎn)進過過程T)。BB2的內(nèi)內(nèi)容將傳傳送給TT。除了實實參是過過程的情情況外,還還有實參參為數(shù)組組的情況況,實參
60、參為標號號的情況況以及實實參為形形式參數(shù)數(shù)的情況況。我們們不再討討論。10.4 過程調(diào)調(diào)用、過過程進入入和過程程返回經(jīng)過上上述討論論之后,我我們歸納納一下,對對于過程程調(diào)用的的四元式式序列:ppar T1ppar T2parr Tnnccalll P,n在運行行時是如如何執(zhí)行行的?;蚧蛘哒f,對對于paar和ccalll應(yīng)產(chǎn)生生什么相相應(yīng)的目目標代碼碼?前面講過,過過程活動動記錄中中有形式式單元,形形式單元元與活動動記錄起起點之間間的距離離是確定定的。因因此對于于parr Tii(i=1,22,n)的的處理是是:根據(jù)據(jù)parr Tii(i=1,22,n)中中Ti的種別別而生成成傳送指指令,或或?qū)?/p>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 運行庫改造施工方案
- 高速公路標志桿施工方案
- 化糞池混凝土施工方案
- 平遠縣改門改窗施工方案
- 海南靚綠生物科技有限公司年產(chǎn)建設(shè)項目1000噸水溶肥建設(shè)項目環(huán)評報告表
- 2025年鉆孔應(yīng)變儀項目合作計劃書
- 置換強夯的施工方案
- 園路及鋪裝施工方案
- 山西造浪游泳池施工方案
- 寧夏工程電纜線槽施工方案
- 語文-湖南省長郡二十校聯(lián)盟2025屆新高考教學教研聯(lián)盟高三第一次聯(lián)考(長郡二十校一聯(lián))試題和答案
- 醫(yī)療衛(wèi)生中心社會效益與經(jīng)濟效益分析
- 3月3號全國愛耳日-保護耳朵課件
- 2025年遼寧裝備制造職業(yè)技術(shù)學院單招職業(yè)適應(yīng)性測試題庫(網(wǎng)校專用)
- 2025國家電投集團資本控股限公司本部招聘11人高頻重點模擬試卷提升(共500題附帶答案詳解)
- 2025年湖南中醫(yī)藥高等??茖W校高職單招職業(yè)技能測試近5年??及鎱⒖碱}庫含答案解析
- 戶外拓展訓練基地項目策劃方案
- 《小兔子安家》(說課稿)-2024-2025學年一年級下冊數(shù)學北師大版
- 小學生人際交往能力培養(yǎng)的實踐研究
- 綜合與實踐 白晝時長規(guī)律的探究說課稿 2024-2025學年人教版數(shù)學七年級下冊
- 2025年春新人教版數(shù)學七年級下冊教學課件 7.4 平移
評論
0/150
提交評論