SNOBOL（StriNg Oriented and symBOlic Language），即 面向字串且符號式的語言，是以 SNOBOL4 告終的一系列程式語言，由 ATT 貝爾實驗室的、和 Ivan P Polonsky，在 1962 年至 1967 年間開發。它是在 1950 年代和 1960 年代，開發出的那些面向文字字串的語言之一，其他語言包括 COMIT 和。 概述 SNOBOL4 超脫於同時代的多數程式語言的地方，是將模式（pattern）作為頭等資料型別，這種資料型別的值，可以用程式語言中的任何其他資料型別所允許的所有方式來操縱，並且提供算符（operator）用於模式（pattern）串接和。SNOBOL4 模式，是某一種型別的物件，並允許各種操縱，非常類似於後來的面嚮物件語言比如 JavaScript 中，那種叫做正則表示式的模式。此外，SNOBOL4 在執行期間生成的字串，可以被當作程式，而要麼解釋要麼編譯執行，如同其他語言中用 eval 函式那樣執行。 在 1960 年代後期和 1970 年代前期，SNOBOL4 在美國大學中被廣泛教授，並在 1970 年代和 1980 年代，在人文學科中作為文字操縱語言被廣泛使用。 在 1980 年代和 1990 年代，隨著新的語言比如 AWK 和 Perl，使得透過正則表示式方式的字串操縱成為時尚，對 SNOBOL4 的使用逐漸衰竭了。SNOBOL4 模式歸類為 BNF 文法，它等價於上下文無關文法，從而比正則表示式更強力 Gimpel J F 1973 A theory of discrete patterns and their implementation in SNOBOL4 Commun ACM 16 2 Feb 1973 91100 DOIhttpdoiacmorg101145361952361960 。不同於 SNOBOL4 模式，純粹的正則表示式是不遞迴的，這帶給了 SNOBOL4 模式，在計算上的明確優勢；當前版本的 AWK 和 Perl 的 正則表示式，實際上是對正則語言意義上的正則表示式的擴充套件（遞迴表示式於 2007 年十二月發行的 Perl 510 中仍未出現）。 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 所用的演算法，它透過提供了類似模式的構造。這個演算法使得利用 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 Its 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 寫的自由開源實現，能夠在幾乎所有平臺上執行。 Catspaw 公司提供了對很多計算機平臺的 SNOBOL4 語言商業實現，現在有可以免費獲得的版本。Viktors Berstis 的 Minnesota SNOBOL4 是最接近 IBM 大型主機版本的 PC 實現，也是免費的。 儘管 SNOBOL 自身沒有結構化程式設計特徵，有叫做的 SNOBOL 預處理器，由 Fred G Swartz 於 1970 年代設計和實現，提供了 IF、ELSEIF、ELSE、LOOP、CASE 和 PROCEDURE 語句，並用於密歇根大學的（MTS）SNOSTORM MTS Volume 9 SNOBOL4 in MTS Computing Center University of Michigan June 1979 pages 99120 Retrieved 1 September 2014。 的 Snocone 向 SNOBOL4 增加了塊結構構造。Snocone 是自包含的程式語言，而非 SNOBOL4 的真超集 The Snocone Programming Language Andrew Koenig USENIX Portland Oregon June 1985 Retrieved 2 September 2014 software download link。 編譯器實現也介入了一些特徵，儘管不使用傳統的結構化程式設計關鍵字，卻可以用來提供很多通常被認作 結構化程式設計 的等價能力，最顯著的是巢狀 ifthenelse 型別的構造。這些特徵已經被增加到最新近的 SNOBOL4 實現中。經過了很多年作為商業產品之後，在 2009 年四月，SPITBOL 成為了在 GNU 通用公共許可證下發行的自由軟體。 參見 同像性 Icon 程式語言 Unicon 程式語言 引用 延伸閱讀 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 Snobol Programming for the Humanities New York Clarendon Press Oxford Oxford University Press 1985 外部連結 Phil Budne offers a free and open source BSDlicensed port of the original Bell Labs SNOBOL4 to UNIX and UNIXlike platforms Catspaw Inc offers implementations of and commercial support for SNOBOL4 Oral history interview with Ralph E GriswoldGriswold discusses development of SNOBOL University of Minnesota Minneapolis Charles Hall Collection on the SNOBOL Programming Language University of Minnesota Minneapolis For a small brief taste of what SNOBOL4 is about try this online compiler Try It Online Snobol4CSNOBOL Online compiler Category 程式設計語言 Category 模式匹配程式語言 Category 面向文字程式語言 Category 同像性程式語言