在我成长的过程中,似乎从 TRS-80 到 Commodore 再到 Apple 的每台“个人电脑”都允许你使用初学者通用符号指令代码(BASIC)编程语言编写自己的程序。我们家有一台 Apple II 的克隆机,叫做 Franklin ACE 1000,作为克隆机,它也运行 AppleSoft BASIC。我立刻喜欢上了 AppleSoft BASIC,并通过阅读书籍和杂志自学 BASIC 编程。
后来,我们家升级到了一台运行 DOS 的 IBM PC。就像之前的每台个人电脑一样,IBM PC 也运行着自己的 DOS 版本,叫做 BASICA。后来的 DOS 版本用一个叫做 GW-BASIC 的更新的解释器取代了 BASIC。
BASIC 是我进入计算机编程的入门语言。随着我长大,我学习了其他编程语言。我已经多年没有编写 BASIC 代码了,但我始终对 BASIC 和 GW-BASIC 怀有喜爱之情。
微软开源 GW-BASIC
2020 年 5 月,微软发布了 GW-BASIC 的源代码,让所有人(包括我)都感到惊讶。Rich Turner(微软)在微软开发者博客上的公告中写道:
自从去年在 GitHub 上重新开源 MS-DOS 1.25 和 2.0 以来,我们收到了许多也开源 Microsoft BASIC 的请求。好吧,我们来了!正如仓库的 readme 文件中明确指出的那样,这些源代码是 1983 年 2 月 10 日的 8088 汇编语言源代码,开源是为了历史参考和教育目的。这意味着我们不会接受任何修改源代码的 PR(Pull Requests)。
你可以在GW-BASIC GitHub上找到 GW-BASIC 源代码发布。是的,微软使用了MIT 许可证,这使其成为开源软件。
不幸的是,GW-BASIC 代码完全是用汇编语言编写的,无法用现代工具构建。但是开源开发者开始着手解决这个问题,并调整了代码以使用更新的 DOS 汇编器进行汇编。其中一个项目是TK Chia 的 GitHub 项目,旨在更新 GW-BASIC 以使用 JWASM 或其他汇编器进行汇编。你可以在 TK Chia 的项目上找到几个源代码和二进制版本。最新版本(2020 年 10 月)的注释提到,这是一个 2020 年重建的 GW-BASIC 的“预发布”二进制文件
,并且 缺少对串口 I/O 的支持。光笔输入、操纵杆输入和打印机(并行端口)输出需要更多测试。
但是,如果你在 GW-BASIC 中不需要这些额外的功能,你应该可以使用这个最新版本重新开始使用开源 GW-BASIC 进行 BASIC 编程。
FreeDOS 1.3 RC4 不包含 GW-BASIC,但安装它非常容易。只需从 TK Chia 2020 年 10 月的 GW-BASIC 版本下载 gwbas-20201025.zip
压缩文件,并在你的 FreeDOS 系统上解压(unzip)。二进制文件包使用 \DEVEL\GWBASIC
的默认路径。
开始使用 GW-BASIC
要启动 GW-BASIC,请从 DOS 命令行运行 GWBASIC.EXE
程序。请注意,DOS 是大小写不敏感的,因此你实际上不需要全部输入大写字母。此外,DOS 将自动运行任何 EXE
或 COM
或 BAT
程序,因此你也不需要提供扩展名。进入 \DEVEL\GWBASIC
并键入 GWBASIC
以运行 BASIC。

GW-BASIC 解释器
(Jim Hall, CC-BY SA 4.0)
GW-BASIC 是一种解释型编程语言。GW-BASIC 环境是一个“shell”,它在运行代码时解析你的 BASIC 程序中的每一行。这比 C 这样的编译型语言要慢一点,但使编码-调试周期更容易。你可以通过将其输入到解释器中来随时测试你的代码。
GW-BASIC 程序中的每一行都需要以行号开头。GW-BASIC 使用行号来确保它以正确的顺序执行你的程序语句。使用这些行号,你稍后可以通过给它一个介于其他行号之间的行号,在两个其他语句之间“插入”新的程序语句。因此,大多数 BASIC 程序员编写的行号都以十为单位递增,这样行号就像 10、20、30 等等。
让我们从一个简单的程序开始,打印出随机数字列表。FOR
语句创建一个数字范围的循环,而 RND(1)
打印一个介于 0 和 1 之间的随机值。

