小步操作语义与大步操作语义之间的区别


28

小步操作语义与大步操作语义之间的根本区别是什么?

我很难理解它的含义和两者的动机。


1
维基百科有关操作语义的文章看起来很有希望……直到人们意识到“大步语义”部分中的信息总和为“该部分需要扩展。(2011年2月)。”
David Richerby

1
您的学习来源是什么?它包含什么内容?你怎么看?提示:的大步语义是x = 0; while ( true ) { x = x + 1; }什么?
拉斐尔

@Raphael我正在阅读了解计算。我的想法是,小步骤方法是将表达式简化为子表达式,直到无法将其进一步简化,然后对其进行评估。迈出的一大步似乎是立即评估事物,但是两种方法之间我并没有什么有趣的区别,因为它们似乎都是在挖掘更高层次的构造。
西蒙·摩根

较大的一步是通过评估子构造从较高级别的构造向下钻取,而通过将较大的构造减少为子构造则是较小的一步。
西蒙·摩根

Answers:


32

小步语义定义了一种在一个计算步骤中一次评估表达式的方法。从形式上来说,表达语言的一个小步语义是一个关系称为归约关系。小步语义详细描述了表达式所发生的事情。它可以给出无限链的精确描述,甚至是非终止程序。终止程序是这样的程序,即以终止,使得终止。 \ newcommand {\ llbracket} {[\![} \ newcommand {\ rrbracket} {] \!]}E→:E×Ee0e1e2e0e1v veE,ve

在另一端是指称语义。指称语义为每个表达式分配一个“含义”。它是一个从表达式到的函数:(称为域)。表示符号的空间可能与语法空间完全无关,例如可以是计算为数字的表达式,可以是一组数字,例如或。[[]]:EDDEDNR

大步语义在中间。表达式语言和一组值上的一大步语义是关系。它将表达式与它的值相关(如果语言是不确定的,则可能有多个值)。通常,特殊值用于非终止表达式。EV⇓:E×V

那么为什么我们有这三个概念呢?所有这些概念都可以相互建模,但是模型增加了一定程度的复杂性。

  • 给定一个小的步语义,可以定义相应的大步骤语义涉及每个表达式到其值(或值时,如果减少是非确定性的):当且仅当存在一个链和不能再减小。请注意,通常您无法从大步语义中重建小步语义。例如,在大步语义下,所有非终止表达式都是无法区分的。evee1vv
  • 给定一个大步语义,可以说这是上的一个小步语义。这不是特别有用。⇓:E×VEV
  • 给定一个小步语义,您可以定义一个对应的指称语义,其中表达式的表示是从其开始的约简链集合。这满足了形式上的定义,但并不是特别有用,因为它给对象增加了一组理论上的开销,而这些对象更容易通过直接查看语法来进行推理。
  • 给定一种指称语义,您可以通过将所有可能的符号添加为语言中的值来定义小步语义。这要求创建的值不是程序员可以编写的语法的一部分,这意味着一些有趣的结果必须声明“对于程序员可以编写的所有程序”,而不是“对于所有程序”。因此,这也不是很有用。[[]]
  • 给定大步语义,您可以定义相应的指称语义,其中域是值的集合集:。如果大步语义是确定性的(每个表达式都简化为一个值),则可以定义更简单的指称语义,其中域是值的集合。[[e]]={vev}
  • 相反,给定语义,您可以定义大步长语义。同样,这一点是没有意义的。[[]]E[[]]

从操作上来说,小步语义相当于查看解释器针对该语言执行的每个操作。大步语义只看结果值。指称语义是一种数学解释,它可能与计算机上发生的事情有关,也可能没有关系。

小步语义是最明显的一种。显然,它提供了有关非终止程序的有用信息。更一般而言,它提供有关程序行为的详细信息。

指称语义将句法构造转换为任意数学对象;它可以表达科学家想要的任何内容(您可以将表达式的定义定义为表达式中所有可能的归约链),但要付出一定程度的复杂性。当我们确实想抽象一些细节(例如精确计算表达式的方式)时使用它。

大步语义在中间:它抽象了评估的细节,但保留了结果的句法性质。通常,当存在底层的小步语义时,使用该概念,以简洁地表示“以“ ”的形式。在这样的结构中,尽管概念非常不同(一个概念使我们可以谈论各个计算步骤和非终止程序,而另一个则不能),但是定义看起来非常相似,因为在这种情况下,定义大步语义基本上具有以下形式:“如果和…以及和(e1,,en),ee1en and e,eneeene1e2envv是一个值,然后是 ”。e1v


我也在学习这一点,但是我对您在回答中说的一些事情有疑问,我想请您澄清一下。您说过:“大步语义在中间。” 但是,小步实际上不是“中间”模型吗?考虑以下表达式:A:(((5 + 7)+ 3)B:((5 + 5)+ 5)C:((1 + 2)+1)D:((2 + 1)+1)指称将分类即使C和D都有不同的值(可能是“ C”和“ D”),大步将它们都分类为“ 4”,而A和B都将其分类为“ 15”。但是,小步将给您“(12 + 3)”和“(10 + 5)”为A和B,和“(3 + 1)”为C和D
蒂莫西天鹅

@TimothySwan假设您要定义常规的算术求值,则指称语义将无法区分C和D。小步语义将定义诸如的约简链。大步长的语义将与指称语义非常相似: vs。该在大步骤的语义是一个在语言的语法,而中指称语义是从元理论的人,但区别并不在这个简单的例子可见的或重要的。((2+1)+1)3+14((2+1)+1)3[[((2+1)+1)]]=444
吉尔(Gilles)'“ SO-别再作恶了”

因此,当您说“符号语义为每个表达式分配一个“含义”时”。您不是要自己唯一地标识表达式,而是某种与评估无关的含义?您能否提供一个简单的示例,清楚地说明大步法和指称语义之间的区别?另外,请解释3((2+1)+1)⇓3我猜“指称”是一些最终所有的价值,但在什么情况下会“大步”并不一定直接映射到了吗?区别是否与上下文有关,例如(a + 1)取决于所包含的环境a
蒂莫西·斯旺

@TimothySwan只要没有副作用,没有确定性和功能,表达式的指称语义就是它求值的值。非确定性是说明大步和否定步法之间区别的好方法:表达式的表示形式是它可以具有的一组值:,而大步语义将具有多个可容许的判断:和 and ...这是一个错字。[[rand(1..n)]]={1,2,,n}rand(1..n)1rand(1..n)23
吉尔斯(Gillles)“所以-别再作恶了”
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.