1 发展历史

1.1 诞生背景(1960年代)

1.1.1 教育需求:让文科生也能写代码

1960年代初,计算机主要用于科学计算和商业数据处理,编程语言FORTRAN和COBOL虽然强大,但语法复杂、学习曲线陡峭。达特茅斯学院数学系主任约翰·凯梅尼在教学中发现,大量非理工科学生对编程望而生畏,认为那是“穿白大褂的人干的活”。他提出一个朴素的想法:设计一种语言,让一个从未接触过计算机的文科生,在听完一节课后就能写出可运行的程序。这种“编程民主化”的冲动,成了BASIC诞生的直接动力。

1.1.2 达特茅斯BASIC的诞生(1964年)

1964年5月1日凌晨,在达特茅斯学院的GE-225大型机上,凯梅尼和库尔茨运行了第一个BASIC程序。这个版本共14条语句,包括LET、PRINT、END等基础指令。语言名称全称“Beginner's All-purpose Symbolic Instruction Code”,直译就是“初学者的通用符号指令代码”,连首字母都透露出一种“我们就是为菜鸟设计的”自信。最初它运行在分时系统中,学生们通过电传打字机终端与主机交互,每行代码必须加行号(如10、20),以便编辑和跳转——这个后来被吐槽无数的行号特性,在当时只是分时系统的无奈产物。

1.2 早期演化(1970年代)

1.2.1 微型计算机的“强制配给”:Altair 8800上的BASIC

1975年,MITS公司推出了人类历史上第一台成功的个人计算机Altair 8800。这台机器没有键盘和显示器,只能通过前面板上的拨动开关和闪烁的LED灯进行二进制编程,效率极低。MITS急需一个高级语言解释器让产品变得可卖。此时,一个名叫比尔·盖茨的哈佛辍学生和他的朋友保罗·艾伦,主动联系MITS,声称自己已经为Altair写好了BASIC解释器——尽管他们当时甚至没有一台Altair机器。他们用模拟器完成了开发,并最终让Altair BASIC(4K内存版本)成功运行。这台解释器只有4KB,却包含了完整的BASIC核心功能,堪称奇迹。

1.2.2 比尔·盖茨的第一桶金:微软BASIC

Altair BASIC的成功直接催生了微软公司。此后推数年里,微软为几乎所有主流微处理器和计算机系统移植BASIC,包括8080、Z80、6502等。到1970年代末,微软BASIC几乎成了微型计算机的标准配置——任何一台个人电脑如果不带BASIC,简直不好意思上市。这为微软积累了第一桶金,也为BASIC的全球流行奠定了基础。

1.3 成熟与分支(1980-1990年代)

1.3.1 家庭电脑的BASIC浪潮:Apple II、Commodore PET、PC-BASIC

1980年代是个人电脑的黄金时代,也是BASIC的鼎盛期。Apple II在ROM中固化了一款微软提供的AppleSoft BASIC,用户开机即进入BASIC提示符,可以直接通过键盘输入代码。Commodore PET、Commodore 64、TRS-80等机型也都内置了各自版本的BASIC。IBM PC发布时,随机器附带了IBM BASICA(Advanced BASIC),后来微软推出了GW-BASIC,在MS-DOS系统中成为标配。这些变种大多基于微软的代码,但各自增加了图形、音乐、游戏控制等硬件相关指令。

1.3.2 结构化转型:QuickBASIC与QBasic

1980年代中期,随着结构化编程思想的普及,BASIC的GOTO无限制跳转、缺少局部变量等问题被批评为“编程恶习”。微软在1987年推出了QuickBASIC(QB),引入多行函数、子程序、DO...LOOP等结构化控制结构,并支持模块化开发。1991年,微软随MS-DOS 5.0免费附赠了QBasic——一个简化版QuickBASIC集成开发环境,没有编译器但内置编辑器与调试器,成为一代人(特别是中国学生)在DOS下的编程启蒙工具。

1.3.3 面向对象尝试:Visual Basic(1991年)

1991年,微软发布Visual Basic 1.0(VB)。它在BASIC语言基础上,引入了图形用户界面设计器,程序员可以通过拖拽控件的方式构建Windows窗口程序,再用BASIC代码编写事件处理逻辑。VB虽然保留了BASIC的部分语法(如DIM、IF...THEN),但加入了面向对象的类模块和ActiveX组件。VB成为1990年代Windows平台上最普及的开发工具之一,也是“可视化编程”概念的引领者。不过,许多老派BASIC爱好者认为,VB已经不再是他们记忆中的那个BASIC了——它更像是“披着BASIC皮的RAD工具”。

