第八章-存儲空間組織節(jié)_第1頁
第八章-存儲空間組織節(jié)_第2頁
第八章-存儲空間組織節(jié)_第3頁
第八章-存儲空間組織節(jié)_第4頁
第八章-存儲空間組織節(jié)_第5頁
已閱讀5頁,還剩29頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

CH8運行時存儲空間組織編譯程序總框

符號表詞法分析器語法分析器語義分析器代碼優(yōu)化出錯處理源程序目標程序單詞符號集語法單位集中間代碼程序中間代碼程序目標代碼生成存儲空間組織存儲空間分配策略1).靜態(tài)分配存儲分配由編譯程序在編譯時進行;2).動態(tài)分配在編譯時生成相應(申請空間)的目標程序,在目標程序運行時,執(zhí)行該代碼,進行存儲分配。(有:棧式存儲分配,堆式存儲分配)影響存儲分配策略的源語言主要特征1).過程能否遞歸調(diào)用;ProgramPP(input,output);vark:integer;FunctionF(n:integer):integer;beginifn<=0thenF:=1elseF:=n*F(n-1);end;beginK:=F(10);…end.執(zhí)行順序:PP→F1→F2→···每一次調(diào)用F,需要一套數(shù)據(jù)區(qū)影響存儲分配策略的源語言主要特征2).是否有可變數(shù)組(可變數(shù)組的大小創(chuàng)建時決定);Pascal:thepoint:arrayof

integer;

setlength(thepoint,5);

在C99,實現(xiàn)了變長數(shù)組:用(整型)變量或表達式聲明的數(shù)組。(在C90和C++,方括號內(nèi)必須是常數(shù)值)。例:int

f

(void)

;

int

main(void)

{

int

size

=

4;

int

a[size];

//

ok

in

only

C99

int

b[size*size];

//

ok

in

only

C99

int

c[

f()

];

//

ok

in

only

C99影響存儲分配策略的源語言主要特征3).過程能否訪問非局部且非全局的變量如:Pascal語言的過程嵌套聲明,內(nèi)層可以訪問外層定義的名字ProgramB1(input,output);consta=10;varb,c:integer;procedureB2(x:real);varf,g:real;procedureB3(y:real);constb=5;varj:real;beginj:=f*B3(a)+b;end;{B3}begin……;begin……;end;{B2}begin……;end;{B1,主程序}其中:j,b——B3

f——B2a——B1影響存儲分配策略的源語言主要特征4).是否有分程序結(jié)構(gòu)(分程序中可以有變量聲明)#include<stdio.h>inttest=5;voidfun1();voidmain(){inttest=10;fun1();printf(“2--%d\n”,test);{inttest=15;printf(“3--%d\n”,test);}}voidfun1(){printf(“1--%d\n”,test);}全局名:5main定義的局部名:10分程序定義的局部名:15影響存儲分配策略的源語言主要特征5).名字的作用域如,C語言的static,extern。動態(tài)局部變量(離開函數(shù),值就消失)靜態(tài)局部變量(離開函數(shù),值仍保留)靜態(tài)全局變量(只限本文件引用)全局變量(允許其它文件引用)

影響存儲分配策略的源語言主要特征6).過程調(diào)用時如何傳遞參數(shù);如:傳值,傳地址,得結(jié)果,傳名等。7).哪些實體可以作為參數(shù)和返回值;如:簡單變量,結(jié)構(gòu)變量,標號,過程等,是否可以做為參數(shù)被傳遞和做為結(jié)果被返回?7).是否允許動態(tài)的為對象分配存儲空間;

如:C:malloc、calloc;pascal:New、GetMem8).存儲空間是否必須顯式地釋放如:C:freepascal:Dispose、FreeMem§8.1目標程序運行時的活動§8.1.1過程的活動1).過程的活動:該過程的一次執(zhí)行(調(diào)用)。2).過程活動的生存期:

從執(zhí)行過程P的過程體的第一步操作到最后一步操作之間的操作序列;包括執(zhí)行P時調(diào)用其他過程(如Q)花費的時間。3).過程遞歸:

