BASIC

BASIC的历史

1964年，两位美国数学家兼计算机科学家约翰·克米尼和Thomas E. Kurtz在FORTRAN语言的基础上创造了一种新的语言——BASIC，BASIC是一种适用于初学者的人机交互式语言。
Basic的名字——Beginner's All-purpose Symbolic Instruction Code（初学者通用的符号指令代码），原来被作者写做BASIC，只是后来被微软广泛的叫做Basic了。
BASIC语言本来是为校园的大学生们创造的高级语言，目的是使大学生容易使用计算机。尽管初期的BASIC仅有几十条语句，但由于BASIC在当时比较容易学习，它很快从校园走向社会，成为初学者学习计算机程序设计的首选语言。
随着计算机科学技术的迅速发展，特别是微型计算机的广泛使用，计算机厂商不断地在原由的BASIC基础上进行功能扩充，出现了多种BASIC版本，例如TRS-80 BASIC、Apple BASIC、GWBASIC、IBM BASICA（即BASICA）、True BASIC。此时BASIC已经由初期小型、简单的学习语言发展成为功能丰富的使用语言。它的许多功能已经能与其他优秀的计算机高级语言相媲美，而且有的功能（如绘图）甚至在当时超过其他语言。
在单片机上亦可以使用BASIC编程（一般是行号类型的BASIC），不过多数情况下要安装BASIC的ROM。

迅速增长：家用计算机时期

尽管BASIC语言在一些小型机上使用了，但是它真正进入大学是在1975年的MITS Altair 8800 "kit"微型机的引入。大多数的编程语言需要一个适用的文本编辑器，大量的内存和磁盘空间。但是当时的情况则是，那个时候的微型机没有本地的编辑器，仅有有限的内存以及一般将录音磁带做为磁盘储存数据。所有的这些问题，使得像BASIC那样以解释形式运行以及拥有内置的代码编辑器的语言能够在这些限制下运行。
BASIC语言同时还具有的优势就是它在那些对微型机感兴趣的年轻的设计师和计算机爱好者中相当出名，以及在那个时候的电子工业中BASIC语言被普遍的使用。另外Kemeny和Kurtz在早期在传播BASIC语言这一方面所花的努力也功不可没，在那个时候一些爱好者的杂志中几乎都被一段一段的提及BASIC语言的文章填满，或者差不多全部都在关注一个版本和其他版本的比较。
最先在像Altair那样8080机器中出现的BASIC语言之一是Tiny BASIC，一个简单的BASIC语言的的实现，最初由Li-Chen Wang博士编写，随后被Dennis Allison应Bob Albrecht（他随后创建了杂志Dr. Dobb's Journal）的要求移植到Altair中。Tiny BASIC的设计和全部的源代码都在1976年于DDJ杂志中被公布出来。
1975年，MITS发布了Altair BASIC，由Bill Gates和Paul Allen作为一个叫做Micro-Soft的公司开发，后来Micro-Soft则发展成今天的企业巨头——微软（Microsoft）。最初的Altair版本由Gates、Allen和Monte Davidoff共同编写。Microsoft BASIC（随后大多被人称作M BASIC或者MBASIC）的一些版本马上被捆绑到最初的基于软盘的CP/M计算机中，这种计算机在小的商业环境中被广为使用。随着在CP/M中的BASIC语言知名度的扩张，新的计算机设计中同样也引入了他们自己的BASIC语言的版本，或者干脆叫Micro-Soft把BASIC版本移植到他们的平台中。
当三种新的个人计算机在1977年问世的时候，也就是Byte Magazine后来称作"1977 Trinity"的那段时间，所有的这三种的计算机都用BASIC语言作为他们的编程语言和操作环境。Commodore Business Machines公司一次性的付费买下一个移植到他们PET计算机的6502芯片中Micro-Soft BASIC的一个无限授权版本，于此同时Apple II和TRS-80都引入了一个新的，与这种语言极大相似的语言。这种相似性是非常明显的因为它们最开始的50个记号（token）都是一样的。随着新的计算机进入到这个领域中来，其他的BASIC语言版本的加入，微妙的改变了BASIC语言的家族。Atari的8位机系列有他们自己的，专为烧入8kB的ROM芯片而修改过的Atari BASIC。BBC发布了BBC BASIC，由Acorn Computers为他们编写，加入了许多额外的结构体的关键字。大多数的二十世纪八十年代的家用计算机都有一个驻留在ROM中的BASIC解释器，以此能让计算机直接引导到BASIC环境。正因为这些原因，BASIC语言有着比其他任何语言都要多的方言（dialects）版本。
因为在这一个时期的BASIC的知名度的上升，一些杂志（就比如美国的Creative Computing Magazine）刊登了用BASIC语言写的游戏、工具和一些其他程序的完整的代码。BASIC具有的一个天生的优势，就是将杂志上公布的代码输入计算机然后运行是一件非常简单的事情。不同的杂志针对不同的计算机刊登BASIC程序，但是有些BASIC程序是可以在不同的计算机的不同的BASIC运行环境中运行（有些时候只需要一些小小的修改）。在那个时候，检查纠正经常会在杂志的代码中出现的印刷错误也是杂志本身的一个作业。
BASIC程序也同样在成熟的书本中被发布：最初的例子是David Ahl的BASIC Computer Games系列。后来的书，就比如Learn to Program BASIC也同样将游戏的程序作为书本导引部分的重点。

