斯蒂夫·沃茲尼亞克是如何為Apple從零開始開發BASIC的
英文原文:How Steve Wozniak Wrote BASIC for the Original Apple From Scratch
為了慶祝 BASIC 誕生五十周年,斯蒂夫·沃茲尼亞克寫下了一些文字,講述了他與這個廣受歡迎的開發語言的舊事,他是如何為 Apple I 和 Apple II 從零開始創造了他自己的 BASIC 語言。
1967 還是 1968 年高中快畢業的時候,我的電子學老師(此生所遇最好的一位老師)介紹我到位于森尼韋爾的喜萬年公司參與電腦編程工作,因為我在學校時已經掌握了全面的電子 學知識。McCollum 先生每年都會為掌握了扎實電子學知識的學生安排實習,將他們送入當地的公司。在這些公司的工程師和項目的幫助下,這些高中生可以獲得實習經驗。當時我在 IBM 電腦上學習和使用 FORTRAN 語言進行編程。
也就是在那一年我第一次接觸了 BASIC 語言。學校里那時并沒有電腦,但通用電氣公司有,我想他們是利用那個帶調制解調器的終端來提升他們的分時業務的。我們中幾個數學比較好的學生拿到了幾頁說 明,然后用 BASIC 語言寫出了很簡單的幾個程序。我覺得 BASIC 簡單易學易上手,但是當時那臺電腦只在我們學校放了幾天。數學老師還讓我寫一份報告來說明電腦對學校會有什么好處。報告里我從邏輯思考和解決問題這兩方面 進行了闡述,但是學校之后并沒有在分時程序中有進一步動作。
大學時我的編程語言主要是 FORTRAN,PL-1 和 Algol。當然,我在學校和家里也經常使用匯編語言來編程。
在 Homebrew 電腦俱樂部的時候,有幾本被我奉為“圣經”的書籍。一本是 Ted Nelson 的《Computer Lib/Dream Machine》,描述了未來世界里的超鏈接。他的想法像科幻小說,但我們都覺得那些想法在技術上是可行的。他如此看待未來的電腦運作,而我們就是他的信 徒。另一本“圣經”就是《101 Games in BASIC》。我是一個電腦游戲迷,曾想過以后要有電腦的話我會要把所有游戲都放入電腦玩一遍。感覺讓我相信,這將是開啟家用電腦革命的關鍵所在。我身體 中非商人的那一部分讓我遠離談論市場和財政。
電腦為公司處理財政工作,這些電腦售價昂貴,而一臺真正的電腦為此需要些什么,我并不是十分清楚。那些電腦物有所值。而我所清楚知道的只有眼前 的東西。在惠普工作的時候,我在計算器上從事仿真芯片設計和邏輯設計。我的電腦必須能做這些事。我的電腦還必須能夠玩游戲。至少我肯定一點,我的電腦應該 能做那些昂貴的電腦能做的事,但我還不是十分肯定。
游戲的關鍵所在就是 BASIC。那時比爾·蓋茨在電子學領域之外無人知曉。俱樂部里的人都知道他已經為英特爾的微處理器編寫了 BASIC。經過深思熟慮,我認為要讓我的電腦好用(受歡迎)的話,必須使用一款高級語言,而這款語言只能是 BASIC。開啟家用電腦革命的不會是使用 FORTRAN 的程序員。
學習 BASIC 并為之寫一個解釋器
我當時對 BASIC 幾乎一無所知,高中有過的三天接觸只讓我勉強記住了它的每行語句前面有行號。于是我挑了一本 BASIC 手冊開始熬夜研讀,在筆記本上記下了這種語言的各種命令。而之前我從未學習過如何編寫編譯器(或解釋器)。還好我在麻省理工的朋友 Allen Baum 給我寄了一些這方面的影印講義,因此我也可以聲稱我是畢業于麻省理工的,哈哈哈。大二的時候,我在數學分析課上努力自學如何編寫 FORTRAN 編譯器,雖然我根本不懂編寫編譯器的相關知識。那時起,我開始為我的 6502 微處理器編寫代碼,逐行讀取用戶輸入的命令,進行分析和錯誤檢查。
我懂語法圖知識,于是為這個 BASIC 創建了一份語法圖。那時我并不知道 HP BASIC 和 DEC BASIC 大相徑庭,后者正是《101 Games in BASIC》中使用的,也正是比爾·蓋茨編寫的那個 BASIC。我以為所有的 BASIC 都是一樣的,但是在處理字符串時,惠普的 BASIC 非常不一樣。然后我完成了語法圖,完整的語法圖。我隱約覺得如果我能為 6502 編寫第一個 BASIC 的話,我將會成為一顆明星,在業界會小有名氣,就像比爾·蓋茨那樣。為了節省一些時間,我將浮點運算從語法圖中剔除了。在為惠普工作時,我需要編寫基于整 形的模擬,而游戲正是基于邏輯的,也就是基于整形的。放棄浮點小數為我節省了幾個星期的時間,讓我更快地成為 6502 上開發出 BASIC 的第一人。你會看到在 Apple II 上我使用了浮點運算,但是在 BASIC 上我從沒有使用過。手動寫代碼的時候,要更改位于中間位置的固定地址上的東西是十分困難的。
Breakout on?Integer Basic?running on the original Apple II.
我不懂如何編寫編譯器并非偶然。但是我確實了解堆棧以及如何利用堆棧將表達式轉換成逆波蘭表達式。惠普的計算器正是使用的逆波蘭表達式。在思考 如何編寫 BASIC 時,我使用了自己腦中的技巧,而非來自書本的技巧。我使用了稱之為 NOUN 和 VERB 堆棧(操作數和運算符)的東西。在語法圖中我使用了標簽,但是在這個 256-byte 還是 512-byte(記不清了)的表中,每個運算符都有一個與其線性位置一致的編號。譬如第 41 個操作數具有 41 號運算符的代碼。
我還為所有具有兩個優先級的運算符列了一份清單。其中一個是位于其他運算符前面的傾向。例如,+運算符會讓*運算符先運算。但我還需要一張表來 處理類似帶括號的運算,防止類似的運算被誤操作。我不知道前進的道路是否正確,但運行結果正確,正是按我想的那樣運行的。這些技巧并不一定要從書上才能學 到。
在 Homebrew 電腦俱樂部里向大家展示我的 BASIC 讓我覺得很享受。從來沒在什么書上看到過印著我的名字,因此我的名氣也沒能和比爾·蓋茨比肩,但在俱樂部里我還是很有名的。這些都是在喬布斯看到我的電腦 研發出來之前發生的事。隨著時間流過,我要做的僅僅是逐個逐個地將每個編好號的運算符操作寫成代碼。每次俱樂部會議上我都會完成幾個命令。
在 Apple II 上我讓視頻和電腦內存合為一體,這樣本來每秒可以交換大概 100 萬(夸張了)個數字的微處理器就可以每秒交換大概 100 萬屏的字節了。Atari 街機游戲機是用硬件實現的,但現在利用 6502 機器語言編程游戲可以作為軟件實現了。BASIC 是一種解釋性語言。BASIC 一邊檢查每條語句的每個字母一邊執行,決定要做什么。因此,它要比機器語言慢上 100 或者 1000 倍。然后有一天我突然好奇,是否可以用 BASIC 編個程序,可以像動畫一樣移動物體。
我之前已經在硬件上實現了 Atari 游戲打磚塊。那我是否可以用 BASIC 來實現這個簡單的街機游戲呢?我知道可以用機器語言來實現這個游戲。因為這是我自己的 BASIC,于是我就到語法圖中加了一些命令,用來劃分顏色以及繪畫垂直線和水平線。然后我在芯片手冊里選了一個帶有四個計時器(555 風格的計時器)的芯片。利用軟件讀取電位器上擋球板的位置以及移動的幅度。我把這些東西安裝好以后(還要為 BASIC 燒錄新的 EPROMS),就坐下來寫了一些簡單的 for 循環語句把磚塊染成不同的顏色。幾分鐘里我大概試了 30 種顏色組合。然后我又加上了擋球板、得分和一個球。通過調整程序參數來改變球的速度和角度。另外,我想是時候增加一個1-bit 音頻設備的揚聲器,因為像球撞到磚塊這樣的事件發生時會需要一個音效。
我打電話讓喬布斯到我那里看看我的成果。我向他展示了我可以就像改變磚塊顏色一樣簡單迅速地做出其它修改。最重要的是,在一個半小時里,我嘗試 的改動要比硬件版本的游戲中花上 10 年可以做出的改動還要多。喬布斯和我都意識到很重要的一點,那就是現在動態游戲(街機風格的)可以用軟件來實現了。更重要的是,用 BASIC 實現的話意味著任何年紀的任何人都可以通過編程來實現它。
我在 BASIC 設計中所有的努力都記錄在了文件里,這些文件按年份排列在了 50 個文件夾里。每個文件夾的標簽都是“GAME BASIC”現在你們知道我的才智是如何來的了吧。
更新
附記:高中還是大一時,我跟爸爸說有天我要擁有一個 4K 版的 Data General NOVA. 他說這抵得上一座豪宅的首付款了。我被驚到了,告訴他說我會住在公寓里。
為什么是 4KB?
因為這是運行更高級語言所需要的最小要求。對我來說,電腦不僅僅只有開關和燈。它必須能夠運行程序。
在 Apple I 之前我就做了臺只有開關和燈的電腦。那時沒辦法負擔得起 4KB 的內存,所以只能 256 字節的。
在 Homebrew 俱樂部的那些日子里,也就是 1975 年的夏天,有 3 家公司引進了 4KB 的 DRAM 的電腦。那是 4KB 內存第一次真正地出現。為了讓 BASIC 成為電腦的一部分,我必須要有 4KB 內存。別無選擇。從而蘋果一代和蘋果二代的最小內存就是 4KB。假如我不在意 BASIC 的話,我也許就只是造了另外一種只有開關和燈的電腦,只有最小的靜態內存,但也就僅此而已了。
編者按:如果你想了解更多斯蒂夫·沃茲尼亞克的生活,可以看看他的傳記 《iWoz 沃茲傳:與蘋果一起瘋狂》。—JD