什麼是編譯器設計中塊結構語言的實現?
塊是一條包含自身區域性資料宣告的語句。塊的概念起源於ALGOL。塊結構語言允許使用長度可調的陣列。塊的主要特點是它們的括號結構(ALGOL中使用begin和end),它們可以在其中定義它們的資料。
塊結構語言的啟用記錄
像ALGOL和PL/I這樣的塊結構語言允許使用可調整大小的陣列,即長度可變的陣列。因此,我們不能將大小不規則的陣列儲存在啟用記錄之間。它可以在啟用記錄的一個角上或固定大小資料之上分配靈活或可變的陣列。指向這些可調整陣列的指標將儲存在啟用記錄的固定位置。
下圖顯示了一個過程的啟用記錄,該過程有兩個長度可調的陣列。
考慮一個塊結構程式
過程 P;
實數 A;
實數陣列 X [10];
在這個過程中,我們使用了3個塊。這些塊的執行將導致它們的區域性資料項A、B、C、D和可調整陣列X、Y、Z被儲存到堆疊中。特定塊的啟用記錄將在該塊當前正在執行時生成。
如果塊2處於活動狀態或正在執行,則過程P的啟用記錄將儲存塊2的區域性資料和指向可調整陣列的指標在頂部。
顯示和靜態連結
有兩種方法可以訪問過程的非區域性資料:
**靜態連結**—在這種方法中,一個稱為靜態連結的指標附加到每個過程,該指標指向程式中物理上圍繞它的該過程的最頂層啟用記錄。因此,任何過程的非區域性資料引用都可以透過下降指標鏈來查詢所有靜態封閉過程。
**顯示**—顯示是一個指標陣列,用於加快對非區域性資料的訪問速度。
引數傳遞
呼叫過程後,引數將傳遞給該過程。有兩個引數
- 實際引數
- 形式引數
根據這些引數,存在各種引數傳遞方法:
- **按值呼叫**—這是引數傳遞最簡單的方法。計算實際引數,並將它們的r值傳遞給被呼叫過程。
- **按引用呼叫**—當引數按引用傳遞(也稱為按地址呼叫或按位置呼叫)時,呼叫方將傳遞給被呼叫過程,一個指向每個實際引數的儲存地址的指標。
- **按名呼叫**—這是一種不太流行的引數傳遞方法。該過程被視為宏。該過程體將被呼叫方的呼叫替換,實際引數將被形式引數替換。
返回
當過程P1呼叫過程P2時,過程P2將向P1返回一些值。
將進行以下更改。
- P2返回的值將儲存在啟用記錄中為其保留的空間中。
- 頂部指標將被恢復,即再次指向P1呼叫P2之前的位置。
- 恢復SP,即設定SP指標指向P1啟用記錄中的舊SP。
- 從P1啟用記錄獲取返回地址以完成P2執行的返回。
廣告