2009年(2)
分类: C/C++
2009-08-03 16:51:42
操作语义
计算机语言的操作语义是这样理解的: 语言的含义是有语言的实施(编译器)决定的,一旦实施确定下来,语言的含义也就确定了,语言的实施就是对计算机系统的操作,因而操作语义的名称就由此而来。由于要研究一般性,故而计算机系统应该是抽象的机器,下面就用一个简单的机器“栈-状态-控制”机器为例说明一个简单语言 FLOW的操作语义
FLOW语言是很简单的语言,但却有能力成为所有语言,呵呵,花哨的包装会让程序员觉得语言更易用,但是对于机器来说没有区别,呵呵,就如计算机发展半个世纪,却始终摆脱不了图灵理论的计算局限。。。貌似远了,回到FLOW语言和“栈-状态-控制”机器。
FLOW语言的语法:
1) 原子语句集 Asts,用A表示其中元素;
2) 布尔表达式 Bexp,用B表示
3) 语句S:=skip|A|S;S|(if B then S else S)|(while B do S)
这里不管原子语句,反正就是语句(比如赋值语句等),布尔表达式和平常一样理解,但也不给出具体形式,不然怎么叫抽象呢,呵呵
说完语句了来说机器
“栈-状态-控制”机器 包含3部分: 控制部分c,记载程序变元当前状态s,栈,记载中间结果st。三元组(st,s,c)构成了机器的一个快照,又叫一个状态,或者大状态…,不管什么名词,反正这个三元组代表了机器现在所处的一个状态。
语言的操作语义就是操作机器 从一个状态到另一个状态,故而叫操作语义(个人理解哈)下面我们要看看FLOW对该机器的操作语义。
控制语句if和while对机器的操作
一)分析:
1)(st,s,(if B then S1 else S2)c)=>(S2:S1:st,s,B if c)
红色部分是说明部分,类似于注释,=>表示状态间的转移,可见if语句对该机器的操作语义,S1,S2是中间结果,布尔表达式B还没有求出来,所以我们需要求值操作,该操作我们抽象的定义为Bexp到{T,F}的映射,用B『.』表示
2)while语句(st,s,(while B do S))=>(skip:S;(while B do S):st,s,B while c)
二)下面应该是求值B,上面已经说过了,用B『.』表示
三)最后就是执行了,呵呵,对机器的操作产生了效果呢,我们看看机器如何执行的。下面都是针对c=;c1,或c=c1=NULL的形式
(1)(st,s,skip c)=>(st,s,c1)
(2)(st,s,Ac)=>(st,A『.』(s),c1) ,A『.』表示对原子表达式的求值,不给出具体形式
(3)(tt:S2:S1:st,s, if c)=>(st,s,S1c)
(4) (ff:S2:S1:st,s, if c)=>(st,s,S2c)
(5)while…
(6)while….不写了,
呵呵,到目前为止我们定义了解释执行FLOW程序的一个抽象机器,也就给出了FlOW语言的一种操作语义,这就是操作语义啦,是不是很没意思啊!感兴趣的可以用FLOW写个小程序,给出其对机器的操作过程(一系列的状态转移….)
PS:blog里面居然没有计算机理论这个分类 ,我把它分到C语言里了,汗一下!