
308
|
第 9 章
程式視為
«x = true; x =x + 1»
,它們雖然合乎語法,但在執行時會造成動態語意的問
題。型別系統可以提前預測這些錯誤,在任何人試著執行它們之前,自動拒絕某些不良
的程式。
抽象解譯給了我們思考程式靜態語意的方式。程式的用意是執行,所以我們對程式意義
的標準解譯是由它的動態語意所提供:
«x = 1 + 2; y = x * 3»
是對它們執行算術運算
並將它們儲存在記憶體某處來操控數值的程式。但若我們另有選擇(更為抽象語意的語
言),就可以根據不同的規則『執行』相同的程式,並且得到更多的抽象結果,這樣的
結果提供了正常解譯程式時將會發生的部分資訊。
實作物
讓我們藉著建置第 2 章 SIMPLE 語言的型別系統來實作這些想法。表面上,這會像第
45 頁『大步語意』一樣的大步驟操作語意:我們將對每個表示 SIMPLE 程式的語法
(
Number
、
Add
等)類別實作方法,而且呼叫該方法將會傳回最終結果。這個方法在動態
語意稱為
#evaluate
,根據我們估算的是運算式還是陳述式,它的結果可能是完全估算
過的 SIMPLE 值,也可以是和 SIMPLE 值有關的環境關聯名稱:
>> expression = Add.new(Variable.new(:x), Number.new(1))
=> «x + 1»
>> expression.evaluate({ x: Number.new(2) })
=> «3»
>> statement = Assign.new(:y, Number.new(3)) ...