穿越到 1983 年學習 BASIC

Two-bit History發表於2019-07-12

1983 年時我還沒出生,這讓我略有一些遺憾。但我特別遺憾的是,是我沒有經歷過 8 位計算機時代的到來,因為我認為那些初次接觸到還相對簡單和受限的計算機的人們,擁有超過如今的我們的巨大優勢。

今天,(幾乎)每個人知道如何使用計算機,但是即使是在計算機行業當中,也很少有人能明白任何一臺計算機內部的所有內容。現在軟體分為如此多的層次,做的是如此不同的事情,沒有哪個人能知道哪些是必不可少的。而在 1983 年,家用電腦足夠傻大粗,努力一些的人就能瞭解到一臺特定的計算機是如何工作的。那樣的一個人可能不會像今天的我覺得作業系統那麼神祕,因為如今的作業系統已經在硬體上疊加了太多的抽象層。我希望這些抽象層逐一引入以易於理解;而今天,新的程式設計師們不得不自上而下、按時間回溯地嘗試理解它們。

很多著名的程式設計師,尤其在計算機遊戲行業,孩童時期就在蘋果 II 和 Commodore 64 這樣的 8 位計算機上開始編寫遊戲,John Romero、Richard Garriott 和 Chris Roberts 都是這樣的例子。這好理解。在 8 位計算機時代,很多遊戲只能在計算機雜誌和書籍中以印刷的 BASIC 程式清單方式得到。如果你想玩其中一款遊戲,就必須手工鍵入整個程式。不可避免的,你可能遇到一些問題,所以你就得除錯你的程式。等到你讓它可以工作起來了,你就已經對程式是如何執行的有了足夠的瞭解,你就可以開始自己修改它了。如果你是一個狂熱的遊戲玩家,你幾乎必然會成為一名優秀的程式設計師。

在我的童年時期我也玩電腦遊戲。但是我玩的遊戲是在 CD-ROM 上的。我有時發現我自己必須得搜尋一下如何修復崩潰的安裝程式,這可能涉及編輯 Windows 登錄檔之類的東西。可能是這種小故障的排除讓我感覺很棒,所以我才考慮在大學裡學習電腦科學。但是在大學中從不教我一些計算機如何工作的或如何控制它們的關鍵性的東西。

當然,現在我可以告訴計算機去幹什麼。儘管如此,我還是不禁感到,我缺少一些根本的見解 —— 只有那些伴隨著更簡單的計算機程式設計而成長的人才有的深刻見解。我不禁在想,如果在上世紀 80 年代初就接觸到計算機會是什麼樣子?它們與今天使用計算機的體驗相比有何不同?

這篇文章將與通常的 Two-Bit History 的文章有一點不同,因為我將為這些問題嘗試設想一個答案。

1983

就在上週,你在電視上看到了 Commodore 64 的廣告 ,現在 M*A*S*H 播完了(LCTT 譯註: 這是一部上世紀 70 年代初的電視劇),星期一晚上你可以找點新的事情做了。這個 Commodore 64 甚至看起來比魯迪(LCTT 譯註:應該是下文中擁有 Apple II 的人)的家人放在他們家地下室的 Apple II 更好。而且,廣告中吹噓說新的計算機會讓你的朋友們“擠破”你家的大門。你知道學校裡的幾個傢伙寧願在你家閒逛,也不願去魯迪家裡,只要他們能玩 Zork 就行。

所以,你得說服你的父母去買一臺。你的母親說,這事可以考慮,只要你不去遊戲廳玩街機就給你買一臺家庭電腦。雖然不太情願,但是你還是同意了。而你的父親則想,他可以用 MultiPlan (LCTT 譯註:電子表格程式)跟蹤家庭的資金狀況,MultiPlan 是他曾聽說過的一個電子表格程式,這就是為什麼這臺計算機被放在客廳的原因。然而,一年後,你仍然是唯一使用它的人。最終,他們同意你把它搬到了你的臥室的桌子上,正好位於你的警察海報下方。

(你的姐姐對這個決定表示抗議,但是,在 1983 年電腦這種東西並不適合女孩。)

