SNOBOL

SNOBOL编程范型| 符号式, 指令式, 非结构化

|

設計者| David J. Farber（英语：David J. Farber）, Ralph E. Griswold（英语：Ralph Griswold），Ivan P. Polonsky
實作者| David J. Farber, Ralph E. Griswold, Ivan P. Polonsky, 贝尔实验室
发行时间| 1962年，​63年前​（1962）
許可證| 2条款BSD许可证
網站| www.snobol4.org
主要實作產品
SNOBOL, SPITBOL（英语：SPITBOL）
受影响于
COMIT
影響語言
AWK, bs（英语：bs (programming language)）, Icon, SL5, 采用关联数组的语言

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

## 概述

[编辑]

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

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

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

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

## 特征

[编辑]

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

所有的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所用的算法，它通过明确子句文法（英语：Definite clause grammar）提供了类似模式的构造。这个算法使得利用SNOBOL作为逻辑编程语言，比大多数其他语言都要容易。

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

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

## 例子程序

[编辑]

“Hello, World!”程序：

OUTPUT = "Hello, World!"
END

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

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

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

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键表示再无后续者为止，最后告知用户一共输入了几个名字：

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写的自由开源实现，能够在几乎所有平台上运行[5]。 Catspaw公司提供了对很多计算机平台的SNOBOL4语言商业实现，现在有可以免费获得的版本。Viktors Berstis的Minnesota SNOBOL4是最接近IBM大型主机版本的PC实现，也是免费的[6]。

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

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

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

## 参见

[编辑]

* 同像性
* Icon (编程语言)
* Unicon (编程语言)
* Snowball (编程语言)（英语：Snowball (programming language)）
* Snostorm（英语：Snostorm）
* SPITBOL（英语：SPITBOL）

## 引用

[编辑]

1. ^ Gimpel, J. F. 1973. A theory of discrete patterns and their implementation in SNOBOL4. Commun. ACM 16, 2 (Feb. 1973), 91-100. DOI=http://doi.acm.org/10.1145/361952.361960 （页面存档备份，存于互联网档案馆）
2. ^ Dr. Dobb's: Programs That Transform Their Own Source Code; or: the Snobol Foot Joke. Dobbscodetalk.com.  [2011-12-04]. （原始内容存档于2013-05-12）.
3. ^ Contact details. perlre. perldoc.perl.org.  [2011-12-04]. （原始内容存档于2016-03-15）.
4. ^ Recursive Regex Tutorial.  [2017-03-19]. （原始内容存档于2017-03-20）.
5. ^ 存档副本.  [2020-04-23]. （原始内容存档于2020-02-28）.
6. ^ 存档副本.  [2020-04-24]. （原始内容存档于2020-02-24）.
7. ^ "SNOSTORM" （页面存档备份，存于互联网档案馆）, MTS Volume 9: SNOBOL4 in MTS, Computing Center, University of Michigan, June 1979, pages 99-120. Retrieved 1 September 2014.
8. ^ "The Snocone Programming Language" （页面存档备份，存于互联网档案馆）, Andrew Koenig, USENIX (Portland, Oregon), June 1985. Retrieved 2 September 2014. software download link.
9. ^ spitbol: Raw power and speed for non-numeric computation..  [2020-04-24]. （原始内容存档于2019-02-05）.

## 延伸阅读

[编辑]

* Emmer, Mark B. SNOBOL4+: The SNOBOL4 Language for the Personal Computer User. Englewood Cliffs, NJ: Prentice Hall, 1985 (ISBN 0-13-815119-9).
* Gimpel, James F. Algorithms in SNOBOL4. New York: Wiley, 1976 (ISBN 0-471-30213-9); republished Salida, CO: Catspaw, 1986 (ISBN 0-939793-00-8).
* Griswold, Ralph E. The Macro Implementation of SNOBOL4. San Francisco, CA: W. H. Freeman and Company, 1972 (ISBN 0-7167-0447-1).
* Griswold, Ralph E., J. F. Poage, and I. P. Polonsky. The SNOBOL4 Programming Language. Englewood Cliffs, NJ: Prentice Hall, 1968 (ISBN 0-13-815373-6).
* Griswold, Ralph E. String and List Processing in SNOBOL4: Techniques and Applications. Englewood Cliffs, NJ: Prentice Hall, 1975 (ISBN 0-13-853010-6).
* Hockey, Susan M.（英语：Susan Hockey） Snobol Programming for the Humanities. New York: Clarendon Press; Oxford: Oxford University Press, 1985 (ISBN 0-19-824676-5).

## 外部链接

[编辑]

