SNOBOL

SNOBOL（StriNg Oriented and symBOlic Language），即“面向字符串且符号式的语言”，是以SNOBOL4告终的一系列编程语言，由AT&T贝尔实验室的David J. Farber、Ralph Griswold和Ivan P. Polonsky，在1962年至1967年间开发。它是在1950年代和1960年代，开发出的那些面向文本字符串的语言之一，其他语言包括COMIT和TRAC (编程语言)。

## 概述

SNOBOL4超脱于同时代的多数编程语言的地方，是将模式（pattern）作为头等数据类型，这种数据类型的值，可以用编程语言中的任何其他数据类型所允许的所有方式来操纵，并且提供算符（operator）用于模式（pattern）串接和交替 (形式语言理论)。SNOBOL4模式，是某一种类型的对象，并允许各种操纵，非常类似于后来的面向对象语言比如JavaScript中，那种叫做正则表达式的模式。此外，SNOBOL4在执行期间生成的字符串，可以被当作程序，而要么解释要么编译执行，如同其他语言中用eval函数那样执行。

在1960年代后期和1970年代前期，SNOBOL4在美国大学中被广泛教授，并在1970年代和1980年代，在人文学科中作为文本操纵语言被广泛使用。

在1980年代和1990年代，随着新的语言比如AWK和Perl，使得通过正则表达式方式的字符串操纵成为时尚，对SNOBOL4的使用逐渐衰竭了。SNOBOL4模式归类为BNF文法，它等价于上下文无关文法，从而比正则表达式更强力。不同于SNOBOL4模式，纯粹的正则表达式是不递归的，这带给了SNOBOL4模式，在计算上的明确优势；当前版本的AWK和Perl的“正则表达式”，实际上是对正则语言意义上的正则表达式的扩展（递归表达式于2007年十二月发行的Perl 5.10中仍未出现）。

SNOBOL的设计者之一Ralph Griswold，设计了SNOBOL4的后继者，叫做SL5和Icon，它们将SNOBOL4模式匹配的回溯算法，与更标准的类ALGOL结构结合起来，同时增加了它们自己的一些特征。

## 特征

SNOBOL4支持很多内置数据类型，比如整数、有限精度的实数、字符串、模式、数组，和首创的叫做表格（table）的关联数组，并允许编程者定义额外的数据类型和新函数。SNOBOL4的编程者定义数据类型的设施，在当时是先进的，它类似于更早的COBOL和更晚的Pascal编程语言中的记录。

所有的SNOBOL命令行语句，都是如下形式的：

```snobol
label subject pattern = object :transfer
```

这五种元素每个都是可选项。“标号”（label）位于行首用来标识语句，没有标号的语句，开始于一个空白字符，特例的单一标号`END`表示程序结束。有四种基本类型的运算操作（operation）：基础、赋值、模式匹配和模式匹配连带替换，所有运算操作，都有“主语”（subject）。基础操作运算，只有一个主语，构成主语的表达式被求值。赋值运算操作有“宾语”（object），等号右侧的值被赋予左侧的变量，如果对主语或宾语的求值失败，则不发生赋值。在模式匹配时，针对“模式”（pattern）对主语进行匹配；如果这时存在宾语，则经由替换规则，将其中任何匹配部分替换为宾语。“转移”（transfer）可以是绝对分支，即`:(标号)`；或依赖于前面运算操作的成功（success）或失败（failure）的条件分支，即`:S(标号1) F(标号2)`。还可以转移到在运行期间程序自身所建立并编译的代码。

SNOBOL模式，可以非常简单也可以非常复杂。一个简单模式，可以是已知的文本字符串，比如`"ABCD"`，或对未知字符串的种类的指定，比如模式函数`LEN(1)`；而一个复杂模式，可以是一个大型的结构描述，例如一个计算机语言的完整文法。有可能在SNOBOL中实现一个语言的解释器，几乎直接源自它的巴科斯-诺尔范式表达式，加上一些改变即可。

SNOBOL采用了隐式的输入输出机制，分别用特殊标识符`INPUT`指示标准输入，`OUTPUT`指示标准输出。

SNOBOL4模式匹配，使用了回溯算法，这类似于逻辑编程语言Prolog所用的算法，它通过明确子句文法提供了类似模式的构造。这个算法使得利用SNOBOL作为逻辑编程语言，比大多数其他语言都要容易。

SNOBOL在一个单一的有垃圾回收的堆中，存储变量、字符串和数据结构。

SNOBOL在格式和编程风格的鲜明性上，匹敌于APL，不同于更“标准”的过程式语言如BASIC、Fortran或C语言，二者都是很激进的。

## 例子程序

“Hello, World!”程序：

```snobol
          OUTPUT = "Hello, World!"
END
```

向用户要求输入名字并把它填入输出句子中的简单程序：

