計算機的工作原理?

這個問題可能有些太泛了。就是從完全不懂計算機的人的視角來看,為什麼計算機能讀懂0和1並處理數據呢?課本提過打孔的一個模型,現代計算機同理嗎?數據又是怎麼組成圖畫,怎麼反饋的呢?其中的載體和運作過程,能否用形象的說法表達出來?


前前言:

所有讀了這個答案但是有不懂的地方的朋友,懇請你們能告訴我哪裡不明白,我會嘗試用更通俗的話來闡述以幫助更多的朋友。謝謝!

前言:

你需要有一定的電學知識,然後就可以去看模擬電路和數字電路相關的書籍了,了解完這兩個東西後你就能基本明白計算機是怎麼運作起來的了。這裡只做簡單回答。簡單回答的意思是說,這個回答旨在讓完全沒有基礎的人從理念上了解計算機如何運作----針對這一原則,答主會一切圍繞通俗易懂來展開,因此在某些學術細節上或許有錯。

讀懂此答案需要具備的能力:

初中電學和數學知識 + 二進位的基本知識。

對於掌握了初中數學知識的朋友來說,大致了解二進位是很簡單的,在這裡做個簡單介紹:

我們知道十進位是最常見的數制,它有十個數字0-9。二進位也同理,只不過二進位是兩個數字。因此十進位里的「逢十進一」在二進位中變成了「逢二進一」。

十進位數數:1 2 3 4 5 6 7 8 9 10 11 12 ...

二進位數數:1 10 11 100 101 110 111 1000 1001 ...

答案定位:

既不是兒童級別的讀物,也不涉及高深晦澀和非常專業的詞句。該答案的目的是讓有初中文憑的人讀懂。

正文:

1)半導體的發現。人類有一天被上帝丟下來的硅不小心砸到了腦袋,於是乎發現了半導體。用半導體材料可以製成二極體(這個概念本不想提但是評論區的朋友覺得直接說半導體錯得太嚴重了)

二極體的原理:給半導體材料里摻入某種元素後,半導體會這樣:我討厭電子;而給半導體摻入另外一種元素後,半導體會這樣:我喜歡電子。我們把一個討厭電子的半導體和一個喜歡電子的半導體放在一起的時候,在它們之間就會形成一個電子趨向的力量(半導體畢竟不是導體,半導體的原子核對電子的束縛力是足夠大的,因此雖然有趨向,但不足以讓一側的電子跑到另一側 --- 這也就是為什麼它叫做「半導體」),這就是一個二極體了。當二極體外部有電流通過的時候,如果外部電流內的電子的運動方向順從了其內部的這種電子的趨向,則這個二極體可以視為接通的導線;而如果外部電流的電子運動方向和二極體內部的電子方向相反的時候,外部電流就無法通過這個二極體(除非加了很高的反向電壓 ----- 這樣就會將二極體擊穿 ---- 當然我們在使用二極體時不會讓它被擊穿因此這裡無需考慮這種情況),此時這個二極體可以視為斷路。所以在二極體的電路里,根據二極體兩端的電壓的高低的不同,就能測出某些電阻兩端的電壓有不同的數值:高或者低(具體看下面的4)。

2)數學上有二進位:0和1。由於只有兩個數字,因此恰好可以和上面的高低電壓一一對應起來。比如我們可以規定:1表示高電壓0表示低電壓。

3)和二進位配套的邏輯運算:與、或、非。

與:只要有0結果就是0。比如1與0等於0。

或:只要有1結果就是1。比如1與0等於1。

非:翻轉。0變1、1變0。

還有其他邏輯運算比如同或、異或等就不一一列舉了;總之基礎的邏輯運算就這三個。

4)把123聯繫起來,人類做出了:與門電路、或門電路、非門電路、異或電路等。

註:

上圖中最上面的唯一一個沒有被字母標記的結點在這裡記為:C

A、B和C都可以加上一定的電壓;Y為測量端;DA與DB為二極體;C下面的矩形為電阻。

這是一個與門電路,有初中電學知識就應該可以看懂。大概很簡單地解釋下(其實不太對但是不影響你從原理上理解):

當A和B中任意一端是0V(可以理解為接地)而C端有一定的電壓時,測量Y端電壓(Y與大地間的電壓或者說Y與0間的電壓)幾乎是0V。這是因為AB中至少有一個是0V且二極體的方向是那個樣子的,所以電流從C端流入、通過那個電阻後從0V那裡流入大地/回到負極了,因此此時測量Y端電壓等於在測量一個導通的電路中的一段導線上的電壓,所以很顯然幾乎是0V。而如果AB端電壓比較高(高於C端的電壓但是沒有到擊穿的地步)的時候,兩個二極體都等效於斷路狀態,電流試圖從AB端流向右邊(因為AB端電壓高於C端電壓因此電流的趨向是從AB流向C)但是流不過去,所以此時測量Y端電壓的時候就不是0V了而是有一定的數值。(更專業的解釋:請問二極體與門電路的原理?)

因此,在這個電路中,只有當AB兩端同時有高電壓時,Y端才有電壓(大於0V);AB中只要有一個是0V,Y端就是0V。當我們把AB兩端視為輸入Y端視為輸出時,就可以得到和上面的「與運算」相對應的結果(設高電壓=1 低電壓=0):只有輸入都是1的時候輸出才是1,其他時候都是0。這就是一個與門電路。同理,也有類似的或門電路等等。

5)有了這些門,就可以做半加器了,有了半加器就能做全加器,它的作用是實現加法。同理,可以實現四則運算了(如何用這些門實現四則運算,這裡不細說,否則就違背了「通俗易懂」的原則。但這樣的跨度有點大,因此答案後面的BONUS里有介紹這部分內容)。到了這裡,理論上只要我給你相關的材料,你就可以做出一個有一定功能的電路了。比如你可以做一個:輸入三個數字,把前兩個數字相加的結果乘以第三個數字然後輸出結果。

比如,你輸入「高低低高」給一個電路,然後這個電路給你輸出「高低高低」。如果我們之前已經規定了高電壓表示1、低電壓表示0,即:1001為輸入,1010為輸出,顯然,這就是做了一個加1的運算。

當然,由於你電路里的所有門電路都是盯死在線路板上的,所以你的這個電路永遠只能做這一件事。然後你就可以做一個專門賣這種功能電路板的硬體生產商了。像計算機里的那些固定在硬體上的指令,就是這麼來的。所謂硬體上的那些指令,就是:你輸入某些數字,硬體就做相關運算,然後輸出結果。

很多朋友會在這裡產生一個困惑(這個困惑甚至困擾著很多計算機專業的學生):你說用1表示高電壓0表示低電壓,那我怎麼告訴電路這裡是高電壓或者低電壓、電路又是怎麼告訴我那裡是高電壓或者低電壓呢?

本質上,這個問題是在問:電路和人如何交流,或者說是在問電路的輸入輸出設備是什麼。

到目前為止,我們所需要用到的輸入輸出設備其實非常簡單:輸入設備就是一個個的開關 --- 開關接通則給電路輸入高電壓開關斷開則給電路輸入低電壓;輸入設備則是一個個的發光二極體或者簡單理解為「燈泡」 --- 「燈泡」亮則表示電路輸出了高電壓「燈泡」不亮則表示電路輸出了低電壓。有了這樣的輸入輸出設備,你就可以這樣做了:通過控制一系列開關的狀態,讓電路運行;而後通過觀察一系列「燈泡」的狀態,來得到電路輸出的結果。

6)邏輯完備性。這個世界中的萬事萬物都可以用三種順序來表示出來:順序、選擇和循環。完備的意思就是說某個理論系統可以涵蓋所有的情況,沒有例外。

註:以下兩個斜杠後面的部分屬於注釋,負責解釋說明。

順序:從o到p從q到r......(就像你看文章一樣,一行一行地看)

第一行:a = 1 // 告訴計算機:有一個值的名字是a,它的大小是1
第二行:b = 2
第三行:計算並顯示(a + b)
// 逐行執行:第一行 ---&> 第二行 ---&> 第三行......

選擇:如果某個條件滿足(比如x&=y)就到q

第一行:a = 1
第二行:b = 用戶輸入
第三行:如果(a &< b) 第四行:顯示(用戶輸入小於a) 第五行:如果(a &> b)
第六行:顯示(用戶輸入大於a)
第七行:如果(a = b)
第八行:顯示(用戶輸入等於a)
// 還是逐行執行,但第四行、第六行和第八行中只有一行會被執行

循環:如果某個條件不滿足/滿足(比如a&=x)了就到q

第一行:a = 0
第二行:b = 10
第三行:語句標籤(label): c = a, a = c + 1 // 把c設置成a 然後把a設置成c+1
第四行:如果(a &< b) 第五行:執行標籤:label 第六行:顯示(a) // 還是逐行執行,但從第三行到第五行會不斷反覆執行:第三行 ---&> 第四行 ---&> 第五行 ---&> 第三行......直至a不再小於b --- 即第四行的條件不滿足了,就會執行第六行

用這三個可以表示世間萬物。

比如:你上樓梯回家:

a---打開樓門,面前出現一個10個台階的樓梯

b---循環做登樓梯的動作直到做了10次

c---如果面對的是你家,開門,到e;如果不是,向右轉

d---如果到家了,到e;否則,到c

e---結束

7)圖靈機。圖靈機簡單來說就是一個能接受信息、處理信息和發出信息的虛構的機器。世界萬物皆為圖靈機。

比如,一個杯子放在一張桌子上:

輸入:杯子

圖靈機:桌子

輸出:支持杯子或者說杯子沒有掉下去

再比如,我對你說謝謝你回復我說不客氣:

輸入:謝謝

圖靈機:你

輸出:不客氣

再比如6中的那個回家的例子:

輸入:十個台階的樓梯

圖靈機:你

輸出:重複十次登樓梯動作

當然,你這個圖靈機在對信息的處理上遠遠比一張桌子要複雜得多:

如果 (十個台階上面是你家 而且 你面對著台階)

那麼 (循環十次登樓梯動作)

當然,你不會是如此簡單的一個圖靈機。你還會這樣:

在登樓梯過程中,如果有人通過你的耳朵給你輸入:兒子別回家了,咱們到外面吃飯。

你這個圖靈機就會立刻優先對這個新的輸入進行處理而會將登樓梯的動作掛起(掛起的意思就是暫時不執行)

你會這樣:

如果(聲音是你爸或者你媽的)

那麼(轉身下樓梯)

否則 // 就是說聲音不是你爸也不是你媽的

那麼(喚醒剛才掛起的登樓梯的動作繼續做)

回到家後,你這個圖靈機會從你大腦里調出晚上要做的事情:寫作業、看電視、睡覺

