我们日常都说汉语,写中文,日常我们思考时用的也经常是汉语和中文。假如不允许你使用中文和汉语出现在脑子里,还能思考吗?或者换句话说,假如一个人,他学识有限,只知道很少的字和词,是否意味着他思考更少呢?
不同语言会影响语言使用者对于现实世界的认知,不同语言的使用者会因语言差异而产生思考方式、行为方式的不同,这被称为叫 Sapir–Whorf 假说,也称为语言相对论。
语言相对论的最强版本是“语言决定论”:即你用的语言决定了你的认知。
不过后续研究者认为这是不准确的,所以现在普遍采用的弱化版本是“语言影响论”:即你用的语言会影响你的认知。
1984中的“新话”
George Orwell 在著名小说《1984》中用很大的篇幅探索了语言相对论。在小说中,地理位置上位于英国和美洲的虚拟国家“大洋国 Oceania”发明了一种新语言,被称为“新话(Newspeak)”
大洋国的执政党设计了新话来代替“旧话(Oldspeak,即我们现在用的英语)”。在小说中,新话是一种修改版的英语,他只有很少的词汇。大洋国计划推广新话来消减语言中的单词,以此对人们进行思想控制。
这种消减大概可以分为两方面:
一是精简现有词汇背后的概念。
比如因为有了“good”这个词,那么“bad”就没有必要了,可以使用“ungood”来代替“坏”这一概念。再比如“free”这个词的其他概念被移除,在新话中只能用于表达“This dog is free from lice(这只狗身上没有虱子)”,而其他概念则消失。
二是消减负面词汇和背后概念。
以 1984 中的异端思想为例,人们对异端思想的了解,除了知道他是异端以外,就不能更进一步了,因为新话中不会提供更进一步的词汇去解释什么是异端。
这一点很类似于古希伯来宗教的观念:“人们知道耶和华的戒律,也知道其他民族崇拜的是‘伪神’,但是关于‘伪神’是什么,人们并不清楚,因此人们知道的越少,越有利于维护宗教的‘正统’”
新话的目的是缩小思想范围。
— George Orwell
小说中 George Orwell 认为,通过限制人们可以使用的语言,可以限制他们的思考能力,即语言相对论。
对语言相对论的争论
作为语言相对论的集大成者,Whorf 提到的例子是关于一种称为 Hipo 语的印第安语,即 Hipo 语中没有“时间”。这让使用 Hipo 语的人在直觉上会很难理解牛顿力学或者其他关于时间的概念,因为他们的语言没有足够的抽象能力来描述“时间”。
反对语言相对论的人认为这个例子的错误之处在于,虽然 Hipo 人不能描述时间,但是他们和我们一样都体验了时间的流逝,不能认为他们的语言中无法描述时间,就认为他们缺乏对时间的感知。
对此,反对者们提出了这么一个例子:
新几内亚的 Dani 语只有两个词来形容颜色:Mili 和 Mola,其中 Mili 表示冷色或者深色,Mola 表示暖色或者浅色。假如语言相对论是正确的,那么 Dani 人应该没有办法像我们一样分辨足够多的色彩细节,他们只能分辨两种颜色。实际上 Dani 人可以像我们一样分辨不同的颜色。
计算机科学家的不同理解
很有意思的是,跟社会学家不同,计算机学界似乎对语言相对论有不同的理解。
比如图灵奖获得者 Kenneth E. Iverson 认同语言对思维的影响。他的图灵奖获奖演讲中提到 "Notation as a tool of thought",即强调计算机语言的表达能力(Notation)能帮助思考计算机算法。
Paul Graham 则在一种假想计算机语言“Blub”中提到了 “Blub 悖论”
考虑有一个 Blub 程序员。当程序员往下看时,他认为低级语言的功能不那么强大,因为它们缺少 Blub 的某些功能。但是当他抬头时(他没有意识到自己在抬头)他只看到带有不必要功能的“怪异语言”,并认为它们虽然具有和 Blub 相同的能力,但同时却显得很多余。
这也经常用来描述程序员界关于语言的论战。
最有趣的是 Yukihiro Matsumoto,Ruby 语言的创造者。在 2003 年的一场会议中,他提到 Ruby 的设计灵感之一来自于一部科幻小说《Babel-17》,而这部小说的基础理论就是 Sapir–Whorf 假说。
计算机语言对人的影响真实存在吗
现在我们普遍认为是真实存在的。
之前我的朋友 @soulhacker 准备做一门程序设计课程,需要选择一门计算机语言,就此跟我有一次讨论。
大致思路是:对于普通人来说,需要考虑什么样的语言适合他们学习程序设计,因为不同的语言会影响教学的思路,自然也会影响学习者的思路。
字符串反转的例子
我使用时间最长的语言是 Python 和 C,因此举一个关于字符串操作的例子,比如把一个字符串倒过来,即把 "abcde" 变成 "edcba"。
在 C 语言中并不存在“字符串”数据类型,因此我很可能会以字节为单位操作来 Bytes 数组,比如使用循环语句加上多个变量来保存中间状态;
但如果使用 Python ,那我可能会直接用这一句 'abcde'[::-1]
之所以这样做,一方面是因为 Python 中字符串是 immutable,也就是说我的操作会生成新的字符串副本,很容易;另一方面是因为 Python 的语法表达能力比 C 强得多,有更多“功能”。
这明显是程序设计语言的选择影响了我如何选择算法。
素数计算方法的例子
另一个例子是筛法求素数。
在 golang 的文档中有提到一个相当漂亮的实现,基于 goroutine 和 channel。如果你阅读过 MIT 的著名计算机教材SICP 第三话,那你肯定会有似曾相识的感觉。
// A concurrent prime sieve
// via: http://golang.org/doc/play/sieve.go
package main
// Send the sequence 2, 3, 4, ... to channel 'ch'.
func Generate(ch chan<- int) {
for i := 2; ; i++ {
ch <- i // Send 'i' to channel 'ch'.
}
}
// Copy the values from channel 'in' to channel 'out',
// removing those divisible by 'prime'.
func Filter(in <-chan int, out chan<- int, prime int) {
for {
i := <-in // Receive value from 'in'.
if i%prime != 0 {
out <- i // Send 'i' to 'out'.
}
}
}
// The prime sieve: Daisy-chain Filter processes.
func main() {
ch := make(chan int) // Create a new channel.
go Generate(ch) // Launch Generate goroutine.
for i := 0; i < 10; i++ {
prime := <-ch
print(prime, "\n")
ch1 := make(chan int)
go Filter(ch, ch1, prime)
ch = ch1
}
}
这个实现与别的实现不同,它基于流而不是基于随时间变化的状态模型。这一特征在 Lisp 这样的函数式语言中是家常便饭,所以如果你使用 Lisp 语言,你会自然而然地用这样的写法。
但如果你使用 C 语言,你肯定不会选择这样的写法,因为流的语法在命令式语言中很少见。这也说明了语言确实会对你的算法选择有影响。
语言对人的影响真实存在吗
我认为是存在的。
语言学家们反对语言决定论的前提是不同语言的使用者感受到了相同的世界和相同的事物。比如因纽特人和英国人一样,看到的是相同的雪花;新几内亚的 Dani 人和其他人一样,看到的是相同的颜色。
但这一前提并不一定总是成立。
思想实验有:例如在科幻小说《你一生的故事》中的外星人由于成长的环境不同,导致他们有完全不同于人类的世界观和科学体系,以及完全不一样的语言。
在计算机世界也是如此。如果我们把计算机语言解决的问题范围认为是计算机语言世界的边界,那么:
- 对于一个 Python 学习者来说,在他学习计算机体系结构之前,他可能都无法理解 C 语言的很多设定,因为他不理解 C 语言的世界。
- 而对于 C 语言学习者来说,他可能也无法理解 LISP 机的运作机理,因为 C 语言对世界的解释跟 LISP 截然不同。
所以,如果我们希望让语言决定论失效,那么就需要让不同语言的使用者去感受相同的世界。
相反地,如果希望利用语言决定论,正如 1984 中大洋国那样做的,除了设计“新话”,还要搭配一个用于扭曲世界的窗口。
这也是为什么我们一定要学习不同的语言,理解每一个词的本意,才有机会靠近真正的世界。