電腦的運作需要仰賴許多硬體與軟體的相互配合,統稱電腦系統 (computer system)。這篇文章會概略地介紹電腦系統中的重要角色,以及它們如何相互合作,來完成複雜的工作,比如說讓無所事事的宅宅如我,假日可以躲在房間玩一整天的遊戲。
說到電腦,你的腦中會浮現什麼呢? 是螢幕、滑鼠鍵盤、閃著各種燈的主機、還是吵死人的風扇?
再想得更深入一點,可能會冒出更多問題: 手機裡面有電腦嗎? 應該是有,但手機只有螢幕,沒有滑鼠和鍵盤。機械手臂裡面應該也有電腦吧? 但它連螢幕都沒有,長得跟筆電或桌上型電腦完全不像。
其實電腦的型態有非常多種,長得樣子千奇百怪、體積的差距也十分懸殊。大型的電腦長得就像一排排貨架,插滿各種線路,佔據數百坪的空間。小型的電腦則會隱藏在其他的裝置裡面: 像是剛剛提到的機械手臂、智慧手表、或 VR 眼鏡。火車、捷運、和飛機上也有相當複雜的電腦,來協助駕駛員控制交通工具,並偵測、防範潛在的危險狀況。 大家刻板印象中的電腦: 筆電和桌上型電腦,只是電腦家族中的一份子。
電腦終其一生就只有一個任務: 運算 (operation)。講得更精確一點: 讀取資料、對資料進行運算,然後產生新的資料。而程式 (program) 則是用來令命電腦做事情的手段。
打個比方,你可以把電腦想像成是精通各種烹飪技巧的「烹飪機器人」,它熟悉刀工、了解如何處理各種食材、以及各式器具的使用方式。程式就像食譜一樣,告訴我們的烹飪機器人如何一步一步,精準無誤得做出一道菜來: 也就是我們希望電腦能夠達成的任務,比如播放影片、發送 email、或是在遇到亂流的時候盡量保持機身的平穩。
也就是說,儘管電腦 (烹飪機器人) 有能力對資料 (食材) 進行各種運算 (烹飪技巧),但它並不知道要用什麼方式和順序去進行運算,必須仰賴程式 (食譜) 告訴它具體的步驟,才能做到滿足人類需求的應用 (菜色),如: 讓我們開心玩糞 game。
這邊以糞 game 為例,實際講述一次從程式、電腦、和開心的宅宅如我之間的關係。
遊戲就如同任何其他軟體一樣,是由一堆程式碼所構成的,透過某些方式安裝在我們的手機當中。當我們在玩糞 game 的時候,手機裡面的電腦其實正在以飛快的速度讀取程式碼 (食譜): 它會發現程式命令它讀取使用者的操作 (資料),看看使用者想要幹嘛。它讀取了以後,發現使用者正在狂按大招,它接著繼續讀取程式碼,發現程式告訴它,如果使用者狂按大招,就在螢幕上顯示華麗炫炮的特效,同時計算敵人是否在大招範圍內,如果是的話就依照大招的傷害,扣除敵人的血量......。
上面的描述其實有點過於簡略,事實上,下面列的事情都需要程式碼進一步提供具體的步驟,電腦才知道該如何做到:
1. 發現使用者正在狂按大招。
2. 在螢幕上顯示華麗炫炮的特效。
3. 計算敵人是否在大招範圍內。
4. 依照大招的傷害,扣除敵人的血量。
看到這裡,有人可能會感到困惑,這些行為跟「運算」到底有什麼關聯呢? 運算就像電腦這個詞彙一樣是個泛稱,就如同世界上各種不同的電腦一樣,也有各式各樣不同種類的運算。
舉例來說,當電腦讀取使用者的操作的時候,它是怎麼知道點一下手機螢幕上的某個按鈕,代表的意思是大招呢? 這其實是靠一個叫做「比較 (comparison)」的運算做到的。具體來說,程式會告訴電腦: 拿使用者的操作來和 xxx 進行比較這個運算 (xxx 是程式碼中對於大招的定義),假如比較出來的結果是吻合的,就表示使用者想要開大招,這時候應該要...... (更多程式碼)。
舉另外一個例子: 電腦是如何在螢幕上顯示出大招的特效的呢? 螢幕其實是由許多個小點點 (pixel) 所組成的,程式會告訴電腦要如何計算出每一個點在每一個瞬間的顏色和亮度,才能夠拼湊出一段開大招的特效。在這個例子中。
雖然電腦的種類形形色色,但它們通常都有一個基本的架構,如下圖所示:
CPU: Central Processing Unit,電腦的核心,負責處理所有的運算。
Memory: 記憶體,負責儲存資料。CPU 會從記憶體取得資料,進行運算,並且將計算的結果 (新的資料) 儲存回記憶體。
Input device: 輸入裝置,負責從電腦外部取得資料的裝置。如: 滑鼠、鍵盤、觸控螢幕、紅外線感測器、攝像頭。
Output device: 輸出裝置,從電腦讀取資料的外部裝置。如: 螢幕 (依照資料顯示畫面)、機械手臂 (依照資料做出動作)、音響 (依照資料發出聲音)。
下面以糞 game 的例子,說明電腦在各個步驟具體做的事情:
這些步驟看起來很繁瑣 (真實的狀況其實遠比上面描述得還要複雜好幾百倍...),但由於電腦運作的速度非常非常快,幾乎在一瞬間就可以把上面所有的步驟都做完,對人類玩家而言,根本不會注意到在他按下大招的按鈕到敵人被扣血之間,其實經過這麼多的資料運算以及資料搬運。
由上面的例子,我們可以歸納出電腦做事情的三個大原則:
本文一開始提到的不同類型的電腦,都會依循這三個大原則對資料進行各種運算,產生更多新的資料,並搭配形形色色的輸入與輸出裝置,來滿足人類各種奇怪的需求。
稍微補充一下,這三個大原則是電腦最最最基礎的運作方式,現代的電腦系統設計得越來越複雜,很多時候為了做到更強大的功能,並不會完全依循這三個原則。不過不管是什麼樣的設計,都是從這邊介紹的基礎架構以及原則去做延伸的。
最後要再次強調,上述的步驟都是透過程式 (食譜) 來告訴電腦具體應該要做什麼事情 (資料的運算以及資料的搬運)。電腦本身完全不知道做這些事情的意義是什麼,是程式設計師利用程式來控制電腦做出對人類來說有意義的行為。
由電腦做事情的三個大原則可以得知,程式除了告訴電腦要對資料做什麼運算以外,還要告訴電腦何時該讀取以及儲存資料。
比如說在電腦有辦法判斷你施放的大招究竟是有打到人、還是打了個寂寞以前,程式必須先叫電腦從記憶體讀取不同角色的位置、大絕的範圍等等的資料。計算完了以後,程式必須再叫它存回記憶體,不然它一轉眼就會把剛剛算出來的東西忘掉。
想必各位應該都會有一種想法: 電腦也太笨了吧! 不能自動自發一點,自己把需要的資料從記憶體讀出來,算好後自己寫回去嗎? 為什麼連這種事情都要一個指令一個動作。
這個原因很簡單: 電腦的本質就是笨、但做事非常快。
硬體的開發與生產是非常燒錢的,所以通常硬體在設計上都會採取「把最基本、最重要的事情做得又快又好」。所以電腦會做的事情其實非常有限,但絕對非常有效率。
你可以把電腦能夠做的事情想像成是一塊一塊樂高積木,它們的種類有限,而且形狀通常都很單純。而所謂的程式 (或軟體) 其實就是透過組裝樂高積木,來做出令人嘆為觀止的酷東西: 像是帝國大廈的模型、星際大戰的死星,或是薩諾斯的無限手套。
透過這種方式,儘管電腦會做的事情是有限的,程式/軟體 (食譜) 卻可以有無限多種可能。