斯蒂夫•沃茲尼亞克是如何為Apple從零開始開發BASIC的

伯樂線上讀者發表於2014-05-20

為了慶祝BASIC誕生五十週年,斯蒂夫·沃茲尼亞克寫下了一些文字,講述了他與這個廣受歡迎的開發語言的舊事,他是如何為Apple I 和 Apple II 從零開始創造了他自己的BASIC語言。感謝 AvisBlume 的熱心翻譯。如果其他朋友也有不錯的原創或譯文,可以嘗試提交到伯樂線上


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

相關文章