蒯因与引用透明

转载 2015年07月10日 15:32:15

蒯因又称奎因,美国哲学家,逻辑学家,逻辑实用主义的代表,与罗素齐名,强调系统的、结构式的哲学分析,主张把一般哲学问题置于一个系统的语言框架内进行研究。

蒯因从逻辑的观点出发,把语言分析作为哲学研究的核心内容,这就为哲学的语言转向划上了一个圆满的句号:自蒯因哲学起,当哲学家开始讨论哲学问题的时候,都需要首先考察所要讨论的命题的意义,而不会像传统哲学家那样依然专注于对世界存在的思考。

蒯因强调以严格精确的形式语言表达我们的思想,蒯因这一逻辑应用在我们编程语言中,演化成了各种面向对象或面向函数编程的原则。

下面我们谈谈函数副作用的问题,也称边界问题,降低甚至消灭副作用已经成为我们编程的一个重要原则,不要让一个方法或函数执行主要功能时,会产生其他意想不到的次要功能,这些额外功能不是我们要求的,称为副作用。

更严格地消灭副作用方式是引用透明(referentially transparent),这是面向函数范式FP中的一个术语,也是FP语言如Scala等相比Java特色所在。

为什么他们称为引用透明Referentially transparent一文中谈到:

“引用透明”(指称透明)这个概念来自于蒯因(Quine)的关于自然语言哲学。看看下面语句:BanQ比老鼠大, 如果把"BanQ"去除,留个空白在那里,显然变成:“??? 比老鼠大”。哲学家认为这是一个Context场景,通过填补场景中的空白,你得到了这个语句真实含义。

再次想一下北京这个城市,它是一个thing,有许多方式可以指称或引用(refer)它,“中国首都”或“在经纬XXX度的城市”。

因此,“引用透明”(referentially transparent)中的“引用referentially”这个词语的含义是在谈论这样一个事实:北京这个事物(thing)有很多名称,有很多途径来表达指称这个事物。

“引用透明”(referentially transparent)中“透明transparent”含义是“没有什么不同”,“都是一样”。

蒯因认为: 如果我们能够用不同的名称替代上面语句中的空白,但是没有改变任何意思,总是得到同样的结果,那么这个场景Context就是“引用透明”的。

如:
[北京]比老鼠大 是真;
[中国首都]比老鼠大 是真
[在经纬XXX度的城市]比老鼠大 是真

这些命题的真正含义不会因为我们选择不同的引用或指称名称而受到影响。我们就可以认为场景"??? 比老鼠大"是引用透明的。

与引用透明相反,蒯因认为存在引用不透明( REFERENTIALLY OPAQUE),名称的改变对于整个语句意思非常重要。

比如:??? 有9个字符。那么:[北京]有9个字符 是伪的。

这样场景“??? 有9个字符” 的含义因为名称指称(name/refernce)不同而不同。

罗素 蒯因等代表的形式逻辑是数学或编程语言的元语言,在数学中,所有函数都是引用透明的,比如sin(x),无论如何调用,结果只依赖x值,或者说:对于一个特定的x值,无论怎么调用这个函数得到都是同一个结果。

因为国内很多人只知道数学,而不知道数学后面的哲学与形式逻辑,就把我们编程语言中的这些约束和数学划上关系,实际上真正有联系的是数学背后的形式逻辑,或称符号逻辑。

对于编程语言,引用透明的含义可以表达为:函数的输出只依赖于其输入,引用透明就没有副作用,也无需指定前后运行顺序,比如:

int getResult(x){
   return x;
}

是一个引用透明无副作用的方法函数,而:
int getResult(x){
   return x + g;
}

则是引用不透明,因为getResult结果不但依赖x,还依赖g值。

那么g值是什么呢?一般是这个方法所在类的属性字段,如完整是如下:
public Class A{
  int g;

  int getResult(x){
     return x + g;
  }
}


很显然,含有属性状态g的类A,我们称为有状态类,也就是说:有状态的类都不是引用透明,都是引用不透明的。

引用透明概念由于本源起源于形式逻辑,而数学也建立在形式逻辑基础上,很显然,关系代数中的幂等函数含义与引用透明概念是一致的。