然後你會給這些任務排列一個優先順序:比如寫作業是1,看電視是2,睡覺是3。(壞孩子的任務優先序列可能是:看電視1,寫作業2,睡覺3---小朋友們不要學喲)

你會根據哪個優先順序更高來選擇先做哪一個。

當然,遠沒有這麼簡單。比如:

如果(你正在做1 而且 時間已經12點了)

那麼 (你決定停止1,直接做3,同時準備好明天給你們老師的輸出 --- 跟他解釋你為什麼沒寫完作業)

......

......

......

所以人是一個非常非常非常非常複雜的圖靈機。由於現在的5那裡的硬體落後得和渣一樣,所以人類目前根本無法用電路去模擬一個真人 。即使硬體發達到可以模擬真人了,那麼依然也只是模擬。人類最大的本領:學習,只靠發達的硬體還是無法做到。所以人類到底能不能真的用電路去實現一個真正的人類的大腦,這是一個懸而未決的問題,有的人認為可以,有的認為不可以。

6+7:這個宇宙中的一切,都可以抽象成圖靈機;這個世界上的所有事件,都可以用那三種邏輯來表示。 而用上面的5中的內容,可以在電路上實現6+7。只要電路的速度越來越快,我們就能實現越來越複雜的6+7。 圖靈機,只是一個概念上的虛擬的機器。而人類可以通過各種手段去實現各式各樣的圖靈機:人類製造的機器,是圖靈機;人類蓋的樓房,是圖靈機;哪怕人類生了一個嬰兒,那個嬰兒也是一個圖靈機。計算機,只是眾多圖靈機中的一種。只要一個圖靈機具備了6中所說的三種順序的邏輯能力,那麼這個圖靈機理論上來說就可以模擬宇宙萬物了。

比如在5)那裡的那個做加1運算的「東西」-----其實那就是一台計算機。只不過它的輸入是一個個的開關,而不是鍵盤和滑鼠;它的輸出是一個發光二極體閃了幾下,而不是顯示器和印表機。一個遙控器、一個手機、一個紅白機,都是計算機、都是圖靈機。

8)在半導體的基礎上,如果加入一些其他化學元素(具體請去看模擬電路的書),就可以讓半導體的狀態變得「可擦除」和「可記憶」:比如上次這裡是斷路半導體狀態、現在我可以改成連通的。我給一個電路板接通電路,然後給它某些輸入、改變了裡面的某些半導體的狀態,然後斷開電路,由於這種半導體是可記憶的,所以它裡面的每個門電路都是你斷電之前的狀態,下次再接上電源的時候,就能讀出上次的狀態---這樣就可以存儲數據了。

9)振蕩器。高中物理會學振蕩迴路。就是電磁一直相互轉化而形成振蕩,就和廣播的道理一樣。振蕩的頻率是固定的,比如每秒震蕩100次,每振蕩一次,就發射出一個電壓信號。然後cpu每接收到一次電壓信號,就去讀一條指令(看6,類似這樣:如果收到了電壓信號,則執行***。當然還要有外來的用戶輸入,比如如果用戶輸入了1,同時接收到了電壓信號,則執行a;如果沒有用戶輸入,則執行b;如果用戶第一次輸入0第二次輸入1,則執行c......)-----指令就是根據5那裡被硬體生產商固定在硬體里的半導體的通斷狀態。一般你買電腦的時候都有個內存頻率,單位都是MHz,表示一秒鐘這個內存里的振蕩器可以發送多少百萬次信號。

到了這裡,你就可以做出一個能處理四則運算和拉丁字母(拉丁字母可以和數字一一對應起來)的電路板了。

10)卷積定理+(離散)傅立葉變換+採樣。大學數學基礎課會學傅立葉變換,數學專業的某個方向會學卷積定理。你不需要知道它們是什麼東西,你只需要這三個東西合起來能做這樣一件事:

連續信號轉換成數字信號。

雖然我們永遠不能把連續信號零誤差地轉換為數字信號,但是可以無限逼近。由於人類太弱了感官系統太不敏感了,所以只要差不多逼近一點人是根本察覺不出來的。世界上有無數種紅色,但計算機只要提供256種紅色,人就以為能表示所有的紅色了。

自此,你就可以做一個能處理數字、文字、聲音和圖像的機器了。

11)熒光物質可以在受到不同能量的電子的轟擊下發出不同的顏色,根據三原色原理,我們可以通過對電子加壓的控制達到顯示不同顏色的目的---------------------顯示器。

12)鍵盤底下有一張導電的紙,你按下某個鍵,就等於接通了某些電路,就有一個獨一無二的輸出,你只要事先規定好哪種輸出對應哪個鍵,主機就能夠知道你按下了某個鍵了。比如規定「高低高高低低高高低」是K,那麼主機只要從鍵盤那裡接收到了101100110就知道用戶按下了K。

滑鼠:滑鼠下面的光源發射器會向桌子發光,還有個光的接收器。當你移動滑鼠時,接收器可以感知到發射器發出的光反射回來時的入射角和方向的不同變化,然後就可以以不同電信號的方式告訴主機滑鼠在向著那個方向移動;滑鼠點擊的原理和鍵盤類似,不再贅述。

把製作上面所有物件的材料都買齊了,然後你就能自己攢一個計算機出來了.............Good luck!

====================================================================

上面說的這些其實非常粗淺,想知道完備的系統的知識請在上大學時報考計算機或通信專業: 通信就是把信息從自然界里捕捉到然後再轉化成易處理的信息然後再通過各種方法傳輸最後到了信息處理的終端:計算機 這裡。計算機處理信息後再把信息通過各種各樣的方式傳遞出來。 所以 @Anchor 說得沒錯,想什麼都學應該選擇通信專業。從知識體系上說計算機只是信息通信的整個系統中的「信息終端」這個環節。

=========================== BONUS ==========================

關於6:邏輯完備性。

如上所述,邏輯的完備性靠三種邏輯順序實現:順序、選擇和循環。

用這三種邏輯順序可以解決問題,比如上面7中的「回家」。這裡再舉一例:

計算從1到100的所有奇數的和。

a = 1
result = 0
語句標籤(label):
如果(a &> 100)
那麼(執行label2)
如果(a除以2的餘數不等於0) // 說明a是奇數
那麼(result = result + a) // 把result和a相加的結果賦值給result
a = a + 1
執行標籤:label
語句標籤(label2):顯示(result)
程序結束

上面這個例子中把三種邏輯順序已經都涉及到了。

依照這三種邏輯來描述世間的一切問題,可以把問題分為三類:

1)不可解決的問題。

雖然前面說了,用這三種邏輯順序可以表示一切事物但是這並不意味著可以解決一切問題

舉個例子:

顯示自己本身的所有代碼。

什麼意思呢?就是說你寫一段程序,這段程序要把自己所有的代碼都顯示出來。

乍一看覺得這很簡單啊,但其實你連一行都顯示不了。

比如有這樣一個程序,就一行:

顯示(100)

這個程序就做一件事情:顯示數字100。

問題來了,你如何把「顯示(100)」這兩個漢字一組括弧和一個數字100顯示出來呢?

似乎應該這樣:

顯示(顯示(100))

但是其實當你這樣做的時候,你已經改變了程序本身,現在的程序為兩個「顯示」兩組括弧和一個100,而你運行程序後只能顯示一個「顯示」一組括弧和一個100,很顯然你並沒有把這個程序全部顯示出來。

類似這樣的問題,就是計算機無法解決的問題。

2)能夠在人類可以容忍的限度內解決的問題。

比如上面的那個「計算1到100內的奇數的和」的問題就是這類問題。解決這類問題所需要的時間的變化是線性變化的。即:「計算1到1000內的奇數的和」所需要的時間是「計算1到100內的奇數的和」的10倍。也就是說問題擴大多少,解決問題所需要的時間就線性地擴大多少。

3)無法在人類可以容忍的限度內解決的問題。

這類問題是計算機或者說用這三種邏輯順序可以解決的、但是所需要的時間是人類無法容忍的。

比如「背包問題」:

一個小偷去博物館偷東西。博物館內有3件物品。

第一件物品的重量為3, 價值為4;

第一件物品的重量為2, 價值為3;

第一件物品的重量為4, 價值為5;

小偷的背包最多可以承受的重量為7。請問:應該如何拿物品,可以讓背包里的物品總價值最大。

這個問題似乎非常簡單,你在稍微比較後就會得出結論:拿第一件和第三件物品。

但是,如果我們擴大一下問題:如果有6件物品、背包可以承受的重量也提高一些,應該怎麼拿?

這個時候如果讓計算機去解決這個問題,我們就會發現當問題的規模擴大1倍後,計算機所需要的時間卻擴大了遠不止1倍 ----- 即解決問題所需時間不再是線性變化了。

就拿這個問題來說,如果物品數量超過12個(如果我沒記錯就是12個,反正這個數字很小),那麼計算機要想解決這個問題所需要的時間就已經超過了100年。

上面的第三類問題,是今天人類在數學和計算機領域的難題,如果大家有興趣可以了解一下。(自行百度:P問題 NP問題 NPC問題)

======================== BONUS2 =========================

關於8:存儲器類型。

8中所涉及的存儲器,其實只是硬碟、U盤等存儲器的原理。這類存儲器的特點是:存放在其中的數據斷電後仍然存在,但讀數據和寫數據都非常慢

而計算機在運行時會產生很多臨時的數據,這些數據只是為當下正在運行的一些程序而服務的,使用計算機的用戶並不關心這些數據。相應程序結束或者計算機斷電後這些數據就沒有存在的必要了。

比如有如下程序:

sum = 1 + 2

執行這一行的時候,計算機先計算等號右面的值 ---- 結果是3,然後把3存放在一個臨時的地方,最後再把這個臨時地方里的數值3賦值給sum。(為什麼不能直接賦值給sum而要經過一個「臨時的地方」:等號右側的計算,必須在計算機內專門做計算工作的晶元 --- 也就是CPU內完成,完成計算後的結果只能保存在CPU的臨時存儲空間里,然後sum才能拿到這個值)這裡的這個「臨時存放的地方」,它只是為這個程序而暫時服務一下,過後就不再需要它了。於此同時,我們需要它的讀寫數據的速度要足夠快。如果我們用硬碟來「臨時存放這個3」,那麼計算機執行這麼一行代碼也得需要好幾秒因為計算機讀寫硬碟的速度是非常慢的。

因此我們還需要一種存儲器:斷電後數據不需要存在,但是讀寫數據的速度要夠快

這種存儲器被稱為寄存器

寄存器是用觸發器實現的而觸發器是用上面的4中所提到的各種門實現的。

舉一個最簡單的例子:

