在我成长的过程中,从TRS-80到Commodore再到苹果,似乎每一台 "个人电脑 "都可以让你用初学者通用符号指令代码[(BASIC](en.wikipedia.org/wiki/BASIC#… 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源代码的请求。好吧,我们来了!如同在Repo的readme中明确指出的,这些源码是1983年2月10日的8088汇编语言源码,被开源用于历史参考和教育目的。这意味着我们将不接受以任何方式修改源代码的PR(拉动请求)。
你可以在GW-BASIC的GitHub上找到GW-BASIC的源代码发布。是的,微软使用了MIT许可证,这使得这个开源软件。
不幸的是,GW-BASIC的代码完全是用汇编编写的,无法用现代工具构建。但是开放源码的开发者们开始着手解决这个问题,并调整了代码,使其能够与更新的DOS汇编器进行组装。其中一个项目是TKChia的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系统上解压(解压缩)。二进制归档文件使用的默认路径是\DEVEL\GWBASIC 。
开始使用GW-BASIC
要启动GW-BASIC,请在DOS命令行中运行GWBASIC.EXE 程序。请注意,DOS对大小写_不敏感,所以_你实际上不需要用所有大写字母输入。另外,DOS会自动运行任何EXE 或COM 或BAT 程序,所以你也不需要提供扩展名。进入\DEVEL\GWBASIC ,输入GWBASIC ,就可以运行BASIC。
GW-BASIC是一种_解释性的_编程语言。GW-BASIC环境是一个 "shell",它在_运行代码_时解析你的BASIC程序中的每一行_。_这比C语言等_编译语言_要慢一些,但可以使编码-调试周期更容易。你可以边走边测试你的代码,只要把它输入解释器就可以了。
GW-BASIC程序中的每一行都需要以行号开始。GW-BASIC使用这些行号来确保它以正确的顺序执行你的程序语句。有了这些行号,以后你就可以在其他两个语句之间 "插入 "新的程序语句,方法是给它一个行号,让它处于其他行号之间。由于这个原因,大多数BASIC程序员写的行号都是以十为单位,所以行号会像10、20、30这样。
让我们从一个简单的程序开始,打印出一个随机数字的列表。FOR 语句在一个数字范围内创建了一个循环,RND(1) ,打印出一个0到1之间的随机值。
你看到屏幕底部那些高亮的字吗?那些是键盘快捷键,你可以使用键盘上的 "F "键(或_功能键_)来访问。例如,F1将在GW-BASIC解释器中插入单词LIST 。左箭头 "表示该快捷键将为你点击回车键,因此F2将输入RUN命令并立即执行。让我们运行该程序几次,看看会发生什么。
有趣的是,每次我们运行BASIC程序时,随机数的列表都是一样的。这是因为每次执行BASIC程序时,GW-BASIC随机数发生器都会重置。
为了每次都能生成新的随机数,我们需要给随机数发生器 "播种 "一个值。一种方法是提示用户输入自己的种子,然后用RANDOMIZE 指令使用该值。我们可以使用第1行和第2行在程序的顶部插入这两条语句。GW-BASIC会自动将这些语句添加到第10行之前。
由于随机数发生器使用新的种子,我们每次运行程序时都会得到不同的随机数列表。
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之间的数字。
然后程序进入一个简单的循环,提示用户进行猜测。如果猜测太低或太高,程序会让用户知道调整他们的猜测。只要用户的猜测与之前挑选的随机数不_一样_,循环就会继续。
我们可以通过敲击F2键来运行该程序。使用1234的随机种子会产生一个全新的随机数。我猜了六次才知道秘密数字是49。
这就是你对GW-BASIC编程的第一次介绍!感谢微软将这段伟大的历史作为开源软件发布,同时也感谢众多的开源开发者,他们将GW-BASIC组装起来,使我们能够运行它。
在我走之前还有一件事-如何退出GW-BASIC并不明显。解释器对此有一个特殊的指令--退出,输入SYSTEM ,GW-BASIC将退出到DOS。