SNOBOL(StriNg Oriented and symBOlic Language),即「面向字符串且符號式的語言」,是以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文法,它等價於上下文無關文法,從而比正則表達式更強力[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所用的算法,它通過明確子句文法提供了類似模式的構造。這個算法使得利用SNOBOL作為邏輯編程語言,比大多數其他語言都要容易。
SNOBOL在一個單一的有垃圾回收的堆中,存儲變量、字符串和數據結構。
SNOBOL在格式和編程風格的鮮明性上,匹敵於APL,不同於更「標準」的過程式語言如BASIC、Fortran或C語言,二者都是很激進的。
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的SNOBOL預處理器,由Fred G. Swartz於1970年代設計和實現,提供了IF、ELSEIF、ELSE、LOOP、CASE和PROCEDURE語句,並用於密歇根大學的密歇根終端系統(MTS)[7]。
Andrew Koenig的Snocone向SNOBOL4增加了塊結構構造。Snocone是自包含的編程語言,而非SNOBOL4的真超集[8]。
SPITBOL編譯器實現也介入了一些特徵,儘管不使用傳統的結構化編程關鍵字,卻可以用來提供很多通常被認作「結構化編程」的等價能力,最顯著的是嵌套if/then/else類型的構造。這些特徵已經被增加到最新近的SNOBOL4實現中。經過了很多年作為商業產品之後,在2009年四月,SPITBOL成為了在GNU通用公共許可證下發行的自由軟件[9]。
- 同像性
- Icon (編程語言)
- Unicon (編程語言)
- Snowball (編程語言)
- Snostorm
- SPITBOL
Wikiwand in your browser!
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.