什么是指称语义?

时间:2016-07-20 18:24:21

标签: functional-programming reactive-programming denotational-semantics

我正在寻找一个准确且易于理解的定义。我发现的那些彼此不同:

  • 从功能反应式编程的书中
  

指称语义是数学的表达式   编程语言的形式意义。

  • 然而,维基百科将其视为一种方法而非数学表达式
  

指称语义是一种形式化意义的方法   通过构造数学对象来编程语言(称为   用来描述表达式的含义   语言

2 个答案:

答案 0 :(得分:4)

术语"指称语义"指 这就像是,#34; history"这意味着某事物的历史,以及事物历史的整个研究领域。

答案 1 :(得分:2)

我从未发现术语“指称语义学”的定义对理解概念及其意义很有用。相反,我认为最好通过考虑指称语义能够推理的形式来接近它。

具体而言,指称语义可以使用referentially transparent程序实现等式推理。维基百科给出了引用透明度的这个介绍性定义:

  

如果表达式可以替换为其值而不改变程序的行为(换句话说,在同一输入上产生具有相同效果和输出的程序),则表示该表达式是引用透明的。

但更精确的定义不会谈论用“值”替换表达式,而是用另一个表达式替换它。然后,引用透明度是这样的属性,如果您将部分替换为具有相同标记的替换,则生成的整体具有相同的属性外延。

所以恕我直言,作为程序员,这是理解的关键:指称语义是关于如何给出参考透明度概念的数学“牙齿”,因此我们可以给出关于替代正确性的主张的原则性答案。例如,在函数式编程的上下文中,关键应用之一是:我们何时可以说两个函数值表达式实际上表示“相同”的函数,因此可以安全地替换另一个?经典的指称答案是extensional equality:当且仅当它们将相同的输入映射到相同的输出时,两个函数是相等的,所以我们只需要证明所讨论的表达式是否表示扩展等效函数。因此,例如,Quicksort和Bubblesort显然是不同的参数,但从表面上看它们是相同的函数。

在反应式编程的背景下,最大的问题是:我们何时可以说两个不同的表达式仍然表示相同的事件流或时间相关值?