SECD抽象機

SECD 機是非常有影響的意圖作為函式式程式語言編譯器目標的虛擬機。SECD 分別是這個機器的內部暫存器的名字的首字母:Stack, Environment, Code, Dump。這些暫存器指向在記憶體中鍊表。

這種機器最初明確設計用來計算 lambda 演算表達式。最初 Peter J. Landin 在1963年把它作為他的 ISWIM程式語言定義的一部分描述。Landin 出版的描述非常抽象,(象一種操作語義那樣)留下很多實現選擇開放著。所以 SECD 機經常以更具體的形式出現,比如 Peter Henderson 的 Lispkit Lisp 編譯器,它自1980年開始發行。此後它已經被用做多個其他實驗編譯器的目標。

在1989年在卡爾加里大學的研究者製作了這種機器的一個硬體實現。

基本介紹

  • 中文名:SECD抽象機
  • 外文名:SECD machine
  • 分類:計算機模型
暫存器和記憶體,指令,

暫存器和記憶體

SECD 機是基於的,函式從棧中取得它們的形式參數(parameter)。與之相對,指令的實際參數(argument)跟在指令之後。
棧同所有內部數據結構一樣是個列表,S暫存器指向這個列表的頭部或開始端。由於列表結構,棧不需要連續成塊的記憶體,所以只要有一個單一空閒記憶體單元棧空間就是可獲得的。即使在所有單元都已經使用了時候,垃圾收集仍可以產生額外的空閒記憶體。
C暫存器指向要計算的代碼或指令列表的頭部。一旦指令已經被執行,C就指向在列表中的下一個指令—它類似於常規機器中的“指令指針”(或程式計數器),除了後續指令不需要在後續記憶體位置上之外。
E暫存器管理當前變數環境,它指向一個列表的列表。每個單獨列表都代表一個環境級別:當前函式的形式參數位於列表的頭部,在當前函式中自由但受外圍函式約束(bound)的變數在E的其他元素中。
D暫存器指向轉儲(dump)的頭部,它被用做其他暫存器的值的臨時存儲,例如在函式調用期間。它聯繫於其他機器的返回棧。
SECD 機的記憶體組織類似於大多數函式式程式語言解釋器所用的模型:一些記憶體單元,每個都持有要么一個“原子”(一個簡單值例如“13”),或表示一個空或非空列表。在後者情況,單元持有到其他單元的兩個指針,一個表示第一個元素,另一個表示除去第一個元素之外的列表。這兩個指針傳統上分別叫做carcdr— 現在更常使用現代術語“頭”和“尾”。單元持有值的不同類型由一個“標誌”來區分。原子的不同類型(整數、字元串等等)經常是同樣可區分的。
記憶體單元 3 到 5 不屬於這個列表,它的單元可以在記憶體中隨機分布。單元 2 是這個列表的頭部,它指向持有第一個元素的值的單元 1,和只包含“2”和“3”的(開始於單元 6)列表。單元 6 指向持有“2”的單元,和表示只包含“3”的列表的單元 7。它接著指向持有值“3”的單元 8,和指向空列表(nil)作為 cdr。在 SECD 機中,單元 0 總是暗含表示空列表,所以不需要特殊的標誌值來指示空列表(只需要簡單的指向單元 0)。
在列表的單元中 cdr 必須指向另一個列表的原則只是個約定。如果 car 和 cdr 二者都指向原子,則生成一個點對,通常寫為如“(1 . 2)”這樣。

指令

  • nil把一個 nil(空)指針壓入棧頂
  • ldc把一個常量實際參數壓入棧頂
  • ld把一個變數的值壓入棧頂。這個變數是由實際參數指示的一個點對。這個點對的 car 指定級別,cdr 指定位置。所以“(1 . 3)”給出當前函式(級別 1)的第三個形式參數。
  • sel期望兩個列表實際參數,並從棧頂彈出一個值。如果彈出的值非 nil 在執行第一個列表,否則執行第二個列表。在這些列表指針之一被作為新的C暫存器之前,保存到隨後sel的指令的指針到轉儲上。
  • join從轉儲中彈出一個列表引用並把它作為C暫存器的新值。這個指令出現在sel的兩個選擇二者的結束處。
  • ldf接受表示函式的一個列表實際參數。它構造一個閉包(包含函式和當前環境的一個點對)並把它壓入棧頂。
  • ap從棧頂彈出一個閉包和形式參數值的一個列表。通過安裝這個閉包的環境為當前環境,把形式參數列表壓在它的上面,清空棧,並設定C暫存器為這個閉包的函式指針,這樣就把閉包套用於形式參數之上。S,E暫存器以前的值和C暫存器的下一個值被保存到轉儲上。
  • ret從棧頂彈出返回一個值,從轉儲中恢復S,EC暫存器,並把這個返回值壓入現在當前的棧頂。
  • dum把一個“啞元”也就是空列表壓入環境列表的頂部。
  • rapap那樣工作,唯一不同的是它把啞環境的出現替代為當前環境,因此使遞歸成為可能。
存在一些基本函式的補充指令如 car, cdr,列表構造,整數加法,I/O,等等。它們都必須從棧上取得形式參數。

相關詞條

熱門詞條

聯絡我們