若過程尚未退出當前活動,又開始其新的活動。過程遞歸可以是間接達到的。如:P→Q→R→Pprogrammain(input,output);

varA,B:integer;

procedureQ(X:integer);

begin

…end;

procedureP(X,Y,Z:integer);

begin

Y:=Y+1;Z:=Z+X;ifZ>0thenQ(Z)elseP(X,Y,Z);end;

beginA:=2;B:=3;P(A+B,A,A);writeln(‘A=’,A)

end.過程定義過程調(diào)用1).過程的活動2).過程活動的生存期3).過程遞歸參參數(shù)數(shù)傳傳遞遞過程程(函函數(shù)數(shù))::結(jié)構(gòu)構(gòu)化化程程序序設設計計的的主主要要手手段段;;節(jié)省程程序代代碼和和擴充充語言言能力力的主主要途途徑;;只要有有過程程定義義,就就可以以在別別的程程序單單位調(diào)調(diào)用它它。調(diào)調(diào)用者者(程程序單單位)與被被調(diào)用用者(過程程)之之間間的信信息傳傳遞主主要通通過“全局局量””和“參數(shù)數(shù)”來完成成。如果把把數(shù)據(jù)據(jù)看成成內(nèi)容容物的的話,,那么么裝載載數(shù)據(jù)據(jù)的容容器就就是變變元。。主程序序/過過程調(diào)用者者被調(diào)用用者變元過程變元控制數(shù)據(jù)流流數(shù)據(jù)流流:⑴.從從調(diào)用者者的變元元=>被調(diào)用用過程程的變元元;⑵.被調(diào)用用過程程對數(shù)據(jù)據(jù)進行行計算算處理理;⑶.過過程結(jié)結(jié)束返返回時時,把把數(shù)據(jù)據(jù)結(jié)果果=>調(diào)用者者的變元元;在完成成對過過程中中代碼碼段的的調(diào)用用執(zhí)行行的同同時,,也完成成了與與過程程的數(shù)數(shù)據(jù)交交換信息傳傳遞中中,涉涉及到到兩類類參數(shù)數(shù):⑴屬于被調(diào)用用過程程:用于表表示相相應數(shù)數(shù)據(jù)在在過程程執(zhí)行行當中中的含含義——形形式式參數(shù)數(shù)(形形參,,或啞啞元))programmain(input,output));varA,B::integer;procedureP(X,Y,Z:integer);beginY:=Y+1;;Z:=Z+X;;end;beginA:=2;B:=3;P(A+B,A,A);writeln(‘‘A=’,,A))end.形式參參數(shù)信息傳傳遞中中,涉涉及到到兩類類參數(shù)數(shù):⑵屬屬于調(diào)用者者:用于裝裝載調(diào)調(diào)用者者對被被調(diào)過過程的的輸入入/輸輸出數(shù)數(shù)據(jù);;——實實在在參數(shù)數(shù)((實參參))programmain(input,output));varA,B::integer;procedureP(X,Y,Z:integer);beginY:=Y+1;;Z:=Z+X;;end;beginA:=2;B:=3;P(A+B,A,A);writeln(‘‘A=’,,A))end.實在參參數(shù)形參與與實參參之間間按照照從左左到右右的順順序一一一對對應。。即:處處于兩兩個列列表的的相同同位置置的變變元,,意味味著它它們是相互互關聯(lián)聯(lián)的。。形-實實對應應的主主要方方式::傳值值,傳傳地址址,得得結(jié)果果,傳傳名programmain(input,output));varA,B::integer;procedureP(X,Y,Z:integer);beginY:=Y+1;;Z:=Z+X;;end;beginA:=2;B:=3;P(A+B,A,A);writeln(‘‘A=’,,A))end.實在參參數(shù)形式參參數(shù)傳值調(diào)調(diào)用((Callbyvalue))調(diào)用者者計算算出實實在參參數(shù)的的值,,并將將其傳傳送給給過程程的形式參參數(shù)。。⑴調(diào)調(diào)用者者計算算實參參的值值,放放在過過程可可以取取到的的地方方;⑵過過程取取出實實參的的值,,放在在過程程內(nèi)對對應的的形式式單元元中(過程程的活活動記記錄中中開辟辟的存存儲空空間);⑶過過程執(zhí)執(zhí)行時時,像像局部部名一一樣使使用這這些形形式單單元。。C參數(shù)為普通變量voidsub(intx,inty)pascal值參procedureP(x,y:integer)programmain(input,output);varA,B:integer;procedureP(X,Y,Z:integer);beginY:=Y+1;;Z:=Z+X;end;beginA:=2;B:=3;P(A+B,A,A);writeln(‘A=’,,A)end.主程序子程序T5X5A2Y23B3Z27此種參數(shù)數(shù)傳遞方方法,過程內(nèi)對參參數(shù)的變動動不會影響響到“調(diào)用者”輸出結(jié)果::A=2傳地址(引用調(diào)調(diào)用)(Call-by-address)調(diào)用者把一一個指向?qū)崒崊⒌拇鎯Φ刂返闹钢羔?,傳遞遞給過程的的形參。⑴實參是是名字:傳傳遞其地址址;實參是表達達式:計算算表達式值值且存放在在某一存儲單元,,將該存儲儲單元地址址傳遞過去去。⑵過程中中對形參的的引用和賦賦值,都變變成對傳遞遞來的指針的的間接引用用訪問。C參數(shù)為指針變量voidsub(int*sum)數(shù)組作為參數(shù)voidFunc(intarr[5])pascal變參procedureP(Varx,y:integer)programmain(input,output);varA,B:integer;procedureP(X,Y,Z:integer);beginY:=Y+1;Z:=Z+X;end;beginA:=2;B:=3;P(A+B,A,A);writeln(‘‘A=’,,A)end.主程序T5A238B3子程序X↑TY↑AZ↑A輸出結(jié)果::A=8C語言參數(shù)例例#include<stdio.h>voidsub(intx,inty,int*sum){*sum=x+y;}main(){intx=9,y=10,s=1;sub(x,y,&s);printf("%d\n",s);}答案:19其中:x,y—傳值值sum——傳傳地址址其中::x——傳傳值y—傳地址址#include<stdio.h>intx,y,z;voidp(int*x,inty){++*x;y--;z=*x+y;printf("%d,%d,%d\n",*x,y,z);}voidmain(){x=2;y=3;z=4;p(&x,y);printf("%d,%d,%d\n",x,y,z);p(&y,x);printf("%d,%d,%d\n",x,y,z);}3,2,53,3,54,2,63,4,6得結(jié)果果(Callbyresult)或或復復制恢恢復(Copy-Restore)⑴被被調(diào)用用過程程為每每個形形參設設置兩兩個形形式單單元;;分別存存地址址、值值。⑵調(diào)調(diào)用者者把實實在參參數(shù)的的地址址和值值同時時傳遞遞到被被調(diào)用用過程中中;⑶被被調(diào)用用過程程直接接使用用實參參的值值;⑷過過程返返回時時,把把形參參的現(xiàn)現(xiàn)行值值復制制到相相應的的實在在參數(shù)的的地址址中,將計計算結(jié)結(jié)果返返回給給調(diào)用用者。。(Ada,pascal)programmain(input,output);varA,,B::integer;;procedureP(X,Y,Z:integer);beginY:=Y+1;;Z:=Z+X;end;beginA:=2;B:=3;P(A+B,A,A);writeln(‘‘A=’,,A))end.主程序T5A237B3子程序X↑T5Y↑A23Z↑A27或:主程序T5A27

