程序员的语言“艳遇史”(四) ——数学系师姐forth
一个闷热的下午我坐在梯形教室里百无聊赖听着讲台上一个白发大师的个人咏叹调。为加强理工科同学们的人文修养出去泡妞不至于没词丢我校的脸学校新开了一批公共选修课什么唐宋词、西方哲学史、小说欣赏等等。学校还规定公共选修课学分不够不能毕业。真够狠的弄得我们这些老生还要和一大批新生蛋子一起补修养。本人一向有崇洋媚外之倾向没办法翻开我们计算机科学教材除了封面的“编者”几乎就没看到中国人名于是就选了西方哲学史。大师的课上得飞快我就逃了几次课他已经从柏拉图讲到黑格尔了跨越了千年。“就绝对者自身成为被规定、有规定的东西来说绝对者是实体。就绝对者是自己规定自己、自己建造自己来说绝对者又是主体。”天哪虽然我清楚的听到了每一个词但是听不懂他在讲什么我感觉自己如同歌剧院里附庸风雅的音盲处于极度郁闷状态中。突然一个迟到的女生从外面冲进来。我旁边正好有一空位她就坐下了。我们俩一对视不禁笑了。原来是数学系师姐forth。我和师姐实在太有缘份了去年跨系的英语六级辅导课我们俩就碰到一起这次又相会了。英语课上我经常插科打诨把她笑得前仰后合。有一次茶水喷了我一脑门她急忙拿手帕给我擦掉。周围一堆目光刺过来简直可以杀人。唉那时人真纯啊。课上完了再也没和师姐联系。没想到这次居然又碰面了。我俩急忙高兴的聊开了。没想到师姐还是某一个地下社团的头目叫什么“Forth语言学习研究协会”。她说Forth是一门伟大的计算机程序设计语言问我有没有兴趣加入。什么Forth计算机程序设计语言我怎么没听说过。师姐见四下无人注意便从书包里掏出一本协会登记册给我看说已经有好多同学加入了。只见上面一堆签名还有红手印。我吃了一惊。干什么反清复明的天地会啊。师姐说要看看我和Forth有没有缘份就随手出一题考我。如何用堆栈数据结构机械计算一个算术表达式比如324。靠也不想想兄弟是什么专业的。我们计算机科学家几十年前就搞定这个问题了。我熟练的把表达式转换为后缀形式即为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协会香主之功名簿每个人都有照片、姓名、系别、毕业时间等信息。还有师姐的一封信。师姐说现在我已经证明自己是一个合格的协会负责人可以把自己的信息写在簿上了将来传给下任香主。我望着簿上师姐的照片不禁呆了。