BASIC

編程語言

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

BASIC
Atari 8位元機家族英語Atari 8-bit family上的Atari BASIC英語Atari BASIC(1979年)
編程範型程序式非結構化
設計者約翰·克米尼托馬斯·庫爾茨英語Thomas E. Kurtz
釋出時間1964年
型態系統強型別
主要實作產品
Apple BASICBBC BASIC英語BBC BASICMicrosoft BASICTI-BASIC
啟發語言
ALGOL 60FORTRAN IIJOSS英語JOSS
影響語言
COMAL英語COMALVisual BasicVisual Basic .NETREALbasicREXXPerlGRASS

BASIC的歷史

1964年,兩位美國數學家兼電腦科學家約翰·克米尼Thomas E. Kurtz英語Thomas E. KurtzFORTRAN語言的基礎上創造了一種新的語言——BASIC,BASIC是一種適用於初學者的人機互動式語言

Basic的名字——Beginner's All-purpose Symbolic Instruction Code(初學者通用的符號指令代碼),原來被作者寫做BASIC,只是後來被微軟廣泛的叫做Basic了。

BASIC語言本來是為達特茅斯學院的大學生們創造的高階語言,目的是使大學生容易使用電腦。儘管初期的BASIC僅有幾十條陳述式,但由於BASIC在當時比較容易學習,它很快從校園走向社會,成為初學者學習電腦程式設計的首選語言。

隨着電腦科學技術的迅速發展,特別是微型電腦的廣泛使用,電腦廠商不斷地在原由的BASIC基礎上進行功能擴充,出現了多種BASIC版本,例如TRS-80 BASICApple BASICGWBASIC、IBM BASICA(即BASICA)、True BASIC。此時BASIC已經由初期小型、簡單的學習語言發展成為功能豐富的使用語言。它的許多功能已經能與其他優秀的電腦高階語言相媲美,而且有的功能(如繪圖)甚至在當時超過其他語言。

單片機上亦可以使用BASIC編程(一般是行號類型的BASIC),不過多數情況下要安裝BASIC的ROM。

早期的BASIC語言:在大型電腦和小型機時代

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

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

  1. 讓初學者容易使用。
  2. 成為通用程式語言
  3. 允許為熟練者添加進階的功能(與此同時對初學者保持簡單)。
  4. 成為互動式語言。
  5. 提供清楚的和友好的錯誤資訊。
  6. 對小型的程式反應迅速。
  7. 不需要對硬件的了解。
  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 AllisonBob Albrecht(他隨後建立了雜誌Dr. Dobb's Journal)的要求移植到Altair中。Tiny BASIC的設計和全部的原始碼都在1976年於DDJ雜誌中被公佈出來。

1975年,MITS發佈了Altair BASIC,由Bill GatesPaul 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 IITRS-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 AhlBASIC 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,例如早期BASICAGW-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

無行號類型(結構化)

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

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 BasicREALbasicStarOffice 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

指令

While指令

Do指令

For指令

Goto指令

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

END指令

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

它的效果有些類似C語言里的exit函數。所不同的是END不帶有任何的參數,僅僅是一條指令。需要注意的是,在Visual Basic中end(雖然不區分大小寫但多習慣用小寫)指令用於強制退出整個程式,但並不能保證完整的釋放程式所使用的資源。因此在退出之前最好先手動釋放資源。[來源請求]


參考文獻

參照

  1. ^ Isaacson, Walter. 创新者:一群技术狂人和鬼才程序员如何改变世界. 由關, 嘉偉; 牛, 小靖翻譯. 中信出版集團. : 343. ISBN 978-7-5086-7164-2. 
  2. ^ Differences Between GW-BASIC and QBasic. 2003-05-12 [2008-06-28]. (原始內容存檔於2013-10-19). 

標準

  • 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/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)

外部連結

參見