1. 程式人生 > >自己動手做計算機-電腦科學的本質

自己動手做計算機-電腦科學的本質

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

什麼是計算機?電腦科學很高深嗎?也許你會聯想到積體電路,聯想到組合語言,作業系統之類的,然而真正的計算機本質上是很簡單的,你自己都能自己動手做出來,所謂的積體電路只不過是實現計算機的一種方式而已,它能使計算機變得更快,更小,它純屬於另一個範疇,至於程式語言,那便是另另一個範疇了,如果你理解了計算機的本質,再理解這些概念就不會覺得難了。
     本文我就帶著想理解本質的同道中人自己動手做一臺可以“程式設計”的計算機。首先計算機不一定非要是電子的,它完全可以是機械的,本文中我做的這臺機器就不是電子的,因為如果想搞電子計算機,那還真得學學積體電路,我的機器是電氣 + 機械的,然而它卻實現馮諾依曼模型的很多特性,比如指令儲存,順序執行等,然而它畢竟很是簡陋,不過了解計算機執行機理,那足夠了。

     我要是說電燈也是一臺計算機科班出身的人一定認為我在侮辱他們的學科,而實際上它確實是一臺計算機, why ?你按下了開關,然後燈就亮了,你關閉開關,燈就滅了,你的動作就是指令,而電燈的亮和滅就是輸出,只不過它不是自動的,它依賴於你去按動開關發出指令,如果它能自己開啟或者關閉那就完美了。如果說資料可程式設計可儲存,那麼磁帶錄音機或者 dvd 光碟機就是這一類,然而介質上所儲存的都是資料,並不含指令,對於這一類機器,是沒有“取指令”一說的,電機在不停的轉動,帶動磁帶前進或者光碟轉動,因而資料就不停的變換,出現不同的聲音或者圖畫。要想實現一個馮氏機器,必須做到兩點: 1. 指令可以儲存在介質上; 2. 順序執行指令。那麼以下開始動手吧:

背景

1.手上物質方面有導線若干根,乾電池若干塊,粗鐵釘若干枚,可用剪刀剪開的鐵片若干片,輕彈簧若干,燈泡若干個,木板一大塊,另有剪刀,刨子,薄塑料板;

2.腦中瞭解中學時學的安培力,洛侖茲力,知道電流的流向,知道電磁感應這些小知識點;

3.沒聽過三極體和二極體,沒聽過積體電路,不知道二進位制編碼知識,更不知道什麼是程式設計以及程式語言;

4.小的時候玩過變形金剛。

第四點和計算機有什麼關係呢?變形金剛不僅僅是一個玩具,它的設計師一定是個天才,如此精細的機關恰到好處的結合在一起,最終它們協同工作使得變形金剛可以變成各種形狀,它使我一直都想自己動手做點什麼類似變形金剛的東西,一是為了回憶一下童年,二是個人沒有其它的不良愛好。

準備工作:

1.將導線纏繞於粗鐵釘上,然後導線兩端通上電,這就是一個磁鐵了,當不通電時,磁性就消了,可以親手試一下。(我儘量避免出現任何專業術語,比如電磁鐵,繼電器,左右手法則等,否則逃離了積體電路之後,又會面對理論物理),如下圖所示,通電線圈上面有一個可以自動復位到水平位置的鐵片:

a

2.上述1中,電池反著接,磁極將會反向,,但是不管怎麼接通電後都會對上面的鐵片吸引,也可實驗為證。

3.通電線圈產生的磁性足以吸引鐵片。

以下是我的計算機的電路圖示:

b

圖例如下:

深黑色的粗線:硬鐵棍

深黑色的細線:硬塑料棍

深黑色的圓球:鐵質導電體

淺黑色細線:軟地指導線

大線圈:線圈1

小線圈:線圈2

大線圈上面的帶有復位彈簧的開關:g1

小線圈上方的攜帶有紙帶的小鐵塊:鐵塊1

橘黃顏色的圓形:燈泡

其執行原理如下:

1.g1閉合,線圈1產生磁性,將鐵片1吸引下來;線圈2產生磁性,將帶有膠紙帶的鐵塊1吸引下來;

2.由於鐵片1被吸引下來,正好鐵片3打在位置1,此時如果該位置有小方塊鐵片,則迴路2閉合,燈亮,如果沒有小方塊鐵片,則迴路2斷路,燈不亮;

3.由於鐵片1被吸引下來,線圈1電流是逐漸減小的(這是因為磁通量變化了,引起了感應電流),鐵片1又由於彈簧彈力和磁力逐漸減小回到水平原位,g1又一次閉合;

