SNOBOL
編程範型 | 符號式, 指令式, 非結構化 |
---|---|
設計者 | David J. Farber, Ralph E. Griswold,Ivan P. Polonsky |
實作者 | David J. Farber, Ralph E. Griswold, Ivan P. Polonsky, 貝爾實驗室 |
面市時間 | 1962年 |
許可證 | 2條款BSD許可證 |
網站 | www |
主要實作產品 | |
SNOBOL, SPITBOL | |
啟發語言 | |
COMIT | |
影響語言 | |
AWK, bs, Icon, SL5, 採用關聯數組的語言 |
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]。
參見
[編輯]引用
[編輯]- ^ 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 (頁面存檔備份,存於網際網路檔案館)
- ^ Dr. Dobb's: Programs That Transform Their Own Source Code; or: the Snobol Foot Joke. Dobbscodetalk.com. [2011-12-04]. (原始內容存檔於2013-05-12).
- ^ Contact details. perlre. perldoc.perl.org. [2011-12-04]. (原始內容存檔於2016-03-15).
- ^ Recursive Regex Tutorial. [2017-03-19]. (原始內容存檔於2017-03-20).
- ^ 存档副本. [2020-04-23]. (原始內容存檔於2020-02-28).
- ^ 存档副本. [2020-04-24]. (原始內容存檔於2020-02-24).
- ^ "SNOSTORM" (頁面存檔備份,存於網際網路檔案館), MTS Volume 9: SNOBOL4 in MTS, Computing Center, University of Michigan, June 1979, pages 99-120. Retrieved 1 September 2014.
- ^ "The Snocone Programming Language" (頁面存檔備份,存於網際網路檔案館), Andrew Koenig, USENIX (Portland, Oregon), June 1985. Retrieved 2 September 2014. software download link.
- ^ 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. 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