我正在寻找一个准确且易于理解的定义。我发现的彼此不同:
- 来自一本关于函数式反应式编程的书
指称语义是编程语言形式含义的数学表达。
- 但是,维基百科将其称为一种方法而不是数学表达式
指称语义是一种通过构建描述语言表达式含义的数学对象(称为指称)来形式化编程语言含义的方法
我正在寻找一个准确且易于理解的定义。我发现的彼此不同:
指称语义是编程语言形式含义的数学表达。
指称语义是一种通过构建描述语言表达式含义的数学对象(称为指称)来形式化编程语言含义的方法
术语“指称语义”既指程序的数学含义,也指赋予程序这些含义的方法。就像,比如说,“历史”这个词,它意味着事物的历史,以及关于事物历史的整个研究领域。
我从来没有发现术语“指称语义”的定义有助于理解这个概念及其意义。相反,我认为最好的方法是考虑指称语义支持的推理形式。
具体来说,指称语义可以通过引用透明的程序进行等式推理。维基百科给出了引用透明度的这个介绍性定义:
如果一个表达式可以用它的值替换而不改变程序的行为(换句话说,产生一个在相同输入上具有相同效果和输出的程序),则称该表达式是引用透明的。
但更精确的定义不会谈论用“值”替换表达式,而是用另一个表达式替换它。然后,参照透明性是这样一种属性,如果您用具有相同外延的替换替换部分,那么生成的整体也具有相同的外延。
所以恕我直言,作为一名程序员,这是要理解的关键:指称语义是关于如何为引用透明性的概念赋予数学“牙齿”,因此我们可以对有关替换正确性的主张给出原则性的答案。例如,在函数式编程的上下文中,关键应用之一是:我们什么时候可以说两个函数值表达式实际上表示“相同”函数,因此可以安全地替换另一个?经典的指称答案是外延相等:两个函数相等当且仅当它们将相同的输入映射到相同的输出,所以我们只需要证明所讨论的表达式是否表示扩展等价函数。例如,Quicksort 和 Bubblesort 是明显不同的参数,但在表示上它们是相同的函数。
在反应式编程的上下文中,最大的问题是:我们什么时候可以说两个不同的表达式仍然表示相同的事件流或与时间相关的值?