练习 37:小型 BASIC

原文:Exercise 37: Little BASIC

译者:飞龙

协议:CC BY-NC-SA 4.0

自豪地采用谷歌翻译

你现在要及时回到我的童年,并实现一个 BASIC 解释器。不,我这里的 BASIC 不是指“一个非常简单的基本的解释器”。我的意思是 BASIC 编程语言。它是最早的编程语言之一,最初由 John Kemeny 和 Thomas Kurtz 在 Dartmouth 创建。这个基本版本叫做 Dartmouth BASIC,在 Dartmouth BASIC 维基百科页面上,代码看起来像这样:

  1. 5 LET S = 0
  2. 10 MAT INPUT V
  3. 20 LET N = NUM
  4. 30 IF N = 0 THEN 99
  5. 40 FOR I = 1 TO N
  6. 45 LET S = S + V(I)
  7. 50 NEXT I
  8. 60 PRINT S/N
  9. 70 GO TO 5
  10. 99 END

左边的数字实际上是手动输入的行号。你告诉 BASIC 每行一个数字,然后你可以只是告诉它“跳到”那一行来循环。后来在其他版本的 BASIC 中成为了GOTO,成为计算时代的象征。

BASIC 的最新版本,在 BASIC 维基百科页面上记载,该页面记载了这个语言的漫长演化过程,朝着越来越现代的形式。过了一段时间,它吸收了 C 和 Algol 这样的结构,然后它面向对象,今天你可以找到相当先进的 BASIC 版本。如果你想要现代的免费 BASIC,请查看 Gambas BASIC,网址为 http://gambas.sourceforge.net/en/main.html

挑战练习

你的挑战是实现原始的 BASIC 解释器 - 具有手动行号和所有 CAPS(大写)文本样式的解释器。你需要查看 BASIC 维基百科页面,来获得可能的记号和示例代码,并阅读 Dartmouth BASIC 维基百科页面来了解更多线索。你的解释器应该能处理尽可能多的原始 BASIC 并产生有效的输出。

当你尝试这样做时,我建议你尝试简单的数学运算,打印和跟踪行号。之后,我会努力使GOTO正常工作。如果你完成它的话,你可以完成剩余部分,慢慢开发一套测试程序,来确保你的解释器工作顺利。

祝你好运!这可能花费你一段时间,但它应该很有趣。我可以看到自己花了几个月的时间在这上面,添加愚蠢的功能,像图形,所以我可以创建所有这些愚蠢的小程序,当我还是孩子的时候我编写了它们。我写了这么多 BASIC 代码,计算行号绝对扭曲了我的大脑。这可能是我这么喜欢 Vim 的原因。

研究性学习

这个练习很困难,但如果你想要一些额外的挑战,请执行以下操作:

  • 使用像 SLY 这样的解析器生成器,创建一个替代的解释器。一旦你有了 ABNF,这可能会变得更加容易,但是对于 BASIC 这样的语言可能更难。你必须这样做才能弄清楚。
  • 尝试制作一个“结构化 BASIC”的版本,它拥有函数,循环,if语句,以及你可以在较旧的非 OOP 语言(如 C 或 Pascal)中找到的所有内容。这是一个巨大的任务,所以建议你尝试不要手写 RDP 解析器。使用像 SLY 这样的工具生成你的解析器,并为更重要的东西节省你的脑力。