其中,i為這個寄存器的輸入,比如如果i是0(1),則表示希望該寄存器存儲0(1);o為寄存器的輸出,即該寄存器存儲的值是多少;s的作用則是「告訴寄存器要工作了」,即當s為1時,寄存器會把i輸入的值存儲下來 ---- 也就是從o輸出來。

另外,圖中的1、2、3和4為與非門

與門電路是:兩個輸入都為1時輸出才為1,否則輸出均為0。即只要輸入有0輸出就是0。

與非門電路是:兩個輸入都為1時輸出才為0,否則輸出均為1。即只要輸入有0輸出就是1。

容易想到,與非門電路就是與門電路的輸出的地方再接一個非門電路而實現的。

假設某個時刻,s是1,i是0,則根據上述與非門的規則,我們可以的到如下結果:

s = 1 i = 0

a = 1 b = 0

c = 1 o = 0

然後,此時我們讓s也變成0,同理,可以得出o還是0;再然後,我們讓i等於1,得出o還是0。這也就意味著,該寄存器成功保存了當s為1時i的值 ---- 也就是0。

同樣地,當s和i均為1時,o為1;隨後讓s為0、i為1和s為0、i為0時,o均為1。也就是說此時寄存器是保存了1(當然還是在s為1時i的值)。

這就是寄存器的大致原理 ---- 只要不要斷電保持1、2、3和4的正常工作,那麼輸入即使消失了也會被電路保存下來。

當然,實際的電路要比這個複雜,有興趣的朋友可以自行閱讀相關資料。

======================= BONUS3 ======================

關於5:邏輯電路實現四則運算。

我們先來考慮如何實現一位數(二進位)加法。

0 + 0 = 0(無進位:進位為0)

1 + 0 = 1(無進位:進位為0)

0 + 1 = 1(無進位:進位為0)

1 + 1 = 0(有進位:進位為1)

於是問題轉化成了:

如何用那些門電路,設計一個邏輯電路,實現上述等號左側的兩個數值為輸入,等號右側的內容為輸出(顯然,這裡需要兩個輸出,一個是加法結果另一個是進位)?

經過分析不難發現,加法的特點是兩個輸入一致時結果為0,兩個輸入不一致時結果為1;同時,只有當兩個輸入均為1時,進位才為1,其他情況進位均為0。

很顯然,進位是一個與門電路。而結果呢?則是一種叫異或的邏輯關係:相同為0相異為1。

異或門電路有多種實現方式,這裡只舉一例:只用與非門(BONUS2中已講過)實現異或門電路:

到此,我們就可以實現上面的一位數的加法了:

AB為輸入,S為加法的結果,C為進位。S的左側為異或門,C的左側為與門。

這就是一個半加器。

至於半加器如何做成全加器,這裡就不談了,無非就是把多個半加器串聯起來。有興趣的朋友請自行了解。

實現了加法,則可以實現減法,因為減法等效於「加負數」;也可以實現乘法,因為乘法可以轉換成多次相加(例如,3 * 3等效於3 + 3 + 3);也可以實現除法,因為除法可以轉換成多次相減(例如,7 / 2等效於7 - 2 - 2 - 2:一共減了3次且結果為1,因此7 / 2的結果為:商3餘1)。

至此,四則運算全部實現。

最後只剩下了一個問題:如何實現負數。

以1和-1為例:

假設我們的加法器可以進行8位二進位的運算,我們用最高位表示符號位:0為正數1為負數

則1為:00000001

-1為:10000001

但這樣1 + (-1)的結果並不是0,而是10000010,也就是-2。

於是我們需要改變負數的表達方式:按位取反(除了符號位)。

註:我們叫最原始的表達方式為原碼,按位取反後的表達方式為反碼。正數的反碼和原碼一樣,負數的反碼則是原碼按位取反後所得。

因此,-1 = (10000001)原 = (11111110)反。

此時,1 + (-1) = (00000001)反 + (11111110)反 = (11111111)反 = (10000000)原 = -0

但這樣還有一個問題,就是0和-0的表達方式不同:

0為:00000000

而-0為:10000000

對負數的反碼做進一步處理:加1,形成補碼。(正數的補碼仍然是原碼本身)

1 + (-1) = (00000001)反 + (11111110)反 = (00000001)補 + (11111111)補 = (00000000)補 = (00000000)原 = 0

註:由於一共只能表示8位,所以最後溢出的進位被丟棄掉了。

說到這裡,一定有朋友會說:

你別急!等一下!你說的這些原碼反碼補碼都是理論,具體到電路中到底是如何實現的呢?

對於這樣的問題我就不在這裡做詳細的解釋了,因為它的原理和上面講的門電路一樣,無非就是通過不同的門電路的組合而形成一個複雜但有一定功能的「片子」罷了。(片子是行業黑話,高大上的說法是「晶元」)

以原碼變反碼為例,其實你可以自己設計一個片子,來實現:

輸入是八個0或1,輸出也是八個0或1。其中,當最左側的輸入為1時,則其他七位的數字全部取反輸出;而如果最左側的輸入為0時,則八個數字全部原樣輸出。

在這裡我僅以一位數字加上符號位(最左側的位)來簡單解釋一下:

設符號位為A,輸入為B,輸出為C。容易得到如下的表(這個表叫真值表,是設計片子的重要手段)

A B C
0 0 0
0 1 1
1 0 1
1 1 0

再重複一下:當符號位是0時,數字位原樣輸出;當符號位是1時,數字位取反輸出。

觀察真值表可得:當AB相等時C為0,AB不等時C為1。即,相同為0,相異為1 ---- 這就是一個異或門了。如何實現異或門上面已經說過了。可見,通過原碼求出反碼只需要用若干個異或門即可實現。

簡單總結一下如何設計電路(這種和01打交道的電路叫做邏輯電路):

第一步:先分析需求,即你要輸入什麼、輸出什麼,根據輸入和輸出,做出真值表;

第二步:觀察真值表,找到規律;

第三步:根據上面找到的規律,依據各種門電路的特點,完成邏輯電路的設計。

其中,第二步有的時候會非常複雜,難以一下子找到規律,如果不找規律就直接去設計邏輯電路,那麼設計出來的邏輯電路會非常複雜。那麼如何解決「找規律難」的問題呢?這就是大學裡相關專業的數字電路課程的任務了......這裡就不介紹了,如有興趣,請自行百度:如何通過真值表寫出邏輯表達式。我們設計邏輯電路其實就是根據邏輯表達式去做的,故只要確保邏輯表達式已經最簡化,那麼設計出來的邏輯電路就一定是最簡單的。

以上,就實現了整數的四則運算,至於如何實現小數的運算,大同小異,只不過在計算機里是用科學計數法來表示的,在處理上會更加複雜。

====================== 什麼是機器思維 =======================

問題一:如果要計算1加到100,應該怎麼算呢?

人類:等差數列求和,有公式的:(1 + 100) * 100 / 2 = 5050

機器:愚蠢的人類啊,我們機器最大的長處就是「規律性地計算非常快」,所以我們不需要公式,只需要老老實實從1一直加到100就好了。

a = 1
result = 0
語句標籤(label):
如果(a &> 100)
那麼(執行label2)
a = a + 1
執行標籤:label
語句標籤(label2):顯示(result)
程序結束

問題二:如何判斷一個數字是否為偶數。

人類:用這個數字除以2,如果餘數為0,則為偶數,否則為奇數。

機器:告訴你,人類,在我這裡,/表示除法,%表示求余,我是不是很友好呀?

初級程序員:

a = 用戶輸入
result = a % 2
如果(result = 0)
那麼(顯示(您輸入的數字為偶數))
否則
顯示(您輸入的數字為奇數)
程序結束

機器:呵呵噠,愚蠢的人類,看來即使是程序員也不能真正懂我們的感受!我好傷心,你們知道要我做求余運算需要花多大的力氣嗎......

高級程序員:

a = 用戶輸入
result = a 1 // 按位與運算
如果(result = 0)
那麼(顯示(您輸入的數字為偶數))
否則
顯示(您輸入的數字為奇數)
程序結束

註:按位與運算(與運算:0 0 = 0 1 0 = 0 1 = 0 1 1 = 1)

5 3 (十進位) = 101 011 (二進位) = 001 (二進位) = 1 (十進位)

奇數的二進位的最後一位一定是1,偶數的二進位的最後一位一定是0

機器:眼淚嘩嘩的!這種位運算我最喜歡啦,因為對我來說最省力最簡單了,這樣的程序員給我來一打!



讀了些計算機組成原理和操作系統方面的書,寫了篇筆記,自認是淺出的。

首發在這裡好書一起讀(82):電腦的原理

總覽

電腦看似複雜,其實硬體無非四種:CPU,內存,磁碟,輸入輸出設備,重要性依次遞減。硬體之上,操作系統是一層,應用程序又一層。

一通電,CPU就會開始運行,從磁碟中將操作系統讀取到內存中,CPU按時間順序從內存中的操作系統里,讀取指令執行之。

操作系統使CPU迅速地在許多進程中切換,以造成進程們在並發運行的假象。

進程的誕生是,將程序從磁碟載入內存,並分配內存空間用於儲存數據,這裝載程序的內存和儲存數據的內存構成了進程的載體,等分配了CPU,進程即開始運行。

CPU的分配以優先順序和時間片為準,讓重要程度不同的各個進程並發運行。

用戶的操作通過輸入設備(或定時器)產生中斷,操作系統的主循環會發現中斷,並分配給適當的響應中斷的程序。

程序的執行結果,體現在硬體的變化上,如輸出設備給出畫面或聲音,讓用戶看到或聽到。

操作系統

操作系統位於「底層硬體」和「應用程序」之間,向下管理硬體資源,向上提供高級介面。

在CPU的計算能力之上,操作系統提供了調度的能力,來運行進程、顯示圖畫、響應事件。

進程

在物理實現上,每個進程都是內存中的一個局部,這個局部既放了程序代碼,又提供了儲存狀態的場所。

這些局部被CPU輪流訪問,形成並發的假象。這「輪流」並非讓各進程盲目地平攤CPU時間,而是有主次之分。在CPU的輪流訪問期間,進程也因而在創建、就緒、運行、阻塞、終止這五種狀態間切換。

CPU的輪流訪問根據「優先順序」和「時間片」,優先順序是每個程序有的一個數字,數字大小關係決定了優先順序高低關係,優先順序低的進程要把CPU讓給優先順序高的,時間片指一小段時間,當一個進程用完一個時間片,CPU就重新選擇下個時間片該運行誰。

因為CPU的程序計數器和各種寄存器都只有一份,當CPU切換到另一個進程時,上一個進程就需要把「我執行到哪了」保存下來,存到自己的「進程上下文」中,下次CPU切換回來時,把狀態裝回給CPU,繼續運行,就好像什麼都沒發生過。

