編譯原理課件(hdu)CHAPTER9(Run-TimeEnvironments)_第1頁
編譯原理課件(hdu)CHAPTER9(Run-TimeEnvironments)_第2頁
編譯原理課件(hdu)CHAPTER9(Run-TimeEnvironments)_第3頁
編譯原理課件(hdu)CHAPTER9(Run-TimeEnvironments)_第4頁
編譯原理課件(hdu)CHAPTER9(Run-TimeEnvironments)_第5頁
已閱讀5頁,還剩69頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

Chapter9

Run-TimeEnvironments概述存儲分配策略(Storage-allocationstrategies)訪問非局部名字(Accesstononlocalnames)參數(shù)傳遞(Parameterpassing)11/23/20221Chapter9

Run-TimeEnvironme9.1概述在生成目標(biāo)代碼之前,必須了解目標(biāo)代碼執(zhí)行時的環(huán)境1、空間環(huán)境目標(biāo)代碼的運行都是在操作系統(tǒng)分配的一塊存儲區(qū)內(nèi)進行的這塊存儲區(qū)必須容納目標(biāo)代碼和目標(biāo)代碼運行時的數(shù)據(jù)空間(目標(biāo)代碼中指令能訪問的空間)11/23/202229.1概述在生成目標(biāo)代碼之前,必須了解目標(biāo)代碼執(zhí)行時的環(huán)9.1概述編譯程序分配目標(biāo)程序運行時的數(shù)據(jù)空間的基本依據(jù)是設(shè)計程序語言時對程序運行中存儲空間的使用和管理辦法的規(guī)定代碼生成器在生成目標(biāo)代碼時必須要體現(xiàn)該程序語言在設(shè)計時分配數(shù)據(jù)空間的規(guī)定11/23/202239.1概述編譯程序分配目標(biāo)程序運行時的數(shù)據(jù)空間的基本依據(jù)9.1概述2、寄存器環(huán)境寄存器是目標(biāo)機器中的寶貴資源如何分配寄存器提高程序運行的效率是代碼生成器主要要解決的問題,(詳細內(nèi)容見下一講)**數(shù)據(jù)空間分配和寄存器分配最后都體現(xiàn)在生成的目標(biāo)代碼中11/23/202249.1概述2、寄存器環(huán)境寄存器是目標(biāo)機器中的寶貴資源如何9.1概述幾種典型程序設(shè)計語言的特點不同的語言有不同的分配數(shù)據(jù)空間的規(guī)定,有不同的組織運行時刻存儲空間的方法11/23/202259.1概述幾種典型程序設(shè)計語言的特點不同的語言有不同的分9.1概述幾種典型程序設(shè)計語言的特點與差異:CPASCALALGOLFORTRAN過程遞歸調(diào)用過程嵌套定義動態(tài)數(shù)組動態(tài)內(nèi)存申請指針檢查√××√×√√×√√√√√×√×

×

×

