對於沒有硬體和電子相關知識的人來說,“計算機到底為什麼能工作”這個問題確實比較深奧。首先你需要明白計算機的CPU實際上和汽車的引擎是一個道理,只不過一個是機械的,一個是電子的。它們在飛速運轉中遵循某些固定的狀態,外界透過對其輸入的控制來產生輸出。對於CPU來說,帶動其運轉的東西叫“時鐘”。時鐘在0和1之間按特定頻率變換,由此同步各個電路元件的狀態變化,以便輸出正確的值。(有些人沒事兒就喜歡超頻,說白了就是在加快這個時鐘的變換頻率。)時鐘和暫存器有關,但是為了不跑題,我就不具體解釋了。為了便於理解,我們在此問題中只討論MIPS架構的CPU。首先,指令【instruction】由更上層的程式語言(比如C)編譯而來,它在記憶體中是許多串由0和1組成的數列,本身代表的就是電路通斷,不用再次進行編譯。由於早期的MIPS是基於“精簡指令集”的32位計算機架構,因此每條指令長度一樣,都是32位的,每條指令都是32個“0和1”。我們日常使用的CPU(比如酷睿i7)並不基於“精簡指令集”,而是基於“複雜指令集”。它們所用的指令長度並不一樣,因此它們的電路設計更加複雜,但基本原理還是一樣的,同樣是一堆“0和1”。看上面的表第一行 addadd $1 $2 $3這條指令在記憶體中應該長什麼樣?000000 | 00010 | 00011 | 00001 | 00000 | 100000這些0和1用豎線隔開後,每一塊都用來控制不同的電路部件。比如Rs Rt 和 Rd 代表的是這次運算所需要的三個暫存器,暫存器是比記憶體還要快許多,可以理解為計算機中最基本的儲蓄部件(算完了您得就近找個地兒擱啊)再比如funct指的是算術邏輯單元【Arithmetic Logic Unit】所進行的相關操作,100000對於算術邏輯單元,代表的是“加”。因此,如果把00000000010000110000100000100000翻譯成人話,是這個意思:“將暫存器$2和暫存器$3的數進行相加,並把結果存入暫存器$1”以上是CPU工作原理的一部分。至於“它如何控制某個電晶體的通斷狀態”,首先,電路中這些所需的部件,都是由電晶體所組成的。比如,上面提到的算術邏輯單元【ALU】:這是某個ALU的門級電路,儘管這不是MIPS所用到的ALU,但他們類似。A和B是輸入,Result是計算結果輸出,Carry-out是進位輸出。由於這部分電路不含任何暫存器,我們忽略電路做出反應所需要的時間,並且預設電路的輸出會隨著輸入的改變而立即改變。你可以看到ALU Opcode,這就是上文提到的funct,你輸入三位不同的控制訊號,它會進行不同的操作。比如ALU Opcode = 000在這裡代表將A和B相加。電路中的邏輯閘實現了程式中最基本的布林邏輯,相信大家對最基本的程式設計都有一點了解。神馬叫布林邏輯?舉個比較籠統的例子,你在C語言中寫了這麼幾行: //判斷變數x是否是100和30中間的一個數, &&(and)表示同時滿足兩個條件,and就是布林邏輯的一種。if ((x < 100) && (x > 30)) { //如果是,就。。。。}那麼這個“同時滿足”到底應該由CPU的什麼東西來判斷?答案是某種邏輯閘或幾種邏輯閘的組合。因此,我們再進一步放大,看這個ALU中的邏輯部件之一:與門【AND gate】與門有什麼性質?比如:1 AND 0 等於01 AND 1 等於1簡而言之,與門可以用來對比兩個輸入。因為對於它來說,只有當輸入的A和B都為高電平(1)時,輸出才會是高電平(1),否則輸出低電平(0)。最後,這個與門,其實是由電晶體組成的。希望你已經對這個問題有了一個大概的理解。以後有時間會再補充。
對於沒有硬體和電子相關知識的人來說,“計算機到底為什麼能工作”這個問題確實比較深奧。首先你需要明白計算機的CPU實際上和汽車的引擎是一個道理,只不過一個是機械的,一個是電子的。它們在飛速運轉中遵循某些固定的狀態,外界透過對其輸入的控制來產生輸出。對於CPU來說,帶動其運轉的東西叫“時鐘”。時鐘在0和1之間按特定頻率變換,由此同步各個電路元件的狀態變化,以便輸出正確的值。(有些人沒事兒就喜歡超頻,說白了就是在加快這個時鐘的變換頻率。)時鐘和暫存器有關,但是為了不跑題,我就不具體解釋了。為了便於理解,我們在此問題中只討論MIPS架構的CPU。首先,指令【instruction】由更上層的程式語言(比如C)編譯而來,它在記憶體中是許多串由0和1組成的數列,本身代表的就是電路通斷,不用再次進行編譯。由於早期的MIPS是基於“精簡指令集”的32位計算機架構,因此每條指令長度一樣,都是32位的,每條指令都是32個“0和1”。我們日常使用的CPU(比如酷睿i7)並不基於“精簡指令集”,而是基於“複雜指令集”。它們所用的指令長度並不一樣,因此它們的電路設計更加複雜,但基本原理還是一樣的,同樣是一堆“0和1”。看上面的表第一行 addadd $1 $2 $3這條指令在記憶體中應該長什麼樣?000000 | 00010 | 00011 | 00001 | 00000 | 100000這些0和1用豎線隔開後,每一塊都用來控制不同的電路部件。比如Rs Rt 和 Rd 代表的是這次運算所需要的三個暫存器,暫存器是比記憶體還要快許多,可以理解為計算機中最基本的儲蓄部件(算完了您得就近找個地兒擱啊)再比如funct指的是算術邏輯單元【Arithmetic Logic Unit】所進行的相關操作,100000對於算術邏輯單元,代表的是“加”。因此,如果把00000000010000110000100000100000翻譯成人話,是這個意思:“將暫存器$2和暫存器$3的數進行相加,並把結果存入暫存器$1”以上是CPU工作原理的一部分。至於“它如何控制某個電晶體的通斷狀態”,首先,電路中這些所需的部件,都是由電晶體所組成的。比如,上面提到的算術邏輯單元【ALU】:這是某個ALU的門級電路,儘管這不是MIPS所用到的ALU,但他們類似。A和B是輸入,Result是計算結果輸出,Carry-out是進位輸出。由於這部分電路不含任何暫存器,我們忽略電路做出反應所需要的時間,並且預設電路的輸出會隨著輸入的改變而立即改變。你可以看到ALU Opcode,這就是上文提到的funct,你輸入三位不同的控制訊號,它會進行不同的操作。比如ALU Opcode = 000在這裡代表將A和B相加。電路中的邏輯閘實現了程式中最基本的布林邏輯,相信大家對最基本的程式設計都有一點了解。神馬叫布林邏輯?舉個比較籠統的例子,你在C語言中寫了這麼幾行: //判斷變數x是否是100和30中間的一個數, &&(and)表示同時滿足兩個條件,and就是布林邏輯的一種。if ((x < 100) && (x > 30)) { //如果是,就。。。。}那麼這個“同時滿足”到底應該由CPU的什麼東西來判斷?答案是某種邏輯閘或幾種邏輯閘的組合。因此,我們再進一步放大,看這個ALU中的邏輯部件之一:與門【AND gate】與門有什麼性質?比如:1 AND 0 等於01 AND 1 等於1簡而言之,與門可以用來對比兩個輸入。因為對於它來說,只有當輸入的A和B都為高電平(1)時,輸出才會是高電平(1),否則輸出低電平(0)。最後,這個與門,其實是由電晶體組成的。希望你已經對這個問題有了一個大概的理解。以後有時間會再補充。