在任務管理器里查看進程列表,我們最關心的是內存佔用和CPU佔用,正說明了進程是「內存的片段」與「CPU的分配」的結合體。

進程可能是無限循環,也可能不是。如果不是,則處理完事務即停止,如果是,則不斷監聽事件以響應。

內存管理

如果內存有限,程序需要的內存超過實際內存,則需要虛擬內存:將磁碟的一部分用作「虛擬內存」,把內存中暫時不執行的程序外放到「虛擬內存」中,騰出來地方來運行需要執行的程序,當外放的程序需要執行時再換回到內存中。

分給某個程序的內存局部,在物理上未必是連續的,而是將真實內存分為固定大小的頁,程序使用其中的若干頁。這樣能更靈活地使用。

文件

只有磁碟能斷電存儲,CPU和內存都不行,而且磁碟存儲空間遠大於CPU和內存,因此全部程序和數據都保存在磁碟上。保存的方式就是文件。

文件的本質是磁碟上的局部。磁碟分配方式與內存類似,也是劃分為若干大小相等的小單元,文件按需使用其中一些小單元。

把磁碟看做輸入輸出設備也無妨,畢竟它相對於CPU和內存,是「外人」,內存從磁碟讀,屬於「輸入」,內存向磁碟寫,屬於「輸出」。

反過來,把輸入輸出設備,看做文件,也無妨,反正內存都是要向它們讀和寫的,只是看待它們的視角的差別。

輸入輸出設備

電腦想有用,就要跟用戶有交互,跟用戶的交互,全靠輸入輸出設備。用戶給電腦信息,就是輸入,電腦給用戶信息,就是輸出。

你對顯示器、鍵盤、滑鼠,肯定比對CPU、內存、磁碟更熟悉,對吧?因為顯示器它們是「在一線面向用戶」的。

引申,像計算機一樣高效地使用大腦

人在同一時間只能做一件事,一心多用都是偽並發,切換上下文有成本。

應該把多而不重要的知識存到「磁碟」里,即筆記本、收藏夾等處,待用時方載入「內存」即大腦里即可,以減輕記憶負擔。

最常用的知識才有必要記住在「內存」里,這取用方便,減少每次都從「磁碟」載入的成本,這是緩存的價值所在。

寫在後面

這一個月每天都在讀《30天自製操作系統》,同時使用大學時教材《計算機組成原理》《計算機三級教程PC技術》《現代操作系統》做參考,來進行對計算機底層硬體、操作系統的學習和鞏固。

作為應用程序員,編寫的代碼都處於太高層,以至於覺得技術含量太差,久了對自己就不滿意。一直都想好好複習下基礎,但總因辛苦而堅持不下來。

後來終於想明白,基礎的鞏固和複習,應該是一個非常長期的工作,一蹴而就的想法非常不現實。於是決定用四個月時間,分別鞏固計算機組成原理、操作系統、網路、演算法的知識。這第一個月,做的是學習計算機組成原理的工作,還順帶看了操作系統。

機箱一拆開,電路板和連線怪複雜神秘的,嚇人,其實那都不重要。最重要的三樣東西,CPU,內存,磁碟,體積都有限,形狀也規整,第四重要的就是機箱外面的顯示器、鍵盤、滑鼠這些總稱為輸入輸出設備的東西了。

CPU是「原動力」,就像四驅車上的電機,嗚嗚轉著,很蠢很機械。但能動起來就是萬歲。人們開動腦筋,通過齒輪、皮帶等零件,讓電機旋轉的單調動作轉為更有意義的動作。對CPU也是一樣,既然它能讀取指令,並忠實地執行之,那就好辦了,只要我們把指令寫出花來,電腦的功能就會豐富錦簇。就像劉邦和張良,既然張良說什麼劉邦都言聽計從,那雖然劉邦能力有限,但只要張良智計百出,一切就都有可能了。

當然,在地位上,張良是劉邦的下級。在計算機體系中,操作系統是硬體的上層,其實計算機體系里,越上層許可權越小,上層能做的,下層全能做,下層能做的,上層能不能做?那要看下層高不高興暴露出調用的介面。所以,最上層的應用程序員,其實是被勒定在一個非常逼仄局促的空間里跳舞,在某個「平台」之上,利用平台好心提供的API,來使出渾身解數實現功能。API越簡潔好用,應用程序員越顯得無腦,其實未必是程序員蠢,而是飯已經熟了,再巧的媳婦也只能做做把它盛到碗里這種沒有技術含量的工作,這跟「巧婦難為無米之炊」恰好是反的,好比「一鍵刷機」,程序給力到這個程度,只負責按一下按鈕的人,即使有很高水平,也顯不出來了。

不過,越上層固然離硬體越遠,但抽象層次越高,離具體業務是越近的。搭積木搭得好,未必就不如造積木造得好那個人光榮。畢竟,用戶要的,還是一個完成品,比如用戶要一個城堡,那光造出來積木還是不行,需要有人搭起來。這搭積木,就需要很多造積木的人用不到的知識,例如空間想像力、圖紙繪製能力、讓城堡穩固不倒的力學知識、色彩搭配知識等等。每個層次,都有每個層次需要的專業技能,但人的認知總是有局限的,傾向重視自己的技能,輕視別人的技能,來達到滿意自己、鄙視他人的心理訴求,其實這還是「成績單的思維」,是沒必要的。

但有些知識是無論造積木,還是搭積木的人都需要的,這就是所謂「通用知識」,例如數學知識、英語知識等等,當然計算機基礎知識也是,這樣看來計算機考研的課程都很有意義,比想像中的合理多了。不過現在學習資源這麼豐富,書籍、視頻、官網等等,即使不考研也可以自學,差別還是在肯不肯用功上。

話題回到劉邦張良,力量當然都在劉邦手上,但因為劉邦對張良言聽計從,張良指哪裡,劉邦的力量就打向哪裡,這跟力量都在張良手上也沒什麼區別了。硬體和操作系統的關係也正像如此,雖然操作系統是「被動的」,只負責定義指令,執行權在CPU手裡,但CPU這麼聽話,看成操作系統實際掌了權也就可以了:明明只有內存、磁碟的「容器」,卻能無中生有地給抽象出「進程」「地址空間」「文件」這些可用性極強的概念來,操作系統真是把CPU內存和硬碟玩出了花來。

不過,同一份操作系統要賣給全世界,全世界各種用戶需要的功能,這操作系統不可能全都包含了,所以操作系統索性也放權,操作系統提供出來API,世界各地程序員可以利用這API開發自己的程序,操作系統就負責把這些程序載入內存里作為進程來跑,當用戶有操作時,操作系統負責把這操作事件交給適當的進程來響應。應用程序員能立足的基本點,其實就是操作系統提供的API們,當然,操作系統提供的API還是很豐富的,只要用好了各種程序都能開發出來,否則這操作系統也賣不出去呀。

對計算機的理解,最終就是到這裡,CPU提供主循環,操作系統在這主循環中運行,提供次級主循環,應用程序的進程又在次級主循環中運行,提供三級主循環,當用戶有操作了,CPU把操作交給操作系統,操作系統再交給應用程序進程,應用程序進程的三級主循環得知了事件的到來,再把它分發給響應事件的函數來處理,這個函數來做具體該做的事,比如把數據寫向某個地方,或者在界面上顯示某些東西,這顯示某些東西,在本質上,其實也是向顯卡內存中寫些東西。

計算機組成原理和操作系統的學習,就先到這裡(以後會慢慢修正和補充),下個月來複習數據結構和演算法的知識,感覺還是這好玩,我都等不及了,至於計算機網路,下下個月再學,對這知識實在不很感興趣。那對演算法感興趣的朋友,下個月咱們再見。


O太簡單啦=====

我們先構造一個模型,解決簡單的計數問題:1+1等於多少呢?

下面,請伸開你粉嫩的小爪,伸出一個手指,對的,一個。好了,下面,再伸出一個手指,對的,再伸出一個。然後,數一下有多少個手指,娃哈哈(請娃哈哈支付廣告植入的費用),兩個手指呢,一個簡單的計算機就這樣做出來啦。

糟啦,大一點的數手指不夠用怎麼辦?於是我們的老祖宗機智得發明了算盤,簡直是逆襲呀。

好啦,現在我們做一個減法的,這個我不講了,容易挨罵。

好了,現在我們要一個乘法的:2x3,先伸出兩個手指頭,再伸出兩個手指頭,伸3次,哎呀,等於6嘛,這個太簡單啦,23得六,小學生都知道啦,還用算嗎?好吧,還是你聰明噠。

嘿嘿,現在問題來啦,37x89等於多少捏,終於算出來啦,啊,還要算78x47呀,還要算289x476呀,還要算7809x1467呀,好複雜呀,不想算捏,好無聊捏,不就是重複得加么,要不我賣個萌,你幫我算算嘛,什麼,要我耍雙截棍兒?哥至少也是個男人,賣腎不賣藝的好伐。

好吧,搞個什麼東西,乘以多少就讓他加多少次就好了撒。

於是,想到了這貨:

大齒輪,小齒輪,小齒輪,大齒輪。

每個齒輪分成十個小格子,左邊的齒輪轉動一周下一個齒輪就轉動一格。

咦,這個東西好像很熟悉的嘛,對了,不就是機械錶嘛,那個我很熟呀。

哎呀,好聰明呀,就是時鐘呀。

好啦,我們用這個來計算37X89

先把小齒輪轉到3.7圈,然後再轉3.7圈,再轉3.7圈。。。轉89次,好啦,有結果啦

哎呀,手都痛拉。

什麼,還要算別的,哎呀,手好疼啊,嗚嗚嗚

好吧,再想想辦法,讓他自己轉嘛

如果能做一個東西,上面直接寫上數字,要算什麼就按什麼,要加就加,要減就減,要乘就乘,要除就除該多好啊

。。。。。。。

登登登登

一代神機橫空出世拉

哇塞,好複雜呀,怎麼跨度這麼大呀?

怎麼會,很簡單的呀,就是轉齒輪的呀,什麼,沒看到齒輪,這裡看這裡瞧

啊,這都暈啦?你還需要多喝露露呀(露露請支付廣告植入費用)

別,輕點

好啦,我也不懂嘛,就隨便貼貼的啦,反正你就知道轉齒輪就行啦呢

貌似這個有點複雜呀,腦袋裡都是漿糊啦,整理整理吧,就是這麼工作的呀

好啦,現在你知道這玩意是怎麼工作的了吧(請聯想支付廣告費用撒,千八百的也行,么么噠)

什麼,你不懂?