引用透明或幂等函数都是多次调用都会得到同样的结果,而且这个结果只依赖输入,不依赖其他值,这就为我们进行并行或异步计算提供了可能,也会分布式架构的粒度切分提供了可能,我们如果把一个引用不透明的有状态服务切分为引用透明无状态服务,那么无疑性能和可扩展性Scalable大大提高了。

引用透明虽然是编程范式中一个原则,实际也是性能设计可扩展性中的一个原则,这就完美体现了良好的性能和良好的编程习惯是密切不可分的。


函数的引用透明性(referential transparency)

1. 基础初学程序设计时,比较容易混淆的两个概念是数学函数(math function)和程序中使用的函数。在数学函数中 y=f(x)y=f(x),一个输入值有固定的输出值。例如,无论计算多少次,si...
  • lanchunhui
  • lanchunhui
  • 2016年09月08日 16:43
  • 1791

2012年“Openstack中国行”活动总结与回顾

2012年8月份OpenStack亚太技术大会在北京、上海两城市的成功举办,掀起了公众对OpenStack的更多兴趣。在此基础上,OpenStack中国用户组希望联手CSDN继续推进OpenStack...
  • ichbinwasser
  • ichbinwasser
  • 2013年01月04日 17:14
  • 3050

一种导致不明确引用的原因

这是新建一个form后在main函数里的代码,用来启动窗体.Application.Run(new TypeUnderTest());今天在编译一个程序时,突然提示这句代码有问题.说:“Applica...
  • gslcn
  • gslcn
  • 2007年01月24日 10:30
  • 1700

模因(meme)、模因学(memetics)、《自私的基因》

模因论是基于达尔文进化论的观点解释文化进化规律的新理论。1976 年,牛津大学动物学家道金斯(Richard Dawkins)在其著作The Selfish Gene(《自私的基因》)中首次提出了文化...
  • godblessu
  • godblessu
  • 2007年05月10日 10:03
  • 5179

函数实现的契约——线程安全与透明引用

透明引用:函数的返回值只依赖于其输入值的特性。使用相同的xx值多次调用sinx\sin x,如果系统每次都重新进行一次计算将会是极大的浪费。即使在“纯粹”的函数库中,也常常执行内部优化,如使用缓存来记...
  • yuanguangyu1221
  • yuanguangyu1221
  • 2017年06月04日 09:54
  • 160

android A工程引用B工程

有两个android工程A,B,现在工程A需要引用工程B,我们把B打成jar包,让A工程调用,但是工程B也是android项目 其中B中的R.java是不能使用的,因为R.java是动态生成的,每次...
  • tsdfk1455
  • tsdfk1455
  • 2014年11月06日 14:07
  • 796

java 简体字 繁体字的转化

package iie.cloud.util; public class ChineseConverter { String jtPy = "荣一丁七三下丈上丑丐不丙世丕且丘丞丢并中串丸丹...
  • sh_c1991
  • sh_c1991
  • 2014年07月18日 16:29
  • 3516

正向代理/反向代理/透明代理/透明模式

1、正向代理(forward)是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转...
  • iinel
  • iinel
  • 2009年10月17日 12:04
  • 8781

OpenGL: 透明 不透明 混合【3D游戏引擎设计】

源颜色:(Rs, Gs, Bs, As)不表颜色:(Rd, Gd, Bd, Ad)最终混合结果的颜色:(Rf, Gf, Bf, Af)此处讨论的所有颜色通道的值都是在[0, 1]范围之间。材质颜色和纹...
  • Augusdi
  • Augusdi
  • 2014年07月22日 17:09
  • 2189

什么是透明通道,如何使用?

“透明通道”顾名思义就是AnyChat SDK为上层应用提供的一个传输数据的通道,由于AnyChat SDK并不关心所传输的内容,即所传输的数据相对于SDK来说是“透明”的,便称为“透明通道”。 ...
  • bestwin812
  • bestwin812
  • 2014年07月30日 10:19
  • 327
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:蒯因与引用透明
举报原因:
原因补充:

(最多只允许输入30个字)