指稱語義

一段程序在形式上只是一個符號串,程序的語義是人對程序意義的理解。現在我們希望嚴格化地定義這種理解。下面要討論的這種方式稱爲“指稱語義”。

表達式的指稱語義

整數類型表達式

首先定義表達式的指稱語義,這裏我們只考慮由常數、變量、四則運算構成的表達式。首先我們不考慮變量的範圍,並認爲變量只能取整數,這樣任何時候一個表達式的語義應當都是一個整數。同時,表達式的語義只取決於所有變量的取值。我們可以定義一個稱爲“程序狀態”的概念,自然地,程序狀態就是某一時刻所有變量的取值,它在本質上是一個從變量名到\(\Z\)的映射。由此定義常量的指稱語義就是常量,變量的指稱語義是當前程序狀態上變量的值,四則運算遞歸定義。 表達式的化簡其實就是表達式的等價變換,所謂等價根據指稱語義的定義就應當是兩個表達式的值在任何程序狀態下都相等。

布爾表達式

布爾表達式是一類特殊的表達式,它不同於上面定義的整數表達式,它只有真假兩種取值。布爾表達式可以看作整數類型表達式複合上與或非及其它二元運算符以後的新表達式,自然地只需要在定義true和false以後遞歸定義即可。

程序語句的指稱語義

表達式是在某一程序狀態下一個符號串映射的值,而程序語句在執行前後將可能改變程序狀態。於是,在指稱語義中程序語句的語義就被定義爲執行前後程序狀態\(s_1,s_2\)的所有可能的二元組。枚舉所有可能的\(s_1\),在執行語句後得到\(s_2\),程序語句的語義就是所有這些二元組\((s_1,s_2)\)。空語句就是所有相同程序狀態構成的二元組,賦值語句是所有把賦值變量修改成了特定值以後的二元組,順序執行語句就是兩個二元關係的複合,if語句是條件表達式的真假(相當於取子集,而子集也是一種特殊的二元關係)複合上對應的語句。while語句的語義比較複雜,它可以被定義爲無窮的並集,也可以在寫出表達式後被定義爲一個函數的不動點,我們採用後者的定義。

現實程序語言的指稱語義

在現實中,整數類型表達式是由範圍限制的。因此當表達式的值越界時,應當返回求值出錯。一種直接的做法是,將表達式的值域定義爲\(\Z_{2^{64}} \cup \{\epsilon\}\),其中\(\epsilon\)表示越界。在做表達式的四則運算時,也要先判斷是否越界再做運算。另一種做法是把表達式的指稱語義定義爲程序狀態與表達式的值的二元關係\((s,n)\),如果越界則爲空集。這樣定義之後,表達式的指稱語義就分爲normal和error兩種情況。

由於表達式求值可能出錯,因此程序語句的語義中也應當包含出錯。同時,程序語句也可能出現while循環死循環的情況。因此語句的語義可以分爲normal、error和inf三種情況。程序語句的指稱語義依然是二元關係的集合。

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