<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=SNOBOL</id>
	<title>SNOBOL - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=SNOBOL"/>
	<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=SNOBOL&amp;action=history"/>
	<updated>2026-07-11T17:59:49Z</updated>
	<subtitle>在这个wiki上该页的修订历史</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://arolstar52-zhtest.hf.space/index.php?title=SNOBOL&amp;diff=3415513&amp;oldid=prev</id>
		<title>imported&gt;ExultantEditor 来自 2025年12月26日 (五) 17:48</title>
		<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=SNOBOL&amp;diff=3415513&amp;oldid=prev"/>
		<updated>2025-12-26T17:48:28Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{NoteTA&lt;br /&gt;
|G1 = IT&lt;br /&gt;
}}&lt;br /&gt;
{{Infobox programming language&lt;br /&gt;
| name                   = SNOBOL&lt;br /&gt;
| paradigm               = [[符号式编程|符号式]], [[指令式编程|指令式]], [[非结构化编程|非结构化]]&lt;br /&gt;
| year                   = {{Start date and age|1962}}&lt;br /&gt;
| designer               = {{le|David J. Farber}}, {{le|Ralph Griswold|Ralph Griswold|Ralph E. Griswold}}，Ivan P. Polonsky&lt;br /&gt;
| developer              = David J. Farber, Ralph E. Griswold, Ivan P. Polonsky, [[贝尔实验室]]&lt;br /&gt;
| latest release version = SNOBOL4&lt;br /&gt;
| latest release date    = {{Start date and age|1967}}&lt;br /&gt;
| license = [[BSD许可证|2条款BSD许可证]]&lt;br /&gt;
| implementations        = SNOBOL, {{le|SPITBOL}}&lt;br /&gt;
| influenced by          = [[COMIT]]&lt;br /&gt;
| influenced             = [[AWK]], {{le|bs (编程语言)|bs (programming language)|bs}}, [[Icon (编程语言)|Icon]], SL5, 采用[[关联数组]]的语言&lt;br /&gt;
| website                = https://www.regressive.org/snobol4/&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;SNOBOL&amp;#039;&amp;#039;&amp;#039;（&amp;#039;&amp;#039;&amp;#039;S&amp;#039;&amp;#039;&amp;#039;tri&amp;#039;&amp;#039;&amp;#039;N&amp;#039;&amp;#039;&amp;#039;g &amp;#039;&amp;#039;&amp;#039;O&amp;#039;&amp;#039;&amp;#039;riented and sym&amp;#039;&amp;#039;&amp;#039;BO&amp;#039;&amp;#039;&amp;#039;lic &amp;#039;&amp;#039;&amp;#039;L&amp;#039;&amp;#039;&amp;#039;anguage），即“面向[[字符串]]且[[符号式编程|符号式]]的语言”，是以SNOBOL4告终的一系列[[编程语言]]，由[[AT&amp;amp;T公司|AT&amp;amp;T]][[贝尔实验室]]的{{le|David J. Farber}}、{{le|Ralph Griswold|Ralph Griswold|Ralph E. Griswold}}和Ivan P. Polonsky，在1962年至1967年间开发。它是在1950年代和1960年代，开发出的那些面向文本字符串的语言之一，其他语言包括[[COMIT]]和{{le|TRAC (编程语言)|TRAC (programming language)|TRAC}}。&lt;br /&gt;
&lt;br /&gt;
==概述==&lt;br /&gt;
SNOBOL4超脱于同时代的多数编程语言的地方，是将模式（pattern）作为[[头等对象|头等]][[数据类型]]，这种数据类型的值，可以用编程语言中的任何其他数据类型所允许的所有方式来操纵，并且提供算符（operator）用于模式（pattern）[[串接]]和{{le|交替 (形式语言理论)|Alternation (formal language theory)|交替}}。SNOBOL4模式，是某一种类型的对象，并允许各种操纵，非常类似于后来的[[面向对象语言]]比如[[JavaScript]]中，那种叫做[[正则表达式]]的模式。此外，SNOBOL4在执行期间生成的字符串，可以被当作程序，而要么解释要么编译执行，如同其他语言中用[[eval]]函数那样执行。&lt;br /&gt;
&lt;br /&gt;
在1960年代后期和1970年代前期，SNOBOL4在美国大学中被广泛教授，并在1970年代和1980年代，在[[人文学科]]中作为文本操纵语言被广泛使用。&lt;br /&gt;
&lt;br /&gt;
在1980年代和1990年代，随着新的语言比如[[AWK]]和[[Perl]]，使得通过[[正则表达式]]方式的字符串操纵成为时尚，对SNOBOL4的使用逐渐衰竭了。SNOBOL4模式归类为[[巴科斯范式|BNF]]文法，它等价于[[上下文无关文法]]，从而比正则表达式更强力&amp;lt;ref&amp;gt;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 {{Wayback|url=http://doi.acm.org/10.1145/361952.361960 |date=20180602071942 }}&amp;lt;/ref&amp;gt;。不同于SNOBOL4模式，纯粹的正则表达式是不递归的，这带给了SNOBOL4模式，在计算上的明确优势&amp;lt;ref&amp;gt;{{cite web |url=http://www.drdobbs.com/architecture-and-design/programs-that-transform-their-own-source/228701469 |title=Dr. Dobb&amp;#039;s: Programs That Transform Their Own Source Code; or: the Snobol Foot Joke |publisher=Dobbscodetalk.com |date= |accessdate=2011-12-04 |archive-date=2013-05-12 |archive-url=https://web.archive.org/web/20130512150111/http://www.drdobbs.com/architecture-and-design/programs-that-transform-their-own-source/228701469 |dead-url=no }}&amp;lt;/ref&amp;gt;；当前版本的AWK和Perl的“正则表达式”，实际上是对[[正则语言]]意义上的正则表达式的扩展（递归表达式于2007年十二月发行的Perl 5.10中仍未出现&amp;lt;ref&amp;gt;{{cite web |author=Contact details |url=http://perldoc.perl.org/5.10.0/perlre.html#Extended-Patterns |title=perlre |publisher=perldoc.perl.org |date= |accessdate=2011-12-04 |archive-date=2016-03-15 |archive-url=https://web.archive.org/web/20160315045008/http://perldoc.perl.org/5.10.0/perlre.html#Extended-Patterns |dead-url=no }}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{cite web|url=http://www.rexegg.com/regex-recursion.html|title=Recursive Regex Tutorial|accessdate=2017-03-19|archive-date=2017-03-20|archive-url=https://web.archive.org/web/20170320052223/http://www.rexegg.com/regex-recursion.html|dead-url=no}}&amp;lt;/ref&amp;gt;）。&lt;br /&gt;
&lt;br /&gt;
SNOBOL的设计者之一Ralph Griswold，设计了SNOBOL4的后继者，叫做SL5和[[Icon (编程语言)|Icon]]，它们将SNOBOL4[[模式匹配]]的[[回溯法|回溯算法]]，与更标准的类[[ALGOL]]结构结合起来，同时增加了它们自己的一些特征。&lt;br /&gt;
&lt;br /&gt;
== 特征 ==&lt;br /&gt;
&lt;br /&gt;
SNOBOL4支持很多内置[[数据类型]]，比如[[整数]]、有限精度的[[实数]]、[[字符串]]、[[模式匹配|模式]]、[[数组]]，和首创的叫做表格（table）的[[关联数组]]，并允许编程者定义额外的数据类型和新[[子例程|函数]]。SNOBOL4的编程者定义数据类型的设施，在当时是先进的，它类似于更早的[[COBOL]]和更晚的[[Pascal (程式语言)|Pascal]]编程语言中的[[记录]]。&lt;br /&gt;
&lt;br /&gt;
所有的SNOBOL命令行语句，都是如下形式的：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=snobol&amp;gt;&lt;br /&gt;
label subject pattern = object :transfer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这五种元素每个都是可选项。“标号”（label）位于行首用来标识语句，没有标号的语句，开始于一个空白字符，特例的单一标号&amp;lt;code&amp;gt;END&amp;lt;/code&amp;gt;表示程序结束。有四种基本类型的运算操作（operation）：基础、赋值、模式匹配和模式匹配连带替换，所有运算操作，都有“主语”（subject）。基础操作运算，只有一个主语，构成主语的表达式被求值。赋值运算操作有“宾语”（object），等号右侧的值被赋予左侧的变量，如果对主语或宾语的求值失败，则不发生赋值。在模式匹配时，针对“模式”（pattern）对主语进行匹配；如果这时存在宾语，则经由替换规则，将其中任何匹配部份替换为宾语。“[[goto|转移]]”（transfer）可以是绝对分支，即&amp;lt;code&amp;gt;:(标号)&amp;lt;/code&amp;gt;；或依赖于前面运算操作的成功（success）或失败（failure）的条件分支，即&amp;lt;code&amp;gt;:S(标号1) F(标号2)&amp;lt;/code&amp;gt;。还可以转移到在运行期间程序自身所建立并编译的代码。&lt;br /&gt;
&lt;br /&gt;
SNOBOL模式，可以非常简单也可以非常复杂。一个简单模式，可以是已知的文本字符串，比如&amp;lt;code&amp;gt;&amp;quot;ABCD&amp;quot;&amp;lt;/code&amp;gt;，或对未知字符串的种类的指定，比如模式函数&amp;lt;code&amp;gt;LEN(1)&amp;lt;/code&amp;gt;；而一个复杂模式，可以是一个大型的结构描述，例如一个计算机语言的完整文法。有可能在SNOBOL中实现一个语言的解释器，几乎直接源自它的[[巴科斯范式|巴科斯-诺尔范式]]表达式，加上一些改变即可。&lt;br /&gt;
&lt;br /&gt;
SNOBOL采用了隐式的输入输出机制，分别用特殊标识符&amp;lt;code&amp;gt;INPUT&amp;lt;/code&amp;gt;指示[[标准输入]]，&amp;lt;code&amp;gt;OUTPUT&amp;lt;/code&amp;gt;指示[[标准输出]]。&lt;br /&gt;
&lt;br /&gt;
SNOBOL4模式匹配，使用了回溯算法，这类似于[[逻辑编程]]语言[[Prolog]]所用的算法，它通过{{le|明确子句文法|Definite clause grammar}}提供了类似模式的构造。这个算法使得利用SNOBOL作为逻辑编程语言，比大多数其他语言都要容易。&lt;br /&gt;
&lt;br /&gt;
SNOBOL在一个单一的有[[垃圾回收 (计算机科学)|垃圾回收]]的堆中，存储变量、字符串和数据结构。&lt;br /&gt;
&lt;br /&gt;
SNOBOL在格式和编程风格的鲜明性上，匹敌于[[APL语言|APL]]，不同于更“标准”的过程式语言如[[BASIC]]、[[Fortran]]或[[C语言|C]]语言，二者都是很激进的。&lt;br /&gt;
&lt;br /&gt;
== 例子程序 ==&lt;br /&gt;
&lt;br /&gt;
“[[Hello World|Hello, World!]]”[[Hello World程序样例|程序]]：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=snobol&amp;gt;&lt;br /&gt;
          OUTPUT = &amp;quot;Hello, World!&amp;quot;&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
向用户要求输入名字并把它填入输出句子中的简单程序：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=snobol&amp;gt;&lt;br /&gt;
          OUTPUT = &amp;quot;What is your name?&amp;quot;&lt;br /&gt;
          Username = INPUT&lt;br /&gt;
          OUTPUT = &amp;quot;Thank you, &amp;quot; Username&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
根据用户输入与二个模式的匹配情况在三种不同语气的输出中进行选择：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=snobol&amp;gt;&lt;br /&gt;
          OUTPUT = &amp;quot;What is your name?&amp;quot;&lt;br /&gt;
          Username = INPUT&lt;br /&gt;
          Username &amp;quot;J&amp;quot;                                             :S(LOVE)&lt;br /&gt;
          Username &amp;quot;K&amp;quot;                                             :S(HATE)&lt;br /&gt;
MEH       OUTPUT = &amp;quot;Hi, &amp;quot; Username                                 :(END)&lt;br /&gt;
LOVE      OUTPUT = &amp;quot;How nice to meet you, &amp;quot; Username               :(END)&lt;br /&gt;
HATE      OUTPUT = &amp;quot;Oh. It&amp;#039;s you, &amp;quot; Username&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
持续要求用户一次一个输入自己所有的名字，直到只按Enter键表示再无后续者为止，最后告知用户一共输入了几个名字：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=snobol&amp;gt;&lt;br /&gt;
          OUTPUT = &amp;quot;This program will ask you for personal names&amp;quot;&lt;br /&gt;
          OUTPUT = &amp;quot;until you press return without giving it one&amp;quot;&lt;br /&gt;
          NameCount = 0                                            :(GETINPUT)&lt;br /&gt;
AGAIN     NameCount = NameCount + 1&lt;br /&gt;
          OUTPUT = &amp;quot;Name &amp;quot; NameCount &amp;quot;: &amp;quot; PersonalName&lt;br /&gt;
GETINPUT  OUTPUT = &amp;quot;Please give me name &amp;quot; NameCount + 1 &lt;br /&gt;
          PersonalName = INPUT&lt;br /&gt;
          PersonalName LEN(1)                                      :S(AGAIN)&lt;br /&gt;
          OUTPUT = &amp;quot;Finished. &amp;quot; NameCount &amp;quot; names requested.&amp;quot;&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==当前实现==&lt;br /&gt;
目前有一些实现能够获得。Macro SNOBOL4 in C是Phil Budne写的自由开源实现，能够在几乎所有平台上运行&amp;lt;ref&amp;gt;{{Cite web |url=http://www.snobol4.org/ |title=存档副本 |accessdate=2020-04-23 |archive-date=2020-02-28 |archive-url=https://web.archive.org/web/20200228042624/http://www.snobol4.org/ |dead-url=yes }}&amp;lt;/ref&amp;gt;。 Catspaw公司提供了对很多计算机平台的SNOBOL4语言商业实现，现在有可以免费获得的版本。Viktors Berstis的Minnesota SNOBOL4是最接近IBM[[大型主机]]版本的PC实现，也是免费的&amp;lt;ref&amp;gt;{{Cite web |url=http://www.berstis.com/snobol4.htm |title=存档副本 |accessdate=2020-04-24 |archive-date=2020-02-24 |archive-url=https://web.archive.org/web/20200224040033/http://berstis.com/snobol4.htm |dead-url=no }}&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
尽管SNOBOL自身没有[[结构化编程]]特征，有叫做{{le|Snostorm}}的SNOBOL[[预处理器]]，由Fred G. Swartz于1970年代设计和实现，提供了IF、ELSEIF、ELSE、LOOP、CASE和PROCEDURE语句，并用于[[密歇根大学]]的{{le|密歇根终端系统|Michigan Terminal System}}（MTS）&amp;lt;ref name=MTSVolume9-June1979&amp;gt;[https://books.google.ca/books?id=WxVXAAAAMAAJ&amp;amp;pg=PA114&amp;amp;lpg=PA114&amp;amp;dq=snostorm+preprocessor&amp;amp;source=bl&amp;amp;ots=H5fdaCJj5n&amp;amp;sig=xvuW41x302-Je8xI1q8SbMSTM4Y&amp;amp;hl=en&amp;amp;sa=X&amp;amp;ei=E4f3U5jaOaLFigLOyYD4DQ&amp;amp;redir_esc=y#v=onepage&amp;amp;q=snostorm%20preprocessor&amp;amp;f=false &amp;quot;SNOSTORM&amp;quot;] {{Wayback|url=https://books.google.ca/books?id=WxVXAAAAMAAJ&amp;amp;pg=PA114&amp;amp;lpg=PA114&amp;amp;dq=snostorm+preprocessor&amp;amp;source=bl&amp;amp;ots=H5fdaCJj5n&amp;amp;sig=xvuW41x302-Je8xI1q8SbMSTM4Y&amp;amp;hl=en&amp;amp;sa=X&amp;amp;ei=E4f3U5jaOaLFigLOyYD4DQ&amp;amp;redir_esc=y#v=onepage&amp;amp;q=snostorm%20preprocessor&amp;amp;f=false |date=20170404221208 }}, &amp;#039;&amp;#039;MTS Volume 9: SNOBOL4 in MTS&amp;#039;&amp;#039;, Computing Center, University of Michigan, June 1979, pages 99-120. Retrieved 1 September 2014.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
{{le|Andrew Koenig}}的Snocone向SNOBOL4增加了块结构构造。Snocone是自包含的编程语言，而非SNOBOL4的真超集&amp;lt;ref&amp;gt;[http://www.snobol4.com/report.htm &amp;quot;The Snocone Programming Language&amp;quot;] {{Wayback|url=http://www.snobol4.com/report.htm |date=20200220033209 }}, Andrew Koenig, USENIX (Portland, Oregon), June 1985. Retrieved 2 September 2014. [ftp://ftp.snobol4.com/snocone/ software download link].&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
{{le|SPITBOL}}编译器实现也介入了一些特征，尽管不使用传统的结构化编程关键字，却可以用来提供很多通常被认作“结构化编程”的等价能力，最显著的是嵌套if/then/else类型的构造。这些特征已经被增加到最新近的SNOBOL4实现中。经过了很多年作为商业产品之后，在2009年四月，SPITBOL成为了在[[GNU通用公共许可证]]下发行的自由软件&amp;lt;ref&amp;gt;{{Cite web |url=http://github.com/spitbol |title=spitbol: Raw power and speed for non-numeric computation. |accessdate=2020-04-24 |archive-date=2019-02-05 |archive-url=https://web.archive.org/web/20190205110733/https://github.com/spitbol |dead-url=no }}&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
== 参见 ==&lt;br /&gt;
* [[同像性]]&lt;br /&gt;
* [[Icon (编程语言)]]&lt;br /&gt;
* [[Unicon (编程语言)]]&lt;br /&gt;
* {{le|Snowball (编程语言)|Snowball (programming language)}}&lt;br /&gt;
* {{le|Snostorm}}&lt;br /&gt;
* {{le|SPITBOL}}&lt;br /&gt;
&lt;br /&gt;
== 引用 ==&lt;br /&gt;
{{reflist|2}}&lt;br /&gt;
&lt;br /&gt;
==延伸阅读==&lt;br /&gt;
* Emmer, Mark B.  &amp;#039;&amp;#039;SNOBOL4+: The SNOBOL4 Language for the Personal Computer User&amp;#039;&amp;#039;.  Englewood Cliffs, NJ: Prentice Hall, 1985 ({{ISBN|0-13-815119-9}}).&lt;br /&gt;
* Gimpel, James F.  &amp;#039;&amp;#039;Algorithms in SNOBOL4&amp;#039;&amp;#039;.  New York: Wiley, 1976 ({{ISBN|0-471-30213-9}}); republished Salida, CO: Catspaw, 1986 ({{ISBN|0-939793-00-8}}).&lt;br /&gt;
* Griswold, Ralph E.  &amp;#039;&amp;#039;The Macro Implementation of SNOBOL4&amp;#039;&amp;#039;.  San Francisco, CA: W. H. Freeman and Company, 1972 ({{ISBN|0-7167-0447-1}}).&lt;br /&gt;
* Griswold, Ralph E., J. F. Poage, and I. P. Polonsky.  &amp;#039;&amp;#039;The SNOBOL4 Programming Language&amp;#039;&amp;#039;.  Englewood Cliffs, NJ: Prentice Hall, 1968 ({{ISBN|0-13-815373-6}}).&lt;br /&gt;
* Griswold, Ralph E.  &amp;#039;&amp;#039;String and List Processing in SNOBOL4: Techniques and Applications&amp;#039;&amp;#039;.  Englewood Cliffs, NJ: Prentice Hall, 1975 ({{ISBN|0-13-853010-6}}).&lt;br /&gt;
* {{le|Susan Hockey|Susan Hockey|Hockey, Susan M.}}  &amp;#039;&amp;#039;Snobol Programming for the Humanities&amp;#039;&amp;#039;.  New York: Clarendon Press; Oxford: Oxford University Press, 1985 ({{ISBN|0-19-824676-5}}).&lt;br /&gt;
&lt;br /&gt;
== 外部链接 ==&lt;br /&gt;
* [http://www.snobol4.org/ Phil Budne offers a free and open source BSD-licensed port of the original Bell Labs SNOBOL4 to UNIX and UNIX-like platforms]{{Wayback|url=http://www.snobol4.org/ |date=20200228042624 }}&lt;br /&gt;
* [http://www.snobol4.com/ Catspaw, Inc. offers implementations of and commercial support for SNOBOL4]{{Wayback|url=http://www.snobol4.com/ |date=20200531004151 }}&lt;br /&gt;
* {{dmoz|Computers/Programming/Languages/Snobol}}&lt;br /&gt;
* [http://purl.umn.edu/107340 Oral history interview with Ralph E. Griswold]—Griswold discusses development of SNOBOL {{le|Charles Babbage Institute}}, University of Minnesota, Minneapolis.&lt;br /&gt;
* [http://purl.umn.edu/40905 Charles Hall Collection on the SNOBOL Programming Language]. {{le|Charles Babbage Institute}}, University of Minnesota, Minneapolis.&lt;br /&gt;
* [https://www.vintagebigblue.org/Compilerator/SNOBOL4/mvsSnobol4Compile.php For a small brief taste of what SNOBOL4 is about try this online compiler]{{Dead link}}&lt;br /&gt;
* [https://tio.run/#snobol4 Try It Online (Snobol4/CSNOBOL)]{{Wayback|url=https://tio.run/#snobol4 |date=20200427095445 }} Online compiler&lt;br /&gt;
&lt;br /&gt;
{{程序设计语言}}&lt;br /&gt;
[[Category:程序设计语言]]&lt;br /&gt;
[[Category:模式匹配编程语言]]&lt;br /&gt;
[[Category:面向文本编程语言]]&lt;br /&gt;
[[Category:同像性编程语言]]&lt;/div&gt;</summary>
		<author><name>imported&gt;ExultantEditor</name></author>
	</entry>
</feed>