程序员的语言“艳遇史”

(***以下小说情节纯属虚构,供朋友们在紧张编程后轻松一下,如有雷同纯属巧合,切勿对号入座***)

地狱里,一个曾经的程序员经不过魔鬼们的严刑拷打,终于把埋藏在心里多年的年少荒唐史给招了。

“好吧,魔鬼大王,我承认我是花心大萝卜,革命意志薄弱,没有管好自己,但我再坏也比不上陈冠希,您不能这样冤枉我啊!”

“我靠!陈冠希才几个啊,你比他多多了!我们地狱的妇联都投诉了,说这样的流氓不严惩,全体女妖从明天起一律罢工!快老实交代你的罪行。”

“我招,我招还不行吗?”

程序员战战兢兢的打开地狱专用的日本Sany牌便携电脑,开始码字……

大学期间

第一个女孩   班长pascal

pascal是我们计算机系93(1)班班长,长得一般,严谨得可怕。据说是某省的高考状元,还是党员,所以一入校就被我们辅导员当成宝贝,连民主选举都免了,直任班长。

计算机系肯定有试验上机课啦。由于pascal学习好,机房上机时总是第一个完成。然后老师就叫她帮忙,对我们这些中学时连键盘都没摸过的菜鸟进行辅导。我当时上机,主要工作就是照着事先在纸上写好的代码,在键盘上找字母。简直是晕倒,一个简单的程序编译了几十次都过不去。我正绝望时,突然闻到一阵淡淡的如幽兰般的香气,原来是她!

pascal推推眼镜,微笑着说:

“第20行少了一个分号,第23行句点变成逗号了,还有你的那个过程怎么嵌套了这么多重子过程,begin和end可能不匹配,你数一数。”

我试了一下,通过啦!那个该死的pascal编译器环境终于放了我一码。怪不得她那么强,编译器的名字都和她一样。我回头正想说谢谢,发现pascal正在辅导其他人。她今天一袭白色的连衣裙,清纯得可爱,我不觉得看呆了。突然一个脏手在眼前一晃,靠,同宿舍的阿飞在旁边一脸坏笑,败兴的家伙!

男生对比自己厉害的女生一向不感冒,每天晚上熄灯后宿舍里开谈话会,pascal往往成为众矢之的,什么“飞机场”、“性冷淡”等等脏词不断。我有时候也敷衍几句,但是心里总觉得有点不好。不会吧,不就辅导个上机,你就喜欢上她了,你怎么这么没用。我心里暗骂自己。

完了,阿飞这个死人,四处散播谣言,说我暗恋pascal。我气得想揍他,宿舍同学赶忙调解。终于在305宿舍全体人民代表大会决议下,说只要我敢当众给pascal一个难堪,让她不敢自认为是学习最好的,为93级备受压迫的男生复仇,我就可以洗刷自己的罪名。

怎么办呢?大一编程课本问题太简单,都难不住pascal。这样吧,找大四的师兄“变态borland”帮忙,此人是borland公司编译器产品骨灰级玩家,故有此名。“变态borland”奸笑着拿出一本复印件,说:

“看看,为了帮你这个忙,我把压箱底的资料都翻出来了。”

我一看,一个叫brainW.Kernighan的家伙写的论文,题名是“Why Pascal is Not My Favorite Programming Language”。

“这篇论文对早期的Pascal语言有很多一针见血的批评,你们一年级的 教材还是用老Pascal,正好可以一用。”

是不是啊,我将信将疑。“变态borland”毫不客气的敲诈我一堆饭票,搞得那个月我吃素都快吃成和尚了。把那篇破论文研究了一番,抄了几段代码,终于到了兄弟证明自己的时刻。

那天上机,我继续在键盘上找字母……

诸位看官知道,我们一年级入门语言Pascal是一个强类型命令式语言,必须对变量、过程参数和返回值都指定类型,然后通过类型检查确保对其进行的操作是合法的。其发明者N.Wirth定义的原初Pascal语言标准不支持动态数组(在后来的商业扩展诸如turbopascal中已经支持,只不过当时课本并无提及),在对数组类型进行定义时必须将数组的长度显式写在类型定义里。比如,

type
a = Array [1..10] of Integer;
b = Array [1..25] of Integer;

定义了两个长度分别为10和25的整型数组类型。