4.由於鐵片1被吸引下來,線圈2電流逐漸減小,當磁力小到和鐵塊的靜摩擦力相等的時候,攜帶紙帶的鐵塊停止移動;

4.鐵片1被彈回,g1閉合,線圈1和線圈2通電,鐵片1被吸引,攜帶膠紙帶的鐵塊1受到線圈2的磁力推進到下一個位置;

5....重複,直到紙帶到達終點。

這個計算機麻雀雖小,但五臟俱全,擁有“取指”和“執行”兩大重要的模組,甚至擁有“電源”和“時鐘”等必不可少的模組,取指和執行互相作用,互相影響,這就是它和磁帶錄音機的區別,否則我完全可以設計一個每秒可以將紙帶移動一釐米的機械裝置,然後將它和線圈1獨立分開,單獨安裝,雖然這也可以實現和我的如上設計一樣的效果,然而其取指模組和線圈1是獨立的,也就是如果把線圈1作為時鐘發生器的話,它將很不容易或者無法將g1的開閉資訊,也就是時鐘訊號傳輸到取指模組從而影響它,也不容易實現“分支”和“跳轉”(根據執行的結果-迴路2的通斷,影響線圈2的通電或者斷開,以實現連續吸引鐵塊1使得“指令”-紙帶到達特定的位置)

     還有一個問題,根據上面的線路圖連線起來的“計算機”並不一定如你所願的執行,因為木板的粗糙度以及線圈2的纏繞圈數和鐵釘粗細影響了帶有紙帶小鐵塊的滑動距離,從而也就影響了“取指”和“執行”的時序,然而在長時間內確實是合理的,如果想要得到理想的效果,你不得不進行一些微調。

     這臺計算機完全實現了“指令儲存”,紙帶上有沒有小方塊鐵片就是指令。如果膠紙帶上面的小方塊鐵片在每一格的排列為下面的形式:

“小方塊鐵片+小方塊鐵片+白紙+小方塊鐵片+白紙”

則燈泡的序列就是“亮亮滅亮滅”

     一個設計良好的計算機好在牽一髮而動全身,這裡的“一發”就是這個可“開關震盪”的“時鐘”,而“全身”則是由於“時鐘”的影響而斷開或者閉合的“線圈2”,“線圈X...從而影響執行模組和取指模組,要知道,機器的執行順序和我們所熟知的流程圖有所區別,對於每一條指令,機器是“一次性”執行完畢的,一旦時鐘有了訊號,取指會自動取出一條指令,然後其餘所有的負責執行該指令的電路幾乎一同開始運作,完成指令的執行。另外可以由於這個“一發”之被牽制,而使得執行模組和取指模組相互影響,達到跳轉的目的,然而要實現這樣的功能,我們不得不把線路再理一下,使它更加模組化,我們有必要將時鐘和取指模組分開,如下圖:

c

然後再按照現代處理器的形式將取指和執行都封裝成模組,甚至按照現代計算機的形式,將記憶體的概念引出,用記憶體這個概念代替紙帶,如下圖所示:

d

然而想實現我們前面所說的分支,跳轉,容易嗎?這裡有兩個問題:第一,紙帶是一個機械裝置,而記憶體中儲存的卻是01,也就是記憶體中的元素本身就是一個電壓(1)或者一個等勢體(0),並不是“有小方塊鐵片”或者“沒有小方塊鐵片”,因此這必然需要將記憶體本身也實現“線圈化”,具體如何做,我們一會再談;第二,我們的分支和跳轉需要執行的結果影響下一步的執行,這就需要在執行模組和取指模組之間互相影響,分支需要判斷,而跳轉需要引出“地址”的概念,這些都是需要解決的問題。

     然而以上的問題對於我們理解計算機的本質已經不重要了,它們屬於計算機設計的範疇,但是為了做事及作文有頭有尾,我還是做一番敘述吧。針對上述的兩個問題,首先要說的是,你還真得學點數位電路方面的知識,其實也就三個電路比較重要,學會了這三個,其它再複雜的電路都逃不過這三者的組合,它們就是三個閘電路,分別是非門,與門,或門。道生一,有了門,神說一生二,於是有了是與非,於是就有了二進位制,非門如此而生,與門和或門僅僅是神星期日的產物,此後再沒有別的能使神引以為豪的發明了。我們的世界就是是和非組成的,就連我們自己都是,計算機沒有經過我們複雜的進化,因此它只能從基本的是和非做起,是與非組成了整個計算機系統,因此只要我們只要能用電池和線圈構造出這三個閘電路,那麼通過它們不同的組合,我們就可以造出一臺類似銀河三型的超級計算機,那麼非門如何實現呢?如下圖,很簡單,在以下:

