1700436840
1700436841
Eqn识别数学结构,并将其转化为Troff命令,而其他内容则不做处理。预处理器式方法干净爽利地切出两种语言和两种程序,用于不同目的。PDP-11的物理限制逼着洛琳达和我想出这个好主意。由于内存限制,Troff已经是单个程序所能达到的最大尺寸,不能再添加处理数学内容的功能。再者,即使我们想修改Troff,乔·奥桑纳也不会容许我们碰它。
1700436842
1700436843
Eqn语言基于盒子模型:表达式由一系列盒子组成,这些盒子相互决定位置和大小。例如,分数是一条长线将分子盒和分母盒上下分开。像xi这样的下标表达式是一对盒子,其中第二个盒子的内容尺寸较小,位置比第一个盒子略低。
1700436844
1700436845
我们用史蒂夫·约翰逊新发明的编译器-编译器Yacc来定义语法,并将语义挂接上去。Eqn是首个基于Yacc的语言,不同于传统语言的传统编译器。就我自己而言,如果没有Yacc,Eqn不会出现,因为我不肯为一门新语言亲手写语法分析器。语法太复杂,而且在我和洛琳达试验语法的时候,经常会改动它,所以不适合写专门的语法分析器。我们使用Yacc的经验有力地说明,有了好的工具,就能做一些原本太难甚至无法想象的事情。
1700436846
1700436847
为不同类型的难以排版的材料提供预处理器是个好主意。在Eqn面世之后不久,迈克尔·莱斯克创造了Tbl,它提供了相当不一样的语言来制作复杂表格。莱斯克还写了用于管理文献引用的Refer程序。管理文献引用对技术论文来说非常重要。
1700436848
1700436849
本章介绍的许多程序都是预处理器,也就是将一些语言转换成适合后续处理的形式的程序。C++的最初版本Cfront,更准确的描述是C语言的面向对象的预处理器,最终演变成了C++。有时,随着功能被吸收到下游处理环节中,预处理器最终消失了,就像C++那样。更多情况下,预处理器继续独立存在,就像文档编制工具Eqn和Tbl。另一个例子是bc[8],它是dc[9]的预处理器。dc是鲍勃 · 莫里斯原作的不限精度计算器。洛琳达·彻丽编写bc是为了给dc提供传统算术符号,因为dc的后缀式符号对于新手来说太难了。
1700436850
1700436851
预处理器有很多优点。首先,在实现一种语言时,不会受到现有语法的限制,可以使用完全不同的风格,如各种Troff预处理器。其次,内存很小时,根本没办法在已经很大的程序中加入更多功能,Troff的情况尤其如此。最后,因为预处理器有输出,所以可以在继续传递之前对其进行操作,执行其他类型的数据处理。在文档编制套件中,我经常使用sed脚本等预处理器来修正字符集和间距。克里斯 · 范·维克(Chris Van Wyk)和我写了一些程序,通过修改Troff的输出,在页面传送到设备驱动程序之前,对它进行纵向对齐处理。这些功能无法整合到单一程序,在管道流水线中处理时,就很容易在前面或后面或中间添加新的环节。
1700436852
1700436853
4.与设备无关的Troff
1700436854
1700436855
1700436856
1700436857
1700436858
1700436859
乔·奥桑纳于1977年去世,享年48岁。他的部分遗产是Troff源代码。那近万行难以捉摸的C语言代码,是乔从原本的汇编语言形式手工翻译出来的——缺乏注释,几十个双字母名称的全局变量,以及(见前文关于内存的讨论)各种小技巧,把尽可能多的信息塞进不够多的内存。乔认为,这样做绝对有必要,因为得把Troff的所有功能打包到65 KB中,那是当时我们使用的PDP-11/45上用户程序可用的最大内存。
1700436860
1700436861
我一年多都没去动这些代码,但终于鼓足勇气开始摆弄它。慢慢地、小心翼翼地,我开始了升级。除了缺乏注释和文档,最大的问题是,它极大地依赖于Graphic Systems CAT照排机,而这种机型业已过时。
1700436862
1700436863
最后,我设法找到了所有依赖CAT特殊功能的代码,并换成由字符集、字号、字体和分辨率等排版器特性表驱动的通用代码。我发明了一种排版机描述语言,这样Troff就可以根据特定排版机的能力来产生输出。驱动程序将该输出转换为特定设备所需的输入。这就产生了所谓的与设备无关的版本,我称其为Ditroff[10]。它还使其他文档编制预处理器,特别是Pic,能够利用新排版设备的更高分辨率来绘制线条和图形。
1700436864
1700436865
其中一种设备是摩根泰勒(Mergenthaler)出品的新型排版机Linotron 202。从指标上看,似乎正可取代CAT照排机。它速度快,分辨率高,通过绘图的方式在屏幕上显示字符。它的处理器是Computer Automation出品的标准微型计算机“Naked Mini”。Naked Mini由一个简单的程序控制,类似于我为其他排版机编写的程序。这套设备主要的缺点是价格高昂,在1979年售价5万美元。鉴于我们用旧排版机打出了赫赫战绩,管理层几乎没有经过任何讨论就批准购买新设备。
1700436866
1700436867
Linotron 202一到手,我们就发现它的硬件出乎意料地不可靠;更糟糕的是它的软件。在之后几个月中,摩根泰勒的维修人员几乎每天都要过来,肯·汤普森和乔·康登(图5-8)还开展了对硬件进行逆向工程的壮举。
1700436868
1700436869
1700436870
1700436871
1700436872
图5-8 乔·康登,约1981年(杰勒德·霍尔兹曼供图)
1700436873
1700436874
乔本来是物理学家,但随着兴趣转移,他成了出色的电子电路设计师。他为中心编写了许多用于硬件实验的电路设计工具,并与肯一起设计了Belle国际象棋计算机。他的硬件专业知识对摸透Linotron 202至关重要。
1700436875
1700436876
肯首先为机器上运行的二进制程序编写了反汇编器。(他在某个晚上用几个小时就完成这项工作,而我则回家吃饭,然后回来工作整晚。)
1700436877
1700436878
通过拆解摩根泰勒程序,肯和乔对排版机本身的工作方式有了切身体会。经过几个星期紧张的逆向工程,他们弄清了摩根泰勒的专有字符编码,并编写了新代码,这样我们就可以创造自己的字符,例如,图5-9所示最上端的贝尔系统标志、用于输出棋局和棋盘图的国际象棋字体,以及有多种用途的彼得面容(图5-10)。
1700436879
1700436880
1700436881
1700436882
1700436883
图5-9 记录了与Linotron 202斗智斗勇过程的贝尔实验室备忘录,未正式发布
1700436884
1700436885
1700436886
1700436887
1700436888
图5-10 彼得脸视力表(杰勒德·霍尔兹曼供图)
1700436889
[
上一页 ]
[ :1.70043684e+09 ]
[
下一页 ]