如果我们要编写一个通用函数库,其中有一个sort例程要对任意长度的整型数组进行排序。这个时候我们该如何定义其参数类型了?总不能设定一个最大长度,所有数组都一样长吧?用指针类型,Pascal指针必须有一个明确的类型指派 ,一指派不又掉到沟里去了吗? 此外Pascal也不象C语言那样支持指针算术,可以干点“违法”的事情。 所以对于使用老Pascal语言的一年级新生来说,这是一个有点难度的问题,可以对pascal姐姐进行一番刁难。

我故意大声叫pascal,“班长,快来,我这有个难题!”。我可爱的pascal微笑着迈着自信的步伐走来,看到了那个变态问题。她愣了一下,疑惑的看了看我。周围一堆人围了过来,弄得她压力很大,她迟疑了一会说,“可能要定义一个最大数组长度吧。”

我早正等着她这句呢!“那这么行,最大长度是多少,内存不够用怎么办?”一向追求完美的她脸青一阵红一阵,鼻头也渗出了小小的汗滴。周围男生起哄,“pascal女王遇到难题了”。

不知哪个猪头出卖,后来pascal发现那个事是我早有预谋的,从此就没有给我好脸色。过了几个月,pascal被学校报送到新加坡当优秀交流学生,从此再无音信。

我的心好痛,我的第一段青春骚动就这样结束了。

第二个女孩   计算中心管理员小C

操作系统课上,我们无比敬仰的课任老师“胖头余”唾沫横飞:

“中国计算机事业的发展,需要一大批熟练掌握unix和c的专业人才……”

“计算机系的第一母语,那就是c语言……”

“招之即来,来之能战,战之能胜……”

要不要这么上纲上线啊,知道的懂得是上操作系统课,不知道的还以为是文革红卫兵动员呢。今天真倒霉,来得迟了一些,挤在第一排,被喷了一脸的唾沫星子,抹一把,咦,还带广式月饼味的。

“胖头余”的可恶之处还在于,不允许我们用pc机dos系统完成大作业,必须到东校区计算中心,用Bull小型机完成,期末要检查我们的系统帐户。他还美其名曰,“学操作系统就要使用原滋原味的unix”。

不去不知道,一去吓一跳。大伙儿到计算中心都被深深震撼了,果然是“原滋原味”,里面的家什如果配上穿孔纸带什么,就可以直接改名为“计算机历史博物馆”。小型机躲在玻璃罩里,横躺着。我们都怀着瞻仰毛主席遗容的心情,从它旁边经过,到里面的终端室上机。

为什么我们在上机问题上比一年级嚣张很多呢?因为当时宿舍一帮死党凑份子买了一台286。原来一个个信誓旦旦,这个要追赶求伯君,那个说要分析dos内核。自从小肖搞来一套“大富翁”之后,好嘛,一伙人整天凑一起掷点数。过了一段更猛的料来了!麦东从香港弄来一套日本脱衣麻将……。原来准备研究dos内核的兄弟现在被指派了更重要的任务——破解游戏通关图片。一帮家伙流着哈喇子说,大家初三生理卫生都不及格,就指着您给复习了。

大家知道,我是比较纯洁的。喂,别扔板砖!好吧,我承认我被诱惑过,但是你们看,我不还是老老实实来计算中心上机了吗。我的课业还算可以,就被宿舍人代会指派完成操作系统大作业的任务了。这帮禽兽!

但是,我很快就有一个意外发现,那就是小C。

小C是那种很耐看的女孩,虽说不上特别艳丽,但五官端庄,眼神静静的,像一汪清澈的湖水。平时总带着一丝微微的笑意,让你特别舒服。唉,这么好的女孩,当这个棺材屋子的管理员!学校管理层是怎么想的,看她年龄不大,不会是勤工俭学吧。

小C的工作用我们的行话来说,属于动态内存分配范畴。我们进机房,要分配一个有号数的令牌,这就算指针了。墙上几十个挂件,每个对应一台终端,这就算空闲内存单元了。

进来一个,拿走一个令牌,就算是指针被分配内存了。

出去一个,交回一个令牌,就算是释放空闲资源了。

如果你上去一看, 靠,“Segment fault”,指定位置上没有终端,属于使用null指针的情况。楼上大叔真是的,终端送修也不通知小C,搞得我还要跑下去换牌子。