3B3結(jié)果::A=7(左左→右右)或:A=3(右→→左)傳名調(diào)調(diào)用或或:換換名調(diào)調(diào)用(Call-by-Name)調(diào)用者者將實實在參參數(shù)的的名字字傳給給被調(diào)調(diào)用過過程中中相應的的形式式參數(shù)數(shù);被調(diào)用用過程程的過過程體體中,,所有有的形形式參參數(shù)都都用相應實實在參數(shù)數(shù)的名字字進行替替換;ALGOL使使用的一一種參數(shù)數(shù)傳遞方方式programmain(input,output);varA,B:integer;procedureP(X,Y,Z:integer);beginY:=Y+1;;Z:=Z+X;end;beginA:=2;B:=3;P(A+B,A,A);writeln(‘A=’,,A)grammain(input,output);varA,B:integer;procedureP(X,Y,Z:integer);beginA:=A+1;;A:=A+(A+B);end;beginA:=2;B:=3;P(A+B,A,A);writeln(‘A=’,,A)end.主程序TAB52393輸出結(jié)果果:A=9§8.2運運行時存存儲器的的劃分運運行行時存儲儲器的劃劃分一個目標標程序運運行所需需的存儲儲空間包包括:存放目標標代碼的的空間存放數(shù)據(jù)據(jù)項目的的空間存放程序序運行的的控制或或連接數(shù)數(shù)據(jù)所需需單元(控制棧棧)一個程序序在運行行時刻的的內(nèi)存劃劃分:代碼(Code)靜態(tài)數(shù)據(jù)據(jù)(StaticData)棧(Stack)堆(Heap)絕大多數(shù)數(shù)高級語語言,執(zhí)執(zhí)行時不不能改變代代碼,所所以在編編譯時,,所有代碼碼(包括括每個過過程的入入口點)地地址都是是可計算算的。過程1的代碼過程2的代碼...過程n的代碼過程1入入口→過程2入入口→過程n入入口→代碼區(qū)內(nèi)容代碼區(qū)大小靜態(tài)確定位置靜態(tài)確定靜態(tài)數(shù)據(jù)據(jù):編譯時就就可以確確定存儲儲位置的的數(shù)據(jù)。。如:*)FORTRAN77::所有的的數(shù)據(jù);;*)Pascal::全全局變量量;*)C::外部變變量,靜態(tài)變變量;對常量,常數(shù)數(shù):編譯時已知其其內(nèi)容,且值值不變。通常常由編譯程序序直接插入到到代碼中,不不分配數(shù)據(jù)空空間。內(nèi)容數(shù)據(jù)段靜態(tài)數(shù)據(jù)區(qū)大小靜態(tài)確定位置靜態(tài)確定目標代碼靜態(tài)數(shù)據(jù)棧堆棧區(qū):用于符合后進先出使用用風格的數(shù)據(jù)據(jù);*)過程運運行的控制及及連接數(shù)據(jù);;*)過程的的局部變量、、形式參數(shù)等等;目標代碼靜態(tài)數(shù)據(jù)棧堆堆區(qū):用于不符合后進先出使用用風格的數(shù)據(jù)據(jù);*)動態(tài)申請地址址空間的變量量。其中:“棧區(qū)區(qū)”和“堆區(qū)區(qū)”的大小是是隨著程序的的運行而改變的,因此此兩者采用對對開式使用。?!?.2.2活動記記錄過程在一次活活動(執(zhí)行)中所需要的的信息,存放放在一片連續(xù)續(xù)的存儲區(qū)中中,稱為一個個活動記錄。。過程調(diào)用產(chǎn)產(chǎn)生新的活動動記錄。活動記錄中至至少應該存放放兩類信息::1.控制信信息:*)控制活動動的正確調(diào)用用與返回;(如:返回地地址)*)控制活動動記錄的正確確切換;(如如:動態(tài)鏈)2.訪問信信息:用于為當前活活動提供對數(shù)數(shù)據(jù)(本地數(shù)數(shù)據(jù)、非本地地數(shù)據(jù))的訪問問。(如::SP,局部部數(shù)據(jù)區(qū))活動記錄結(jié)構(gòu)構(gòu)TOP→臨時單元內(nèi)情向量局部變量形式單元靜態(tài)鏈動態(tài)鏈SP→返回地址

