複製鏈接
請複製以下鏈接發送給好友

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抽象機寄存器和內存

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)”這樣。 [1] 

SECD抽象機指令

  • 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,等等。它們都必須從棧上取得形式參數。
參考資料
  • 1.    袁飛. 基於SECD抽象機的XQuery編譯實現技術的研究[D]. 北京工業大學, 2009.