如果你发现位置已经有人,怎么回事?兄弟,这么不长眼,你18号怎么坐到28号位置来了。这属于指针越界访问情况,自己调解。

一来二去,我和小C就熟悉了。原来她是高考落榜生,在计算中心当个临时工,还在参加自学高考。不过她unix系统用得比我老练多了,这管理员没白当,足可以当我老师。我厚着脸皮,多次以做机房卫生为代价,获得了美女给我下指导棋的机会。用现在时髦的话说,这是两种文明的对话——我代表dos星球,她来自外太空的unix行星。

不过,要论高中数学什么的,就轮到她崇拜我的份了。妹妹,需要辅导早说嘛。哇,最近胳膊肘老疼,都是这做卫生给闹的。

现在,我爱死bull小型机了,怎么看怎么觉的比宿舍的pc机人性化。每天上机和小C邮件发来发去的,成为编程之余一大乐事。大作业都完成了,我还往计算中心跑。很快,我的免费机时就over了,自己得贴钱。不过能看到亲爱得小C,我愿意。但是老蹭饭就不对了,弄得吃饭时一些人远远看到我,就假装上厕所掉头就溜。我怒了,以大作业不给参考进行威胁,局面才有所好转。

期末快到了,马上要交操作系统和编译原理两门大作业。大家脸都绿了,一个个做奋发图强状,连生理卫生这么重要的课都没人研究了。操作系统大作业是用c语言模拟unix文件系统,他们还可以参考一下。不过编译原理大作业他们就无法参考我的了,因为我选的是实现c语言子集,他们都选了实现pascal语言子集。这帮人被c语言怪异的语法吓到了,而且还以为一年级的入门语言肯定更简单。我呢,在小C的精心栽培下茁壮成长,当然选c语言啦。

他们不知道,虽然两者都源于Algol60体系,但pascal是理论家设计的语言,模型那叫一精美;而c是工程师设计的语言,为了便于实现,不懂砍掉多少东西。

就以过程调用这块来讲吧。C语言的函数不允许嵌套,属于非块结构语言。任何时刻可以访问的变量,或者属于函数内部局部作用域,或者是全局空间(static也算全局),只有两个层次。这样,运行时间系统管理工作就简单多了,反正全局变量就是分配在内存中的固定位置了,栈帧不断堆叠就是了,下一个帧就代表调用者,可以返回,但是当前函数正常是不能访问调用者的作用域的。

Pascal语言就麻烦了,过程可以嵌套,内部过程可以访问外部过程定义的变量。那时的编译课本,70%的部分是讲词法和语法分析,运行时间系统一语带过,讲得不清不楚,够他们喝一壶的。有的人使用什么静态链、动态链,有的人用Display表来管理帧指针,反正都深陷泥潭。

末了,我的两门大作业都得了优。我正筹划着给小C飞鸽传书,一诉衷肠,好好庆祝一番。突然有人通知,“胖头余”要单独召见我。不会是要给什么奖学金吧。我乐呵呵的就跑去了。

结果我听到了一个无比恐怖的信息,原来小C是“胖头余”的女儿。我们的“奸情”暴露了。什么啊,就牵过手,都传成什么样了!就差没开房了。不过“胖头余”好歹是大学教授,不会动粗,总之都是电视剧语言啦。还年轻,要把精力放在学习上,长痛不如短痛,以后不要再见面,天涯无处无芳草……

杯具啊,我的初恋就这样被扼杀在摇篮中。

第三个女孩 法国外教prolog

张开双脚,轻轻的插入,调整一下,再插入,哇,怎么出血了!

呵呵,各位没走错,欢迎来到博客园电视台“程序人生”栏目。

实验室里,我满头大汗,摆弄着面包板和一堆元器件。也不懂上次哪个变态,做完试验后报复社会,把电阻管脚扭得和麻花似的。要插到面包板上,是不是要把管脚张开。你看,一不小心还把手指捅破了。

说起来真没面子,都大三了,还在硬件实验室混。这要归功于一个人,美丽的prolog老师。她来自法国马赛大学,从小热爱中国文化,所以到中国过学术假期。我校计算机系多年盼想,终于等到了接待访问学者的机会。这么一个金发碧眼、前凸后翘的美女,往性压抑严重的理工科大学一放,那简直是“深水炸弹”啊!

