Skip to main content

Tedshd's Dev note

Computer Science - 與硬體對話

Table of Contents

# 與硬體對話

就像布林邏輯和有限狀態機是電腦硬體的建構區組一樣,程式語言等於是組成電腦軟體的建構區組.和人類的語言一樣,程式語言也有字彙和文法,但不同的是,程式語言的每個字句都有其確切的意義.大部分程式語言就如同布林邏輯是通用的,它們可以描述任何電腦所做的事情.

告訴電腦你要做的事情並不如想像中的容易,必須精確描述任何要求電腦進行的細節與步驟.

程式語言種類繁多,照成多樣性的主要因素包括歷史、習慣及喜好等等,但這些不同的程式語言之所以能繼續存在,主要是因為他們在描述不同事物上各有所長.每種語言都有自己的語法,你必須學會它才能撰寫程式,但與法並非語意的基礎,也不是表達語言的動力,而是像一般語言中的拼字和標點符號一樣.就表達語言的動力而言,最重要在於字彙,亦稱為語言的原詞(primitive),以及如何用原詞組合新概念的方法.

電腦語言有很多種,如 LISP Ada FORTRAN C ALGOL 之類,有些語言對於定義遞迴運算,或在處理非數值資料上有其限制,有些則可以讓程式設計師直接操作位元資料.最近新一代的電腦語言漸漸出頭,就是所謂的物件導向(object-oriented)語言,如 Small-Talk C++ Java 等.這些語言將所要處理的資料結構(如螢幕上的圖形)視為擁有屬性的[物件],這些屬性好比圖畫的位置、顏色等等,而物件可以接受其他物件的命令.

物件導向程式語言最大的優點在於它可以個別定義不同的物件,如電腦遊戲中的各種物件,然後再將物件組合在一起變成新的程式.寫一個新的物件導向程式有點像是把一群動物關在一個籠子裡,然後靜觀其變.在這些虛擬物件互相作用的過程中,程式的行為便浮現出來.

有限狀態機如何執行 logo 這類語言所下的指令?要回答這個問題,我們必須再回到布林邏輯這個層面詳加討論.有限狀態機和 logo 語言之間有三個主要步驟加以連結.首先,我們要了解有限狀態機在加上記憶體(memory)這樣的儲存裝置後,是如何延伸、擴充的,而記憶體可以讓電腦儲存它被要求執行的動作.其次,我們將看到擴充後的有限狀態機是如何依機械語言(machine language)的指令運作,這種語言是一種很簡單的語言,可以明確地指示機器所要執行的運算.最後,我們則會看到機械語言是如何指揮機器解讀logo這類程式語言.

電腦其實只是一種連接了記憶體的有限狀態機.電腦的記憶體,實際上相當於許多用來儲存資料的小隔間組成的陣列,由暫存器建構成,和儲存有限狀態機的狀態所用的暫存器相同.

每個暫存器都可以容納一組位元,稱之為字組(word),這些字組可以被有限狀態機讀取或寫入.每部電腦的字組所含的位元數可能都不太一樣,但現今的微處理器通常是8位元 16位元或32位元(隨科技的進步,字組的位元數也越來越大,如64位元).一般記憶體可能有上百萬個甚至數十億個這樣的暫存器,而每個暫存器都可容納一個字組.在同一時間內,每次只能存取一個記憶體中的暫存器,也就是說在有限狀態機的每個循環中,只能寫入或讀取一個暫存器中的資料.

每個暫存器都有不同的位址(address),位址是一組位元的組合形態,可藉由它找到特定的暫存器,因此暫存器也稱為記憶體中的位置(locations in menory),記憶體包含了一些可以解碼的布林邏輯區組,用以選擇所要寫入或讀取的位置.如果要在某個記憶體位置寫入資料,這些邏輯區組便將新資料寫入指定的暫存器中.若要讀取資料,這些邏輯區組也會將資料由指定的暫存器中引導到記憶體的輸出端,而這個輸出端是連接在有限狀態機的輸入端.

記憶體所儲存的字組有些是要運算的資料,如數字和字母等,也可能是指令,告知電腦執行運算的程序.指令以機械語言的方式儲存.機械語言比一般程式語言來的簡單.機械語言可直接由有限狀態機解讀,在我們所介紹的電腦中,每個機械語言指令都以一個字組儲存,而指令就儲存再一塊依序編號的記憶體位置中,這一連串的機械語言指令就是電腦中最簡單的軟體.

有限狀態機會重複執行下列的程序 1.讀取(read)記憶體中的指令. 2.執行(execute)這個指令所代表的運算. 3.推算(calculate)下一個指令所在的位址.

完成這些工作所需的狀態順序就建構在有限狀態機的布林邏輯中,而指令本身則以位元表示,這些位元組可使有限狀態機對記憶體中的資料作各種運算.例如, Add 指令為一個特定的位元組合,它表示將記憶體中的兩個暫存器相加,當有限狀態機辨識出這個位元組後,會透過一連串的狀態轉換將記憶體中要加總的資料讀出,然後相加,再將總和寫回記憶體.

大部分電腦中都有兩種最基本的指令-運算指令(processing instruction) 控制指令(control instruction).

運算指令是由記憶體存取資料,然後將資料做算數或邏輯計算,而資料所在的記憶體位址或暫存器也是由運算指令所指定.通常指令只與少數暫存器有直接關聯,而以間接的方式對其他暫存器下指令,因為它的位址是存在別的暫存器. EX. Move 指令可將暫存器1中的資料搬移到暫存器2指定的位址上.

控制指令則決定下一個呼叫的指令所在的位址,這個位址儲存在一個特別的暫存器中,稱為程式計時器(program counter).在正常的狀態下,指令從連續的記憶體位置中依序叫出,所以每當叫出一個指令後,程式計數器就會自動加1.控制指令可以改變程式計數器的內容,藉此改變程式執行的順序.最簡單的就是Jump指令它可以將指定的位址儲存在程式計數器中,因此下一個指令便會從此位置中呼叫出.另外還有一種條件式的Jump指令,它只在符合條件的狀態下才會改變程式計數器的內容.

若要重複執行一串相同的指令,則可以在這串指令結束時,利用條件式 Jump 指令將程式計數器移回開始的地方,重複幾次都行,這動作稱為迴圈(loop).