* 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（页面存档备份，存于互联网档案馆）
* 开放目录项目中的“SNOBOL”
* Oral history interview with Ralph E. Griswold—Griswold discusses development of SNOBOL Charles Babbage Institute（英语：Charles Babbage Institute）, University of Minnesota, Minneapolis.
* Charles Hall Collection on the SNOBOL Programming Language. Charles Babbage Institute（英语：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

* 查
* 论
* 编

编程语言

范型|

| 过程式|

* FORTRAN
* COBOL
* JOVIAL
* ALGOL 60
* JOSS（英语：JOSS）
* BASIC
* PL/I
* MUMPS（英语：MUMPS）
* ALGOL 68
* Forth
* Pascal
* Turbo Pascal
* C
* Modula-2
* Ada 83
* occam
* Oberon
* Go
* Ballerina（英语：Ballerina (programming language)）

|

面向对象|

* Simula 67
* Smalltalk
* Objective-C
* Eiffel
* Object Pascal
* Delphi
* Self
* CLOS
* Visual Basic
* Gambas
* Ada 95
* Java
* C#
* Vala
* Crystal（英语：Crystal (programming language)）

多范型|

* C++
* Modula-3
* Dylan
* Python
* Lua
* JavaScript
* Ruby
* D
* Factor
* Scala
* F#
* Haxe
* Nim
* Chapel（英语：Chapel (programming language)）
* Rust
* Kotlin
* Dart
* Swift
* Zig
* Ring（英语：Ring (programming language)）
* V（英语：V (programming language)）
* Mojo
* Carbon

函数式|

* LISP
* Scheme
* Common Lisp
* Clojure
* Logo
* APL/`J`
* ML
* Standard ML
* OCaml
* Erlang
* Elixir
* Haskell
* SAC
* Agda
* Idris
* jq
* Gleam（英语：Gleam (programming language)）

逻辑式|

* Prolog
* Datalog
* Mercury
* AnsProlog
* ProbLog（英语：ProbLog）

脚本语言|

| 动态语言|

* SNOBOL
* Icon
* REXX
* Perl
* Raku
* Tcl/Tk
* Python
* Lua
* Ruby
* PHP
* Hack
* CFML（英语：ColdFusion Markup Language）
* REBOL
* Red（英语：Red (programming language)）
* Io
* Julia
* jq

|

Shell语言|

* Unix shell
* sh/ash/dash
* csh/tcsh
* ksh
* bash
* zsh
* rc（英语：rc (Unix shell)）
* sed
* AWK
* PowerShell

ECMA-262|

* ECMAScript
* JavaScript
* TypeScript
* CoffeeScript/LiveScript（英语：LiveScript (programming language)）
* Elm
* PureScript
* Reason
* Bosque（英语：Bosque (programming language)）

特定平台|

| .NET|

* C#
* C++/CLI
* F#
* PowerShell
* VB.NET
* Small Basic

|

JVM|

* Java
* AspectJ（英语：AspectJ）
* Scala
* Clojure
* Groovy
* Kotlin

特定领域|

| 科学计算|

* Speakeasy（英语：Speakeasy (computational environment)）
* IDL
* GDL
* Maxima
* Maple
* MATLAB
* Octave
* Scilab
* Wolfram
* R
* Yorick（英语：Yorick (programming language)）
* SageMath
* Julia

|

GPU计算|

* Cg/HLSL
* GLSL
* Brook（英语：BrookGPU）
* OpenCL
* SYCL
* CUDA/PTX（英语：Parallel Thread Execution）
* Futhark
* SPIR-V（英语：Standard Portable Intermediate Representation）

数据查询|

* CODASYL（英语：CODASYL）
* SQL
* PL/SQL
* T-SQL
* SQL/PSM（英语：SQL/PSM）
* xBase（英语：xBase）
* XPath
* XQuery（英语：XQuery）
* GraphQL

可视化|

* Prograph（英语：Prograph）
* Simulink
* LabVIEW
* Orange（英语：Orange (software)）
* KNIME（英语：KNIME）
* Scratch
* Snap!
* App Inventor
* Power Fx

传媒设计|

* SuperCollider
* Pure Data
* AviSynth
* Processing
* ChucK

其它|

* 汇编语言
* APT（英语：APT (programming language)）
* GPSS（英语：GPSS）
* CLIPS（英语：CLIPS）
* AMPL
* dc
* yacc
* make
* PostScript
* XSLT
* LLVM IR
* WebAssembly
* 深奥的编程语言

* 目录
* 列表
* 历史
* 比较（英语：Comparison of programming languages）
* 时间线

*[查]: 查看该模板
*[论]: 讨论该模板
*[编]: 编辑该模板