第四十八章:十歲的小老師

投票推薦 加入書籤 小說報錯

  他像一塊乾燥的海綿,瘋狂吸收著關於這兩台機器的知識。

  蘋果II上,他用BASIC寫簡單的圖形程序,畫會動的星星、跳動的音符;8086上,他學DOS命令,用DEBUG工具看內存,甚至嘗試用彙編語言寫幾行小程序(雖然語法生澀,但邏輯清晰)。

  他的進步快得驚人。

  兩周後,他就能用蘋果II的BASIC寫一個貪吃蛇遊戲——用方向鍵控制小方塊移動,吃到隨機出現的食物後變長,撞到邊界或自己身體則遊戲結束。

  雖然畫面是粗糙的字符和簡單圖形,但邏輯完整,運行流暢。

  張老師看到後,驚訝得半天說不出話:「這……這得學多久才能寫出來?」

  「三天,每天放學後練兩小時。」陸沉說。

  張老師沉默了。

  他知道陸沉沒說謊,但三天寫出一個可運行的貪吃蛇,在任何一本編程教材里都是進階案例,而這個十歲的孩子,只用了三天。

  陸沉的計算機能力很快在實驗班傳開。

  孫鵬纏著他教怎麼改遊戲參數,陳浩想了解硬體原理,劉宇則和他討論算法優化。

  陸沉從不藏私,但也不會主動炫耀。

  他幫孫鵬修改了貪吃蛇的移動速度,給陳浩解釋了8086的寄存器結構(用修農機時齒輪傳動打比方),和劉宇一起用數學公式優化了圖形繪製效率。

  ——

  特權帶來的意料之中的副作用,就是學霸三人組的請教越來越頻繁。

  每天下午放學後,陸沉鑽進裡間機房沒多久,外間就會響起試探性的敲門聲,或者乾脆是孫鵬那標誌性的大嗓門隔著門板傳來:「沉子!開門!救命!」

  這天周四,陸沉正在8086 PC機上,嘗試用DEBUG工具查看一段簡單的彙編程序在內存中的加載情況。

  門又被敲響了,節奏急促。

  陸沉保存好進度,起身開門。

  門口站著三個人:一臉苦相的孫鵬,眉頭緊鎖的陳浩,還有抱著本厚厚《數學物理方法》的劉宇。

  「沉子,江湖救急!」孫鵬率先擠進來,指著外間一台中華學習機,「我的坦克大戰,好不容易改了參數,坦克跑得飛快,可一開火就死機!肯定是哪個數據溢出搞崩了!」

  陳浩則遞過來一張手繪的草圖,上面畫著8086 CPU的方塊圖,用箭頭標註著數據流,旁邊寫著密密麻麻的問題:「你上次說AX、BX這些寄存器像齒輪箱裡的不同齒輪,負責傳遞不同力道的的數據。那如果同時有多個力道要處理,CPU怎麼知道先轉哪個齒輪?還有這個時鐘周期,是不是就像柴油機的曲軸轉一圈,完成一個動作?」

  劉宇沒說話,只是把手裡那本《數學物理方法》翻到某一頁,指著上面一個用級數展開近似計算積分的公式,又指了指裡間那台蘋果II:「我在想,如果要用計算機數值求解這個積分,是不是得把這個連續過程離散化?離散的步長怎麼取,才能在精度和計算量之間取得平衡?我用BASIC寫了個循環試算,但結果不太對,感覺是捨入誤差累積了。」

  陸沉看著眼前三位同學,一個遊戲崩潰,一個刨根問底鑽研硬體原理,一個試圖用計算機解決高階數學問題。

  他忽然覺得這場面有點熟悉,仿佛回到了前世的實驗室,同事們拿著各自的問題來找他討論。

  「一個個來。」陸沉把門完全打開,讓三人進來。

  裡間空間不大,一下子顯得有點擁擠。

  他先走到孫鵬的機器前。

  孫鵬的坦克大戰是他用BASIC模仿的,圖形極其簡陋,用字符表示坦克和牆壁。

  陸沉調出原始碼,快速瀏覽。

  「你這裡,」陸沉指著一行代碼,「BULLETX = TANKX + DIRX * 3,子彈初始位置用坦克坐標加上方向向量乘以3。你想讓子彈發射位置靠前一點,想法沒錯。但你沒檢查TANKX + DIRX*3會不會超過屏幕邊界。當坦克貼邊時,這個計算值可能為負或超過最大值,導致數組越界,訪問了不該訪問的內存地址,程序就崩了。」

  「邊界檢查……」孫鵬恍然大悟,「我光想著讓坦克跑得快,忘了子彈出生點也可能出界!那怎麼辦?每發一顆子彈都判斷一下?」

  「加個IF語句判斷計算後的坐標是否在有效範圍內,如果非法,就修正到邊界值,或者乾脆不允許發射。」陸沉說著,接過鍵盤,快速加了四行條件判斷。


  運行,坦克貼邊開火,子彈穩穩出現在邊界處,不再死機。

  「神了!」孫鵬一拍大腿,「就這麼簡單?我怎麼就沒想到!」

  「經驗問題。多寫多崩幾次,就有感覺了。」陸沉笑了笑。

  這確實是經驗,前世調試程序時,邊界條件是最容易出錯的角落之一。

  接著是陳浩。

  陸沉拿過他那張手繪的CPU圖,看了幾眼,發現陳浩的理解已經相當深入,甚至畫出了簡單的數據通路。

  「你的比喻很對,時鐘周期就像曲軸轉一圈,指揮所有齒輪(寄存器、運算器)同步動作一次。但CPU內部不是只有一個曲軸,它有多級流水線,可以像工廠的流水線一樣,同時處理多條指令的不同階段。」陸沉儘量用陳浩能懂的比喻,「比如第一條指令在取齒輪(取指),第二條指令就可以同時在轉齒輪(解碼),第三條在咬合齒輪(執行)。這樣總的效率就高了。至於哪個力道優先,由控制器根據指令本身的依賴關係和流水線狀態動態調度,有點像碼頭調度員指揮不同貨船裝卸,要避免擁堵和衝突。」

  為了讓陳浩更直觀地理解流水線,陸沉乾脆在草稿紙上畫了一條簡易的、分為取指-解碼-執行-訪存-寫回五個階段的流水線圖,用箭頭表示指令流動,並標出可能發生的數據衝突(比如下條指令需要上條指令的結果,但結果還沒寫回)和控制衝突(遇到跳轉指令)。

  這些都是計算機體系結構課程的內容,但他用齒輪卡殼、傳送帶改道這樣接地氣的說法解釋,陳浩聽得眼睛發亮,連連點頭。

  「我好像有點明白了!就是說,CPU不是傻乎乎地幹完一件事再干下一件,而是像……像幾個老師同時批改不同班級的卷子,雖然每個老師只負責一道題,但整體批改速度飛快!」陳浩興奮地總結。

  「這個比喻好。」陸沉贊道。

章節目錄