SNOBOL

title: 概述.
content: SNOBOL4超脱于同时代的多数编程语言的是将模式(pattern)作为第一类数据类型(这种数据类型的值可以被编程语言中的任何其他数据类型以所有允许的方式操纵),并提供算符(operator)用于模式串接和。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结构结合起来,同时增加了它们自己的一些特征。
title: 特征.
content: SNOBOL4支持很多内置数据类型,比如整数、有限精度的实数、字符串、、数组,和首创的叫做“表格”的关联数组,并允许编程者定义额外的数据类型和新函数。SNOBOL4的编程者定义数据类型的设施在当时是先进的,它类似于更早的COBOL和更晚的Pascal编程语言中的记录。  所有SNOBOL的命令行语句都是如下形式的:  label subject pattern = object :transfer 这五种元素每个都是可选项。“标号”(label)位于行首用来标识语句,没有标号的语句开始于一个空白字符,特例的单一标号codice_1表示程序结束。有四种基本类型的运算操作(operation):基础、赋值、模式匹配和模式匹配替换,所有运算操作都有“主语”(subject)。基础操作运算只有一个主语,构成主语的表达式被求值。赋值运算操作有“宾语”(object),等号右侧的值被赋予左侧的变量,如果对主语或宾语的求值失败,则不发生赋值。在模式匹配时,针对“模式”(pattern)对主语进行匹配;如果这时存在宾语,则经由替换规则将其中任何匹配部分替换为宾语。“转移”(transfer)可以是绝对分支,即codice_2;或依赖于前面运算操作的成功(success)或失败(failure)的条件分支,即codice_3。还可以转移到在运行期间程序自身所建立并编译的代码。  SNOBOL模式可以非常简单也可以非常复杂。一个简单模式可以是已知的文本字符串(比如codice_4),或对未知字符串的种类的指定(比如模式函数codice_5);而一个复杂模式可以是一个大型的结构描述,例如一个计算机语言的完整文法。有可能在SNOBOL中实现一个语言的解释器,几乎直接源自它的巴科斯-诺尔范式表达式,加上一些改变即可。  SNOBOL采用了隐式的输入输出机制,分别用特殊标识符codice_6指示标准输入,codice_7指示标准输出。  SNOBOL4模式匹配使用了回溯算法,这类似于逻辑编程语言Prolog所用的算法,它通过提供了类似模式的构造。这个算法使得利用SNOBOL作为逻辑编程语言比大多数其他语言都要容易。  SNOBOL在一个单一的有垃圾回收的堆中存储变量、字符串和数据结构。  SNOBOL在格式和编程风格的鲜明性上匹敌于APL,不同于更“标准”的过程序语言如BASIC、Fortran或C语言,二者都是很激进的。
title: 例子程序.
content: “Hello, World!”程序: END 向用户要求输入名字并把它填入输出句子中的简单程序:  END 根据用户输入与二个模式的匹配情况在三种不同语气的输出中进行选择: MEH OUTPUT = "Hi, " Username :(END) LOVE OUTPUT = "How nice to meet you, " Username :(END) HATE OUTPUT = "Oh. It's you, " Username END 持续要求用户一次一个输入自己所有的名字,直到只按Enter键表示再无后续者为止,最后告知用户一共输入了几个名字: AGAIN NameCount = NameCount + 1 GETINPUT OUTPUT = "Please give me name " NameCount + 1 END
title: 当前实现.
content: 目前有一些实现能够获得。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通用公共许可证下发行的自由软件。

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

SNOBOL: SNOBOL (abréviation de "StriNg Oriented symBOlic Language") est un langage de programmation basé sur le traitement des chaînes de caractères. Il a été défini entre 1960 et 1962 dans les Laboratoires Bell. Il est resté confidentiel jusqu'à sa version 4 (SNOBOL4), qui a connu la célébrité grâce à son algorithme de filtrage par motif très puissant ; par contre sa syntaxe était très liée à la technologie des cartes perforées, et un programme en SNOBOL était illisible une fois écrit.