成熟的语言：个人计算机时期

早在1979年微软公司就开始和IBM协商给IBM的PC机提供一个烧在BIOS里面的IBM Cassette BASIC（BASIC C）。微软公司后来出售了一些在MS-DOS和PC-DOS上的BASIC语言版本，包括IBM Disk BASIC（BASIC D）、IBM BASICA（BASIC A）、GW-BASIC（一个不需要IBM机器ROM以及与BASICA兼容的版本）和QuickBASIC。发布了Turbo Pascal的Borland公司在1985年发布了Turbo BASIC 1.0（即后来的PowerBASIC）。微软公司同样还编写了一个基于窗口的AmigaBASIC，支持一个在当时非常先进的多任务图形界面的计算机Amiga computers的1.1版本（1985年末，1986年初）。
这些语言引入了许多对原始的家用计算机中BASIC的扩展，比如提供了更加好的字符串操作功能以及对图形的支持，另外还有对文件系统的访问以及一些额外的数据类型。其中更加重要的则是添加了结构化编程的功能，包括一些原始版本中不存在的流程控制语句和支持本地变量的子程序。新的图形功能同样为个人计算机中的电子游戏打下的基础，类似DONKEY.BAS的一些BASIC程序展示了个人计算机所具有的功能。
但是在二十世纪八十年代的后半段，新的计算机则是比起以往的计算机拥有更加强大的资源控制能力。于此同时，计算机渐渐的从一个业余爱好者感兴趣的东西过渡到一个人们日常使用的工具（主要用的是别人写的代码），所以编写程序对用户的重要性渐渐地减弱。当然BASIC的重要性也渐渐地减弱起来，尽管依然还有许多的BASIC语言版本。编译型BASIC语言和CBASIC仍然使用在许多的IBM 4960系统上。
随着微软公司Visual Basic的发布BASIC的语言的好运似乎又一次回归了过来。很难确切的说Visual Basic到底是不是BASIC语言，因为它较之前的版本有很大的改变——以基于对象以及事件驱动为的设计目标的语言。它唯一显著的与BASIC语言相关的地方就是相似的语法，但是语法本身也不能完全定义这种语言，因为大多数Visual Basic的开发都是使用“拖动－放置”的方法，开发者不需要为一些常用的对象比如按钮和滚动条去写所有的代码。这个可以看成是BASIC语言的一种进化，一些早期的Dartmouth BASIC的特有的功能被保留了下来，比如行号和INPUT关键字等（Visual Basic仍旧是使用INPUT语句来从文件读取数据；行号也同样允许用在所有的VB版本中，甚至是VB.NET，仅管它不能用在一些特定的地方，比如在SUB语句前面）。
有趣的是，BASIC语言最开始的时候是作为一种初学者的语言，微软最初依旧是将Visual Basic定位于向爱好者提供的一种语言，但是在VB 3.0（也是被认为第一个相对稳定的版本）发布之后不久就在小型商业程序的使用中迅速的传播开来。尽管有很多高级的程序员始终在嘲笑它，但是VB正是有效的匹配了小型商用程序的要求，即重点是简单的开发，而运行的速度则是次要的因素。在那个时候, Windows 3.1已经是足够的快了，很多商业有关的程序只要不是牵涉到大量的数据，几乎是可以在一眨眼之间完成的，即使使用的是一种非常慢的语言。许多公司的老板发现他们通过很少的一些步骤就可以创建出一个小型的但是有用的程序来满足他们特定的需求。最终，在VB3的冗长的生命周期中，对于Visual Basic知识的掌握成为了一种非常有用的职业技能.这种语言，就像它的前辈QBASIC一样，同时也成为了业余游戏开发者喜爱的语言之一。