×√11/23/202269.1概述幾種典型程序設(shè)計語言的特點與差異:CPASCA9.1概述名字的聯(lián)編(BindingsofNames)名字的左值(l-value)—內(nèi)存地址,存儲名字的瞬時值名字的右值(r-value)—名字的瞬時值名字的聯(lián)編—將一個內(nèi)存地址與一個名字聯(lián)系起來在程序的一次運行中,一個名字右值(瞬時值)可能會經(jīng)常改變,一個名字也可能被聯(lián)編到多個地址(如遞歸調(diào)用中)11/23/202279.1概述名字的聯(lián)編(BindingsofNames9.1概述運行時刻內(nèi)存的典型劃分操作系統(tǒng)收到運行目標(biāo)程序的指令,分配一塊連續(xù)的內(nèi)存空間使目標(biāo)程序在其上運行P397Fig7.7這只是一個典型的劃分,具體語言不同,該劃分也不同棧(Stack):支持過程的遞歸調(diào)用堆(Heap):支持動態(tài)內(nèi)存申請11/23/202289.1概述運行時刻內(nèi)存的典型劃分操作系統(tǒng)收到運行目標(biāo)程序9.1概述活動記錄(ActivationRecords)是一段連續(xù)的存儲區(qū),用以存放過程的一次執(zhí)行所需要的信息,如局部數(shù)據(jù)活動記錄的結(jié)構(gòu)P398Fig7.8參數(shù)域、狀態(tài)域、數(shù)據(jù)域TOP指向棧頂,TOP-SP指向局部數(shù)據(jù)區(qū)的開始位置**這只是一個一般的結(jié)構(gòu),具體語言不同,活動記錄的結(jié)構(gòu)和內(nèi)容也有差異11/23/202299.1概述活動記錄(ActivationRecords9.1概述過程的活動(Activation)過程的一次完整執(zhí)行(第一條語句到最后一條語句),稱為過程的一次活動過程在執(zhí)行中稱它為活著的如果允許遞歸調(diào)用,程序的一次執(zhí)行可能有同一個過程的多個實例是活著的**本章主要討論不同語言的目標(biāo)程序在運行時的存儲分配策略及名字與其左值和右值的關(guān)系11/23/2022109.1概述過程的活動(Activation)過程的一次完9.2存儲分配策略靜態(tài)存儲分配(Staticallocation)編譯時確定所需的全部數(shù)據(jù)空間的大小編譯時安排好每個名字的存儲位置(相對地址)采用靜態(tài)存儲分配的典型語言是FORTRAN11/23/2022119.2存儲分配策略靜態(tài)存儲分配(Staticalloc9.2存儲分配策略FORTRAN語言程序是段結(jié)構(gòu)的,主程序段+若干子程序(函數(shù))段沒有動態(tài)數(shù)據(jù)類型,每個名字所需空間是確定的沒有遞歸調(diào)用,無需棧區(qū)沒有動態(tài)數(shù)據(jù)結(jié)構(gòu)(如鏈表),沒有動態(tài)內(nèi)存申請,無需堆區(qū)11/23/2022129.2存儲分配策略FORTRAN語言程序是段結(jié)構(gòu)的,主9.2存儲分配策略因此,編譯時可確定數(shù)據(jù)區(qū)大小,為每個名字分配好地址FORTRAN程序運行時內(nèi)存劃分為目標(biāo)代碼區(qū)和靜態(tài)數(shù)據(jù)區(qū),沒有棧區(qū)和堆區(qū)程序例子:P402example7.4Fig.7.10Fig.7.11Fig.7.1211/23/2022139.2存儲分配策略因此,編譯時可確定數(shù)據(jù)區(qū)大小,為每個名9.2存儲分配策略程序設(shè)計語言若允許遞歸調(diào)用、可變數(shù)組、可變數(shù)據(jù)結(jié)構(gòu):編譯時無法確定運行時需要的存儲空間大小動態(tài)存儲分配包括:棧式分配(Stackallocation)和堆式分配(Heapallocation)只能在運行時動態(tài)地確定,采用動態(tài)存儲分配11/23/2022149.2存儲分配策略程序設(shè)計語言若允許遞歸調(diào)用、可變數(shù)組、9.2存儲分配策略棧式存儲分配的思想:在運行空間中劃分一塊存儲空間作為棧區(qū)程序運行時每當(dāng)調(diào)用一個過程,就將該過程的活動記錄壓入棧中,過程執(zhí)行完畢將它的活動記錄從棧中彈出例子:P405Fig.7.1311/23/2022159.2存儲分配策略棧式存儲分配的思想:在運行空間中劃分一9.2存儲分配策略棧式存儲分配的實現(xiàn)反映在目標(biāo)代碼生成器的構(gòu)造策略中,最終體現(xiàn)在生成的目標(biāo)代碼中調(diào)用序列(CallSequence)目標(biāo)代碼中的一個指令序列,完成調(diào)用一個過程的一系列操作,包括為被調(diào)用過程分配一個活動記錄,并在相應(yīng)的域中填入信息11/23/2022169.2存儲分配策略棧式存儲分配的實現(xiàn)反映在目標(biāo)代碼生成器9.2存儲分配策略返回序列(ReturnSequence)目標(biāo)代碼中的一個指令序列,完成從一個被調(diào)用過程返回到它的調(diào)用過程的一系列操作,包括釋放被調(diào)用過程的活動記錄,并復(fù)制出返回值具體內(nèi)容:P407Fig.7.1411/23/2022179.2存儲分配策略返回序列(ReturnSequenc9.2存儲分配策略有些程序設(shè)計語言允許用戶自由申請內(nèi)存空間,如C的malloc和free,PASCAL的new和dispose何時申請何時釋放由用戶決定有些程序設(shè)計語言在進行數(shù)據(jù)空間分配時不服從棧式的存儲分配原則(即“先申請后釋放、后申請先釋放”)11/23/2022189.2存儲分配策略有些程序設(shè)計語言允許用戶自由申請內(nèi)存空9.2存儲分配策略這時采用堆式存儲分配方案運行空間劃分一塊堆區(qū)用戶(顯式)或目標(biāo)代碼需要時從這堆中借用一塊,不用時退還**這是一種完全動態(tài)的存儲分配方案11/23/2022199.2存儲分配策略這時采用堆式存儲分配方案運行空間劃分一9.3訪問非局部名字非局部名字相對于引用點所在的過程或分程序來說的程序執(zhí)行時引用的在當(dāng)前過程(分程序)之外定義的變量稱為非局部名字**本節(jié)主要討論棧式存儲分配中如何訪問非局部名字11/23/2022209.3訪問非局部名字非局部名字相對于引用點所在的過程或分9.3訪問非局部名字最近嵌套的作用域規(guī)則(mostcloselynestedrule)P412這是大多數(shù)程序設(shè)計語言采用的作用域規(guī)則例子:P416Fig.7.22(過程)例子:P413Fig.7.18(塊或分程序)11/23/2022219.3訪問非局部名字最近嵌套的作用域規(guī)則P4129.3訪問非局部名字分程序(塊)結(jié)構(gòu)——ALGOL和C分程序(塊)含有局部數(shù)據(jù)說明的語句序列有定界符號,允許嵌套例子:P413Fig.7.1811/23/2022229.3訪問非局部名字分程序(塊)結(jié)構(gòu)——ALGOL9.3訪問非局部名字過程(活動記錄)采用棧式存儲分配,分程序中的局部數(shù)據(jù)在活動記錄的局部數(shù)據(jù)區(qū)內(nèi)也采用棧式分配并列的分程序中的名字可分配同一個地址,因為它們所屬的分程序不會在同一時刻存活訪問同一過程中的局部名字可以從棧頂?shù)綏5走M行定位(同一活動記錄中)Fig.7.19**訪問其它過程中的局部名字見下面的討論11/23/2022239.3訪問非局部名字過程(活動記錄)采用棧式存儲分配,分9.3訪問非局部名字無過程嵌套定義——C程序中引用的名字或者在當(dāng)前的過程中被定義,或者在所有過程之外被定義在所有過程之外被定義的變量,稱之為全局變量,被存放在靜態(tài)數(shù)據(jù)區(qū),地址在編譯時刻確定(放符號表中)11/23/2022249.3訪問非局部名字無過程嵌套定義——C程序中引用的9.3訪問非局部名字過程中的局部名字聯(lián)編到過程的活動記錄的局部數(shù)據(jù)區(qū)中訪問非局部名字可根據(jù)符號表中該變量的地址直接到全局靜態(tài)數(shù)據(jù)區(qū)中查找11/23/2022259.3訪問非局部名字過程中的局部名字聯(lián)編到過程的活動記錄9.3訪問非局部名字有過程嵌套定義——PASCALPASCAL語言的一個例子P416過程和函數(shù)的嵌套深度(nestingdepth)訪問非局部名字的方法有兩種,一種是通過存取鏈,一種是通過DISPLAY表主程序為111/23/2022269.3訪問非局部名字有過程嵌套定義——PASCALP9.3訪問非局部名字存取鏈(accesslinks)活動記錄中的一個區(qū),是一個指針若過程P直接嵌入在過程Q中,則P的活動記錄中的存取鏈指向Q的最近的活動記錄中的存取鏈11/23/2022279.3訪問非局部名字存取鏈(accesslinks)活9.3訪問非局部名字如何建立存取鏈?參見P417Fig.7.23(a)(b)(c)(d)區(qū)分兩種情況:P4181、Np<Nx,Np是調(diào)用者深度,Nx是被調(diào)用者深度2、Np>=NxNp–Nx+1

11/23/2022289.3訪問非局部名字如何建立存取鏈?參見P417F9.3訪問非局部名字如何利用存取鏈訪問非局部名字?根據(jù)當(dāng)前過程的嵌套深度和非局部名字所在過程的嵌套深度,可以計算出需順著存取鏈前進的步數(shù),從而對非局部名字進行訪問Np–Na11/23/2022299.3訪問非局部名字如何利用存取鏈訪問非局部名字?根據(jù)當(dāng)9.3訪問非局部名字DISPLAY表是一個指向活動記錄的指針數(shù)組運行時刻要訪問的嵌套深度為i的非局部名字就在d[i]所指的活動記錄中這種方法只要一步就可到達要訪問的非局部名字的活動記錄,比存取鏈方法高效11/23/2022309.3訪問非局部名字DISPLAY表是一個指向活動記錄的9.3訪問非局部名字如何建立與維護DISPLAY表?DISPLAY表的大小由程序中嵌套深度最大的過程決定參見P421Fig.7.26(a)(b)(c)(d)11/23/2022319.3訪問非局部名字如何建立與維護DISPLAY表?9.3訪問非局部名字當(dāng)建立嵌套深度為i的過程的活動記錄時,首先在新的活動記錄中保存d[i]的值,然后置d[i]指向新的活動記錄注意考慮調(diào)用和返回兩種情況當(dāng)從過程中返回時,從活動記錄中恢復(fù)老的d[i]的值11/23/2022329.3訪問非局部名字當(dāng)建立嵌套深度為i的過程的活動記9.4參數(shù)傳遞傳值調(diào)用(Call-by-Value)把實在參數(shù)的右值傳遞給形式參數(shù)調(diào)用序列計算實在參數(shù)的值,并將它復(fù)制到被調(diào)用過程活動記錄的參數(shù)域中這種參數(shù)傳遞方法對調(diào)用過程的活動記錄沒有影響11/23/2022339.4參數(shù)傳遞傳值調(diào)用(Call-by-Value)把實9.4參數(shù)傳遞引用調(diào)用(Call-by-Reference)把實在參數(shù)的左值(地址)傳遞給形式參數(shù)調(diào)用序列將實在參數(shù)的左值(地址)復(fù)制到被調(diào)用過程活動記錄的參數(shù)域中被調(diào)用過程對形式參數(shù)的引用其實是對實在參數(shù)的地址(在被調(diào)用過程的活動記錄中)進行引用11/23/2022349.4參數(shù)傳遞引用調(diào)用(Call-by-Referenc9.4參數(shù)傳遞復(fù)制恢復(fù)(Copy-Restore)傳遞參數(shù)同傳值調(diào)用在從被調(diào)用過程返回前,把形式參數(shù)的現(xiàn)行右值復(fù)制回相應(yīng)的實在參數(shù)的左值中這種方法與引用調(diào)用是有區(qū)別的:在被調(diào)用過程體中訪問了非局部名字,而此非局部名字正是形式參數(shù)時P427Fig.7.3111/23/2022359.4參數(shù)傳遞復(fù)制恢復(fù)(Copy-Restore)傳遞參9.4參數(shù)傳遞傳名調(diào)用(Call-by-Name)用實在參數(shù)對過程體進行宏擴展,必要時對被調(diào)用過程中的名字進行改名(防止與調(diào)用過程中的名字重復(fù))**例子:P456練習(xí)7.6Fig.7.5311/23/2022369.4參數(shù)傳遞傳名調(diào)用(Call-by-Name)用實在TheEnd!11/23/202237TheEnd!11/22/202237Chapter9

Run-TimeEnvironments概述存儲分配策略(Storage-allocationstrategies)訪問非局部名字(Accesstononlocalnames)參數(shù)傳遞(Parameterpassing)11/23/202238Chapter9

Run-TimeEnvironme9.1概述在生成目標(biāo)代碼之前,必須了解目標(biāo)代碼執(zhí)行時的環(huán)境1、空間環(huán)境目標(biāo)代碼的運行都是在操作系統(tǒng)分配的一塊存儲區(qū)內(nèi)進行的這塊存儲區(qū)必須容納目標(biāo)代碼和目標(biāo)代碼運行時的數(shù)據(jù)空間(目標(biāo)代碼中指令能訪問的空間)11/23/2022399.1概述在生成目標(biāo)代碼之前,必須了解目標(biāo)代碼執(zhí)行時的環(huán)9.1概述編譯程序分配目標(biāo)程序運行時的數(shù)據(jù)空間的基本依據(jù)是設(shè)計程序語言時對程序運行中存儲空間的使用和管理辦法的規(guī)定代碼生成器在生成目標(biāo)代碼時必須要體現(xiàn)該程序語言在設(shè)計時分配數(shù)據(jù)空間的規(guī)定11/23/2022409.1概述編譯程序分配目標(biāo)程序運行時的數(shù)據(jù)空間的基本依據(jù)9.1概述2、寄存器環(huán)境寄存器是目標(biāo)機器中的寶貴資源如何分配寄存器提高程序運行的效率是代碼生成器主要要解決的問題,(詳細內(nèi)容見下一講)**數(shù)據(jù)空間分配和寄存器分配最后都體現(xiàn)在生成的目標(biāo)代碼中11/23/2022419.1概述2、寄存器環(huán)境寄存器是目標(biāo)機器中的寶貴資源如何9.1概述幾種典型程序設(shè)計語言的特點不同的語言有不同的分配數(shù)據(jù)空間的規(guī)定,有不同的組織運行時刻存儲空間的方法11/23/2022429.1概述幾種典型程序設(shè)計語言的特點不同的語言有不同的分9.1概述幾種典型程序設(shè)計語言的特點與差異:CPASCALALGOLFORTRAN過程遞歸調(diào)用過程嵌套定義動態(tài)數(shù)組動態(tài)內(nèi)存申請指針檢查√××√×√√×√√√√√×√×

×

×

×√11/23/2022439.1概述幾種典型程序設(shè)計語言的特點與差異:CPASCA9.1概述名字的聯(lián)編(BindingsofNames)名字的左值(l-value)—內(nèi)存地址,存儲名字的瞬時值名字的右值(r-value)—名字的瞬時值名字的聯(lián)編—將一個內(nèi)存地址與一個名字聯(lián)系起來在程序的一次運行中,一個名字右值(瞬時值)可能會經(jīng)常改變,一個名字也可能被聯(lián)編到多個地址(如遞歸調(diào)用中)11/23/2022449.1概述名字的聯(lián)編(BindingsofNames9.1概述運行時刻內(nèi)存的典型劃分操作系統(tǒng)收到運行目標(biāo)程序的指令,分配一塊連續(xù)的內(nèi)存空間使目標(biāo)程序在其上運行P397Fig7.7這只是一個典型的劃分,具體語言不同,該劃分也不同棧(Stack):支持過程的遞歸調(diào)用堆(Heap):支持動態(tài)內(nèi)存申請11/23/2022459.1概述運行時刻內(nèi)存的典型劃分操作系統(tǒng)收到運行目標(biāo)程序9.1概述活動記錄(ActivationRecords)是一段連續(xù)的存儲區(qū),用以存放過程的一次執(zhí)行所需要的信息,如局部數(shù)據(jù)活動記錄的結(jié)構(gòu)P398Fig7.8參數(shù)域、狀態(tài)域、數(shù)據(jù)域TOP指向棧頂,TOP-SP指向局部數(shù)據(jù)區(qū)的開始位置**這只是一個一般的結(jié)構(gòu),具體語言不同,活動記錄的結(jié)構(gòu)和內(nèi)容也有差異11/23/2022469.1概述活動記錄(ActivationRecords9.1概述過程的活動(Activation)過程的一次完整執(zhí)行(第一條語句到最后一條語句),稱為過程的一次活動過程在執(zhí)行中稱它為活著的如果允許遞歸調(diào)用,程序的一次執(zhí)行可能有同一個過程的多個實例是活著的**本章主要討論不同語言的目標(biāo)程序在運行時的存儲分配策略及名字與其左值和右值的關(guān)系11/23/2022479.1概述過程的活動(Activation)過程的一次完9.2存儲分配策略靜態(tài)存儲分配(Staticallocation)編譯時確定所需的全部數(shù)據(jù)空間的大小編譯時安排好每個名字的存儲位置(相對地址)采用靜態(tài)存儲分配的典型語言是FORTRAN11/23/2022489.2存儲分配策略靜態(tài)存儲分配(Staticalloc9.2存儲分配策略FORTRAN語言程序是段結(jié)構(gòu)的,主程序段+若干子程序(函數(shù))段沒有動態(tài)數(shù)據(jù)類型,每個名字所需空間是確定的沒有遞歸調(diào)用,無需棧區(qū)沒有動態(tài)數(shù)據(jù)結(jié)構(gòu)(如鏈表),沒有動態(tài)內(nèi)存申請,無需堆區(qū)11/23/2022499.2存儲分配策略FORTRAN語言程序是段結(jié)構(gòu)的,主9.2存儲分配策略因此,編譯時可確定數(shù)據(jù)區(qū)大小,為每個名字分配好地址FORTRAN程序運行時內(nèi)存劃分為目標(biāo)代碼區(qū)和靜態(tài)數(shù)據(jù)區(qū),沒有棧區(qū)和堆區(qū)程序例子:P402example7.4Fig.7.10Fig.7.11Fig.7.1211/23/2022509.2存儲分配策略因此,編譯時可確定數(shù)據(jù)區(qū)大小,為每個名9.2存儲分配策略程序設(shè)計語言若允許遞歸調(diào)用、可變數(shù)組、可變數(shù)據(jù)結(jié)構(gòu):編譯時無法確定運行時需要的存儲空間大小動態(tài)存儲分配包括:棧式分配(Stackallocation)和堆式分配(Heapallocation)只能在運行時動態(tài)地確定,采用動態(tài)存儲分配11/23/2022519.2存儲分配策略程序設(shè)計語言若允許遞歸調(diào)用、可變數(shù)組、9.2存儲分配策略棧式存儲分配的思想:在運行空間中劃分一塊存儲空間作為棧區(qū)程序運行時每當(dāng)調(diào)用一個過程,就將該過程的活動記錄壓入棧中,過程執(zhí)行完畢將它的活動記錄從棧中彈出例子:P405Fig.7.1311/23/2022529.2存儲分配策略棧式存儲分配的思想:在運行空間中劃分一9.2存儲分配策略棧式存儲分配的實現(xiàn)反映在目標(biāo)代碼生成器的構(gòu)造策略中,最終體現(xiàn)在生成的目標(biāo)代碼中調(diào)用序列(CallSequence)目標(biāo)代碼中的一個指令序列,完成調(diào)用一個過程的一系列操作,包括為被調(diào)用過程分配一個活動記錄,并在相應(yīng)的域中填入信息11/23/2022539.2存儲分配策略棧式存儲分配的實現(xiàn)反映在目標(biāo)代碼生成器9.2存儲分配策略返回序列(ReturnSequence)目標(biāo)代碼中的一個指令序列,完成從一個被調(diào)用過程返回到它的調(diào)用過程的一系列操作,包括釋放被調(diào)用過程的活動記錄,并復(fù)制出返回值具體內(nèi)容:P407Fig.7.1411/23/2022549.2存儲分配策略返回序列(ReturnSequenc9.2存儲分配策略有些程序設(shè)計語言允許用戶自由申請內(nèi)存空間,如C的malloc和free,PASCAL的new和dispose何時申請何時釋放由用戶決定有些程序設(shè)計語言在進行數(shù)據(jù)空間分配時不服從棧式的存儲分配原則(即“先申請后釋放、后申請先釋放”)11/23/2022559.2存儲分配策略有些程序設(shè)計語言允許用戶自由申請內(nèi)存空9.2存儲分配策略這時采用堆式存儲分配方案運行空間劃分一塊堆區(qū)用戶(顯式)或目標(biāo)代碼需要時從這堆中借用一塊,不用時退還**這是一種完全動態(tài)的存儲分配方案11/23/2022569.2存儲分配策略這時采用堆式存儲分配方案運行空間劃分一9.3訪問非局部名字非局部名字相對于引用點所在的過程或分程序來說的程序執(zhí)行時引用的在當(dāng)前過程(分程序)之外定義的變量稱為非局部名字**本節(jié)主要討論棧式存儲分配中如何訪問非局部名字11/23/2022579.3訪問非局部名字非局部名字相對于引用點所在的過程或分9.3訪問非局部名字最近嵌套的作用域規(guī)則(mostcloselynestedrule)P412這是大多數(shù)程序設(shè)計語言采用的作用域規(guī)則例子:P416Fig.7.22(過程)例子:P413Fig.7.18(塊或分程序)11/23/2022589.3訪問非局部名字最近嵌套的作用域規(guī)則P4129.3訪問非局部名字分程序(塊)結(jié)構(gòu)——ALGOL和C分程序(塊)含有局部數(shù)據(jù)說明的語句序列有定界符號,允許嵌套例子:P413Fig.7.1811/23/2022599.3訪問非局部名字分程序(塊)結(jié)構(gòu)——ALGOL9.3訪問非局部名字過程(活動記錄)采用棧式存儲分配,分程序中的局部數(shù)據(jù)在活動記錄的局部數(shù)據(jù)區(qū)內(nèi)也采用棧式分配并列的分程序中的名字可分配同一個地址,因為它們所屬的分程序不會在同一時刻存活訪問同一過程中的局部名字可以從棧頂?shù)綏5走M行定位(同一活動記錄中)Fig.7.19**訪問其它過程中的局部名字見下面的討論11/23/2022609.3訪問非局部名字過程(活動記錄)采用棧式存儲分配,分9.3訪問非局部名字無過程嵌套定義——C程序中引用的名字或者在當(dāng)前的過程中被定義,或者在所有過程之外被定義在所有過程之外被定義的變量,稱之為全局變量,被存放在靜態(tài)數(shù)據(jù)區(qū),地址在編譯時刻確定(放符號表中)11/23/2022619.3訪問非局部名字無過程嵌套定義——C程序中引用的9.3訪問非局部名字過程中的局部名字聯(lián)編到過程的活動記錄的局部數(shù)據(jù)區(qū)中訪問非局部名字可根據(jù)符號表中該變量的地址直接到全局靜態(tài)數(shù)據(jù)區(qū)中查找11/23/2022629.3訪問非局部名字過程中的局部名字聯(lián)編到過程的活動記錄9.3訪問非局部名字有過程嵌套定義——PASCALPASCAL語言的一個例子P416過程和函數(shù)的嵌套深度(nestingdepth)訪問非局部名字的方法有兩種,一種是通過存取鏈,一種是通過DISPLAY表主程序為111/23/2022639.3訪問非局部名字有過程嵌套定義——PASCALP9.3訪問非局部名字存取鏈(accesslinks)活動記錄中的一個區(qū),是一個指針若過程P直接嵌入在過程Q中,則P的活動記錄中的存取鏈指向Q的最近的活動記錄中的存取鏈11/23/2022649.3訪問非局部名字存取鏈(accesslinks)活9.3訪問非局部名字如何建立存取鏈?參見P417Fig.7.23(a)(b)(c)(d)區(qū)分兩種情況:P4181、Np<Nx,Np是調(diào)用者深度,Nx是被調(diào)用者深度2、Np>=NxNp–Nx+1

11/23/2022659.3訪問非局部名字如何建立存取鏈?參見P417F9.3訪問非局部名字如何利用存取鏈訪問非局部名字?根據(jù)當(dāng)前過程的嵌套深度和非局部名字所在過程的嵌套深度,可以計算出需順著存取鏈前進的步數(shù),從而對非局部名字進行訪問Np–Na11/23/2022669.3訪問非局部名字如何利

溫馨提示

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

最新文檔

評論

0/150

提交評論