二十六年前,王小波先生因病于北京逝世,享年四十四周岁。喜爱他的人,都知道他是一个特立独行的人,拥有谦虚与自豪并存的强大气质,并且留下无数传世作品,无可争议的文坛巨擘,他的力量、有趣,对媚众形式束缚的反抗,以及一以贯之的,对待生活无比真诚的态度都让我们为之倾倒。
然而,鲜为人知的是,他不仅仅在文学上造诣非凡,与此同时,他还是一位不世出的编程奇才。在整个九十年代,除了和文字跳舞,王小波还将他的才华通过键盘喷涌而出,天才的脑细胞幻化为一行一行的代码, 挥洒自如,回转如意。王小波在编程领域的惊人艺业,我们也许可以通过他的书信以及著作中的内容略窥一二。
1988年12月,致好友刘晓阳:
回来之前我曾往人大一分校计算机站写过一封信,问他们可要带什么软件,主管的工程师回了封信,我没收到。回来之后人家还提到此事。现在国内软件一面混乱,又逐渐有形成市场之势。首先以年兄学统计这一事实来看,回来做事非有会用的软件不可。Macintosh 根本就没打进中国市场,你非带几个可用的IBM微机软件回来不可。至于什么机器上能使倒不必太担心。我这个狗屁计算机室,IBMPS/2就有二台。AT机也不少。SAS SPSS Statistx都有,可代表国内上等一般统计微机房的水平,可就是少了一种宜于作统计的语言。
年兄如有 APL(A Programming Language)之IBM微机本,可给我寄copy来。我在美还有一个户头,连manual复印费一并写支票给你们。Glim我也没有,如年兄有便人可捎来。邮寄太贵,能省就省吧。
Macintosh就是苹果电脑,1998年后多被简称为Mac,可见在八十年代刘晓阳就已经用上mac电脑了,但是国内还是以IBM计算机为主流。
信中提到的 SAS,SPSS,Statistx,Glim 都是统计学软件,其中 SAS 作为商业软件到现在依然被普遍使用。
而值得一提的是,APL (A Programming Language)是一个对二十一世纪的程序员来说不太寻常的计算机语言,APL 最著名的就是它使用一组非ASCII符号。这些符号比一般常见的代数和计算符号要多。有人开玩笑说,用两行这样的奇形怪状的符号就可以将所有航空控制的问题解决了。事实上,在一些APL版本中,用一行代码就可以将任何可计算的函数表达出来,再用一行代码就可以将这个函数的结构表达出来。由于它的精密的结构和非标准的符号,也有人将APL称为“只写语言”。除数学家外,其他人要读APL写的程序都感到非常困难。有些数学家觉得其它语言比APL难懂。由于APL使用不寻常的符号,许多专业程序员在写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))
}
}
1991年3月,致好友刘晓阳:
你寄来的严氏2.0A我也收到,还没用。因为一者是3盘要倒,二者我自己写的WK也有重大进展。我也自做了词组功能,是棵B树,我觉得自写的软件自用,感觉是最好的。词组用处不是很大,主要用于定义人地名等专有名词,但是严氏软件对我还是有重大启示,拼音加四声是个极好的主意,写起东西来声韵铿锵,与其他软件大不一样。自写一遍,从分页到编辑键分配,都能合乎自家习惯,不是存心狗尾续貂也。如能见到严氏,可代为致意。
信中提到的严氏 2.0 应该是当时某个中文输入和处理的软件。因为在其他信件中,王小波提到的 “WK” 是对严氏的仿制,而 WK 是王小波用 C 语言实现的,用来在电脑上写小说。
这里王小波提到 WK 用 B 树实现了词组查询,应该是为了方便自己中文常用词组输入。事实上,在那个年代,懂得用B-tree优化查找效率的人应该是凤毛麟角,而王小波恰恰是其中一位,这说明王小波在90年代初就懂得使用算法和数据结构来优化自己的程序了,他可能不会想到,2022年的今天,会有数以万计的程序员会在一个叫做leetcode的平台上苦练算法和数据机构,以期一个研发职位。
1992年1月,致好友刘晓阳:
编译程序一盘(有说明书,见shou),源程序一盘。我的音典与严氏同名内容不同。功能上与严氏的近似,但是多了改进拼音字典的功能。按F4后可以把拼音重定义。也可加字,在拼音拣字时,按enter,就进入国标拣字,拣到的字加入字典。 这个软件由五个c语言(另有两个头文件)和一个汇编语言文件组成,可用 turboc编译。假如你用过其它c软件,有一点要提醒你,turbo.c有一种极讨厌的特性,就是你在一个函数内alloc的内存,退出该函数时不会自动释放;还有一点也很糟,就是模型问题,在大模型下写的程序,到了小模型上一概不能用,我的程序是在compact模型下写的,就不能用small来编译,这两条是可以气死人的。据说可以用far,near之类的前缀说明指针,其实是屁用不管。我干了一年多c,得到的结论是微机c还不能使人快乐,有时叫人怀念汇编。
这封信他提到 WK 要用 Turbo C 这个 C 编译器来构建。Turbo C 是 Borland 公司 1987 年发布的 C 语言集成开发环境,Turbo C 这样的老 C 编译器是面向 DOS 的,因此提供了不同的内存模式。简单来说就是不同模式下指针基础偏移不同,compact 中的指针在 small 环境下可能会指向错误的地址,所以“大模型下写的程序,到了小模型上一概不能用”。现代程序员如果在应用层开发功能,底层只需要考虑内存溢出问题,而在那个遥远的年代,程序员不仅仅需要考虑整体内存容量问题,还需要解决内存单位的布局问题,这对于现代程序员来说,其复杂度是难以想象的。
最后,王小波在其著作《革命时期的爱情》第三章第四节有如下记述:
锁在房子里时,精力能够集中。所以我编的第一批软件极有诗意。李后主有词云: 红豆啄残鹦鹉粒。 我的软件就曲折和弹性而言,达到了此句的境界。
后主又有残句云: 细雨流湿光。
我的软件就有这么简约,别人编十行,我只用一行。等到交活时,教授看了吃一惊:这么短!能跑(run)吗?我说你试试嘛。试完了他和我握手道:谢谢!但是到了开支时,我的钱比别人都少。原来是按行算钱,真把我气死了。
等到交第二批软件时,我就吃棉花屙线屎。
古诗云: 一个和尚独自归, 关门闭户掩柴扉。
我的第二批软件到了这种境界。简言之,别人编一行,我就编了二十行。等到交活时,教授根本不问能不能run,只说:你这是捣蛋!就打回来让我改短。
资本主义就是这么虚伪。等到拿了学位,我毫不犹豫就回国来。这是因为我从骨子里来说是个浪漫诗人,作画时是个颜色诗人,写程序时是个软件诗人。干瘪无味的资本主义社会哪里容得下浪漫诗人。
这一段简直就是现代编码风格的圭臬,戏谑和深刻齐飞,让人忍俊不禁,乐而忘返。能将感性的唐诗宋词和理性的机械代码相结合,还出落的如羚羊挂角无迹可寻的圆润,恐怕,普天之下,也只有王小波可以做到了。
结语:
他拥有诗意而有趣的灵魂,他用文字对抗虚无,他用代码实现理念, 他用行动践行了自己的誓言,并一直战斗到死。他的身前是万家灯火,他的身后是繁星闪烁,我们都在守候,我们却又都在送别,小波从此逝,江海寄余生。