很簡單的嘛,跟你掰手指一樣,無非就是10個手指不夠用了,所以加上了腳,腳趾也不夠用了,就加上了別人的手指,算的慢了,就搞個齒輪轉,技術這玩意,就是這麼一點點改進出來的撒。

什麼,你還想聽的仔細一點?

好吧,這玩意經過偉大的人類的深度改造,已經相當的複雜了。

不過,基本的原理就跟掰手指是一樣的,知道了這些就可以跟別人吹牛啦。

什麼,你還不滿足?還想了解清楚一點?

那麼,你可要準備好啊,革命道路充滿了艱難險阻呀。

哎呀,爸爸去哪兒(自覺點撒)開始啦,先看看再說吧。

、、、、、、、、、、

那麼現在,看來你確實想知道,那麼請點贊。

恩恩恩

鑒於這兩天比較閑,就慢慢道來吧,

故事要從很久很久以前說起

。。。

好啦,林子大了,總要養很多的鳥。鳥人多啦,就要開始分工啦,建築工你就蓋房子嘛,鐵匠你就打你的鐵嘛,農民,你就種你的地嘛,各司其職,團結奮進,為共產主義而奮鬥(農民的對白一定是這樣:老子自己種的莊稼自己吃,餓死丫的)。

什麼,你要當皇帝,呸,皇帝是我的!!!!

好啦,現在開始為我們的計算機分分工吧:先要把要計算的東西敲進去撒,我們就叫他輸入部分,然後他計算,我們叫他計算部分,然後他把他的技術結果顯示給我們看,我們叫他顯示部分。好啦,清楚明了:輸入~計算~輸出,是不是簡單明了呀。

好啦,現在我們來想想我們周圍的東西:什麼東西最重要呢?

金子,銀子,美女,帥哥?你們這些愚蠢的人類,是時間呀。

額,當然了,美女也是很重要的。嘻嘻嘻

那麼我們當然想到了鐘錶,鐘錶是不是一種計算機呢?咦,好像是呢,他不就是每秒跳一下,每秒跳一下么?計算完了就通過輸出部分來讓我們看到罷了,只是沒有輸入部分而已。

好了,再想想,想到了什麼?電扇,輸入部分就是那個遙控器(什麼,你家的電風扇沒有遙控器?這裡看這裡瞧~~~好吧,鑒於前面的都沒支付廣告費,所以此處招租,先給錢,再上船),計算部分就是那個馬達什麼的,什麼,看不到輸出部分?輸出部分就是葉子在轉呀,衰,這個輸出不僅可以看,而且可以讓你涼快撒。

好啦,現在你涼快啦,也搞清楚輸入/計算/輸出啦,那麼,有個人就要閃亮登場啦,音樂想起來,這個人就是

愛迪生

好吧,其實這事跟愛迪生其實關係也不大,嘻嘻嘻

這一切的開始都要從燈泡說起,對的,沒錯,是燈泡。愛迪生當年發明燈泡的時候,為了試驗壽命比較長的材料,於是在碳絲旁邊加了一小段銅絲,想要減少發熱,想想都醉了,簡直就是異想天開,真不知道老愛當時是怎麼想的。結果實驗當然就失敗了,但是,老愛意外滴發現銅絲竟然產生了微軟的電流,老愛當時一心要搞燈泡,這東西整明白了也沒人給發銀子,自然就放棄了,但是機智滴將這個現象命名為愛迪生效應。哎呀,真是對老愛無比佩服,好吧,現在我要將人們朝夢想狂奔的現象命名為夢奔效應。

夢奔效應!

夢奔效應!!

夢奔效應!!!

記住這個,以後將有大用處,嘻嘻嘻,順便我也成名啦

這一切的就從愛迪生效應開始,神奇吧。

轟轟烈烈,海枯石爛的愛情都從一個眼神開始,想想也是奇妙,好吧。

這個故事告訴我們,沒事多向身邊的美女,帥哥多拋媚眼撒,吼吼吼

好啦,今天先這樣,我要去拋媚眼啦

好吧,拋媚眼也是需要顏值的。。。。

=================================

圖片來自網路,侵刪

=================================


具體怎麼判斷的我不知道,這要有電子電路的相關知識。

大概是用戶用輸入設備發出的指令通過匯流排到達cpu,然後cpu進行識別,比如你要打開某某程序,那麼cpu就會通知硬碟把某個文件送到內存當中,硬碟通過定址把程序找到通過匯流排送到內存,程序在內存中運行,數據通過編碼和解碼通過輸出設備輸出到顯示器或者其他輸出設備上。

cpu用來控制和計算,內存用來存儲當前運行的程序和數據,硬碟負責永久保存信息和數據,輸入設備負責接受用戶的操作指令,匯流排負責傳輸指令、地址和數據,輸出設備負責把計算機處理的過程或者結果顯示給用戶看。

圖像的顯示方法是根據拓展名來分類的,每一種類型的圖片繪製的方法都不大一樣。

0和1代表兩種狀態,0是沒電,1是有電。


當年學數電、模電時,講到後面陡然覺得所有的看起來複雜的邏輯關係,都可以分解簡化成幾個最基本的形式的組合,複雜的晶元都是由小晶元組合、而小晶元不斷拆分,最後其實也就是最基本的邏輯關係一層一層疊加起來的,而這個基本的單元就是所有電路書都會一開始講的,與、或、非(不要問我與、或、非是由啥構成的……好吧,我就知道你會問,底下就沒有電路啦,靠的是二極體、三極體之類的實現邏輯關係的……好吧,我知道你還會問它們是怎麼構成的……它們在往下材料物理啦,就是靠一些材料性質和人為的工藝製造,使它具有通電和不通電的狀態(0和1),好了,這真的是最底層了,不要再問了……)

想通了這點,然後我就開始跟好哥們吹牛逼了:你給我足夠多的與、或、非門,我就能跟你拼出一台電腦。(無視我…)

其實就跟哥們吹牛逼後不久,真還沒一個學期,就看到一條新聞,一個小夥子用兩年多時間,只用門電路搭建出了一台電腦(看到新聞時分分鐘嚇跪了…真有人這麼做…)

不多說,看圖(手機流量黨迴避):

外觀:

能運行BASIC程序:

主板正面:

調試中:

大招:

是不是偏題了?

餓,我意思是,無論你現在看起來電腦多麼複雜不可思議,記住,它的的確確是由最簡單的邏輯電路,經過幾代人的努力,才搭建成現在這個樣子的。

當然,這還只是硬體,缺了軟體也一無是處,不要再問我軟體是怎麼思考的…相信我,它也是由一些最基本的函數,慢慢搭建起來的。


@《編碼的奧秘》


爪機作答,在讀學生,學術不精有錯誤歡迎指正,用的是英文教材所以不大清楚中文翻譯有可能不太準確。寫的這麼差應該沒人會轉載…

電子與計算機工程專業的學習課程一般是這樣的(一些需要考慮的時序啊冒險hazard啊我就略過不說了):

1 電路基礎

電阻R、電感L、電容C你總得知道吧?

2 邏輯電路

半導體(半導體之後會有專門的課程,這個階段簡單理解PN節有什麼性質不深究原理)

→_→與或非門

→_→鎖存器latch觸發器flip flop寄存器register寄存器堆register file存儲器RAMROM、運算單元ALU、選擇器MUX、解碼器decoder……

→_→控制單元controller數據通路datapath(插一句,有點類似於MVC開發框架中的C和M(model))

→_→有限狀態機FSM: (複製自百度百科)有限狀態機是指輸出取決於過去輸入部分和當前輸入部分的時序邏輯電路。………… 在實際的應用中,根據有限狀態機是否使用輸入信號,設計人員經常將其分為Moore型有限狀態機和Mealy型有限狀態機兩種類型。1 Moore型有限狀態機其輸出信號僅與當前狀態有關,即可以把Moore型有限狀態的輸出看成是當前狀態的函數。2 Mealy型有限狀態機其輸出信號不僅與當前狀態有關,而且還與所有的輸入信號有關,即可以把Mealy型有限狀態機的輸出看成是當前狀態和所有輸入信號的函數。

→_→一些基本元件工作原理(硬體方面的實現方式),內存啊硬碟啊匯流排啊blabla

3 計算機原理

processor:1/0機器碼怎麼通過與非門輸出控制信號,通過選擇器MUX選出所需的來源數據運算結果目標寄存器

…基友喊我出去玩,留坑

4 編譯原理

5 操作系統

6 某編程語言精通

6.1 CS這麼賺錢,投身之

6.2 頸椎病眼科疾病關節疼痛…治療指南

7 網路

99 怎麼談戀愛π_π


看著都在講計算機的實現啊,我來講講計算機的理論原理吧。

計算機的實質一般認為是一個集合和一組狀態轉移函數。集合列舉了計算機存在的所有可能的狀態(比如寄存器狀態和內存外存狀態),而狀態轉移函數就是從一個狀態轉移到另外一個狀態的操作,換句話說類似cpu的指令。

舉個例子,我們假設一台電腦只有一個1bit寄存器reg,只支持一條inc指令用於給給該寄存器加一,那麼這台電腦可以表述為

A = {reg=1B, reg=0B}

inc: f(reg) =&> reg+=1

對於大多數通用計算機,這個狀態集合是非常大的,所以我們一般會忽略掉計算機的數學理論實質。

p.s. 搞演算法的人應該都知道動態規劃,搞編譯器的也應該都玩過自動機,說實話這些東西其實就是計算機的實質。


推薦 《深入理解計算機系統》。

如果是給小學生科普,可把計算機自比你的大腦。


摘自《三體》

《三體》第二級的場景開始時沒有大的變化,仍舊是詭異寒冷的黎明,仍是那座大金字塔,但這次,金字塔的形狀又恢復到東方樣式。

汪淼聽到一陣清脆的金屬撞擊聲,這聲音反而更襯託了這寒冷黎明的寂靜。他循聲望去,看到金字塔根基處有兩個黑影在閃動,灰暗的晨光中有金屬的寒光在黑影間閃耀,那是兩個人在斗劍。等目光適應了這昏暗後,汪淼大致看清了那兩個格鬥者的模樣,從金字塔的形狀看這應該是在東方國度,但那卻是兩個歐洲人,穿戴大致是歐洲十六七世紀的樣子。格鬥中個子矮的那人低頭閃過一劍,銀白色的假髮掉在地上。幾個回合之後,又有一個人繞過金字塔的拐角奔了過來,試圖勸止這場格鬥,但雙方那呼嘯的劍使他不敢上前,他大喊道:

「停下來!你們這兩個無聊的人!你們就沒有一點責任心嗎?如果世界文明沒有未來,你們那點榮譽算個屁!」