```snobol
          OUTPUT = "What is your name?"
          Username = INPUT
          OUTPUT = "Thank you, " Username
END
```

根据用户输入与二个模式的匹配情况在三种不同语气的输出中进行选择：

```snobol
          OUTPUT = "What is your name?"
          Username = INPUT
          Username "J"                                             :S(LOVE)
          Username "K"                                             :S(HATE)
MEH       OUTPUT = "Hi, " Username                                 :(END)
LOVE      OUTPUT = "How nice to meet you, " Username               :(END)
HATE      OUTPUT = "Oh. It's you, " Username
END
```

持续要求用户一次一个输入自己所有的名字，直到只按Enter键表示再无后续者为止，最后告知用户一共输入了几个名字：

```snobol
          OUTPUT = "This program will ask you for personal names"
          OUTPUT = "until you press return without giving it one"
          NameCount = 0                                            :(GETINPUT)
AGAIN     NameCount = NameCount + 1
          OUTPUT = "Name " NameCount ": " PersonalName
GETINPUT  OUTPUT = "Please give me name " NameCount + 1 
          PersonalName = INPUT
          PersonalName LEN(1)                                      :S(AGAIN)
          OUTPUT = "Finished. " NameCount " names requested."
END
```

## 当前实现

目前有一些实现能够获得。Macro SNOBOL4 in C是Phil Budne写的自由开源实现，能够在几乎所有平台上运行。Catspaw公司提供了对很多计算机平台的SNOBOL4语言商业实现，现在有可以免费获得的版本。Viktors Berstis的Minnesota SNOBOL4是最接近IBM大型主机版本的PC实现，也是免费的。

尽管SNOBOL自身没有结构化编程特征，有叫做Snostorm的SNOBOL预处理器，由Fred G. Swartz于1970年代设计和实现，提供了IF、ELSEIF、ELSE、LOOP、CASE和PROCEDURE语句，并用于密歇根大学的密歇根终端系统（MTS）。

Andrew Koenig的Snocone向SNOBOL4增加了块结构构造。Snocone是自包含的编程语言，而非SNOBOL4的真超集。

SPITBOL编译器实现也介入了一些特征，尽管不使用传统的结构化编程关键字，却可以用来提供很多通常被认作“结构化编程”的等价能力，最显著的是嵌套if/then/else类型的构造。这些特征已经被增加到最新近的SNOBOL4实现中。经过了很多年作为商业产品之后，在2009年四月，SPITBOL成为了在GNU通用公共许可证下发行的自由软件。

## 延伸阅读

- Emmer, Mark B. SNOBOL4+: The SNOBOL4 Language for the Personal Computer User. Englewood Cliffs, NJ: Prentice Hall, 1985 .
- Gimpel, James F. Algorithms in SNOBOL4. New York: Wiley, 1976 ; republished Salida, CO: Catspaw, 1986 .
- Griswold, Ralph E. The Macro Implementation of SNOBOL4. San Francisco, CA: W. H. Freeman and Company, 1972 .
- Griswold, Ralph E., J. F. Poage, and I. P. Polonsky. The SNOBOL4 Programming Language. Englewood Cliffs, NJ: Prentice Hall, 1968 .
- Griswold, Ralph E. String and List Processing in SNOBOL4: Techniques and Applications. Englewood Cliffs, NJ: Prentice Hall, 1975 .
- Susan Hockey Snobol Programming for the Humanities. New York: Clarendon Press; Oxford: Oxford University Press, 1985 .

## 外部链接

- Phil Budne offers a free and open source BSD-licensed port of the original Bell Labs SNOBOL4 to UNIX and UNIX-like platforms
- Catspaw, Inc. offers implementations of and commercial support for SNOBOL4
- Computers/Programming/Languages/Snobol
- Oral history interview with Ralph E. Griswold—Griswold discusses development of SNOBOL Charles Babbage Institute, University of Minnesota, Minneapolis.
- Charles Hall Collection on the SNOBOL Programming Language. Charles Babbage Institute, University of Minnesota, Minneapolis.
- For a small brief taste of what SNOBOL4 is about try this online compiler
- Try It Online (Snobol4/CSNOBOL) Online compiler

## 基本资料

- 编程范型：符号式, 指令式, 非结构化
- 发行时间：1962年
- 设计者：David J. Farber, Ralph Griswold，Ivan P. Polonsky
- 开发者：David J. Farber, Ralph E. Griswold, Ivan P. Polonsky, 贝尔实验室
- 软件版本周期：SNOBOL4
- 软件版本周期：1967年
- 许可证：2条款BSD许可证
- 软件实现：SNOBOL, SPITBOL
- 受影响于：COMIT
- 施影响于：AWK, bs (编程语言), Icon, SL5, 采用关联数组的语言
- 网站：https://www.regressive.org/snobol4/