朝霞里,一批批青年学子在“锻炼身体 建设祖国”的标语下,迎着瑟瑟寒风,奔赴操场。他们的身影,多么的矫健!负责主抓全民健身的体育老师大老刘,饱含着热泪,都不敢相信自己的眼睛。这是多年未见的好景象,晨炼原来鬼都不来,教育部“211”院校检查期间,都动用武装力量押送了。这几天同学们怎么这么自觉呢?

定睛一看,哦,为首那个红衣红裤的,不就是我们的prolog老师吗?还是外来的美女会念经啊!体育场上的轰动也就罢了,最近prolog还要给我系的本科生开一门选修课。消息传出都砸锅了,大家奔走相告。第一次课那天,由于人太多,临时更换了三间教室才搞定。

我挤在教室里,发现一大堆不认识的人。同学,您没走错教室吧,本课程是计算机系专业选修课“计算机科学中的逻辑”,怎么你们机械工程系都来凑热闹啊!我看这帮家伙听逻辑是假,过来看“波霸”是真。不过,prolog老师真的身材很好,我们班女生都妒忌得要自杀了。唉,安慰她们的光荣任务就交给麦东了,我们还是认真听课。

课没上几次,无关人等就少了一大半,留下来的也离抓狂不远了。原以为是艳星玛丽莲.梦露来讲成名史,现在发现是古希腊女战神雅典娜的角斗课。prolog老师的雷人语录至今仍在我耳边回响——

“学习计算机的最好方式,就是亲手设计并制造一台计算机。”

她对我们软件专业学生普遍怕脏怕累、轻视数字电路和硬件的不良作风极为不满。居然把课表改了,让我们回锅数字电路课程。她威胁说,没独立完成4位数字模型计算机项目的同学,就不用来上逻辑课了,所以才有本文开头那一场景。

我小心翼翼的按画在草纸上的设计图,把线和元器件连接好,默默祈祷“主啊,赐于我力量吧!”。开电,正常工作,输入,02,03,01(代表无符号加法指令),走。不错,幼儿园阿姨表扬我了,乖,是05。我正准备叫prolog来验收,那曾想旁边的美女昨晚偶感风寒,“哈揪”了一声。靠,结果变成ff了!怎么检查也无法回归正常,那一刻,我真是欲哭无泪,想死的心都有了。

若干年后,我在某厂商展示会上发现一个叫FPGA(可编程门阵列)的玩艺,兴奋的摔了自己一巴掌,把演示的小姐吓得发抖,以为我是来当众劫色的疯子。这就是当时面包板数字电路试验做多了落下的病根。还好prolog老师只要求我们做4位cpu,要按现在intel四核64位的水平,那家伙,想让我们把面包板铺满西校区啊。

经过这一劫,又死了一批人,选修课的教室终于符合联合国人类发展组织宜居标准了。但是新的灾难又来了。

“学习一门程序设计语言的最好方式,就是亲手实现它。”

我耳朵里似乎听到隔壁有牙齿打战的声音。天啊,是不是女人每个月那几天来了,女战神也不例外。要是她一不爽,让我们实现个c++,明天就可以到集体宿舍收尸了。

“至少是语言的核心子集。”

无数个心脏从嗓子眼掉了下来。随着后面的课程进展,任务确定了,是逻辑程序设计语言Prolog的子集,以解释器的方式实现。

大家最近看过某卫视的男女速配节目没有(原谅我的情趣低下),熟悉它的流程吧,不错,你已经领会逻辑程序设计的精神了。

一个寻找心目中公主的俊男在动感音乐声中,来到了台上。这就是我们的求解目标。

舞台围着一圈妙龄女孩,每人面前一盏灯。这就是我们的逻辑数据库了。对于俊男求解目标来说,这些女生是逻辑或的关系。

节目主持人加运作机制就是我们的解释器。

求解目标可以分解成几个子目标,每个子目标之间是逻辑与的关系。先是男方基本情况介绍,主持人问,众女生满意否?不爽的请灭掉面前的灯。

看到这里,我振臂高呼,这就是广度优先搜索啊!

求解可能完全失败,如果没有兴趣爱好匹配的,俊男只能灰溜溜下场。

否则经过多轮对子目标的搜索匹配,以及男生权利环节,求解成功,俊男携带那名女生回家。

这个节目要到了沙特阿拉伯,流程要修改,省掉最后的几个女生之间的PK,俊男可以多带几个女友回去嘛。后面的事,哦哼,我就不说了,别想歪了。照逻辑程序观点看也合理,可以有多解。

