什么是“形式语义”?

时间:2010-02-28 23:27:07

标签: formal-semantics

我正在阅读一篇非常愚蠢的论文,并继续谈论乔托如何定义“形式语义”。

  

Giotto有一个正式的语义,用于指定模式切换,任务间通信以及与程序环境通信的含义。

我处在边缘,但却无法完全理解“形式语义”的含义。

4 个答案:

答案 0 :(得分:12)

为了扩展Michael Madsen的答案,一个例子可能是++运算符的行为。非正式地,我们使用普通英语描述运算符。例如:

  

如果xint类型的变量,++x会导致x增加1。

(我假设没有整数溢出,并且++x没有返回任何内容)

在形式语义中(我将使用操作语义),我们还有一些工作要做。首先,我们需要定义类型的概念。在这种情况下,我将假设所有变量都是int类型。在这种简单的语言中,程序的当前状态可以由存储来描述,存储是从变量到值的映射。例如,在程序中的某个时刻,x可能等于42,而y等于-5351。商店可以用作函数 - 例如,如果商店s的变量x的值为42,那么s(x) = 42

程序的当前状态还包括我们必须执行的程序的其余语句。我们可以将其捆绑为<C, s>,其中C是剩余的程序,s是商店。

因此,如果我们有状态<++x, {x -> 42, y -> -5351}>,这是一个非正式的状态,其中唯一剩下的执行命令是++x,变量x的值为42,变量{ {1}}的值为y

然后我们可以定义从程序的一个状态到另一个状态的转换 - 我们描述当我们在程序中执行下一步时会发生什么。因此,对于-5351,我们可以定义以下语义:

++

有些非正式地,通过执行<++x, s> --> <skip, s{x -> (s(x) + 1)> ,下一个命令是++x,它没有任何效果,并且商店中的变量没有变化,skip除外,它现在具有最初的价值加上一个。还有一些工作要做,例如定义我用来更新商店的符号(我没有这样做以阻止这个答案变得更长!)。因此,一般规则的具体实例可能是:

x

希望能给你这个想法。请注意,这只是形式语义的一个例子 - 除了操作语义,还有公理语义(通常使用Hoare逻辑)和指称语义,可能还有很多我不熟悉的。

正如我在对另一个答案的评论中提到的,形式语义的一个优点是你可以使用它们来证明程序的某些属性,例如它终止。除了显示您的程序没有表现出不良行为(例如非终止)之外,您还可以通过证明您的程序与给定规范匹配来证明您的程序的行为符合要求。话虽如此,我从未发现指定和验证程序的想法都令人信服,因为我发现规范通常只是在逻辑中重写的程序,因此规范也很可能是错误的。 / p>

答案 1 :(得分:9)

Formal semantics描述语义 - 嗯,一种正式的方式 - 使用符号以明确的方式表达事物的意义。

它与非正式语义相反,它本质上只是用简单的英语描述所有内容。这可能更容易阅读和理解,但它会产生误解的可能性,这可能会导致错误,因为有人没有按照您希望他们阅读的方式阅读段落。

编程语言可以同时具有正式和非正式语义 - 非正式语义可以作为形式语义的“纯文本”解释,如果你不确定是什么,形式语义将是你看的地方。非正式的解释确实意味着。

答案 2 :(得分:3)

就像语言的语法可以通过形式语法(例如BNF)来描述一样,可以使用不同类型的形式来将该语法映射到数学对象(即语法的含义)。

来自This page

A Practical Introduction to Denotational Semantics很好地介绍了[指称]语义与语法的关系。本书的开头还简要介绍了形式语义学的其他非指称方法(虽然维基百科链接Michael给出的更详细,可能更新)。

来自the author's site

  

语义模型没有   陷入与BNF相同的程度   它的后代有语法。   这可能是因为语义确实如此   似乎只是比平原更难   句法。最成功的系统是   描述的指称语义   必要的所有功能   编程语言并有声音   数学基础。 (还有   积极研究类型系统和   并行编程。)很多   指称定义可以   作为口译员执行或翻译   进入“编译器”但这还没有   导致高效的发电机   编译器可能是另一个原因   指称语义较少   比BNF更受欢迎。

答案 3 :(得分:0)

在像Giotto这样的编程语言的上下文中,含有形式语义的语言对其各个语言结构具有数学上严格的解释。

目前大多数编程语言都没有严格定义。他们可能会遵守相当详细的标准文档,但最终编译器有责任发出以某种方式遵守这些标准文档的代码。

另一方面,当需要使用例如模型检查或定理证明对程序代码进行推理时,通常使用正式指定的语言。适合这些技术的语言往往是功能性的,例如ML或Haskell,因为它们是使用数学函数和它们之间的转换来定义的;也就是数学的基础。

另一方面,C或C ++是由技术描述非正式定义的,尽管存在形式化这些语言方面的学术论文(例如,Michael Norrish:C ++的形式语义,https://publications.csiro.au/rpr/pub?pid=nicta:1203),但通常没有找到进入官方标准的方式(可能是由于缺乏实用性,特别是难以维护)。