你的父親在下班路上從 ComputerLand 那裡把它捎了回來。你倆把盒子放置在電視機的旁邊,並開啟了它。外包裝上說“歡迎來到友好的計算機世界”。而二十分鐘以後你就不再信這句話了 —— 你倆仍然在嘗試把 Commodore 連線到電視機上,並在想電視機的天線電纜到底是 75 歐姆還是 300 歐姆的同軸電纜。但是,最終你把電視機調到了頻道 3,看到了一個顆粒狀的、紫色的影象。

Commodore 64 啟動螢幕

計算機顯示了一個 READY。你的爸爸把計算機推向了你,這意思是你是第一個嘗試它的人。你小心翼翼地敲擊每個字母,鍵入了 HELLO。然而計算機的迴應是令人困惑的。

Commodore 64 語法錯誤

你嘗試輸入了一些稍有不同的單詞,然而回應總是一樣的。你父親說,你最好仔細讀一下手冊的其它部分。這絕非易事,隨 Commodore 64 一起提供的手冊 是一本小一些的書。但是這不會困住你,因為手冊的介紹預示著奇蹟。

它聲稱,Commodore 64 有“微型計算機行業中最先進的圖畫製作器”,能允許“你設計擁有四種不同顏色的圖畫,就像你在街機視訊遊戲裡看到的一樣”。Commodore 64 也有“內建的音樂和聲音效果,可以與很多著名的音樂合成器相媲美”。所有的這些工具都置身於你的手邊,手冊會引導你完成所有這些:

與所有提供的硬體一樣重要的是,這本使用者指南將提高你對計算機的理解。它無法在這裡告訴你有關計算機的所有資訊,但是它會向你推薦各種出版物,以獲取有關所提出主題的更多詳細資訊。Commodore 希望你真正喜歡你的新 COMMODORE 64。要想真正得到樂趣,請記住:程式設計不是一種一天就能學會的東西。通讀這個使用者指南你要有耐心。

那一夜,你在床上通讀了整整前三個章節:“安裝”、“入門”和“BASIC 程式設計入門”,在你最終睡著時,手冊還開啟著放在了胸前。

Commodore BASIC

現在是星期六早上,你渴望嘗試你所學到的新東西。手冊裡教給你的第一件事是如何更改在顯示器上的顏色。你按照操作說明,按下 CTRL-9 來進入反色輸入模式,然後按住空格鍵來建立了一個長長的空行。你可以使用 CTRL-1CTRL-8 在不同的顏色之間交換,這讓你的電視機螢幕煥發出了新的力量。

Commodore 64 顏色帶

儘管這很酷,但你覺得這不能算是程式設計。要對計算機程式設計,你昨晚已經學會了如何做,你必須以一種稱為 BASIC 的語言與計算機交談。對你來說,BASIC 看起來就像星球大戰中的東西一樣科幻,但是,到 1983 年時,其實 BASIC 已經快有二十歲了。它是由兩位達特茅斯教授 John Kemeny 和 Tom Kurtz 發明的,他們想讓社會科學和人文科學中的本科生也可以使用計算機。它被廣泛使用在微型計算機上,在大學的數學課上很受歡迎。在比爾蓋茲和保羅艾倫為 Altair 編寫了微軟 BASIC 直譯器後,它就成為了微型計算機上的標準。但是這本手冊對此沒有任何解釋,那麼多年你都沒學過它。

手冊中建議你嘗試的第一個 BASIC 命令是 PRINT 命令。你輸入了 PRINT "COMMODORE 64",很慢,因為你需要花費一點時間才能在按鍵 2 上面找到引號符號。你單擊 RETURN,這一次,計算機沒有抱怨,完全是按照你告訴它做的,在下一行中顯示了 “COMMODORE 64” 。

現在你嘗試對各種不同的東西使用 PRINT 命令:兩個數字加在一起,兩個數字乘在一起,甚至幾個十進位制數字。你不再輸入 PRINT ,而是使用 ? 代替,因為手冊中告訴你 ?PRINT 的一個縮寫,通常專業程式設計師都這麼使用。你感覺自己已經像是一個專家了,不過你想起你還沒有進行到第三章“BASIC 程式設計入門”。