BASIC语言的种类

以下是同样的运行结果，但用不同时期的BASIC的方式所写的示例。

行号类型（非结构化）

这是第一代的BASIC，例如早期BASICA、GW-BASIC……等，BASIC解释器。这类的BASIC程序的特征，就是每一行的代码前面都有一个数字作为“行号”。由于这种类型的BASIC程序的写法，很容易滥用GOTO的跳跃指令，以及代码没有办法使用到缩进去区分区段，因此很容易导致面条式代码。
10 INPUT "What is your name: ", U$20 PRINT "Hello "; U$30 INPUT "How many stars do you want: ", N40 S$ = ""50 FOR I = 1 TO N60 S$ = S$ + "*"70 NEXT I80 PRINT S$90 INPUT "Do you want more stars? ", A$100 IF LEN(A$) = 0 THEN GOTO 90110 A$ = LEFT$(A$, 1)120 IF A$ = "Y" OR A$ = "y" THEN GOTO 30130 PRINT "Goodbye "; U$140 END

无行号类型（结构化）

这是第二代的BASIC，例如QuickBASIC、PowerBASIC。这时期，同时有功能相近的解释器与编译器的版本出现。这类的BASIC程序的特征，是不使用行号，改使用标签作为跳跃点（仍有GOTO指令，但已可使用其他写法可完全避开使用GOTO），与使用函数或副程序的方式，以及可使用缩进，将程序结构化。
INPUT "What is your name: ", UserName$PRINT "Hello "; UserName$DO  INPUT "How many stars do you want: ", NumStars  Stars$ = STRING$(NumStars, "*")   PRINT Stars$  DO    INPUT "Do you want more stars? ", Answer$  LOOP UNTIL Answer$ <> ""  Answer$ = LEFT$(Answer$, 1)LOOP WHILE UCASE$(Answer$) = "Y"PRINT "Goodbye "; UserName$

面向对象化

这是第三代的BASIC，例如Visual Basic、REALbasic、StarOffice Basic。这类的BASIC程序的特征，是导入类别（Class）的应用，使用面向对象的继承与代码封装的写法。通常也使用“事件驱动”的写法，虽然下面这个Visual Basic .NET的示例并不是用到“事件驱动”。
 
Public Class StarsProgram
    Public Shared Sub Main()
        Dim UserName, Answer, stars As String, NumStars As Integer
        Console.Write("What is your name: ")
        UserName = Console.ReadLine()
        Console.WriteLine("Hello {0}", UserName)
        Do
            Console.Write("How many stars do you want: ")
            NumStars = CInt(Console.ReadLine())
            stars = New String("*", NumStars)
            Console.WriteLine(stars)
            Do
                Console.Write("Do you want more stars? ")
                Answer = Console.ReadLine()
            Loop Until Answer <> ""
            Answer = Answer.Substring(0, 1)
        Loop While Answer.ToUpper() = "Y"
        Console.WriteLine("Goodbye {0}", UserName)
    End SubEnd Class

Goto指令

Goto是一种程序运行无条件跳跃的指令，在有行号的BASIC里后面是接要跳跃目的的行号。在无行号的BASIC里后面则是接要跳跃目的的标记名称。

END指令

用于终止一个BASIC程序的运行。
它的效果有些类似C语言里的exit函数。所不同的是END不带有任何的参数，仅仅是一条指令。需要注意的是，在Visual Basic中end（虽然不区分大小写但多习惯用小写）指令用于强制退出整个程序，但并不能保证完整的释放程序所使用的资源。因此在退出之前最好先手动释放资源。