SNOBOL4

**SNOBOL**（**S**tri**N**g **O**riented and sym**BO**lic **L**anguage），即「面向字串且符號式的語言」，是以 SNOBOL4 告終的一系列程式語言，由 AT&T 貝爾實驗室的 David J. Farber、Ralph E. 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 命令列語句，都是如下形式的：

這五種元素每個都是可選項。「標號」（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!」程式：

向使用者要求輸入名字並把它填入輸出句子中的簡單程式：

根據使用者輸入與二個模式的匹配情況在三種不同語氣的輸出中進行選擇：

持續要求使用者一次一個輸入自己所有的名字，直到只按 Enter 鍵表示再無後續者為止，最後告知使用者一共輸入了幾個名字：

## 當前實現

目前有一些實現能夠獲得。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 通用公共許可證下發行的自由軟體。

## 參見

* 同像性
* Icon (程式語言)
* Unicon (程式語言)
* Snowball (程式語言)
* Snostorm
* SPITBOL

## 參照

## 延伸閱讀

* 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. _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, 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