爲了[慶祝BASIC的50週年][2],Steve Wozniak【注0】寫了一些回憶錄,關於這門受歡迎語言的首次體驗,以及他如何從零作起爲蘋果I和蘋果II電腦創立本身的BASIC。一個難以置信的壯舉!
在1967年或1968年,我是高中的一名畢業班學生,咱們的電子學老師(我生活中不少教學名聲中最好的老師)安排我到桑尼維爾(西爾韋尼亞)的一家公司給電腦編程,由於我已經所有掌握了學校的電子學課程。McCollum先生每一年爲具有電子學能力的學生作這樣的事情,找到當地有工程師和項目的公司讓高中生去積累一些經驗。我在這臺IBM電腦上學習用FORTRAN編程。編程
我最初體驗BASIC是在高中的同一年。咱們學校尚未電腦,除了GE,我猜的,引進了帶有modem的終端來作他們的分時業務。咱們不多的數學好的學生被給幾頁的指令,咱們用BASIC寫一些很是簡單的程序。我以爲對於上手,這是一門很是簡單、易於學習的語言,不過那個終端僅僅在咱們學校放了幾天。咱們的數學班主任要求我寫一頁,說明爲何我認爲擁有這個終端對於學校是一件好事。個人確寫了一頁,關於邏輯思考和解決問題的,可是學校沒有跟進調查分時程序。segmentfault
在我大學幾年裏,個人高級編程語言屬於科學的類型,FORTRAN、PL-一、Algol。固然我也在大學以及本身獨立的時候用不少彙編語言作了大量的編程。app
在Homebrew電腦俱樂部,咱們被成堆的書包圍,我喜歡稱之爲‘聖經’。一本是Ted Nelson寫的《電腦革命/夢幻機器》,描述了以書面形式連接到下一步事物的意義的將來世界。他的想法就像科幻小說,可是咱們都知道它們是技術上可實現的,咱們都提倡這種看待將來電腦的方式。另外一本‘聖經’是一本書《BASIC的101個遊戲》。我是一個電腦遊戲粉絲,知道若是我有一臺屬於我本身的電腦,我會打算敲入全部這些遊戲並玩一遍。根據我本身感受的判斷,我猜想這將是發起一場家用電腦革命的關鍵所在。個人非商人特色阻止我去討論市場和財務。編程語言
我不確切知道一臺真正的電腦須要作的、電腦爲公司作的大量財務工做,電腦以高價賣給了公司。那些是值得花錢的電腦。我所知道的一切就近在咫尺。我模擬了HP的芯片設計和邏輯設計,以及工做在計算器上。個人電腦將不得不那樣作。個人電腦也要不得不玩遊戲。至少那時候我肯定個人電腦可能可以作那些價格昂貴電腦作的重要事情,只是那時候我不敢確定。學習
遊戲的關鍵是BASIC。比爾蓋茨那會兒在電子學愛好者的世界以外還不出名。咱們俱樂部的每一個人都知道他在爲Intel微處理器寫BASIC。我意識到,讓個人電腦變得優秀(受歡迎)的關鍵是包含一個高級語言,它必定是BASIC。使用FORTRAN編程的工程師們不會是發起一場家用電腦革命的力量。動畫
問題是我還不瞭解BASIC,只有來自於3天的高中經驗,它有行號。所以某天深夜我找到HP上的一本BASIC手冊,開始閱讀,並就該語言的命令作了筆記。須要一提的是,我生命中歷來上過一節編寫編譯器(或解釋器)的課程。可是個人朋友Allen Baum送給我了關於這個主題的、MIT課本的影音拷貝,所以我能夠聲稱我在MIT受過教育,哈哈。我在大學的第二年,我坐在數學分析課堂上,儘可能教本身如何開始寫一個FORTRAN編譯器,殊不知道編寫編譯器的技術。回到這個回憶裏,我開始爲個人6502微處理器寫以行讀取用戶敲入的、用於分析和錯誤檢查的字符的代碼。編碼
我瞭解語法圖(Syntax Chart),就爲這個BASIC創建了一份。我不知道HP BASIC與DEC BASIC是大相徑庭的,後者是《BASIC的101個遊戲》書中用到的,是比爾蓋茨編寫的。我認爲全部BASIC是相同的,可是HP的BASIC在遇到字符串時出現了極大的不一樣。我完成了個人語法圖(Syntax diagrams ),它們是完整的。可是我腦子裏想,若是我爲6502創立第一個BASIC的話,我將成爲一個明星,我可以在愛好者世界裏有一點兒名氣,就像比爾蓋茨同樣。爲了節約一些時間,我跳過了浮點數字(帶小數點的數字)只是爲了節約數週時間,這樣就更有機會成爲在6502上開發出BASIC的第一人。你或許往回看,且看到了我在Apple II的ROM裏包含了浮點運算程序,可是我歷來沒把它們放在BASIC裏。當你手動編碼(負擔不起分時帳目)時,在不得不位於固定位置的中間層結構作出修改是比較困難的。spa
我不知道編譯器。可是我知道棧,以及用棧把表達式轉化成RPN【注1】的東東。事實上,咱們的HP計算器使用RPN。在考慮如何寫這種語言時,我想到了我本身的技能、而不是書本中的東東。我用上了稱之爲名詞和動詞的棧(操做數和操做符)。我把標記放在個人語法圖裏,可是裏面的每一個操做符都有一個數字,對應到它在這個256字節或512字節表(我忘了)裏。第41個操做數的操做符代碼是#41。.net
我還有個針對每一個操做符兩種優先級的列表。一個是高於其它操做符的優先級。例如,+操做符將會引發*操做符首先發生。可是我須要第二張表,用於阻止處理像圓括號之類操做符的入棧操做。我不知道我是否在一個正確的棧上,可是它運行正常,作了我須要的事情。它沒必要從書中來。設計
我喜歡描述在Homebrew電腦俱樂部的這種BASIC。我歷來沒有看到個人名字被印出來,所以我沒有獲得‘比爾蓋茨’的名聲,可是我在俱樂部出名了。這甚至發生在Steve Jobs看到個人電腦出現以前。接下來的時間我只是不得不爲那些數字操做符編寫一個又一個的程序。每次俱樂部會議,我都多一些徹底工做的命令。
在個人蘋果II上,視頻內存和電腦內存,一樣的還有微處理器,每秒修改或許一百萬(誇大了)個數字,將改變爲每秒修改一百萬屏幕上的字節。Atari arcade遊戲那時候仍是硬件,可是如今遊戲可以作爲軟件實現了,使用6502機器語言編程。BASIC是一門解釋型語言。在執行過程當中,BASIC仔細查看每一個語句的單個字符,再決定作什麼。結果它可能比機器語言慢100或1000倍。可是有一天我產生了好奇,你是否可以只在BASIC裏寫個移動對象的程序,看看它們是否像真實動畫那樣移動。
我已經在硬件上爲Atari設計了遊戲《Breakout》【注2】。我想知道我是否可以用BASIC實現這個簡單的有動畫的街機遊戲?我知道我可以用機器語言編寫。既然這是我本身的BASIC,我找到語法圖,加入命令來標示顏色、畫水平和垂直的線條。隨後我搜索芯片手冊,選擇在一個芯片上有4個定時器(555種定時器)的芯片。我使用一些軟件來讀取平臺距離電位器的位置,根據你調節刻度位置來改變反彈的刻度。一旦我安裝了這些機制(爲新的BASIC附加東東燒了新的EPROMS),我坐下來寫了一些簡單的FOR循環,用不一樣的顏色標示磚塊。我必須在幾分鐘內嘗試30種顏色組合。而後我加了平臺、分數和球。我可以調節程序參數來改變球的速度和角度。順便地,我認爲是時候增長1位(bit)聲音的揚聲器了,由於當球撞擊到磚塊上時,你須要聽到聲音,等等。
我把Steve Jobs喊到個人公寓看看個人成果。我向他演示了更改像磚塊顏色之類的東西是多麼地容易和迅速。最重要的是,在半小時裏我嘗試了這個遊戲更多的變量,比我能在這個硬件過去10年裏作的還要多。Steve和我都意識到這是多麼地重要,由於動畫遊戲(街機模式)可以用軟件實現了。更重要的是,用BASIC意味着任何年齡段的任何人都可以編寫遊戲。
我按順序保存了大約50個關於個人全部BASIC設計工做的資料。每個都標記爲GAME BASIC。所以你可以看到個人領導是從哪裏來的。
原文地址:http://gizmodo.com/how-steve-wozniak-wrote-basic-for-the-original-apple-fr-1570573636
文章首發:《臘八粥》
注0:斯蒂芬·蓋瑞·沃茲尼亞克(Stephen Gary Wozniak),http://zh.wikipedia.org/wiki/斯蒂夫·沃茲尼亞克
注1:RPN,http://zh.wikipedia.org/wiki/逆波蘭表示法
注2:http://zh.wikipedia.org/wiki/Breakout_(遊戲)