你很快就開始了。該章節提示你編寫你的第一個真正的 BASIC 程式。你輸入 NEW 並單擊 RETURN,它給了你一個乾淨的黑板slate。然後你在其中輸入你的程式:

10 ?"COMMODORE 64"
20 GOTO 10

手冊裡解釋說 10 和 20 是行號。它們為計算機排序了語句。它們也允許程式設計師在某些命令中引用程式的其它行,正像你在這裡使用的 GOTO 命令一樣,它將程式指回到行 10。“這是一個很好的程式設計習慣”,手冊認為,“以 10 的增量來編號行,可以防止你以後需要插入一些語句”。

你輸入 RUN,並凝視充滿了 “COMMODORE 64” 的螢幕,它一遍又一遍的重複。

Commodore 64 顯示反覆列印 "Commodore 64" 的結果

你不確定這不會引爆你的計算機,過了一秒鐘你才想起來應該單擊 RUN/STOP 按鍵來打斷迴圈。

手冊接下來的一些部分向你介紹了變數,它告訴你變數像“在計算機中許多的盒子,它們每個可以容納一個數字或一個文字字串”。以一個 % 符號結尾的變數是一個整數,與此同時,以一個 $ 符號結尾的變數是一個字串。其餘的所有變數是一些稱為“浮點”變數的東西。手冊警告你要小心變數名稱,因為計算機僅會識別變數名稱的前兩個字母,儘管它不限制你想建立的名稱有多長。(這並沒有特別讓你困擾,但是要是在 30 年後來看,這可能會讓人們感到太瘋狂了)

你接著學習 IF... THEN...FOR... NEXT... 結構體。有了這些新的工具,你感覺有能力來解決接下來手冊丟給你的重大挑戰。“如果你是個有野心的人”,沒錯,“輸入下面的程式,並檢視會發生什麼。”該程式比你目前為止看到的程式更長、更復雜,但是,你很想知道它做了什麼:

10  REM BOUNCING BALL
20  PRINT "{CLR/HOME}"
25  FOR X = 1 TO 10 : PRINT "{CRSR/DOWN}" : NEXT
30  FOR BL = 1 TO 40
40  PRINT " ●{CRSR LEFT}";:REM (● is a Shift-Q)
50  FOR TM = 1 TO 5
60  NEXT TM
70  NEXT BL
75  REM MOVE BALL RIGHT TO LEFT
80  FOR BL = 40 TO 1 STEP -1
90  PRINT " {CRSR LEFT}{CRSR LEFT}●{CRSR LEFT}";
100 FOR TM = 1 TO 5
110 NEXT TM
120 NEXT BL
130 GOTO 20

上面的程式充分利用了 Commodore 64 最酷的功能之一。當把不可列印的命令字元作為字串的一部分傳遞到 PRINT 命令時,它們會執行其操作,而不是被列印到螢幕上。這允許你重新擺放你程式中列印的字串。(LCTT 譯註:上述程式中如 {CRSR LEFT} 之類的控制字元執行類似 “在行中向左移動一個位置” 的操作,因此上述程式中利用這些字元操作了一個圓點字元四處移動,如下圖。)

輸入上面的程式你花費了很長時間。你犯一些錯誤,並不得不重新輸入一些行。但是,你最終能夠按下 RUN,並看到了一幅傑作:

Commodore 64 反彈球

你覺得這恐怕是你見過的最酷的事了。不過你幾乎轉頭就忘記了它,因為馬上你就學到了 BASIC 的內建函式,像 RND(它返回一個隨機數字)和 CHR$(它返回與一個給定數字程式碼匹配的字元),這個手冊向你展示一個程式,這個程式有名到什麼程度呢?直到許多年後,它仍然被當成了一個短文選集的標題:

10 PRINT "{CLR/HOME}"
20 PRINT CHR$(205.5 + RND(1));
40 GOTO 20

當執行時,上面的程式會生成一個隨機的迷宮:

Commodore 64 迷宮程式

這絕對是你曾經見過最酷的事。

PEEK 和 POKE