不过Prolog程序员如果是主持人,节目流程就改大发了。应该是那个俊男坐在一个密室,女生们按顺序进去,每个女生相当于树的一个分支,把所有环节搞定一遍,想呕吐的可以中途退场。第二天电视台电话就被打爆了,观众大骂,编导脑袋进水了吧!没办法,谁让咱解释器是深度优先搜索的啊。

看到这里,有些被命令式语言毒害的同学可能会问,这也是计算?是啊,当年我也是这样问的。和命令式语言的状态转换模式一样,Prolog的合一和搜索也是计算。你别看上面速配轻飘飘的,上个世纪80年代,在全球颁发了无数个逻辑程序设计领域的计算机科学博士,我们的宿敌日本还投入了数以亿计的研发资金。虽然总体而言,小日本的野心失败了。但是作为一种 程序设计范型,逻辑程序设计还是确立了它的地位。

对习惯命令式语言的程序员来说,最不适应的事情是,基础的逻辑程序设计没有循环,只能依靠递归来解决处理像树、列表等数据结构操作的问题。其实如果捅破那层窗户纸,那简直是一种解放!我当年看到Prolog程序表示的什么二分搜索、八皇后问题,简直有把自作聪明的算法老师打成猪头的冲动。用什么Fortran伪代码表示算法,程序循环迭代的把大家都弄疯了。Prolog程序至少可以作为算法的高层次规范来使用,递归的美是无以伦比的!

Prolog解释器完成后,我无知者无畏,丧心病狂的准备以此为基础创业。我忽悠了经济学系的几个师弟做销售代理(本系就免了,那帮小子太精了,万一兄弟的核心技术泄密了怎么办),许诺俺的公司上市后,股权进行分配。

一天晌午,我正流着口水,梦想着香车美女。突然公司“市场总监”哭丧着脸找我,说一个客户投诉俺们的Prolog解释器产品经常崩溃。我极不耐烦的准备打发他走,忽然听说客户是经济学系十大系花之一,立马从床上蹦起来,准备回访客户。“真诚到永远”,这就是我们的服务宗旨嘛。

我靠,谁说女子不如男,系花对Prolog语言掌握得太好了,连导入数据都编了个递归子程序。一看她要处理的数据文件,几十万行的统计回归序列记录!我的妈呀,这能不出事吗?按这样使用递归,堆栈早溢出了。我和“市场总监”落荒而逃。

后来才搞清楚,兄弟的解释器没有做尾递归优化。再说,就算做了优化,培训经济学系美女把程序转换成尾递归形式,也会吐血。(当然有算法可以转换啦,只不过当时我不知道而已。聪明的程序员肯定知道是哪种办法,先不说,当作小说的悬念吧!)经济环境实在太差,我含泪宣布公司破产倒闭,遣散全体员工。

天下没有不散的宴席,课程到了结束的那一天。女战神prolog老师站在讲台上,神采奕奕的宣布,本课程不进行期末考试,所有能活到现在的同学,全部通过!激动的泪水,从伤痕累累的角斗士们眼中涌出,我们赢了!我们疯狂的欢呼雀跃,prolog老师也加进我们的行列。砰,教室的门被撞开,两个气喘吁吁的保安目瞪口呆的站在门口。我们哄堂大笑。

prolog老师回国那天,我躲在教学楼顶上,遥看送别的场面,竟无语凝噎。她上车的时候,回头望了教学楼一眼。那一刻,我崩溃了!

第四个女孩    数学系师姐forth

一个闷热的下午,我坐在梯形教室里,百无聊赖,听着讲台上一个白发大师的个人咏叹调。为加强理工科同学们的人文修养,出去泡妞不至于没词,丢我校的脸,学校新开了一批公共选修课,什么唐宋词、西方哲学史、小说欣赏等等。

学校还规定,公共选修课学分不够,不能毕业。真够狠的,弄得我们这些老生还要和一大批新生蛋子一起补修养。本人一向有崇洋媚外之倾向(没办法,翻开我们计算机科学教材,除了封面的“编者”,几乎就没看到中国人名),于是就选了西方哲学史。

大师的课上得飞快,我就逃了几次课,他已经从柏拉图讲到黑格尔了,跨越了千年。

