我学习了 Snobol,然后写了一个玩具 Forth
Home | About | Now | Repos | Cards | Contact | RSS
我学习了 Snobol,然后写了一个玩具 Forth
页面创建时间:2025-04-19
更新时间:2025-05-07
这个页面是关于我探索 Snobol 的一个迷你站点,包含以下页面的链接:
- 我对 Snobol 的思考
- 用 Snobol 编写的玩具 Forth 解释器
- 关于用 Snobol 编写玩具 Forth 解释器的想法
开始展示...
我终于学习了 SNOBOL!
Snobol 已经在我的编程语言愿望清单上很久了。
Snobol
以下是我对 Snobol4 语言本身的结论,它们都有各自的页面:
简而言之,我认为 Snobol 非常迷人。它对模式匹配的独特关注让我想起了 Awk。 只是 Awk 在模式处理上没做什么,它会退化成一个类似 C 的脚本来处理模式匹配的结果。 Snobol 没有使用任何这样的拐杖,而是使用模式匹配语句来进行所有逻辑和控制流。 它的纯粹性令人印象深刻。
毫不夸张地说:Snobol 程序中的 每一行 都包含五个部分:label, subject, pattern, replacement, goto。 所有这些部分都是可选的。
这当然使它成为现代开发人员眼中的一门“怪异的语言”,但是一旦你掌握了它,就很容易理解为什么 Snobol 曾经受到各种计算机用户的欢迎和好评。
经验丰富的开发人员很容易忘记,即使是简单的循环结构对于初学者来说也是一个概念上的飞跃。 我还记得我还是一个初学者的时候。 相比之下,我认为条件 GOTO 风格的控制流对于初学者来说很容易理解,因为你可以“看到”它。 你可以用手指追踪逻辑。
当然,语言的简单性有利于小型编程,但可能不利于大型编程。 Snobol4 基本上是 20 世纪 60 年代风格的“非结构化编程”,通常认为这种编程方式在大程序中会迅速崩溃。
这就是 Edsger Dijkstra 著名的“Go To Statement Considered Harmful”信件中的信息。 请参阅 David R. Tribble 的 Go To Statement Considered Harmful: A Retrospective (david.tribble.com)。
尽管如此,Snobol 证明了使用“这个奇怪的技巧”进行编程可能出奇地有效。
Snobol4th - 一个用 Snobol4 编写的 Forth
我了解到,很容易以为自己理解了一个概念,但当被迫付诸实践时才发现自己并没有真正理解。 因此,我需要用 Snobol 做一些小项目,以确保我没有自欺欺人。
要做什么呢?
“我知道了!” Dave 说。“这是一个让我保持对 Forth 语言概念新鲜感的机会。 我应该用 Snobol 实现一个玩具 Forth 解释器。”
但是我应该实现 多少 Forth 呢? 我没有盲目地随机选择语言特性,而是决定选择一个小型的 Forth 程序来执行。 目标是:一旦我的实现可以执行它,我就完成了。
我选择的程序是 99.forth ,这是 Arf Dysg 编写的 “99 Bottles of Beer”,发布在我最喜欢的编程相关网站之一上:
http://www.99-bottles-of-beer.net/language-forth-793.html
这是结果,一个用 Snobol 编写的 Forth,可以执行一个程序,该程序可以运行上述程序,该程序可以打印完整的 “99 Bottles of Beer” 歌曲的歌词:forth.sno。
这是结果: The Snobol4th Repo
生成的 Forth 实现不到 500 行 Snobol 代码。 repo 中的 README 更详细地解释了该程序,并且解释器的源代码具有相当的可读性 - 尽管它对于学习 Forth 的工作方式来说可能是一种奇怪的方式。
制作玩具来制作玩具
我真的很喜欢这种拥有一个小型目标程序的方法。 一个 Forth 解释器测试了我的 Snobol 知识。
Forth 不是我的创作,但这个奇怪的 Snobol4th 实现肯定是我的 - 无论是在其不寻常的执行方式方面,还是在我选择实现的语言子集方面。 因此,就某些 “我的” 价值而言,我将其称为我的玩具编程语言。
如果你要测试自己的小型玩具编程语言,我认为目标程序是值得考虑的。 这是我写的一张关于这个的“卡片”:
Have a target for your toy language
说到卡片,这是我深入研究 Snobol 之前写的第一张关于 Snobol 的卡片。 对于现代开发人员来说,开始使用 Snobol4 可能有点令人困惑。 这是另一张小“卡片”页面:
版本说明
这个项目是我深夜在床上完成的,当时家里其他人都在睡觉。
上面照片中的计算机是 MNT Pocket Reform。
我在本页顶部绘制的小老鼠和雪球使用了我最喜欢的 FOSS 绘图程序 Krita。
此页面上次生成于 2025-05-12 11:03:16 -0400 严格禁止使用本网站上的任何内容来训练大型语言模型 (LLMs)。 所有内容 © Copyright Dave Gaue