SNOBOLStriNg Oriented and symBOlic Language),即「面向字串符號式的語言」,是以SNOBOL4告終的一系列程式語言,由AT&T貝爾實驗室David J. Farber英語David J. FarberRalph E. Griswold英語Ralph Griswold和Ivan P. Polonsky,在1962年至1967年間開發。它是在1950年代和1960年代,開發出的那些面向文字字串的語言之一,其他語言套件括COMITTRAC英語TRAC (programming language)

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年,​62年前​(1962
許可證2條款BSD許可證
網站www.snobol4.org 編輯維基數據連結
主要實作產品
SNOBOL, SPITBOL英語SPITBOL
啟發語言
COMIT
影響語言
AWK, bs英語bs (programming language), Icon, SL5, 採用關聯陣列的語言

概述

編輯

SNOBOL4超脫於同時代的多數程式語言的地方,是將模式(pattern)作為頭等資料類型,這種資料類型的值,可以用程式語言中的任何其他資料類型所允許的所有方式來操縱,並且提供算符(operator)用於模式(pattern)串接交替英語Alternation (formal language theory)。SNOBOL4模式,是某一種類型的對象,並允許各種操縱,非常類似於後來的物件導向語言比如JavaScript中,那種叫做正則表達式的模式。此外,SNOBOL4在執行期間生成的字串,可以被當作程式,而要麼解釋要麼編譯執行,如同其他語言中用eval函數那樣執行。

在1960年代後期和1970年代前期,SNOBOL4在美國大學中被廣泛教授,並在1970年代和1980年代,在人文學科中作為文字操縱語言被廣泛使用。

在1980年代和1990年代,隨着新的語言比如AWKPerl,使得通過正則表達式方式的字串操縱成為時尚,對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,不同於更「標準」的程序式語言如BASICFortranC語言,二者都是很激進的。

例子程式

編輯

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]

參見

編輯

參照

編輯
  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).

外部連結

編輯