“就绝对者自身成为被规定、有规定的东西来说,绝对者是实体。就绝对者是自己规定自己、自己建造自己来说,绝对者又是主体。”

天哪!虽然我清楚的听到了每一个词,但是听不懂他在讲什么!我感觉自己如同歌剧院里附庸风雅的音盲,处于极度郁闷状态中。

突然,一个迟到的女生从外面冲进来。我旁边正好有一空位,她就坐下了。我们俩一对视,不禁笑了。原来是数学系师姐forth。

我和师姐实在太有缘份了,去年跨系的英语六级辅导课,我们俩就碰到一起,这次又相会了。英语课上,我经常插科打诨,把她笑得前仰后合。有一次茶水喷了我一脑门,她急忙拿手帕给我擦掉。周围一堆目光刺过来,简直可以杀人。

唉,那时人真纯啊。课上完了,再也没和师姐联系。没想到这次居然又碰面了。我俩急忙高兴的聊开了。没想到师姐还是某一个地下社团的头目,叫什么“Forth语言学习研究协会”。她说,Forth是一门伟大的计算机程序设计语言,问我有没有兴趣加入。

什么?Forth?计算机程序设计语言?我怎么没听说过。

师姐见四下无人注意,便从书包里掏出一本协会登记册给我看,说已经有好多同学加入了。只见上面一堆签名,还有红手印。我吃了一惊。干什么?反清复明的天地会啊。

师姐说要看看我和Forth有没有缘份,就随手出一题考我。

如何用堆栈数据结构,机械计算一个算术表达式,比如3+2*4。

靠,也不想想兄弟是什么专业的。我们计算机科学家几十年前就搞定这个问题了。我熟练的把表达式转换为后缀形式,即为2 4 *3 +

然后从左到右开始入栈,碰到象*这样的二元操作符,就把已入栈的两个操作数比如2、4弹出,算出结果8重新入栈。如此下去,最终得到结果11。

师姐说,不错,Forth的求值核心就是这样一个堆栈机,主要的操作都围绕着堆栈而不是寄存器进行的。Forth的语言长什么样的呢,她神秘的笑了一下,说就是后缀表达式。

我差点没晕死过去。这是给人看的吗?我一向以为后缀表达式属于中间代码一类的东西,居然还有人把它当作一门程序语言。怪不得我们计算机系的老师提都没提过Forth语言,整一个旁门左道啊!师姐怎么会中意这个东西。不过为了讨她喜欢,我只能学韦小宝,先混进去看看究竟再说。

不过Forth采用的堆栈虚拟机倒是不稀奇。为了便于移植,早期的ucsd Pascal系统就设计了一个基于堆栈的虚拟机,作为目标架构。上个世纪80年代,还有人专门设计了堆栈体系结构的cpu芯片,没成什么气候。没想到风水轮流转,到了21世纪,堆栈体系结构又流行起来了。这首先应归功于java语言,其底层的jvm就是一个典型的堆栈虚拟机。实际硬件中,堆栈体系结构效率不如寄存器方式。然而对软件虚拟机而言,不管寄存器还是堆栈,都实现在内存里,效率差不多。加上很多编译器程序员喜欢堆栈体系结构,所以它又得势了。

师姐还开给我几本参考书,让我到图书馆里自修一下,改天通知我参加讨论会。

图书馆里,我连打了十几个喷嚏,终于从一堆满是灰尘的故纸堆中,翻出一本《Forth之道》的书。好恶心,书都发黄了,上面还有斑点,估计很多年没人翻看了。作者是一个美籍华裔工程师,开篇就是一堆文言文,弄得和九阴真经口诀似的,我看得晕头转向。

突然,我看到一个熟悉的字眼“欲练此功,必先……”。我倒吸了一口凉气。不会吧,师姐!没说Forth语言男人不能学的,兄弟可还没有传宗接代啊!

我抑制住超过每秒百次的心跳,用颤抖的手翻过了那一页。去他的,原来是“欲练此功,必先明其机理。”这作者太恶心了,要写您也得写个男女双修之类的心法啊,什么“欲练此功”,搞得这么玄乎。还分两页写,诚心啊,要是心脏不好的,直接就挂了。

讨论会上,来了一堆人,有我校的,也有周边其他学校的。我带着计算机系科班出身的优越感,设计了一堆问题,对师姐等前辈进行轮番质问。但是随着他们的阐述和解释,我逐渐发现了自己的浅薄,慢慢开始欣赏Forth语言的美。