兩名劍客誰都不理他,專心於他們的戰鬥。個子高的那位突然痛叫一聲,劍「噹啷」一聲掉到地上,捂著胳膊跑了。另一位追了幾步,沖著失利者的背影啐了一口。

「呸,無恥之徒!」他彎腰拾起了自己的假髮,抬頭看到了汪淼,就用劍指著逃跑者的方向說,「他居然說微積分是他發明的!」說著他戴上假髮,一隻手捂著胸口對汪淼行了個歐式的鞠躬禮,「伊薩克·牛頓。」

「那麼跑了的那一位是萊布尼茨了?」汪淼問。

「是他,無恥之徒!呸!!其實我根本不屑於同他爭奪這項名譽,力學三定律的發現,就已經使我成為僅次於上帝的人,從星球運行到細胞分裂,無不遵從於這三個偉大的定律。現在有了微積分這個強有力的數學工具,以三定律為基礎,掌握三個太陽運行的規律指日可待。」

「沒有那麼簡單。」勸架的人說,「你考慮過計算量嗎?我看過你列出的那一系列微分方程,好像不可能求出解析解,只能求數值解,計算量之大,就是全世界的數學家不停地工作,到世界末日也算不完。當然,如果不能儘快掌握太陽運行的規律,世界未日也不是大遠了。」他說著也向汪淼鞠躬,姿勢更現代些。「馮·諾伊曼(註:現代計算機技術的莫基者)。」

「你帶我們千里迢迢來東方,不就是為了解決這些方程的計算問題嗎?」牛頓說,然後轉向汪淼,「同來的還有維納(註:控制論創始人)和剛才那個敗類,在馬達加斯加遭遇海盜時,維納為掩護我們隻身阻擊海盜,英勇犧牲。」

「計算機需要到東方來製造嗎?」汪淼不解地問馮·諾伊曼。

馮·諾伊曼和牛頓面面相覷,「計算機?計算機器?!有這種東西?」

「您不知道計算機?那,你打算用什麼來進行那些海量計算呢?」

馮·諾伊曼瞪大眼晴看著汪淼,似乎很不理解他的問題,「用什麼?當然是用人了!這世界上除了人之外難道真的還有什麼東西會計算嗎?」

「可您說過,全世界的數學家都不夠用。」

「我們不會用數學家的,我們用普通人,普通勞動力,但需要的數量巨大.最少要三千萬人!這是數學的人海戰術。」

「普通人?三千萬?!」汪淼驚奇萬分,「我要是沒理解錯,這是一個百分之九十的人都是文盲的時代,您要找三千萬個懂微積分的?」

「有一個川軍的笑話你聽說過嗎?」馮·諾伊曼掏出一枝粗雪茄,咬開頭點了起來,「士兵們練隊列,因為文化水平極低,連軍官喊一二一都聽不懂,於是軍官想了一個辦法,讓每個士兵左腳穿草鞋右腳穿布鞋.走隊列時喊:草孩布孩、草孩布孩……(四川話)我們需要這樣水平的士兵就行,但要三干萬。」

聽到這個近現代的笑話,汪淼知道面前這位不是程序而是人,而且幾乎可以肯定是中國人。

「這樣龐大的軍隊,難以想像。」汪淼搖搖頭說。

「所以我們來找秦始皇。」牛頓指指金字塔說。

「現在這裡還是他在統治嗎?」汪淼四下打量了一下問,看到守衛金字塔入口的士兵確買穿看秦代簡潔的軟甲兵服,拿著長戟。對《三體》中歷史的錯亂,汪淼已經見多不怪了。

「整個世界都要由他統治了,他擁有一支三干多萬人的大軍,準備去征服歐洲。好了,讓我們去見他吧。」馮·諾伊曼一手指著金字塔入口說,然後又指著牛頓說,「把劍扔了!」

牛頓「噹啷」一聲扔下劍,三人走進入口,走到門廊盡頭就要進入大殿時,一名衛士堅持讓他們都脫光衣服,牛頓抗議說我們是著名學者,沒有暗器!雙方僵持之時,大殿內傳來一聲低沉的男音:「是發現三定律的西洋人嗎?讓他們進來。」走進大殿,三人看到秦嬴政正在殿中踱著步.長衣的後擺和那柄著名的長劍都拖在地上。他轉身看著三位學者,汪淼立刻發現,那是紂王和格里高利教皇的眼睛。

「你們的來意我知道了,你們是西洋人,幹嗎不去找凱撒?他的帝國疆域廣大,應該能湊齊三千萬大軍吧。」

「可是尊敬的皇帝,您知道那是一支什麼樣的軍隊嗎?您知道那個帝國現在是什麼樣子嗎?在宏偉的羅馬城內,穿過城市的河流都被嚴重污染,你知道是什麼所致嗎?」

「軍工企業?」

「不不,偉大的皇帝,是羅馬人暴飲暴食後的嘔吐物!那些貴族赴宴時餐桌下放著擔架,吃得走不動時就讓僕人抬回去。整個帝國陷入荒淫無度的泥潭中不可自拔,就是組成了三千萬大軍,也不可能具備進行這種偉大計算的素質和體力。」

「這朕知道,」秦始皇說,「但凱撒正在清醒過來,在重整軍備,西洋人的智慧也是件可怕的東西,你們並不比東方人聰明,但想對了路子,比如他能看出太陽有三個,你能想出那三條定律,都是很了不起的,東方人暫時做不到。而我現在還沒有能力遠征西洋,我的船不行,從陸上走.漫長的供應線無法維持。」

「所以,偉大的皇帝,您的帝國還要發展!」馮·諾伊曼不失時機地說,「如果掌握了太陽運行的規律,你就能充分利用每一個恆紀元,同時避免亂紀元帶來的損失,這樣發展速度比西洋要快得多。請你相信我們,我們是學者,只要能用三定律和微積分準確預測太陽的運行,不在乎誰征服統治世界。」

「朕當然需要預測太陽的運行,但你們讓我集結三千萬大軍,至少要首先向朕演示一下這種計算如何進行吧。」

「陛下,請給我三個士兵,我將為您演示。」馮·諾伊曼興奮起來。

「三個?只要三個嗎?朕可以輕易給你三千個。」秦始皇用不信任的目光掃視看著馮·諾伊曼。

「偉大的陛下,您剛才提到東方人在科學思維上的缺陷,就是因為你們沒有意識到,複雜的宇宙萬物其實是由最簡單的單元構成的。我只要三個,陛下。」

秦始皇揮手召來了三名士兵,他們都很年輕,與秦國的其他士兵一樣,一舉一動像聽從命令的機器。

「我不知道你們的名字,」馮·諾伊曼拍拍前兩個士兵的肩,「你們兩個負責信號輸入,就叫『入1』、『入2』吧.」他又指指最後一名士兵,「你,負責信號輸出.就叫『出』吧,」他伸手撥動三名士兵,「這樣,站成一個三角形,出是頂端,入1和入2是底邊。」

「哼,你讓他們成楔形攻擊隊形不就行了?」秦始皇輕蔑地看著馮·諾伊曼。牛頓不知從什麼地方掏出六面小旗.三白三黑,馮·諾伊曼接過來分給三名士兵,每人一白一黑,說:「白色代表0,黑色代表1。好,現在聽我說,出,你轉身看著入1和入2,如果他們都舉黑旗,你就舉黑旗,其他的情況你都舉白旗,這種情況有三種:入l白,入2黑;入l黑,入2白;入1、入2都是白。」

「我覺得你應該換種顏色,白旗代表投降。」秦始皇說。

興奮中的馮·諾伊曼沒有理睬皇帝,對三名士兵大聲命令:「現在開始運行!入1入2,你們每人隨意舉旗,好,舉!好,再舉!舉!」

入1和入2同時舉了三次旗,第一次是黑黑,第二次是白黑,第三次是黑白。出都進行了正確反應,分別舉起了一次黑和兩次白。

「很好,運行正確,陛下,您的士兵很聰明!」

「這事兒傻瓜都會,你能告訴聯,他們在幹什麼嗎?」秦始皇一臉困惑地問。

「這三個人組成了一個計算系統的部件,是門部件的一種,叫『與門』。」馮·諾伊曼說完停了一會兒,好讓皇帝理解。

秦始皇面無表情地說:「聯是夠鬱悶的,好,繼續。」

馮·諾伊曼轉向排成三角陣的三名士兵:「我們構建下一個部件。你,出,只要看到入1和入2中有一個人舉黑旗,你就舉黑旗,這種情況有三種組合——黑黑、白黑、黑白,剩下的一種情況——白白,你就舉白旗。明白了嗎?好孩子,你真聰明,門部件的正確運行你是關鍵,好好乾,皇帝會獎賞你的!下面開始運行:舉!好,再舉!再舉!好極了,運行正常,陛下,這個門部件叫或門。」

然後,馮·諾伊曼又用三名士兵構建了與非門、或非門、異或門、同或門和三態門,最後只用兩名士兵構建了最簡單的非門,出總是舉與入顏色相反的旗。

馮·諾伊曼對皇帝鞠躬說:「現在,陛下,所有的門部件都已演示完畢,這很簡單不是嗎?任何三名士兵經過一小時的訓練就可以掌握。」

「他們不需要學更多的東西了嗎?」秦始皇問。

「不需要,我們組建一千萬個這樣的門部件,再將這些部件組合成一個系統,這個系統就能進行我們所需要的運算,解出那些預測太陽運行的微分方程。這個系統,我們把它叫做……嗯,叫做……」

「計算機。」汪淼說。

「啊——好!」馮·諾伊曼對汪淼豎起一根指頭,「計算機,這個名字好,整個系統實際上就是一部龐大的機器,是有史以來最複雜的機器!」

遊戲時間加快.三個月過去了。

秦始皇、牛頓、馮,諾伊曼和汪淼站在金字塔頂部的平台上,這個平台與汪淼和墨子相遇時的很相似,架設著大量的天文觀測儀器,其中有一部分是歐洲近代的設備。在他們下方,三千萬秦國軍隊宏偉的方陣鋪展在大地上,這是一個邊長六公里的正方形。在初升的太陽下,方陣凝固了似的紋絲不動,彷彿一張由三千萬個兵馬俑構成的巨毯,但飛翔的鳥群誤入這巨毯上空時,立刻感到了下方濃重的殺氣,鳥群頓時大亂,驚慌混亂地散開或繞行汪淼在心裡算了算,如果全人類站成這樣一個方陣,面積也不過是上海浦東大小,比起它表現的力量,這方陣更顯示了文明的脆弱。

「陛下,您的軍隊真是舉世無雙,這麼短的時間,就完成了如此複雜的訓練。」馮·諾伊曼對秦始皇讚歎道。

「雖然整體上複雜,但每個士兵要做的很簡單,比起以前為粉碎馬其頓方陣進行的訓練來,這算不了什麼。」秦始皇按著長劍劍柄說。