e

與門呢?看吧:

f

或門呢?如下:

自己想吧,哈哈

有了這三者,還有什麼能難倒我們的呢?“地址”是什麼概念?它在是與非的世界中無非就是一串01,接下來,我們迴歸到地址的本源,它無非一個索引,我們說需要實現從地址2(以《另一個視角解讀計算機編碼-補碼編碼》這篇blog的前提為準,以8位作為計算機表示的數字,地址2就是00000010)讀出這裡所儲存的數字,我們需要做些什麼呢?首先我們需要實現一個儲存器節點,接下來我們需要實現一個多路選擇器和多路複用器,除了科班出身的人都知道這無非一個矩陣,一般的人我想也能設計出精妙的結構,剩下的只是你有沒有耐心將你的設計做出來了。如果你做出來了,那你會看到,你的計算機足有N間房子那麼大(N>3),你會驚訝自己完成了20世紀中葉這個星球上智慧最高的人的創舉,而實際上你僅僅需要的是耐心,畢竟你只需要使用一些諸如電池,鐵片,鐵釘子之類隨處可以買到的器件,然而你需要付出的最重要的不是搞清楚這些器件如何能和積體電路等效(事實上確實等效),而是搞明白如何去組合它們,這才是最重要的事,真正的電腦科學家所作的就是這個事情,因此上世紀中葉即使那些科學家比現在的優秀,而他們卻只能搞出幾間房子那麼大的機器(現在的隨便一個學生都能使用酷睿處理器),如果你能搞到現代處理器的圖紙,那麼剩下的工作就是無休止的連線和焊接了。

     在我的最基本的設計中,紙帶上有沒有小方塊鐵片構成了10,可以看出,整臺機器只需要“時鐘”不停運作,取指和執行都是有條不紊的執行,整個過程沒有依靠機器外的任何因素,執行的結果是什麼完全取決於你的紙帶上在什麼位置貼上了小方塊鐵片。終於有一天,有人發現了自然界存在一種物質,可以實現這三個所謂的基本“門”,於是這種物質被大規模採用,因此積體電路科學也就由運而生,計算機再也不需使用鐵釘,線圈之類的半機械,半電氣開關了,大自然的神奇物質為我們完成了很多的事。

     至於程式設計問題,這就更簡單了,程式設計語言和機器硬體的介面就是指令集,我們知道,IntelAMD是兩家處理器公司,它們的處理器實現肯定不同,然而它們的處理器上卻都能執行一套指令,這就是ia32相容指令,這就涉及了一個叫做指令集的概念,一個指令集只是一個介面,至於怎麼實現就無所謂了,各個廠商可以有不同的實現,只要相同的輸入能得到相同的輸出即可,比如一個指令為a b(可以是add a),它被編碼為xyyx(x,y01),這個xyyx在首先存在指令暫存器中,比如是0110,當它執行的時候,指令暫存器會在相應的導線上分別發射出“0V”,“12V”,“12V”,“0V”的電壓,以表示0110,這樣這些電壓就會影響接下來的執行序列,如果xyyxadd a(a是一個暫存器)的編碼話,那麼這個012120的電壓肯定要影響暫存器a的各相關引線,引起它的值加1,這一切都是通過三個門的組合導致的哦,而且這一切都是同時發生的哦!

     我們從機器的最底層的硬體開到指令集,速度迅猛,如果我現在開始說c語言的事,你會覺得意外嗎?應該不會吧!但是我不想再細說c語言了,只想說一個要點,那就是c語言最重要的就是提供了一個方便的方式操作記憶體地址而不是暫存器,這樣c語言就和具體的機器分離了。組合語言程式設計師考慮的是暫存器和地址,而c語言程式設計師考慮的是指標(地址的另一個名字),那麼java呢?它連指標都沒有了,它關注的是“物件”。從珍妮紡紗機到超級計算機,歷經N個世紀,從業者從專業人員到現在的隨便一個學生,真可謂是機器智慧的一大進步,因此也就不要怪java程式設計師不懂處理器流水線啦,正是有了一幫人專門搞流水線,才會有另一幫人被解放出來專業搞業務,這正是社會化分工的優良產物啊!

參考:Charles Petzold所著《編碼:隱匿在計算機軟硬體背後的語言》

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述