Linux中國

穿越到 1983 年學習 BASIC

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 的廣告 ,現在 MAS*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中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國