「上帝也保佑,連著兩個這樣長的恆紀元。」牛頓說。

「即使是亂紀元,朕的軍隊也照樣訓練,以後,他們也會在亂紀元完成你們的計算。」秦始皇驕傲地掃視著方陣說。

「那麼,請陛下發出您偉大的號令吧!」馮·諾伊曼用激動得發顫的聲音說。

秦始皇點點頭,一名衛士奔跑過來,握住皇帝的劍柄向後退了幾步,抽出了那柄皇帝本人無法抽出的青銅長劍.然後上前跪下將劍呈給皇帝,秦始皇對著長空揚起長劍,高聲喊道:

「成計算機隊列!」

金字塔四角的四尊青銅大鼎同時轟地燃燒起來,站滿了金字塔面向方陣一面坡牆的士兵用宏大的合唱將始皇帝的號令傳誦下去:

「成計算機隊列——」

下面的大地上,方陣均勻的色彩開始出現擾動,複雜精細的迴路結構浮現出來,並漸漸充滿了整個方陣,十分鐘後,大地上出現了一塊三十六平方公里的計算機主板。

馮·諾伊曼指著下方巨大的人列迴路開始介紹:「陛下,我們把這台計算機命名為『秦一號』。請看,那裡,中心部分,是CPU,是計算機的核心計算元件.由您最精銳的五個軍團構成,對照這張圖您可以看到裡面的加法器、寄存器、堆棧存貯器;外圍整齊的部分是內存,構建這部分時我們發現人手不夠,好在這部分每個單元的動作最簡單,就訓練每個士兵拿多種顏色的旗幟,組合起來後,一個人就能同時完成最初二十個人的操作,這就使內存容量達到了運行『秦1.0』操作系統的最低要求;你再看那條貫穿整個陣列的通道,還有那些在通道上待命的輕轉兵,那是BUS,系統匯流排,負責在整個系統間傳遞信息。」

「匯流排結構是個偉大的發明,新的插件,最大可由十個軍團構成,能夠快捷地掛接到匯流排上運行,這使得『秦一號』的硬體擴展和升級十分便利;再看最遠處那一邊,可能要用望遠鏡才能看清,那是外存,我們又用了哥白尼起的名字,叫它『硬碟』,那是由三百萬名文化程度較高的人構成,您上次坑儒時把他們留下是對了,他們每個人手中都有一個記錄本和筆,負責記錄運算結果,當然,他們最大的工作量還是作為虛擬內存,存貯中間運算結果,運算速度的瓶頸就在他們那裡。這兒,離我們最近的地方,是顯示陣列,能顯示計算機運行的主要狀態參數。」

馮·諾伊曼和牛頓搬來一個一人多高的大紙卷,在秦始皇面前展開來,當紙卷展到盡頭時,汪淼一陣頭皮發緊,但他想像中的匕首並沒有出現,面前只有一張寫滿符號的大紙,那些符號都是蠅頭大小,密密麻麻,看上去與下面的計算機陣列一樣令人頭暈目眩。

「陛下,這是就我們開發的『秦1.0』版操作系統,計算軟體將在它上面運行。陛下您看——」馮·諾伊曼指指下面的人列計算機,這陣列是硬體,而這張紙上寫的是軟體,硬體和軟體,就如同琴和樂譜的關係。」說著他和牛頓又展開了一張同樣大小的紙,」陛下,這就是數值法解那一組微分方程的軟體,將天文觀測得到的三個太陽在某一時間斷面的運動矢量輸入,它的運行就能為我們預測以後任一時刻太陽的運行狀態。我們這次計算,將對以後兩年太陽的運行做出完整預測,每組預測值的時間間隔為一百二十小時。」

秦始皇點點頭:「那就開始吧。」

馮·諾伊曼雙手過頂,莊嚴地喊道:「奉聖上御旨,計算機啟動!系統自檢!」

在金字塔的中部,一排旗手用旗語發出指令,一時間,下面大地上三千萬人構成的巨型主板彷彿液化了,充滿了細密的粼粼波光,那是幾千萬面小旗在揮動。在靠近金字塔底部的顯示陣列中,一條由無數面綠色大旗構成的進度條在延伸著,標示著自檢的進度。十分鐘後,進度條走到了頭。

「自檢完成!引導程序運行!操作系統載入!!"

下面,貫穿人列計算機的系統匯流排上的輕轉兵快速運動起來,匯流排立刻變成了一條湍急的河流.這河流沿途又分成無數條細小的支流,滲入到各個模塊陣列之中。很快,黑白旗的漣漪演化成洶湧的浪潮,激蕩在整塊主板上。中央的CPU區激蕩最為劇烈,像一片燃燒的火藥。突然,彷彿火藥燃盡,CPU區的擾動漸漸平靜下來,最後竟完全靜止了,以它為圓心,這靜止向各個方向飛快擴散開來,像快速封凍的海面,最後整塊主板大部分靜止了,其間只有一些零星的死循環在以不變的節奏沒有生氣地閃動著,顯示陣列中出現了閃動的紅色。

「系統鎖死!」一名信號官高喊。故障原因很快查清,是CPU狀態寄存器中的一個門電路運行出錯。

「系統重新熱啟動!」馮·諾伊受胸有成竹地命令道。

「慢!」牛頓揮手制止了信號官,轉身一臉陰毒地對秦始皇說,「陛下,為了系統的穩定運行,對故障率較高的部件應該採取一些維修措施。」

秦始皇拄著長劍說:「更換出錯部件,組成那個部件的所有兵卒,斬!以後故障照此辦理。」

馮·諾伊曼厭惡地看了牛頓一眼,看著一組利劍出鞘的騎兵衝進主板,「維修」了故障部件後,重新發布了熱啟動命令。這次啟動十分順利,二十分鐘後,三體世界的馮,諾伊曼結構人列計算機在「秦1.0」操作系統下進入運行狀態。

「啟動太陽軌道計算軟體『Three-Body l.0』!」牛頓聲嘶力竭地發令,「啟動計算主控!載入差分模塊!載入有限元模塊!載入譜方法模塊……調入初始條件參數!計算啟動!!」

主板上波光粼粼,顯示陣列上的各色標誌此起彼伏地閃動,人列計算機開始了漫長的計算。

「真是很有意思。」秦始皇手指壯觀的計算機說,「每個人如此簡單的行為,竟產生了如此複雜的大東西!歐洲人罵朕獨裁暴政,扼殺了社會的創造力,其實在嚴格紀律約束下的大量的人,合為一個整體後也能產生偉大的智慧。」

「偉大的始皇帝,這是機器的機械運行,不是智慧。這些普通卑賤的人都是一個個0,只有在最前面加上您這樣一個1,他們的整體才有意義。」牛頓帶著奉承的微笑說。

「噁心的哲學。」馮·諾伊曼瞥了牛頓一眼說,「如果到時候,按你的理論和數學模型計算出的結果與預測不符,你我可就連零都不是了。」

「對,那時你們可真的什麼都不是了!」秦始皇說著,拂袖而去。

時光飛逝,人列計算機運行了一年零四個月,除去程序的調試時間,實際計算時間約一年兩個月,這期間,只因亂紀元過分惡劣的氣候中斷過兩次,但計算機存貯了中斷現場數據,都成功地從斷點恢復了運行。當秦始皇和歐洲學者們再次登上金字塔頂部時,第一階段的計算已經完成,這批結果數據,精確地描述了以後兩年太陽運行的軌道狀況。

這是一個寒冷的黎明,徹夜照耀著巨大主板的無數火炬已經熄滅,計算機完成後,「秦1.0」進入待機狀態,主板表面洶湧的浪濤變成了平靜的微波。

馮·諾伊曼和牛頓將記錄著運行結果的長卷呈獻給秦始皇,牛頓說:「偉大的始皇帝,本來計算在三天前就已完成,之所以今天才將結果獻給您,是因為按照計算結果,這一段漫長的寒夜就要結束,我們將迎來一個長恆紀元的第一次日出,這個恆紀元將持續一年之久,從太陽軌道參數看,氣候宜人,請讓您的王國從脫水中復活吧。」

「朕的國家自計算開始後從來就沒有脫水過!」秦始皇一把抓過紙卷,沒好氣地說,「朕傾大秦之國力來維持計算機的運行,已經耗盡了所有儲備,到現在,為此餓死累死和凍死熱死的人不計其數。」秦始皇用紙卷指指遠方,晨光中,可以看到從主板各個邊緣,有幾十條白線在大地上輻射向各個方向,消失在遙遠的天邊,那是全國各地向主板運送供給品的道路。

「陛下,您將發現這是值得的,在掌握了太陽的運行規律後,秦國將飛速發展,很快會比計算開始之前強大許多倍。」馮.諾伊曼說。

「按照計算,太陽就要升起來了,陛下,享受您的榮耀吧!」

彷彿是回應牛頓的話,一輪紅日升出地平線,將金字塔和人列計算機籠罩在一片金光中。主板上爆發出一陣海潮般的歡呼聲。

這時,一個人急匆匆地跑來,可能跑得太急了,下跪時氣喘吁吁地趴到了地上,這是秦國的天文大臣。

「聖上,不好了,計算有誤!大難將臨!!」他哭喊道。

「你胡說些什麼?!」沒等秦始皇答話,牛頓就踹了天文大臣一腳,「沒看到太陽精確地按照計算結果的時間升起了嗎?」

「可……」大臣半直起身,一手指著太陽,「那是幾顆太陽?!」

所有的人看著正在上升的太陽,都莫名其妙。「大臣,你是受過正統西洋教育的劍橋留學博士,不會愚蠢到不識數吧,太陽當然是一顆,而且氣溫適宜。」馮·諾伊曼說。

「不,是三顆!!」大臣抽泣著說,「另外兩顆,在這一顆的後面!」

人們再次看著太陽,對大臣的話都感到很茫然。

「帝國天文台的觀測表明,現在出現了亘古罕有的『三日連珠』,三顆太陽成一條直線,以相同的角速度圍繞我們的行星運行!這樣,我們的行星和三顆太陽,四者始終處於一條直線上!我們的世界始終在這條線的頂端!」

「你肯定觀察無誤?」牛頓抓住大臣的衣領問。

「當然無誤!觀測是由帝國天文台的西洋天文學家進行的,其中有開普勒和赫歇爾,他們使用從歐洲進口的世界上最大的望遠鏡!」