指向:調(diào)用本本過程前,最最新活動記錄地址址指向:靜態(tài)直直接外層過程程最新活動記錄地址址相應實在參數(shù)數(shù)的地址或值值現(xiàn)行過程活動動記錄在棧頂位置指向:現(xiàn)行過過程活動記錄錄在棧里的起始始位置局部數(shù)據(jù)區(qū)連接數(shù)據(jù)TOP→臨時單元內(nèi)情向量局部變量形式單元靜態(tài)鏈動態(tài)鏈SP→返回地址

局部數(shù)據(jù)區(qū)局部數(shù)據(jù)區(qū)::*)靜態(tài)可確確定長度數(shù)據(jù)據(jù)如:簡單類型型的局部變量量,形式單元臨時變量對此種名字的訪訪問方式:設名字u,引用方式可可表示為變址訪問:LDR1,x[SP]x:名字u相對于活動記記錄起點的地址,在編編譯時可確定定?;顒佑涗浀拇蟠笮。庆o態(tài)態(tài)確定的。局部數(shù)據(jù)區(qū)::*)動態(tài)確定定長度的數(shù)據(jù)據(jù)的訪問信息如:可變數(shù)組組的內(nèi)情向量量;動態(tài)數(shù)據(jù)區(qū)的的首地址指針針對動態(tài)數(shù)據(jù)的引用需要經(jīng)過兩步步:⑴LDR1,x[SP]找到起始地址址(如內(nèi)情向向量)⑵LDR2,h[R1]x:名字u的訪問信息息地址(如::首地址)h:u與首地地址的偏移量量。(如:A[3]與A[1]之間間相差2)TOP→臨時單元內(nèi)情向量局部變量形式單元靜態(tài)鏈動態(tài)鏈SP→返回地址

