BASIC

BASIC（全稱 “Beginner's All-purpose Symbolic Instruction Code”，意即 “初學者通用符號指令程式碼”），是一種直譯式程式設計語言。設計給初學者使用的程式語言，在完成編寫後不須經由編譯及連結等手續，經過直譯器即可執行，但如果需要單獨執行時仍然需要將其建立成執行檔。

BASIC 的歷史

1964 年，兩位美國數學家兼計算機科學家約翰・克米尼和在 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。

1.1 早期的 BASIC 語言：在大型機和小型機時代

最原始的 BASIC 語言是在 1964 年由約翰・克米尼和設計，並且在他們的指導下由 Dartmouth 的學生實現的。當時設計 BASIC 語言的目的是讓學生能在 Dartmouth 的分時作業系統上寫程式。這種語言是為了解決以前語言的複雜的問題，而設計的一種新的語言。它特別針對了那些新的要用到分時系統，但是卻沒有以往學生那樣有很深厚的數學功底，又對學習這些數學知識不感興趣的那些學生。能夠使用一臺電腦來幫助教學和研究在那個時候是非常新穎的一件事情。在那段時間中，隨著其他形式的 BASIC 語言的出現，人們就把 Kemeny 和 Kurtz 的最原始的 BASIC 語言形式被人們稱為 Dartmouth BASIC。

BASIC 語言的 8 個設計原則是：

讓初學者容易使用。
成為通用程式語言。
允許為熟練者新增高階的功能（與此同時對初學者保持簡單）。
成為互動式語言。
提供清楚的和友好的錯誤資訊。
對小型的程式反應迅速。
不需要對硬體的瞭解。
將使用者和作業系統隔離。

這種語言一部分基於 FORTRAN II，一部分基於 ALGOL 60，並且在此之上增加了一些東西使之適和於分時功能。（另外擁有這種功能的分時系統有 JOSS 和 CORC，LISP 也在較小程度上的支援這種功能）在它之前，Dartmouth 研究開發了 DARSIMCO（1956）和 DOPE（1962，實現了 SAP 和 DART（1963）一個精簡版的 FORTRAN II）。最初，BASIC 語言致力於簡單的數學運算，在它最初的作為批處理語言的實現中就有對矩陣運算的支援，在 1965 年完整的字串處理功能被加入其中。BASIC 語言最初在支援多個終端的 GE-265 大型機上實現。在它最初被引入的那段時間中，它是一種編譯型語言，並且效率十分高，在 GE-265 大型機中的一些具有一定的計算上密集的（至少在當時是如此）的程式，比如用辛普森法則進行數值積分的計算效率上擊敗了 FORTRAN II 和 ALGOL 60。

BASIC 語言的設計者為了使這種語言廣為傳播，決定讓人免費獲得編譯器。他們同時也向漢諾威地區的高校提供了這種語言並且在促進 BASIC 語言方面花了很大的功夫。結果是有關於 BASIC 語言的知識傳播的非常廣泛，並且被很多的製造商實現，逐漸在一些較新的小型機像 DEC PDP 系列和 Data General Nova 中盛行起來。BASIC 語言同時也在 20 世紀 60 年代末 70 年代初成為了惠普分時 BASIC 系統的核心，另外也是 Pick 作業系統的核心。在以上這些例子中，BASIC 語言趨向於以直譯器的方式實現，而不是編譯器。

在它發行的若干年之後，一些非常有聲望的計算機專家，特別是艾茲赫爾・戴克斯特拉，表達了他們對於使用 GOTO 語句的看法。他們認為，存在於包括 BASIC 語言在內的很多語言中的 GOTO 語句，會使編寫程式變得很糟糕。有些人同時也嘲笑 BASIC 語言速度太慢（大多數語言的解釋型版本要比同樣的編譯型的要慢）或者 BASIC 語言太簡單了（許多版本，特別是為小電腦設計的版本，捨去了一些重要的功能以及效能）

1.2 迅速增長：家用電腦時期

儘管 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 也同樣將遊戲的程式作為書本導引部分的重點。

1.3 成熟的語言：個人電腦時期

早在 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 的方式所寫的範例。

2.1 行號型別（非結構化）

這是第一代的 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:", N

40 S$ = ""

50 FOR I = 1 TO N

60 S$ = S$ + "*"

70 NEXT I

80 PRINT S$

90 INPUT "Do you want more stars?", A$

100 IF LEN (A$) = 0 THEN GOTO 90

110 A$ = LEFT$(A$, 1)

120 IF A$ = "Y" OR A$ = "y" THEN GOTO 30

130 PRINT "Goodbye"; U$

140 END

2.2 無行號型別（結構化）

這是第二代的 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$

2.3 物件導向化

這是第三代的 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 Sub

End Class

指令

3.1 While 指令

3.2 Do 指令

3.3 For 指令

3.4 Goto 指令

Goto 是一種程式執行無條件跳躍的指令，在有行號的 BASIC 裡後面是接要跳躍目的的行號。在無行號的 BASIC 裡後面則是接要跳躍目的的標記名稱。

3.5 END 指令

用於終止一個 BASIC 程式的執行。

它的效果有些類似 C 語言裡的 exit 函式。所不同的是 END 不帶有任何的引數，僅僅是一條指令。需要注意的是，在 Visual Basic 中 end（雖然不區分大小寫但多習慣用小寫）指令用於強制退出整個程式，