現在你已經看過了 Commodore 64 手冊的前四章節,包含那篇 “高階的 BASIC” 的章節,所以你感到十分自豪。在這個星期六早上,你學習到了很多東西。但是這個下午(在趕快吃了點午飯後),你將繼續學習一些使這個放在你的客廳中的奇妙機器變得不再神祕的東西。

手冊中的下一個章節標題是“高階顏色和影象命令”。它從回顧你今天早上首先鍵入的彩色條開始,並向你展示瞭如何在一個程式中做同樣的事。然後它教給了你如何更改螢幕的背景顏色。

為此,你需要使用 BASIC 的 PEEKPOKE 命令。這些命令分別允許你檢查和寫入一個儲存器地址。Commodore 64 有一個主背景顏色和一個邊框背景顏色。每個都通過一個特定的記憶體地址控制。你可以把你喜歡的任何顏色值寫入到這些地址,以使用這些背景顏色和邊框顏色。

手冊中解釋:

正像變數可以被認為機器中你放置資訊的“盒子”一樣,你也可以認為在計算機中代表特定記憶體位置的是一些特殊定義的“盒子”。

Commodore 64 會檢視這些記憶體位置來了解螢幕的背景和邊框應該是什麼樣的顏色,什麼樣的字元應該被顯示在螢幕上,以及顯示在哪裡,等等其它任務。

你編寫了一個程式來遍歷所有可用的背景和邊界的顏色的組合:

10 FOR BA = 0 TO 15
20 FOR BO = 0 TO 15
30 POKE 53280, BA
40 POKE 53281, BO
50 FOR X = 1 TO 500 : NEXT X
60 NEXT BO : NEXT BA

雖然 POKE 命令以及它的大運算元一開始時看起來很嚇人,現在你看到那個數字的實際值其實不是很要緊。顯然,你必須得到正確的數字,但是所有的數字代表的是一個“盒子”,Commodore 只是正好儲存在地址 53280 處而已。這個盒子有一個特殊的用途:Commodore 使用它來確定螢幕背景應該是什麼顏色。

Commodore 64 更改背景顏色

你認為這簡直棒極了。只需要寫入到記憶體中一個專用的盒子,你可以控制一臺計算機的基礎屬性。你不確定 Commodore 64 的電路系統如何讀取你寫入在記憶體中的值並更改螢幕的顏色的,但是,你不知道這些也沒事。至少你知道結果是怎麼樣的。

特殊容器

在那個週六,你沒有讀完整本手冊,因為你現在有點精疲力盡了。但是你最終會全部讀完它。在這個過程中,你學到更多的 Commodore 64 專用的盒子。有一些盒子你可以寫入來控制在螢幕上顯示什麼——這也是一個盒子,事實上,是控制每一個位置出現的字元。在第六章節 “精靈圖形” 中,你學到可以讓你定義可以移動和甚至縮放影象的特殊盒子。在第七章節 “創造聲音” 中,你學到能寫入以便使你的 Commodore 64 歌唱 “Michael Row the Boat Ashore” 的盒子。Commodore 64,事實證明,它和你可能以後學習到的一個稱為 API 的關係甚少。控制 Commodore 64 大多涉及寫入到電路系統賦予特殊意義的記憶體地址。

多年來,你花費在這些特殊盒子的時光一直伴隨著你。甚至幾十年後,當你在一個擁有大量的圖形或聲音 API 的機器上程式設計時,你知道,隱藏於其背後的,這些 API 最終是寫入到這些盒子之類的東西里面的。你有時會好奇那些只使用過 API 的年輕程式設計師,他們肯定是覺得 API 為他們做到的這一切。可能他們認為這些 API 呼叫了一些其它隱藏的 API。但是,那些隱藏的 API 呼叫了什麼?你不由得同情這些年輕的程式設計師們,因為他們一定會非常迷惑。

如果你喜歡這篇文章,也喜歡它每兩週釋出的一篇新文章的話,那麼請在 Twitter 上關注 @TwoBitHistory 或訂閱 RSS 源來確保你知道新的文章釋出出來。


via:https://twobithistory.org/2018/09/02/learning-basic.html

作者:Two-Bit History 選題:lujun9972 譯者:robsean 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出

穿越到 1983 年學習 BASIC

訂閱“Linux 中國”官方小程式來檢視

相關文章