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/