Recent Comments

2008年2月23日 星期六

[轉自iThome]IT自救術-學電腦先學寫程式

IT自救術-學電腦先學寫程式
文/嚴立群 (記者) 2007-12-27

我認為,想要知道電腦大部分問題的原因,了解電腦的「秘密」,沒有捷徑,你得學怎麼寫程式──即使是只懂一點點也該試著去學。

用了這麼久的電腦,我必須承認我不是專家,但勉強是個通才,通才的特色是「啥都只懂一點點」,所謂「樣樣通樣樣鬆」。所以,接下來本欄的內容,我一直想著該寫些什麼?

「進階的電腦學習」該學些什麼?

作為一份專欄,我想本欄的讀者應該沒人打著「只看專欄內容就可以變成專家」的主意吧!既然如此,在此就請各位以「只打算變成『稍微多懂一點』的心態」來研究電腦這東西,至少你恐怕沒法僅看本欄內容就變成超級專家。

學院派的專家學什麼
首先讓我們來研究一下,「學院派」的「資訊專家」是如何養成的。

假設你是個高中生,考上了大學的「資訊工程系」,那我們可以假設:經過了四年的大學學習生活後,你會成為一個「資訊專業人員」。(當然,這是在如果你沒有玩樂的太過頭,且有用功讀書的前提下才成立的。)

那麼,資訊工程系上些什麼課來培養資訊專業人員呢?雖然我應該可以背得出來,但我也還是去查了一下臺大資訊工程系的課表,課程大致的分類如下:

● 共同科目
通常包含了「國文」、「英文」、「歷史」、「體育」

● 數理基礎
通常有「物理」和「微積分」、「機率」、「統計」、「線性代數」和「離散數學」

● 資訊工程基礎
包含了「計算機概論」、「程式設計」、「資料結構」、「演算法則」

● 軟體系統
「計算機組織」、「系統程式」、「作業系統」、「編譯程式」、「資料庫系統」

● 硬體結構
「計算機結構」、「數位電子/電路」、「數位系統設計」
許多學校會有更多的專業科目讓大四、研究生選修(像是「人工智慧」、「遊戲程式設計」……),讓學生多方研習自己有興趣的領域,為將來的專業生涯紮下更深厚的基礎。不過這些都是比較嚴肅的電腦專業,和我們一般生活的「電腦柴米油鹽醬醋茶」距離頗為遙遠。

既然我們離高中(甚至離大學)已經很久了,那就別管這些吧!知道一下科目名稱不壞就是。

今後以「理解電腦」作為研究目標
那我打算教什麼?離散數學?呵呵,大家別擔心,因為本人的數學程度不佳,所以我也不適合教這種高等數學(因為我也不會,要是我會我也想教)。我想做的,只是想找一個「學習標的」,讓讀者「從學這東西的過程中,逐漸理解電腦的一切。」

這就會有幾個問題:
● 通常「理解」得下更多苦工
如果我們要儘可能理解電腦的一切,那很抱歉,很多的學習項目是單調、無聊、沉悶而痛苦的。但如果你想要理解,就得去學,某些東西甚至得熟悉到會背誦,或是變成你直覺的一部份,因為我們的目標是要「理解」,而不只是「知道」而已。

● 理解的時程往往不能盡如人意
學習的過程是循序的,但是理解的過程卻不一定。有時本人只是用自己認定的邏輯順序去介紹某些項目,但是你不會一下就看懂全部。有時候你得慢慢想,等到「某一天」來臨時才能融會貫通。

● 千萬不能用「見樹不見林」的方式去學任何東西
我認為「單一項目」的學習容易造成誤解,比方說,如果你只是學習「二進位、十進位、八進位和十六進為的轉換」,通常會覺得很痛苦,心中不斷泛出疑問「我學這幹麼哩?」如果你先搞清楚學習的目的,學起來會比較好理解。

● 如果能「有系統的學習」會更好
除了原因之外,還能先知道這「單一項目在整個學習架構裡的地位」會更好。比方說,學習「數碼系統的轉換」,原來是因為「目前的數位電腦僅處理二進位,但為了理解和紀錄的方便則使用八、十或十六進位」,且「這對寫程式和研究處理器是很重要的」,那學習的動機就會比較強烈。

從處理器運作原理開始研究
所以,且讓本人來立一個學習目標,「研究處理器的簡單運作原理」。

處理器,processor,按理來說是個超級尖端的電腦設備。不過,它的基礎運作原理並不複雜,而且也是電腦的一切原理的開端。根據我的想像,要理解處理器的簡單運作原理,得知道下列事情:

● 整臺電腦的組織架構
了解處理器在整臺電腦中的地位和扮演的角色。