1.4 没落与遗产(2000年至今)

1.4.1 被C、Java等语言取代

进入21世纪,互联网和面向对象编程成为主流。BASIC缺乏完整的面向对象支持,在大型项目开发中显得力不从心。C、C++、Java、C#、Python等语言相继崛起,BASIC逐渐退出主流程式设计领域。微软于2008年宣布停止对Visual Basic 6.0的主流支持(但VB.NET仍在.NET生态中延续),GW-BASIC、QBasic等老版本被扔进了历史的回收站。不过,BASIC在嵌入式系统(如PIC微控制器)的BASIC Stamp中仍有一席之地。

1.4.2 作为“教学玩具”的复兴:Small Basic

2008年,微软推出了Microsoft Small Basic,一款专为儿童和初学者设计的现代BASIC教学语言。它的语法更简洁(抛弃了行号,引入类似C#的写法),集成开发环境提供了直观的“对象浏览器”和“图形窗口”。Small Basic保留了BASIC“易学、快速反馈”的理念,同时支持通过“扩展库”调用Windows API。它被用于学校的信息技术课程和编程夏令营,相当于“给BASIC换了一身新衣服”。

2 语言设计

2.1 语法特点

2.1.1 行号、LET与PRINT

传统BASIC(指行号版本)中,每一行程序以一个数字开头(通常以10为步进,方便插入新行)。执行时解释器按行号升序逐条运行。行号后紧跟语句关键词,如:

  • LET A = 5 —— 赋值(多数实现中可省略LET,直接写A=5
  • PRINT "HELLO" —— 输出字符串或变量值到显示屏(或电传打字机)
  • END —— 结束程序

程序员在20世纪70、80年代热衷于用极少的行号编写出看上去“短小精悍”的程序,比如用一行代码打印99瓶啤酒歌词,直到内存耗尽。

2.1.2 无条件跳转:GOTO与GOSUB的“意大利面条”

BASIC的早期版本缺乏结构化控制语句,程序员主要靠无条件跳转GOTOGOSUB组织代码逻辑。GOTO 行号会将执行流转移到指定行,而GOSUB 行号则像子程序调用,执行到RETURN后跳回调用处的下一行。这种模式很容易写出逻辑混乱、难以维护的“意大利面条式代码”(spaghetti code)。有经验的BASIC老手往往能在一堆GOTO中游刃有余,而初学者则经常陷入无限循环(比如著名的GOTO 10)。

2.2 数据类型与变量

2.2.1 整型、浮点型、字符串型(以及那个神秘的单字母变量名)

BASIC的变量名早期仅支持单个字母或一个字母加一个数字(如A、B、C1、X9),这给程序可读性带来了极大局限——你永远不知道变量Z是代表“最后的总值”还是“拉链的序号”。类型由变量名后缀的符号或上下文决定:A%表示整型,A!表示单精度浮点,A$表示字符串。不加后缀的变量默认浮点(在某些版本中)。AppleSoft BASIC甚至支持A#表示双精度,不过没人记得区分它们。

2.2.2 数组(DIM语句的艺术)

数组通过DIM语句声明,例如DIM A(10)创建一个下标0到10(共11个元素)的一维数组。早期BASIC的数组下标默认从0开始,但部分实现(如GW-BASIC)允许用OPTION BASE 1强制从1开始,体现了BASIC最平庸的折中主义。多维数组如DIM B(5,5)用于存储迷宫、游戏地图或矩阵运算。老程序员常戏称“DIM是烧内存最快的指令”,因为当时内存极其有限,一个50×50的二维数组就可能拖垮整台机器。

2.3 控制结构

2.3.1 IF...THEN...ELSE(早期版本连ELSE都没有)

最基本的条件语句是:

IF 条件 THEN 行号(或语句)

例如IF A=5 THEN 100。多数早期BASIC不允许在THEN后面写多条语句(需用冒号分隔);更尴尬的是,许多版本根本不支持ELSE。程序员只能用GOTO技巧模拟:

IF A=5 THEN 100
GOTO 200
100 PRINT "Five"
200 ...

直到QuickBASIC才引入了完整的IF...THEN...ELSE...END IF块结构。

2.3.2 FOR...NEXT循环(一个经典的嵌套陷阱)

FOR I = 1 TO 10 STEP 1 ... NEXT I是最常用的循环结构。嵌套循环后,必须确保NEXT变量匹配,否则会出现逻辑错误。经典的“嵌套陷阱”是指忘记写内层NEXT,或者把变量写错,导致循环无法终止,外部配套的系统风扇听起来都像在叹气。

2.4 输入输出

2.4.1 INPUT(等待用户输入,通常伴随着无限循环的提示符)

INPUT "请输入数字:", A 会暂停程序,等待用户在键盘输入一个值并按回车。如果用户输入了非数字内容(比如按错键敲了个字母),程序经常会崩溃或进入死循环——因为输入缓冲区被弄脏了,后续INPUT读取到的都是无效数据。因此许多BASIC程序在INPUT前加上ON ERROR GOTO或手动清空缓冲区的技巧。老教材上通常都会提醒:“请不要在INPUT时随便乱敲键盘。”

2.4.2 打印机与图形模式(比如AppleSoft BASIC的POKE与PLOT)

早期的BASIC通过LPRINT向打印机输出文本,而图形模式则依赖直接操纵内存地址。在AppleSoft BASIC中,HGR切换到高分辨率图形模式,HPLOT X,Y画一个点,HPLOT TO X2,Y2画线。更有甚者,POKE语句可以直接向内存地址写入字节,比如POKE -16368,0会清除键盘缓冲区,POKE 49236,0可能让你听到哔哔声。程序员们用POKE模拟了爆炸声、屏幕卷动,甚至烧坏了某些胆大者的显卡(虽然多数情况只是程序崩溃)。POKE是“硬件黑客的入门券”,也是“愚蠢错误的最快路径”。

3 典型应用与趣闻

3.1 教育领域的“敲门砖”

3.1.1 中学计算机课的必备神器

1980-1990年代,全球中学的计算机课几乎离不开BASIC。美国的Apple II实验室、英国的BBC Micro教室、中国的联想0520机房,学生都从10 PRINT "HELLO"开始。老师会布置“用BASIC编写一个计算器”或“让电脑猜你心里想的数字”的作业。由于BASIC的解释器直接运行在内存中,学生甚至可以用LIST命令作弊——只要邻座程序没保护,按个键就能抄到。

3.1.2 “用10行代码画一个螺旋”的挑战

在有限的内存和图形能力下,“用最短的代码画出漂亮的几何图形”成了一个经典挑战。例如在AppleSoft BASIC中,用HGR加几行HPLOT和旋转计算,就能画出一个不断延伸的螺旋线。那些10行内的螺旋代码在计算机爱好者的联谊会上如同武林秘籍一样被交换。

3.2 游戏与玩具

3.2.1 字符界面游戏(猜数字、迷宫、牛吃草)

由于早期家用电脑处理能力有限,大部分游戏以字符界面运行。经典例子包括:

  • 猜数字:用户输入数字,计算机提示“太高/太低”,最终猜中时打印“你赢了!”并放出蜂鸣声。
  • 迷宫生成与求解:用二维数组表示迷宫的“#”和“.”,然后用随机深度优先搜索算法生成,再用键盘方向键移动光标。
  • 牛吃草:一个模拟牧场经营的小游戏,计算机随机产生“牛”和“草”,用户通过输入指令让牛移动,吃到草得分,碰到边界则死亡。这些游戏通常不超过50行代码,却让很多人第一次意识到“游戏原来是这么做的”。

3.2.2 苹果机上的BASIC游戏集(《神偷卡门》等)

1984年,Broderbund公司发布了一款名为《Where in the World Is Carmen Sandiego?》(神偷卡门在哪?)的教育游戏,其早期版本使用Apple BASIC编写。玩家扮演侦探,在ASCII地图上追捕虚拟罪犯,同时学习地理知识。这款游戏被誉为“寓教于乐的典范”,而它的内核就是BASIC+数据文件。同样,众多《打砖块》《吃豆人》的BASIC克隆版本流传在BBS和盗版磁盘中,构成了早期电脑游戏的雏形。

3.3 梗文化与地狱笑话

3.3.1 经典死循环:10 PRINT "HELLO" + 20 GOTO 10

这是BASIC世界最著名的“程序”,没有之一。当你键入:

10 PRINT "HELLO"
20 GOTO 10
RUN

屏幕上将永无止境地滚动“HELLO”,直到按下Ctrl+C或强行关机。每个BASIC初学者都曾一边傻笑一边让这个程序跑满了整节计算机课。它既是BASIC的标志性笑话,也被后人用在了恶搞海报、T恤和表情包上,成为互联网早期meme之一。

3.3.2 行号强迫症:为什么你的程序总是从10开始?

行号步进间距取10(或5),是为了方便日后插入新行而不必重新编号。但很多初学者会从1开始编号,结果在写了GOTO 2后发现中间无法插入新语句。于是老手会教他们一个技巧:用RENUM命令自动重排。不过,有些版本的BASIC根本不支持RENUM,于是强迫症患者们发明了“行号洁癖”:坚持从10开始,每隔10一个号,最后一行可以是9990。这种习惯被代代相传,直到现代编程中已经毫无意义。

3.3.3 “你刚刚写了一个病毒”——用BASIC格式化硬盘的传说

在DOS时代,曾流传过一个坏笑编程题:“写一个程序,当用户输入某个错误答案时立刻格式化C盘。”例如:

INPUT "ARE YOU SURE?", A$
IF A$ = "NO" THEN 10
SHELL "FORMAT C: /U"

这当然需要预先开启SHELL命令权限。虽然真正的病毒不会这么直白,但不少学生好奇心过重,在自己电脑上试验了类似代码,结果硬盘数据灰飞烟灭。于是“BASIC入门→写格式化代码→重装系统”被戏称为“编程启蒙三部曲”。事实上,大多数早期BASIC的SHELL命令只在扩展版本(如QuickBASIC)中存在,GE BASIC等版本无法直接调用系统命令,所以这类“病毒”更多是都市传说——但足以让老师在机房装上了写保护软盘。

4 影响与对比

4.1 对后续语言的启示

4.1.1 从BASIC到Python:依然是“人人可写”的初心

Python的设计哲学之一是“可读性”和“易学性”,这直接承袭了BASIC的初衷。Guido van Rossum曾表示,他年轻时在CWI使用过BASIC(虽然并不很喜欢),但“让新手立刻能上手”这一理念被Python发扬光大——用简洁的缩进取代花括号,用printinput等直观函数。某种程度上,Python就是“没有行号、没有GOTO的BASIC”,甚至很多Python入门教材的第一课都写print("Hello"),与40年前的BASIC如出一辙。

4.1.2 从BASIC到Visual Basic:GUI的平民化

Visual Basic让没有深厚C/C++经验的开发者也能轻松创建Windows图形界面,这延续了BASIC“降低门槛”的使命。VB中的事件驱动模型(点击按钮触发Command1_Click)对应了BASIC中通过ON...GOSUB实现的简单事件处理。直到今天,C#中的button1.Click仍能看到VB的影子。可以说,VB是BASIC在面向对象时代的“超进化体”,虽然后来被社区戏称为“玩具语言”,但它在商业应用开发(特别是中小型企业数据库前端)中发挥了巨大作用。

4.2 与其他早期语言对比

4.2.1 FORTRAN(科学计算,但学起来像天书)

FORTRAN(公式翻译语言)诞生于1957年,专为数值计算优化,性能极高。它的语句如DO 10 I=1,10READ(5,100) X用到了大量的格式号、单元号,初学者面对这些“数字魔法”一头雾水。FORTRAN变量名默认以I~N开头为整型(称为隐式类型),其他字母为实型,这比BASIC的显式类型后缀更让新手崩溃。BASIC之所以在高校流行,很大程度上是因为“FORTRAN只属于大神,BASIC属于我们普通人类”。

4.2.2 COBOL(商业报表,但语法像议会法案)

COBOL(通用商业语言)以英语可读为卖点,但它的代码看起来更像法律条款:每行必须按分区格式写(Area A、Area B),变量名可以长达30个字符,描述日期要写PIC 9(8)。COBOL的程序大多像一本冗长的操作手册,而BASIC可以用几行代码完成相同功能。COBOL偏向大型机的批处理事务,BASIC则帮助个人用户快速完成任务——两者在哲学上截然不同。

4.2.3 Pascal(结构化强迫症,但不够亲民)

Pascal由Niklaus Wirth在1970年设计,强制使用BEGIN...ENDPROCEDURE、严格的变量声明,旨在教学上教授“良好编程习惯”。然而,其严格的类型系统和丰富的语法结构让初学者往往在编译错误中耗费大量时间。相比之下,BASIC允许不做变量声明就直接使用,省去了类型匹配的烦恼。Pascal更像一个“完美主义的考官”,而BASIC更像一个“随便玩的老朋友”。尽管Pascal后来催生了Delphi(支持可视化开发),但始终未能像BASIC那样成为大众的“第一门语言”。

5 现代复兴与变体

5.1 经典BASIC模拟器

5.1.1 网页版BASIC(例如jsbasic)

随着Web技术发展,许多开源项目用JavaScript实现了原始BASIC的解释器。例如jsbasic(http://www.8bitworkshop.com/)可以准确模拟AppleSoft BASIC、Commodore BASIC和BBC BASIC,在浏览器中运行经典程序。这些模拟器不仅供怀旧,也被用于复古编程教育——老师只需要一个浏览器就能让学生体验1970年代的编程环境,甚至用POKE命令去“干扰”虚拟内存。

5.1.2 复古爱好者社区(如RetroBASIC论坛)

互联网上有许多活跃的BASIC爱好者社区,例如RetroBASIC论坛、AtariAge的BASIC板块。这些社区的参与者用现代硬件(如Raspberry Pi、Arduino)运行修改版BASIC解释器,或者移植经典游戏到新平台。每年还有各种“Obscure BASIC Game Jam”活动,参赛者必须在BASIC的有限语法内创作新颖的游戏。他们热衷于讨论诸如“如何在GW-BASIC中实现三维伪旋转”一类的问题,外人看来像是考古与行为艺术的混合体。

5.2 继续存在的教学版本

5.2.1 Microsoft Small Basic(2010年后推出)

如1.4.2所述,Small Basic是微软官方推出的教学性BASIC变体,目前的版本为1.2。它的开发环境以一个“小而美”的窗口呈现,左侧是代码编辑区,右侧是即时显示图形或文本的输出区。语言去除了行号、指针等复杂概念,提供了丰富的“对象”(如TurtleClockNetwork)供学生调用。孩子们可以在10分钟内画出一只移动的乌龟,或者编写一个简单的聊天机器人。Small Basic的社区还提供“扩展库”下载,使得这门语言能控制LED灯、操作Excel文件,甚至连接物联网设备。

5.2.2 Just BASIC / Liberty BASIC(Windows下的轻量级选择)

Just BASIC(免费版)和Liberty BASIC(商业版)由Shoptalk Systems公司开发,主打在Windows平台上为初学者提供类似传统BASIC的体验。它们支持事件驱动编程(类似于Visual Basic,但更简单),拥有集成表单设计器和控件工具箱。许多非专业开发者用它快速编写小工具、教育软件和轻度游戏。虽然用户数远不如Python或C#,但在“怀旧+实用”的细分领域有一批忠实拥趸。

5.3 文化符号

5.3.1 在电影《黑客帝国》中出现的“汤勺弯曲”BASIC代码(笑)

在1999年的电影《黑客帝国》中,小男孩向尼奥展示“弯曲汤勺”的桥段,屏幕上出现了快速滚动的绿色代码——里面有部分是BASIC风格的行号、GOTO和PRINT语句(如10 PRINT "THERE IS NO SPOON")。虽然导演沃卓斯基姐妹用真实的代码采集合成,但这段“假装是矩阵的BASIC”被无数编程爱好者截图传播。有人甚至吐槽说:“原来矩阵是用BASIC写的!难怪它运行起来这么卡。”

5.3.2 Linux的BASH与BASIC的拼写巧合

Linux下的命令行默认Shell叫做Bash(Bourne Again SHell),它的缩写巧合地与BASIC的后三个字母相同(BASIC → BASIC,BASH → BASH)。一些新用户曾困惑地提问:“在终端里输入BASIC会不会自动进入BASIC编程?”实际上,Bash与BASIC(语言)毫无关系——Bash是命令解释器,BASIC是编程语言。但在某些怀旧发行版(如Damn Small Linux)中,确实可以安装BASIC解释器,使得在Bash里运行BASIC成为可能,为此网友戏称“这是历史的回旋镖(Bash + BASIC = Bashic)”。