程序员的语言“艳遇史”(四) ——数学系师姐Forth
(***以下小说情节纯属虚构,供朋友们在紧张编程后轻松一下,如有雷同纯属巧合,切勿对号入座***)
第四个女孩 数学系师姐Forth
一个闷热的下午,我坐在梯形教室里,百无聊赖,听着讲台上一个白发大师的个人咏叹调。为加强理工科同学们的人文修养,出去泡妞不至于没词,丢我校的脸,学校新开了一批公共选修课,什么唐宋词、西方哲学史、小说欣赏等等。
学校还规定,公共选修课学分不够,不能毕业。真够狠的,弄得我们这些老生还要和一大批新生蛋子一起补修养。本人一向有崇洋媚外之倾向(没办法,翻开我们计算机科学教材,除了封面的“编者”,几乎就没看到中国人名),于是就选了西方哲学史。
大师的课上得飞快,我就逃了几次课,他已经从柏拉图讲到黑格尔了,跨越了千年。
“就绝对者自身成为被规定、有规定的东西来说,绝对者是实体。就绝对者是自己规定自己、自己建造自己来说,绝对者又是主体。”
天哪!虽然我清楚的听到了每一个词,但是听不懂他在讲什么!我感觉自己如同歌剧院里附庸风雅的音盲,处于极度郁闷状态中。
突然,一个迟到的女生从外面冲进来。我旁边正好有一空位,她就坐下了。我们俩一对视,不禁笑了。原来是数学系师姐forth。
我和师姐实在太有缘份了,去年跨系的英语六级辅导课,我们俩就碰到一起,这次又相会了。英语课上,我经常插科打诨,把她笑得前仰后合。有一次茶水喷了我一脑门,她急忙拿手帕给我擦掉。周围一堆目光刺过来,简直可以杀人。
唉,那时人真纯啊。课上完了,再也没和师姐联系。没想到这次居然又碰面了。我俩急忙高兴的聊开了。没想到师姐还是某一个地下社团的头目,叫什么“Forth语言学习研究协会”。她说,Forth是一门伟大的计算机程序设计语言,问我有没有兴趣加入。
什么?Forth?计算机程序设计语言?我怎么没听说过。
师姐见四下无人注意,便从书包里掏出一本协会登记册给我看,说已经有好多同学加入了。只见上面一堆签名,还有红手印。我吃了一惊。干什么?反清复明的天地会啊。
师姐说要看看我和Forth有没有缘份,就随手出一题考我。
如何用堆栈数据结构,机械计算一个算术表达式,比如3+2*4。
靠,也不想想兄弟是什么专业的。我们计算机科学家几十年前就搞定这个问题了。我熟练的把表达式转换为后缀形式,即为
2 4*3 +
然后从左到右开始入栈,碰到象*这样的二元操作符,就把已入栈的两个操作数比如2、4弹出,算出结果8重新入栈。如此下去,最终得到结果11。
师姐说,不错,Forth的求值核心就是这样一个堆栈机,主要的操作都围绕着堆栈而不是寄存器进行的。Forth的语言长什么样的呢,她神秘的笑了一下,说就是后缀表达式。
我差点没晕死过去。这是给人看的吗?我一向以为后缀表达式属于中间代码一类的东西,居然还有人把它当作一门程序语言。怪不得我们计算机系的老师提都没提过Forth语言,整一个旁门左道啊!师姐怎么会中意这个东西。不过为了讨她喜欢,我只能学韦小宝,先混进去看看究竟再说。
不过Forth采用的堆栈虚拟机倒是不稀奇。为了便于移植,早期的UCSD系统就设计了一个基于堆栈的虚拟机,作为目标架构。上个世纪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系统的解释阶段。解释过程做什么呢,按次序跳转到地址所指示的词定义中去,进行执行。如果是系统预定义词,则直接执行其机器代码;如果词属于用户自定义的,则其过程体也是一个地址列表,也使用threaded code解释方式进行处理。
一天,师姐打电话说要和我单独谈谈,把我激动得不行。我兴冲冲跑到约定地点。月上柳梢头,人约黄昏后,可师姐却是为Forth协会之事而来的。师姐说,她要毕业离校了,已请示协会高层,准备把派驻我校的香主一职转给我。
靠,这种事!不过好歹是个一官半职,我在师姐含情脉脉的攻势下,只好欣然接受。突然,师姐诡异的一笑,给我一个信封。她说按惯例都有一笔“财富”要转给新任香主,但是必须等我为协会新发展100个会员才能打开信封。我只好发了毒誓,提前启封必遭天打五雷轰什么什么的。
后来一个月,为完成师姐的托付,我真是尝尽世态炎凉。原以为发展很容易,没想到在计算机系这个最大目标群体,先遭冷遇。一堆人都以为我疯了,入了邪教。某一特钟情于C++语言的哥们差点揍我,说要替我系清理门户。经我七蒙八骗,又和自动化系机器人制作协会结盟,终于快凑够数了。
还差一个,怎么办?我在家里,流着口水,死死瞪着那个信封。受不了啦!我起身抓起我们家那只卷毛狗,来了个霸王硬上弓,把狗“手”沾上印泥,在登记册摁上一下,然后代署小名。搞定!
打开信封,先掉出一个我校历任Forth协会香主之功名簿,每个人都有照片、姓名、系别、毕业时间等信息。还有师姐的一封信。师姐说,现在我已经证明自己是一个合格的协会负责人,可以把自己的信息写在簿上了,将来传给下任香主。我望着簿上师姐的照片,不禁呆了。