记住David M. Tilbrook和QED编辑的工作

2021-01-22 17:05:58

上周,我得知David M.Tilbrook死了,这让我很难过。我个人不认识他,也不能说太多关于他的生活,但是我研究了他的出版物和软件构想,并且认为它们很有趣,特别是从历史的观点。

不幸的是,这些东西大多数都在被拆除的网站上,因此本文将广泛地引用Internet存档上的页面。

当我研究Unix标准文本编辑器ed的直接前身QED编辑器的历史时,首先遇到了David。QED的历史由Dennis Ritchie很好地记录了下来。但是,长期以来,QED源代码很难被发现。找到,听说大卫仍然保留了一个版本。

在2016年左右,我从USENIX磁带80.1中获得了一份Caltech qed副本,并尝试使其在现代平台上工作,并取得了一定的成功。感谢Arnold Robbinsthere的努力,现在是QED档案馆,其中还包含多伦多的1992 QED副本,其中包含汤姆·达夫(Tom Duff),罗伯特·派克(Robert Pike),休·雷德迈尔(Hugh Redelmeier)和戴维·蒂尔布鲁克(David Tilbrook)的贡献。如果您想自己运行它,现在可以使用现代化的UTF-8意识版本!

我不知道David到底为QED贡献了什么,但是从他的著作中可以明显看出他是QED的重度用户,并编写了许多脚本init。请记住,在80年代初期,awk相当有限,Perldid不存在,因此在Unix上进行通用字符串处理非常困难。本文结尾处将提供一个小型QED脚本示例。

大卫的大手笔是一套称为QEF的工具,是Euclid在几何构造的末尾写的,从软件的意义上讲,我们希望构建系统能够产生要制造的东西。负责维护(当时)大型系统,基本上是Unix发行版。工具停留在1977年make(1)的时代。有关详细信息和基本思想,请参见Tilbrook和Place(1986),“维护和维护工具”。安装大型软件发行版”(非常感谢Alan Grosskurth提供了副本。)我最喜欢的脚注是关于其构建系统的Prolog原型的脚注:“ cray免费吗?我需要重新安装/ bin / true!”

那时,Unix软件开发受到各种不兼容和特定于供应商的解决方法的困扰,而QEF是最早提供树外构建,自动依赖检测等概念的工具之一,并为诸如创建共享库之类的事情提供了可移植的抽象,那时需要执行神秘的仪式。

有趣的是,整个工具包都是以经典的Unix方式由小型工具和少量语言创建的.2015年,我获得了QEF的评估版,但遗憾的是其中没有QED的副本。但是,我可以阅读他的许多工具的完整手册。

查看这些工具很有启发性;许多功能已被废弃,因为这些功能已添加到标准工具中,或者我们现在可以负担得起使用更通用,效率低下的工具。但是,例如,他的go工具直接影响了我的nq工具的用户界面,并且阅读有关rls,lls,fexists和ftest的内容启发了我的lr。

好吧,我已答应过您一些QED代码,所以让我们开始吧。(我听说这在工作面试中很有用,所以下一次为什么不问您是否可以使用QED来完成任务!)

事实证明,这并没有像预期的那样晦涩难懂,但我并不是说我写的是惯用的QED。在研究本教程的同时,我将其一起破解。

那么它是怎样工作的?首先,我们切换到QED的56个可用缓冲区中的一个(ba)。缺省情况下,由于-x标志,我们位于名为〜的脚本缓冲区中,这使我从头开始抓头,因为脚本一开始总是打印自己的源代码!

接下来,我们建立一个循环.QED以while循环的形式提供结构化的编程,但这需要将循环主体装配在同一行上,相反,我们将使用跳转。我们以标签" loop和使用zc#+ 1递增cregister。 #启用寄存器的算术模式,它们也可以是字符串。由于寄存器为空,将被视为零。循环的结尾是zc#= 100 yf`循环行,它检查c寄存器是否等于100,否则(yf)跳回到标签循环。奇怪的是,QED具有不同的命令来向前(')和向后(`)跳跃。我假设有明确的方向是该缓冲区的实现细节基于程序的存储,但是与Unix的gotoor TECO的O命令进行比较,两者都从顶部开始搜索。

但是QED允许使用\ N作为换行符,因此我们可以节省一些屏幕空间。

然后,我们需要执行fizzbuzz逻辑。命令za#:\ zc%3 = 0会将c寄存器复制到a寄存器(我们需要这样做,因为所有算术运算都将其结果存储在aregister中),然后我们将a寄存器取模3并检查寄存器是否为3然后为零。如果不是,则向前跳一行(yf)。如果不跳转,则使用s命令将fizz附加到该行(与ed中的用法非常相似)。

如果该行仍然为空,则必须说出该数字,因此我们再次使用s将其附加,这次使用\ zc将c寄存器插入输入流。请注意,这不是由s命令进行插值,而是由QED本身进行插值。您基本上可以在任何地方写\ zc(或\ N),它的工作方式就像您在其中键入一样!\可以引用为\ c,因此我们可以这样做:

注意插入a寄存器是如何导致bregister也被插入的!幸运的是,参与QED的人员以后写shell时会更好。

在循环的最后,我们将fizzbuzz输出存储在缓冲区中,因此我们只需打印出整个内容(,p)即可退出QED,而无需问任何问题(Q)。

通过在Qed和UNIX其他工具之间取得和谐的平衡,聪明的用户将发现Qed功能强大,灵活,易于掌握和娱乐!