局部數(shù)據(jù)區(qū)9、靜靜夜夜四四無無鄰鄰,,荒荒居居舊舊業(yè)業(yè)貧貧。。。。1月月-231月月-23Sunday,January1,202310、雨中黃葉葉樹,燈下下白頭人。。。21:02:1921:02:1921:021/1/20239:02:19PM11、以以我我獨獨沈沈久久,,愧愧君君相相見見頻頻。。。。1月月-2321:02:1921:02Jan-2301-Jan-2312、故人江海海別,幾度度隔山川。。。21:02:1921:02:1921:02Sunday,January1,202313、乍乍見見翻翻疑疑夢夢,,相相悲悲各各問問年年。。。。1月月-231月月-2321:02:1921:02:19January1,202314、他鄉(xiāng)生白白發(fā),舊國國見青山。。。01一月月20239:02:19下下午21:02:191月-2315、比不不了得得就不不比,,得不不到的的就不不要。。。。。一月239:02下下午午1月-2321:02January1,202316、行行動動出出成成果果,,工工作作出出財財富富。。。。2023/1/121:02:1921:02:1901January202317、做做前前,,能能夠夠環(huán)環(huán)視視四四周周;;做做時時,,你你只只能能或或者者最最好好沿沿著著以以腳腳為為起起點點的的射射線線向向前前。。。。9:02:19下下午午9:02下下午午21:02:191月月-239、沒有失敗,,只有暫時停停止成功!。。1月-231月-23Sunday,January1,202310、很多事情努努力了未必有有結(jié)果,但是是不努力卻什什么改變也沒沒有。。21:02:1921:02:1921:021/1/20239:02:19PM11、成功就是是日復一日日那一點點點小小努力力的積累。。。1月-2321:02:1921:02Jan-2301-Jan-2312、世間成事,,不求其絕對對圓滿,留一一份不足,可可得無限完美美。。21:02:1921:02:1921:02Sunday,January1,202313、不知知香積積寺,,數(shù)里里入云云峰。。。1月-231月-2321:02:2021:02:20January1,20

溫馨提示

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

最新文檔

評論

0/150

提交評論