目標程序運行時的存儲組織

  在代碼生成前,編譯程序必須進行目標程序運行環境的設計和數據空間的分配。一般來講,假如編譯程序從操作系統中得到一塊存儲區以使目標程序在其上運行,該存儲區需容納生成的目標代碼和目標代碼運行時的數據空間。數據空間應包括:用戶定義的的各種類型的數據對象(變量和常數)所需的存儲空間,作爲保留中間結果和傳遞參數的臨時工作單元,調用過程時所需的連接單元,以及組織輸入輸出所需的緩衝區。目標代碼所佔的大小,在編譯時能確定,有些數據對象所佔用的空間也能在編譯時確定,其地址可以編譯進目標代碼中。但有些數據對象具有可變體積和待編譯性質,而無法在編譯時確定存儲空間和位置。
  因此運行時的存儲區常常劃分成:目標區靜態數據區棧區堆區。代碼區用以存放目標代碼,這是固定長度的,即編譯時能確定的。靜態數據區用以存放編譯時能確定所佔用空間的數據,堆棧區用於可變數據以及管理過程活動的控制信息。
  
  數據空間的使用和管理方法分成三種:靜態存儲分配棧式動態存儲分配堆式動態存儲分配
  如果編譯時能確定確定目標程序運行中所需全部數據空間的大小,編譯時安排好目標程序運行時的全部數據空間,確定每個數據對象的存儲位置,這種分配爲靜態存儲分配。
  棧式動態存儲分配是將整個程序的數據空間設計爲一個棧,每當調用一個過程,它所需的數據空間就分配在棧頂,沒當過程工作結束時就釋放着部分空間。過程所需的數據空間包括兩部分:一部分是生存期在本過程這次活動中的數據對象,如局部變量,參數單元,臨時變量等;另一部分是用以管理過程活動的記錄信息,即當一次過程調用出現時,調用該過程的過程的活動即被中斷,當前機器的狀態信息,諸如程序計數器(返回地址)、寄存器的值等,也都必須保留在棧中。
  如果一個程序語言提供用戶自由地申請數據空間和退還數據空間的機制(如 new),或者不僅有過程而且有進程的程序結構,即空間的使用未必服從“先申請後釋放,後申請先釋放”的原則,那麼棧式分配方案就不適應了。這種情況下通常使用一種稱爲堆式的動態存儲分配方案。假設程序運行時有一個大的存儲空間,每當需要時就從這片空間中借用一塊,不用時再退還,由於借還的時間先後不一,經一段運行之後,程序運行空間將被分成許多塊,有些佔用,有些空閒。有的分配管理系統採用廢品回收的方法來解決空閒空間的問題。
  
  
  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章