Forth系统中除了堆栈机这个执行机构外,还有一个类似简单数据库的东西——词典。其他语言中称为函数、过程的东西,在Forth中称为词,存储在词典里。Forth语言中几乎所有的项,甚至if、while这些控制结构,都以词的形式实现。程序员可以重新改写系统预定义词,也可以发明新的词,从而改变Forth语言。使用Forth语言开发的过程,就是用新词来丰富Forth词典的过程,就是重构旧有Forth系统的过程。最终你得到了一个面向应用领域的dsl。

把玩Forth系统一段时间后,我有了一个意外收获。借助Forth系统这个现实模型,我终于听懂我们哲学大师整天念叨的黑格尔鬼话了。程序员和Forth系统“人剑合一”,就好比黑格尔的绝对精神,即是实体又是主体。在开发过程中,它从一个朴素的基础出发,通过新词的加入不断否定自己,使自己满足应用领域的需求;但是这种否定是自我否定,自我超越,新词是在旧词的基础上形成的,无需等待语言设计师的恩赐,语言进化的权力给了程序员。

看了这里,有人会问,那Forth和汇编什么区别?只要够底层,不是想做什么就能做什么吗?Forth语言和c语言一样,在底层机器架构上加了一个薄薄的胶合层,可以不断向上发展新的抽象,但同时并不忘掉底层机器这个根本。

如果大家爱看“暗算”、“潜伏”这些谍战片,可能会知道一种很土但是很实用的加密法——字典加密法。巧的很,在老式Forth系统中,其编译/解释方式被称为threaded code,和这种加密法很相象。

假设你是打入敌人内部的谍报员,有一段情报要加密,比如“暴露了,行动停止”。这就好比一段待编译的Forth源程序。

谍报员拿来一本密码本字典,开始生成密文。假如“暴”字,在字典的第15页第11行,它对应的密文就是1511。如此进行下去,就把明文全部变成数字形式的密文了。

Forth系统对源程序进行处理,分两个阶段,编译和解释。首先进行的编译阶段也是这么干的。对源程序中引用的每一个词,在系统词典中找到它的地址。用地址编码代替文本,如此进行下去就可以把文本程序变成了一个有序的地址列表。程序员在Forth编译阶段可以玩很多花招,这种强大的元语言编程能力不输Lisp语言的宏。

后方收到密文后,按页号和行号查字典,就会将密文重新恢复成明文。这对应于Forth系统的解释阶段。解释过程做什么呢,按次序跳转到地址所指示的词定义中去,进行执行。如果是系统预定义词,则直接执行其机器代码;如果词属于用户自定义的,则其过程体也是一个地址列表,也使用threadedcode解释方式进行处理。

一天,师姐打电话说要和我单独谈谈,把我激动得不行。我兴冲冲跑到约定地点。月上柳梢头,人约黄昏后,可师姐却是为Forth协会之事而来的。师姐说,她要毕业离校了,已请示协会高层,准备把派驻我校的香主一职转给我。

靠,这种事!不过好歹是个一官半职,我在师姐含情脉脉的攻势下,只好欣然接受。突然,师姐诡异的一笑,给我一个信封。她说按惯例都有一笔“财富”要转给新任香主,但是必须等我为协会新发展100个会员才能打开信封。我只好发了毒誓,提前启封必遭天打五雷轰什么什么的。

后来一个月,为完成师姐的托付,我真是尝尽世态炎凉。原以为发展很容易,没想到在计算机系这个最大目标群体,先遭冷遇。一堆人都以为我疯了,入了邪教。某一特钟情于c++语言的哥们差点揍我,说要替我系清理门户。经我七蒙八骗,又和自动化系机器人制作协会结盟,终于快凑够数了。

还差一个,怎么办?我在家里,流着口水,死死瞪着那个信封。受不了啦!我起身抓起我们家那只卷毛狗,来了个霸王硬上弓,把狗“手”沾上印泥,在登记册摁上一下,然后代署小名。搞定!

打开信封,先掉出一个我校历任Forth协会香主之功名簿,每个人都有照片、姓名、系别、毕业时间等信息。还有师姐的一封信。师姐说,现在我已经证明自己是一个合格的协会负责人,可以把自己的信息写在簿上了,将来传给下任香主。我望着簿上师姐的照片,不禁呆了。