牛頓鬆開天文大臣直起身來,汪淼發現他臉色發白,但表情卻欣喜若狂,他兩手抱在胸前對秦始皇說:「最偉大的、最尊敬的皇帝,這可是吉兆中的吉兆啊!現在,三顆太陽圍繞著我們的行星旋轉,您的帝國成了宇宙中心!這是上帝對我們努力的獎賞!待我去再詳細查閱一下計算結果,我會證實這一點的!」說完,趁所有人都還在茫然中,他顧自溜走;稍後,有人報告說牛頓爵士偷了一匹快馬去向不明。

一陣緊張的沉默後,汪淼突然說:「陛下,請把您的劍抽出來。」

「幹什麼?」秦始皇不解地問,但還是對旁邊他的抽劍兵做了個手式,那士兵立刻為皇帝抽出長劍。

汪淼說:「您揮一揮。」

秦始皇接過劍,揮了幾下,面露驚奇之色:「咦,怎麼這麼輕?!」

「遊戲的V裝具不能模擬失重感覺,否則我們也會感覺到自己輕了許多。」

「看下面!看那馬,那人!」有人驚叫,大家一齊向下看去,看到金字塔腳下一隊行進中的騎兵,所有的戰馬似乎是在地面上飄行,飄很遠四蹄才著地一次;他們又看到幾個奔跑中的人,他們邁一步就能躍出十幾米,但每一躍的下落很緩慢。金字塔上,一名衛士試著跳了一下,輕易地跳上了三米多的高度。

「怎麼回事?!」秦始皇驚恐地看著那個剛剛跳上半空的人緩緩下落。

「聖上,三顆太陽成一線直對我們的行星.它們的引力以相同的方向疊加到這裡……」天文大臣解釋說,同時發現自己雙腳離地已經橫在半空,其他人也相繼以不同角度傾斜著,雙腳都離開了地面開始飄浮,他們像一群不會游泳的落水者那樣笨拙地揮動者四肢試圖穩定自己,但還是不時相撞。這時,他們剛剛飄離的地面像蛛網似的開裂了,裂縫迅速擴大,在瀰漫的灰漿和天崩地裂般的巨響中,下面的金字塔裂解為組成它的無數塊巨石。透過緩緩飄浮的巨石間的縫隙,汪淼看到了正在變形中的大殿,那尊煮過伏毅的大鼎和他曾被縛於其上的火刑柱在大殿正中飄浮著。

太陽升到了正空,飄浮著的一切:人、巨石、天文儀器、青銅大鼎,都開始緩緩上升,並在很快加速。汪淼無意中掃了一眼平原上的人列計算機,看到了一幅噩夢般的畫面:組成主板的三千萬人正在飄離地面,飛快上升,像一大片被吸塵器吸起的螞蟻群。在他們飛離的大地上,竟清晰地留下了主板電路的印痕,那一大片只有從高空才能一覽全貌的精細複雜的圖紋,將在遙遠的未來成為令下一個三體文明困惑的遺迹。汪淼抬頭望去,天空被一片斑駁怪異的雲層所覆蓋,這雲是由塵埃、石塊、人體和其他雜物構成,太陽在雲層後面閃耀著。在遠方,汪淼看到了連綿的透明山脈在緩緩上升,那山脈晶瑩剔透,在閃閃發光中變幻著形狀,那是被吸向太空的海洋!

三體世界表面的一切都被吸向太陽。

汪淼環顧四周,看到了馮·諾伊曼和秦始皇,馮·諾伊曼在飄浮中對秦始皇大聲說著什麼,但沒有聲音發出,只出現了一行小小的字幕:「……我想到了,用電元件!用電元件做成門電路,組成計算機!那樣計算機的速度要快許多倍!體積也要小許多,估計用一幢小樓就放下了……陛下,您在聽我說嗎?」

秦始皇揮著長劍砍向馮·諾伊曼,後者蹬著旁邊飄浮的一塊巨石躲開了,長劍砍在巨石上,迸出一片火花斷成兩截。緊接著,這塊巨石與另一塊相撞,將秦始皇夾在中間,碎石和血肉橫飛,慘不忍睹,但汪淼沒有聽到相撞的巨響,周圍已經一片死寂,由於空氣散失,聲音也不存在了。飄浮在空中的人體在真空中血液沸騰,吐出內臟,變成了一團團由體液化成的冰晶雲圍繞著的形狀怪異的東西。由於大氣層消失,天空已經變得漆黑,從三體世界被吸入太空的一切反射著太陽光,在太空中構成了一片燦爛的星雲,這星雲形成巨大的旋渦,流向最終的歸宿——太陽。

汪淼這時發現太陽的形狀在變化,他馬上明白,自己實際上是看到了另外兩顆太陽,它們都從第一顆太陽後面露出一小部分,從這個方向看,三隻疊加的太陽構成了宇宙中一隻明亮的眼睛。以三顆太陽的隊列為背景,字幕出現:

第184號文明在「三日連珠」的引力疊加中毀滅了,該文明進化至科學革命和工業革命。

這次文明中,牛頓建立了低速狀態下的經典力學體系,同時,由於微積分和馮·諾伊曼結構計算機的發明,奠定了對三體運動進行定量數學分析的基礎。

——————————————————————————《三體》


相信我,只要看一本書《穿越計算機的迷霧》,你就會豁然開朗。通過淺顯的表述來讓你了解計算機的始末。


高低電平控制互補金屬氧化物場效應晶體管實現0和1,電容和電感組合用於實現微積分運算。


計算機如何讀懂二進位編碼:

注意這裡說的是二進位編碼,不是單純的二進位數,是嚴格按照一定的格式來編碼的。

讀指令這些操作都是靠計算機里的CPU來進行的。

拿我們常用的手機來說,它的CPU里有一個控制寄存器。

所謂的控制寄存器就是一堆開關,每個開關有兩個狀態就是開和關,開對應的是0,關對應的是1。

這樣我們可以用一組二進位數來描述這個控制寄存器的狀態。

而開關的多少就是一條指令的長度。我們經常見的32位機,就是一條指令長為32,就是這個控制有32個小開關。同樣64位機有64個。反過來,如果你可以用雙手來模擬一個CPU的控制寄存器,那麼你就是一個10位機,一條指令長為10。

在寄存器內,各個位有的是單獨工作的,有的是好幾個一起工作的,我們把他們分成一個個小組。有的組是表示狀態的,只能讀不能寫,或者說寫了也沒用。而有的組是可以操作的。而且這些組是可以在一定條件下改變的,用來實現某個功能。

對於那些可以操作的寄存器是有特定功能的,比如說有個開關你撥一下,它就伸出個腿什麼的,你撥回去它就縮回來。

這樣我們按照上面的格式寫給CPU一串二進位編碼,他就能按照我們意願完成某個動作。這個編碼格式其實就跟你喊:電腦啊,電腦,給我個雞腿吧!或者:媽,我餓了。是一樣一樣的。這些二進位編碼動輒幾十位,電腦好認了,可是讓我們這幫程序員怎麼讀?既然上面說的格式固定,那就用幾個字元來代替寄存器組吧!這樣彙編語言就誕生了,當然彙編是按照機器的模式來的,還是不好理解,那C等等一些語言就出來了。而我們也有代碼碼了!想想就開心啊

我們寫好的程序會按照CPU能認識的格式來生成二進位文件,每條指令的長度固定。這樣CPU每次讀一點,按照讀出的指令來完成相應的動作,然後再讀下一條。這樣就可以完成我們交給它的任務了。

當然不同的CPU的控制寄存器個數不相同,但是大致原理都差不多的


題主剛接觸編程嗎?我沒惡意,我剛學c的時候也一直想弄明白這個問題。

計算機怎麼能看懂我寫的程序(編譯後)呢?於是我跑去學了彙編,哦,CPU有一套邏輯電路,那些所謂的01隻不過是代表電路的通斷……後來問題又來了,那CPU是怎麼操做外設的呢?

於是我買了套51單片機,琢磨了幾天。哦,我們可以通過指令,像操作寄存器一樣操作CPU引腳的通斷,而這些通斷送到具體的外設後被外設翻譯成有意義的指令或者數據……

嗯?貌似沒什麼問題了。。。。

有過了段日子,咦,內存這種東西是怎麼保存數據的呢?為什麼有ROM和RAM之分?

屁顛屁顛的到囊盡天下智慧的圖書館借來了微機原理……

然後,然後……最後一個問題來了……我要知道這些幹嘛?(微機原理看不懂……


沒有過硬的意志力 千萬別報計算機專業

-------------------------------------------------

雖然這個說的很極端、很不中聽、很多人反對,但是這就是殘酷的現實!


為方便閱讀,就直接把評論回複復制到回答裡面了。

電磁學,量子力學,半導體物理,模擬電路,數字電路,計算機體系結構,彙編語言,C語言,編譯原理,數據結構,操作系統,linux內核分析。嗯,等學完這些,你就基本懂了

計算機依靠集成數字電路來工作,而集成電路都要用半導體來做。數字電路的基礎就是與或非三種門電路,一般的邏輯門都是要用MOS(Metal Oxide Semiconductor),中文也叫金屬氧化物半導體。而MOS結構能夠工作的關鍵就是偏置電壓不同導致半導體能級發生變化,也就可以控制載流子的變化(自由電子和共價鍵失去電子的空穴)。而隨著載流子密度的變化,就可以控制電流大小和通斷。利用這個原理就可以製造與或非等數字門電路。在這裡面所說的能級、共價鍵、載流子實際上就是量子力學和麥克斯韋電磁理論結合應用的結果,我記得是用薛定諤方程然後結合電磁理論進行近似推導的結論。

那麼計算出來之後,人眼是怎麼看到的呢?

顯示器工作的關鍵就是通過電壓控制像素點的發光強度,oled是直接控制發光二極體的發光強度,而LCD的背光強度是一樣的,而通過控制液晶的透光率來控制顯示器的最終的發光強度。液晶各向異性晶體,折射率與方向有關。電壓-&>液晶分子的角度-&>液晶的折射率-&>透光率-&>顯示器表面的不同亮度-&>人眼識別;

詳情請參考半導體物理、數字電路、計算機體系結構、物理光學等相關教科書。


推薦《編碼 隱匿在計算機軟硬體後的語言》這本書,我這個高中生都能看懂...


單本書版 深入了解計算機系統

多本書版 計算機組成原理+計算機體系(系統)結構+計算機操作系統+編譯原理+數據結構+演算法。。。等等看完這些貌似可以找工作了


推薦閱讀

編碼:隱匿在計算機軟硬體背後的語言


推薦閱讀:

2017年,你看了啥很好的計算機的博客/書/視頻?
如何評價同濟大學軟體學院?
如何理解NAT使Ipsec更複雜?
吳軍博士是一個怎樣的人?
隨身攜帶什麼東西可以標榜你喜歡數學or物理or計算機科學or ... ?

TAG:編程 | 計算機 | 科技 | 計算機科學 |