贝尔实验室的符号处理问题

SNOBOL于1962年在贝尔电话实验室的程序设计研究部门开始形成。该部门当年从新泽西州惠帕尼迁到霍姆德尔。拉尔夫·格里斯沃尔德与伊万·波隆斯基正在处理公式、图和符号计算,发现已有SCL语言表达繁琐、存储空间有限;COMIT的设计取向也不能完全满足他们的需要。

1962年秋,两人与戴维·法伯决定设计新的字符串处理语言。法伯有较多软件实现经验,承担组织和实现方面的重要工作;另外两人起初更关心它能否解决研究问题。语言由实际使用需求推动,把字符序列作为可直接命名和操作的数据。

参考:[1] [2]

1963年的可运行系统

团队在1963年初开始为IBM 7090制作试验实现。法伯编写把源语句转成中间形式的部分及解释执行部分,格里斯沃尔德和波隆斯基实现模式匹配,劳拉·怀特·诺尔协助完成符号表和存储管理。实现还利用了道格拉斯·麦克罗伊的字符串宏。

最初可用系统约用三周建成,此后继续调试和完善。到1963年夏,贝尔实验室内部已用它处理代数表达式、网络描述和程序生成等工作。设计者因此得到直接反馈:哪些字符串规则容易书写,哪些运算仍需要冗长的程序。

参考:[1]

构造、检查与改写

法伯等人1964年的论文把字符串构造、模式匹配和替换列为基本操作。一个名字可以指向一串符号,赋值规则建立这种联系;已有字符串与文字常量又能连接成新的字符串。程序不必为每一次连接自行计算内存位置。

论文中的简单例子先令NUMBER保存文本“1”,再把NUMBER、NUMBER和文字“0”依次连接,结果得到“110”。这不是数值加法,而是按顺序拼合字符。相同办法可把若干行文本加上分隔符,组成一个较长字符串。

模式匹配则检查目标字符串是否包含指定内容。匹配成功或失败是程序可以利用的结果;单纯检查不会改动目标。模式还可包含代表可变长度内容的字符串变量,使程序识别两个片段之间的部分。

参考:[2]

从查找片段到处理输入

这种基本方法在后来SNOBOL4的教材中仍然清晰可见。书中把TRADE设为“PROGRAMMER”,再以“GRAM”为模式检查它;处理器从左向右寻找这个片段。目标与模式之间没有另加运算符,而以空白分隔。

同一章用“SEMI”和“GROUP”说明连接,得到“SEMIGROUP”。它还介绍了INPUT、OUTPUT等与输入输出关联的变量:读取输入得到一行数据,把结果赋给输出变量便产生输出。于是,读入、判断内容、组成结果并输出,可以直接围绕字符串来组织。

这些例子来自1971年的SNOBOL4手册,展示的是后续语言中已经整理成体系的写法。它们延续原始SNOBOL关注文本操作的方向,同时属于更丰富的类型和函数环境。

参考:[3]

对外介绍与文献传播

1963年10月,法伯在密歇根大学介绍SNOBOL;原先的内部说明也获准对外分发。关于这门语言的论文随后发表于1964年1月《Journal of the ACM》,公开说明基本操作、语句形式及IBM 7090实现。

系统通过SHARE计算机用户组织向其他IBM 7090及7094使用者提供。语言的传播伴随着程序和说明材料的分发,而不只是一个名称的公布。研究人员开始把原本繁琐的文本加工、程序转换和试验性语言处理写成较短的规则序列。

参考:[1] [2]

后续语言扩大了表达范围

最初SNOBOL缺少方便的内建函数机制。SNOBOL2补入字符串和数值函数,SNOBOL3再加入程序员定义函数的能力;这些改进回应了实际程序中重复操作和组织代码的需要。

SNOBOL4进一步发展模式、数据类型和可移植实现。1971年手册不仅讲字符串,也包括整数、实数和相应表达式:字符连接仍是基本操作,数值运算则按另外的规则处理。原始语言的形成、1963年的试验系统以及后来的SNOBOL4,构成相互关联而又应分别理解的阶段。

参考:[1] [3]