输入我们的第一个程序
(Jim Hall, CC-BY SA 4.0)
你看到屏幕底部那些高亮显示的单词了吗?这些是你可以使用键盘上的“F”键(或功能键)访问的键盘快捷键。例如,F1 将在 GW-BASIC 解释器中插入单词 LIST
。“左箭头”表示快捷方式将为你按下 Enter,因此 F2 将输入 RUN
命令并立即执行它。让我们运行程序几次,看看会发生什么。

两组随机数字列表是相同的
(Jim Hall, CC-BY SA 4.0)
有趣的是,每次我们运行 BASIC 程序时,随机数字列表都是相同的。这是因为 GW-BASIC 随机数生成器在每次你执行 BASIC 程序时都会重置。
为了每次都生成新的随机数,我们需要用一个值“播种”随机数生成器。一种方法是提示用户输入他们自己的种子,然后将该值与 RANDOMIZE
指令一起使用。我们可以使用行号 1 和 2 将这两个语句插入到程序的顶部。GW-BASIC 将自动在第 10 行之前添加这些语句。

更新程序
(Jim Hall, CC-BY SA 4.0)
由于随机数生成器使用新的种子,因此每次我们运行程序时都会得到不同的随机数字列表。

现在随机数字列表是不同的了
(Jim Hall, CC-BY SA 4.0)
GW-BASIC 中的“猜数字”游戏
每当我开始学习一种新的编程语言时,我都会专注于定义变量、编写语句和评估表达式。一旦我对这些概念有了大致的了解,我通常就可以自己弄清楚其余的内容。大多数编程语言都有一些相似之处,所以一旦你掌握了一种编程语言,学习下一种语言就变成了弄清楚独特的细节并识别差异的问题。
为了帮助我练习一种新的编程语言,我喜欢编写一些测试程序。我经常编写的一个示例程序是一个简单的“猜数字”游戏,其中计算机选择一个介于 1 到 100 之间的数字,并要求我猜它。程序循环直到我猜对为止。
让我们用 GW-BASIC 编写一个版本的“猜数字”游戏。首先,输入 NEW
指令,告诉 GW-BASIC 忘记之前的程序并开始一个新的程序。
我的“猜数字”程序首先提示用户输入一个随机数种子,然后生成一个介于 1 和 100 之间的随机数。RND(1)
函数实际上生成一个介于 0 和 1 之间的随机值(实际上是 0.9999…),所以我首先将 RND(1)
乘以 100 以获得一个介于 0 和 99.9999… 之间的值,然后将其转换为整数(删除小数点后的所有内容)。加 1 得到一个介于 1 和 100 之间的数字。
然后,程序进入一个简单的循环,在该循环中,它提示用户进行猜测。如果猜测太低或太高,程序会告知用户调整他们的猜测。只要用户的猜测不与之前选择的随机数相同,循环就会继续。

输入“猜数字”程序
(Jim Hall, CC-BY SA 4.0)
我们可以通过点击 F2 键来运行程序。使用 1234 的随机种子会生成一个全新的随机数。我猜了六次才猜出秘密数字是 49。

猜出秘密数字
(Jim Hall, CC-BY SA 4.0)
这就是你对 GW-BASIC 编程的初步介绍!感谢微软将这个伟大的历史作品作为开源软件发布,也感谢许多开源开发者汇编了 GW-BASIC,以便我们能够运行它。
在我离开之前还有一件事——退出 GW-BASIC 的方法并不明显。解释器有一个特殊的指令用于此——要退出,输入 SYSTEM
,GW-BASIC 将退出返回 DOS。

输入 SYSTEM 退出 GW-BASIC
(Jim Hall, CC-BY SA 4.0)
评论已关闭。