我非常喜欢王小波的原因有两个:一这个人很有趣;二这个人是程序员里小说写得最好的。
在 90 年代短短 7 年里(他 1997 年 4 月 11 日去世),在用戏谑的语气严肃地思考自由和尊严的同时,还编程上搞了中文处理软件和中文输入法这两个中文计算机界的史前时代的巨坑——当时的很多计算机是要通过“汉卡”这种独立硬件来显示中文的,可以理解成当时显示中文相当于在屏幕上“画出”中文,而不是“显示”。
以下来信片段节选自王小波书信集,收录于王小波全集之中。
王小波书信集节选
1988年12月,致晓阳
回来之前我曾往人大一分校计算机站写过一封信,问他们可要带什么软件,主管的工程师回了封信,我没收到。回来之后人家还提到此事。现在国内软件一面混乱,又逐渐有形成市场之势。首先以年兄学统计这一事实来看,回来做事非有会用的软件不可。
Macintosh 根本就没打进中国市场,你非带几个可用的IBM微机软件回来不可。至于什么机器上能使倒不必太担心。我这个狗屁计算机室,IBMPS/2就有二台。AT机也不少。SAS SPSS Statistx都有,可代表国内上等一般统计微机房的水平,可就是少了一种宜于作统计的语言。
年兄如有 APL(A Programming Language)之IBM微机本,可给我寄copy来。我在美还有一个户头,连manual复印费一并写支票给你们。Glim我也没有,如年兄有便人可捎来。邮寄太贵,能省就省吧。
文中的 SAS,SPSS,Statistx,Glim 都是统计学软件,其中 SPSS 和 SAS 两个商业软件现在依然被普遍使用。
他提到的 APL (A Programming Language)是一个对现在的程序员来说不太寻常的计算机语言。不寻常在什么地方呢,比如说在 APL 中,2*3
表示 2 的 3 次方,而不是 2 乘以 3。如果想要表达 2 乘以 3,得这么写:2×3
。对,你得真的用乘号“×”(注意这不是字母 x)。
你可能注意到了,APL 的语法中使用了数学符号,比如:
从 1~100 中选择一个随机数是这样的:
x[⍋x←1?100]
求 100 以内的所有质数是这样的:
R←100
(~R∊R∘.×R)/R←1↓ιR
下面是实际的代码运行结果:
因为 APL 的语法中包含大量的数学符号,如果你要用 APL,你最好买一个 APL 专用键盘或者贴纸,比如这种,否则输入这些符号会让人痛不欲生:
1990年1月,致晓阳
我现在正给北大社会学所做统计,手上除SPSS没有可用的软件,国内这方面很差。我现在会用FORTRAN,编统计程序不方便。闻兄谈起你们用 S语言,不知是否好用。工具书也不知好找不。不管好歹,烦兄找个拷贝给我,要就算了。照我看只要能解决各种矩阵运算就够:当然也要有各种分布函数。反正也是瞎胡混,我就算努把力,少混点吧。
文中的 S 语言 是 1976 年由贝尔实验室设计的统计学编程语言。不过王小波提到的 S 语言可能指的是 1988 年以后的新版 S 语言。后来在统计领域广泛使用的 R 是 S 语言的后继者。
下面是 R 的例子,语法已经很现代了:
recurse_fibonacci <- function(n) {
if(n <= 1) {
return(n)
} else {
return(recurse_fibonacci(n-1) + recurse_fibonacci(n-2))
}
}
nterms = as.integer(readline(prompt="How many terms? "))
# check if the number of terms is valid
if(nterms <= 0) {
print("Plese enter a positive integer")
} else {
print("Fibonacci sequence:")
for(i in 0:(nterms-1)) {
print(recurse_fibonacci(i))
}
}
1991年3月,致晓阳
你寄来的严氏2.0A我也收到,还没用。因为一者是3盘要倒,二者我自己写的WK也有重大进展。我也自做了词组功能,是棵B树,我觉得自写的软件自用,感觉是最好的。词组用处不是很大,主要用于定义人地名等专有名词,但是严氏软件对我还是有重大启示,拼音加四声是个极好的主意,写起东西来声韵铿锵,与其他软件大不一样。自写一遍,从分页到编辑键分配,都能合乎自家习惯,不是存心狗尾续貂也。如能见到严氏,可代为致意。
结合上下文来看,文中的严氏 2.0 可能是当时某个中文输入和处理的软件。因为在其他信件中,王小波提到的 “WK” 是对严氏的仿制,而 WK 是小波用 C 语言实现的,用来写小说。
这里王小波提到 WK 用 B 树实现了词组查询,应该是为了方便自己中文输入。一个典型的 B 树搜索是这样的:
1992年1月,致晓阳
编译程序一盘(有说明书,见shou),源程序一盘。我的音典与严氏同名内容不同。功能上与严氏的近似,但是多了改进拼音字典的功能。按F4后可以把拼音重定义。也可加字,在拼音拣字时,按enter,就进入国标拣字,拣到的字加入字典。 这个软件由五个c语言(另有两个头文件)和一个汇编语言文件组成,可用 turboc编译,但是汇编部分不必重汇了,可以把汇编文件写成的部分形成的obj(我的磁盘上叫wk5.obj)放到硬盘上,与其它c语言文件分开,用 turboc的 commandline 编译器编一下,命令如下:
tcc-mc-ewk -c wk*.c wk5.obj graphics.lib
形成wk.exe,但是必须有yindian,cclib,egavga.bgi三文件支持才工作。
*.bgi
是图象板参数表,可以包括到*.exe内的。但是要改改程序。你的机器好。我还用个老掉牙的XT机,简直落伍了。turbo.c你一定能找到。假如你用过其它c软件,有一点要提醒你,turbo.c有一种极讨厌的特性,就是你在一个函数内alloc的内存,退出该函数时不会自动释放;还有一点也很糟,就是模型问题,在大模型下写的程序,到了小模型上一概不能用,我的程序是在compact模型下写的,就不能用small来编译,这两条是可以气死人的。据说可以用far,near之类的前缀说明指针,其实是屁用不管。我干了一年多c,得到的结论是微机c还不能使人快乐,有时叫人怀念汇编。
这封来信应该是王小波的 WK 软件的首次“发布”,他提到 WK 要用 Turbo C 这个 C 编译器来构建。Turbo C 是 Borland 公司 1987 年发布的 C 语言集成开发环境(不过国内 2000 年信息学奥林匹克竞赛依然要求使用 Turbo C 作为比赛环境)
来信中提到的 Turbo C 的两个特性:一是 alloc 后的内存不会自动释放,我不清楚他指 alloc 是否是误用 alloca 还是 Turbo C 的实现标准不同,因为 alloca 是在栈上申请内存的,而 malloc 不是;二是内存模式问题,Turbo C 这样的老 C 编译器是面向 DOS 的,因此提供了不同的内存模式。简单来说就是不同模式下指针基础偏移不同,在 compact 下的指针在 small 下可能会指向错误的地址,所以“大模型下写的程序,到了小模型上一概不能用”
现在的程序员大概很少会考虑到内存布局的问题了。
1992年9月,致晓阳
我用 C编的软件已经用熟,并做出了各种写小说的工具,别人的软件已不用了。现在主要是写书赚钱。从今年初开始写长篇,首先做了写长篇的专用软件,现在基本调通,开始写了。
这里提到的“用 C编的软件”应该指的是上文的 WK 和其他帮助写小说的软件。
从此世界上少了一位“蹩脚的”程序员,多了一位伟大的作家。
年份不详,致曲小燕
我们的 pc 机还没有和 Internet 连上。本来中国有几个国内网发展得很快,现在又出了问题,谁要上 Internet,必须到有关部门去登记,留个案底,以备当局监控,很有一点监狱的气味。我还不想找这份麻烦,再说,通过 Chinanet 联网,每月也要交七八百的月费,我也没有这么多的钱。既然×反对信息时代,我们就不进这个时代罢,有什么法子。所以还是写信好了。
没法细说,此处省略一千字...
除了这些,书信集中其他信件也非常有意思,推荐阅读。