執行時環境筆記

2021-06-20 17:57:42 字數 2260 閱讀 3917

《編譯原理與實踐》第七章

名詞:

活動記錄(activation record):包括引數,狀態資訊,local data,臨時資料

stack frames:儲存在stack上的ar

frame pointer:專門用於指向ar的暫存器

argument pointer(ap):專門用於指向ar中引數部分的暫存器

呼叫序列(calling sequence):包括ar的記憶體分配,引數的計算和儲存,印象呼叫的必要的暫存器的儲存和設定

返回序列(return sequence):返回值的設定,暫存器的調整,ar記憶體的釋放

設計呼叫序列的重要性在於:

1)在呼叫者和被呼叫者之間劃分呼叫操作的範圍,即有多少呼叫序列的**放在呼叫的時候,有多少**放在被呼叫者開始

這一點是很重要的,一般來說在呼叫點插入**較為容易,但是相同的**被複製多次會導致生成的**量的提高

2)多大程度上依賴於處理器的支援,而不是為呼叫序列的每一步顯式的生成**

【筆記】由以上知,ar中的各項資料,他們分別由誰來儲存,需要在呼叫者(caller)和被呼叫者(callee)之間協調和分配

一般來說有三種主要的執行時環境,靜態,基於棧,動態,這裡主要說基於棧的執行時環境,因為這是c的方式

一般來說,這種基於棧的執行時環境,需要包括當前的ar和前乙個ar,前乙個ar用於在退出當前呼叫的時候使用。當前ar指標一般儲存在fp中,前乙個ar的指標則儲存在當前ar中,一般在ar的中部,引數區和區域性變數之間,該指標也被稱為控制鏈(control link)或者動態鏈(dynamic link),它指向前乙個ar的控制鏈。

上圖給出了ar的結構,其中m為引數,y為區域性變數,由於控制鏈在ar的中部,可以通過正負偏移量的方式,計算出各個引數和區域性變數的位址

call sequence:

1.計算引數,並且把它們儲存在正確的位置(通過入棧的方式,引數從右向左或者從左向右入棧)

2.把fp儲存在新的ar的控制鏈中

3.把fp指向新的ar的控制鏈,通常就是把sp賦值給fp,因為此時,sp指向棧頂,也就是控制鏈的位置

4.把返回位址儲存在新的ar中

5.跳轉到被呼叫過程中

return sequence:

1.把fp賦值到sp中

2.把控制鏈載入到fp中(現在fp指向上乙個ar)

3.根據返回位址進行跳轉(可以通過fp找到返回位址的偏移)

4.sp popup 引數

如何處理變長引數

nested declaration

巢狀宣告,在c中就是在乙個block中,巢狀了另外乙個block,對於這種情況,一般的處理方法是在進入block的時候,在棧中分配臨時資料,在退出block的時候,釋放棧中的臨時資料

stack-based environments with local procedures

對於在乙個procedure中包含有另外乙個procedure的情況,需要在ar中加入access link,指向定義procedure的ar,control link構建了calling environments,access link構建了defining environments。在訪問變數的時候,通過access link可以逐層查詢定義,為了計算遞迴查詢的次數,為每一種declaration都加入了netsting level的概念,即巢狀層數,處於最外層的global 變數或者procedure的nesting level是0,巢狀一層該值加一。在m層如果需要訪問n層的變數的話,只需要遞迴m-n次就可以查詢到。

stack-based environments with procedure parameters

在處理把procedure當做引數的情況中,需要傳遞兩個引數,乙個是指令指標ip(指向**位址),乙個是環境指標ep(指向定義**的ar),他們一起構成了closure(也就是access link close the hole caused by nonlocal reference)。如下圖所示的呼叫過程:procedure p的引數是procedure r,procedure r在procedure q中定義

如下圖:在呼叫p的ar中,引數a:的ip是procedure r,ep是procedure r所在的procuedure q的ar,這是r的定義環境,而在procedure r被呼叫的時候,其ar中的access link就是這個ep所指向的access link

根據以上分析,最終的ar如下:

其中當引數為procedure的時候,需要傳遞procedure code和context作為引數,其中context就是access link,它指向caller

第18章 執行時環境

乙個函式分成3個部分 函式序 prologue 函式體 body 和函式跋 epilogue 函式序用於執行函式啟動需要的一些工作,如為區域性變數保留堆疊中的記憶體。函式體是用於執行有用工作的地方。函式跋用於在函式即將返回之前清理堆疊。當程式增長後的容量超過了記憶體的數量時,它就無法執行,因此它就屬...

v8學習筆記 三 執行時環境

context 上下文 執行時環境 1.概述 上下文 context 即執行時環境 runtime 內建 自定義 的物件 函式 每個 v8 context 含有乙個 global 全域性 objecttemplate 物件context scope 表示進入 context 建立 1 儲存頂層 i ...

執行時異常

常見的幾種如下 nullpointerexception 空指標引用異常 classcastexception 型別強制轉換異常。illegalargumentexception 傳遞非法引數異常。arithmeticexception 算術運算異常 arraystoreexception 向陣列中...