计算机科学中透明性概念,函数式编程 - 什么是参考透明度?

“参照透明度”一词来自分析哲学,即分析自然语言结构,基于逻辑和数学方法的陈述和论证的哲学分支。 换句话说,它是计算机科学之外最接近我们称之为编程语言语义的主题。 哲学家Willard Quine负责启动参照透明度的概念,但Bertrand Russell和Alfred Whitehead的方法也暗示了这一点。

“参考透明度”的核心是一个非常简单明了的想法。 术语“指示物”用于分析哲学中来谈论表达所指的事物。 它与编程语言语义中的“含义”或“外延”大致相同。 使用Andrew Birkett的例子(博客文章),“苏格兰的首都”一词指的是爱丁堡市。 这是一个直接的“指称对象”的例子。

如果在该上下文中用引用同一实体的另一个术语替换术语而不改变含义,则句子中的上下文是“引用透明的”。 例如

苏格兰议会在苏格兰首都举行会议。

意思是一样的

苏格兰议会在爱丁堡举行会议。

因此,“苏格兰议会在...中相遇”的背景是一种参考透明的背景。 我们可以用“爱丁堡”取代“苏格兰的首都”而不改变其含义。 换句话说,上下文只关心术语所指的内容,而不关心其他内容。 这就是上下文“引用透明”的意义。

另一方面,在句子中,

自1999年以来,爱丁堡一直是苏格兰的首府。

我们不能做这样的替代。 如果我们这样做,我们会得到“自1999年以来爱丁堡一直是爱丁堡”,这是一个可怕的说法,并没有表达与原句相同的含义。 因此,似乎“爱丁堡自1999年以来一直”的背景是参考不透明的(与参考透明相反)。 它显然关心的东西比术语所指的更多。 它是什么?

像“苏格兰的首都”这样的东西被称为明确的术语,他们长期以来没有给逻辑学家和哲学家带来过少的头痛。 Russell和Quine将它们排除在外,说它们实际上并不是“参照”,即认为上述例子用于指代实体是错误的。 正确的理解“爱丁堡自1999年以来一直是苏格兰的首都”的正确方法

苏格兰自1999年以来一直有资本,首都是爱丁堡。

这句话不能变成坚果。 问题解决了! 奎因的观点是说自然语言是混乱的,或者至少是复杂的,因为它被用来方便实际使用,但哲学家和逻辑学家应该以正确的方式理解它们。 参考透明度是一种用于带来这种清晰含义的工具。

这与编程有什么关系? 实际上并不是很多。 正如我们所说,参考透明度是用于理解语言的工具,即用于分配意义。 创建编程语言语义学领域的Christopher Strachey在他的意义研究中使用了它。 他的基础论文“编程语言中的基本概念”可以在网上找到。 这是一篇精美的论文,每个人都可以阅读和理解它。 所以,请这样做。 你会得到很多启发。 他在本段中引入了“参照透明度”一词:

表达式最有用的属性之一是由Quine引用   透明度。 本质上,这意味着如果我们希望找到一个表达式的值   包含一个子表达式,我们唯一需要知道的关于子表达式的是它   值。 子表达式的任何其他功能,例如其内部结构,数量   和组件的性质,评估的顺序或墨水的颜色   它们的编写方式与主表达式的值无关。

使用“本质上”表明Strachey正在解释它,以便用简单的术语来解释它。 功能程序员似乎以自己的方式理解这一段。 本文还有其他9种“引用透明度”,但它们似乎并没有打扰其他任何一种。 实际上,Strachey的全文都致力于解释命令式编程语言的含义。 但是,今天,功能程序员声称命令式编程语言不是透明的。 Strachey会在他的坟墓中转身。

我们可以挽救局势。我们说自然语言是“杂乱的,或者至少是复杂的”,因为它是为了方便实际使用。编程语言是一样的。它们“杂乱,或至少复杂”,因为它们被制作成便于实际使用。这并不意味着他们需要混淆我们。他们只需要以正确的方式理解它们,使用一种引用透明的元语言,这样我们就可以清晰地理解它们。在我引用的论文中,Strachey正是如此。他通过将命令式编程语言分解为基本概念来解释命令式语言的含义,从不在任何地方失去清晰度。他的分析的一个重要部分是指出编程语言中的表达式有两种“值”,称为l值和r值。在Strachey的论文之前,这一点并未得到理解,并且混乱占据了至高无上的地位。今天,C的定义经常提及它,每个C程序员都理解这种区别。 (其他语言的程序员是否同样理解它很难说。)

Quine和Strachey都关注语言结构的含义,这些语言结构涉及某种形式的语境依赖。例如,我们的例子“爱丁堡自1999年以来一直是苏格兰的首都”,这标志着“苏格兰的首都”取决于它被考虑的时间。无论是在自然语言还是编程语言中,这种上下文依赖都是现实。即使在函数式编程中,自由和绑定变量也要根据它们出现的上下文进行解释。任何类型的上下文依赖性都会以某种方式阻止引用透明性。如果您试图理解术语的含义而不考虑它们所依赖的上下文,那么您最终会感到困惑。奎因关注模态逻辑的含义。他认为模态逻辑在参考上是不透明的,应该通过将其翻译成一个参考透明的框架(例如,将必要性视为可证明性)来清理它。他基本上失去了这场辩论。逻辑学家和哲学家都认为克里普克可能的世界语义是完全足够的。类似的情况也与命令式编程有关。由Strachey解释的状态依赖性和Reynolds解释的存储依赖性(以类似于Kripke可能的世界语义的方式)是完全足够的。功能程序员对这项研究知之甚少。他们关于参考透明度的想法应该用大量的盐。

[补充说明:上面的例子表明,诸如“苏格兰之都”这样的简单短语具有多层含义。在某种程度上,我们可能在谈论当前的资本。在另一个层面上,我们可能会讨论苏格兰可能在一段时间内可能拥有的所有资本。在正常练习中,我们可以“放大”特定的上下文并“缩小”以跨越所有上下文。自然语言的效率利用了我们这样做的能力。命令式编程语言以非常相同的方式有效。我们可以在赋值的右侧使用变量x(r值)来讨论它在特定状态下的值。或者,我们可以谈论它跨越所有州的l值。人们很少被这些事情搞糊涂。然而,它们可能或可能不能精确地解释语言结构中固有的所有意义层。所有这些意义层面都不一定是“显而易见的”,正确研究它们是一个科学问题。然而,普通人解释这种分层意义的意义并不意味着他们对它们感到困惑。

下面单独的“后记”将此讨论与功能和命令式编程的关注联系起来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值