BASIC

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

## 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語言：在大型機和小型機時代

最原始的BASIC語言是在1964年由約翰·克米尼和Thomas E. Kurtz設計，並且在他們的指導下由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語言太簡單了（許多版本，特別是為小電腦設計的版本，捨去了一些重要的功能以及性能）

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

儘管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的跳躍指令，以及程式碼沒有辦法使用到縮排去區分區段，因此很容易導致麵條式代碼。

```QBasic
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
```

### 無行號類型（結構化）

這是第二代的BASIC，例如QuickBASIC、PowerBASIC。這時期，同時有功能相近的直譯器與編譯器的版本出現。這類的BASIC程式的特徵，是不使用行號，改使用標籤作為跳躍點（仍有GOTO指令，但已可使用其他寫法可完全避開使用GOTO），與使用函數或副程式的方式，以及可使用縮排，將程式結構化。

```QBasic
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的範例並不是用到事件驅動。

```vbnet
 
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
```

## 指令

### Goto指令

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

### END指令

用於終止一個BASIC程序的運行。

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

## 參考文獻

### 標準

- ANSI/ISO/IEC Standard for Minimal BASIC:
- ANSI X3.60-1978 "FOR MINIMAL BASIC"
- ISO/IEC 6373:1984 "DATA PROCESSING - PROGRAMMING LANGUAGES - MINIMAL BASIC"
- ANSI/ISO/IEC Standard for Full BASIC:
- ANSI X3.113-1987 "PROGRAMMING LANGUAGES FULL BASIC"
- INCITS/ISO/IEC 10279-1991 (R2005) "Information Technology - Programming Languages - Full BASIC"
- ANSI/ISO/IEC Addendum Defining Modules:
- ANSI X3.113 INTERPRETATIONS-1992 "BASIC TECHNICAL INFORMATION BULLETIN # 1 INTERPRETATIONS OF ANSI 03.113-1987"
- ISO/IEC 10279:1991/ Amd 1:1994 "MODULES AND SINGLE CHARACTER INPUT ENHANCEMENT"
- ECMA-116 BASIC (withdrawn, similar to ANSI X3.113-1987)

## 外部連結

- Computers/Programming/Languages/BASIC

## 基本資料

- screenshot caption：在Atari 8位機家族上的Atari BASIC（1979年）
- 編程范型：過程式，非結構化
- 發行時間：1964年
- 設計者：約翰·克米尼和 托馬斯·庫爾茨
- 類型系統：強類型