● 處理器本身的簡單結構
處理器裡面通常有許多暫存器,你得知道暫存器的角色和功用。

● 數碼系統的轉換
現在的數位計算機通常僅能處理二進位數字,但我們得熟悉各種數碼系統的轉換才能看懂大部分的火星文字(十六進位程式碼)。

● 數字的縮寫和單位的縮寫
處理器就是用來處理「巨量」資料的,而表示巨量資料通常使用英文字母的縮寫,這些縮寫字常造成學習者的困擾。

● 簡單的數位邏輯
大概只需要知道「AND」、「OR」、「NOT」就差不多了(反正剩下的都可這三個組合而成)。

● 如何無中生有寫出會動的程式
要理解某顆處理器,其中一個途徑就是得用該處理器的「指令」寫出程式來,低階的程式和高階的程式都得會寫。不過,我們的目的不是成為程式設計師,所以不必花太多時間在程式語法的學習,我們只是為了要理解處理器的運作原理。

● 釐清處理器硬體和軟體之間的關聯
雖說「硬體」和「軟體」常被視為兩個單獨的個體,但其實「硬體」本來就是被設計用來執行「軟體」,所以廠商在設計硬體的時候,本來就是不斷的考慮軟體執行的效率,所以你得對這兩個個體的「關聯性」有概括性的認識。

● 了解基本的計算機學理基礎
為何電腦能夠進行各種運算?電腦的侷限是什麼?摩爾定律是什麼?安達爾定律的意義為何?為何電腦進行的是「二進位」而不是「三進位」或是「四進位」演算?什麼是杜林機(或是有限自動機),它們代表的意義為何?這些學理並不複雜,反而簡化複雜的表象。

我還漏了什麼嗎?

沒關係,且讓我們一期一期的慢慢研究,每一周都會有一點進度,慢慢來就可以徹底理解了。

寫個印出數字的小程式
那我們「研究處理器」的第一件事,就是利用Windows內建的一個叫做「DEBUG」的小工具,來寫個「能印出 0123456789」的DOS小程式。

DEBUG這小工具從很久以前,就一直內建在DOS 和各版本的Windows裡面,主要可用來寫迷你的小程式。我們想要一窺處理器的奧秘,用這小工具當作一個「開始」還挺合適的。

從「開始」功能表→程式集→附屬應用程式→命令提示字元,然後在命令提示字元下,輸入DEBUG之後按下Enter。按下 Enter後,畫面會出現一個「減號」的提示字元,這時你就可以在DEBUG模式下寫程式了。

輸入問號(?)可以檢查DEBUG的命令格式。

Alt+Enter可以來回切換於「全螢幕提示字元」和「視窗環境」之間。

接著請依序輸入下列幾行字,這就是「從0印到9」組合語言程式碼。不過第一行的A100不是程式,而是用 DEBUG寫程式的宣告。程式第一行是從「MOV CX, 0A」

A100
MOV CX, 0A
MOV AH, 02
MOV DL, 30
INT 21
INC DL
LOOP 0107
INT 20

注意,最後一行程式是INT 20,輸入完畢之後再按一次Enter就可以結束輸入程式。

要執行程式只需要輸入G然後按下Enter,即可看到印出的文字(0~9)出現在下方。

要儲存程式,則請依據下列步驟(假設程式要取名為PN.COM ,意指「Print Number 」):

RCX
010F
N PN.COM
W

輸入「Q」即可結束DUBUG的執行。

在DOS命令列下,只要輸入PN,程式就會再次印出0~9的數值。從這裡,我們發現:

● 不經說明,DEBUG的操作還真是詭異透頂,又是Q又是A的,不知道在幹麼

● 程式碼也是很奇怪,又是INC又是MOV的,也都不知道在幹嘛

● 程式寫好了存起來,可以反覆使用

● 寫程式表面上並沒有什麼困難就是,短短幾行字卻有神奇的結果出現

DEBUG執行畫面,字均為白色,但為了方便辨別,綠色框內為使用者需要打字輸入的,紅色框內為程式輸出結果。

本期結語:這真是太神奇了
用價值好幾萬的電腦拿來寫這麼無聊的小程式,這當然不是我們的真正目的。而這DEBUG的畫面以及我們輸入的文字,看起來更是透著「邪氣」,看不懂也不知道在做什麼。神奇的是:如果你都輸入正確,它確實可以印出 0123456789,這真是太神奇了。

下期,筆者會從處理器的結構開始說明,幫這幾行程式進行大解密。藉由多寫一點組合語言小程式,我們將會對處理器(主要是Intel x86處理器)獲得更多的認識。

0 意見: