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

來源:互聯網
上載者:User

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

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

背景

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

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

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

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

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

準備工作:

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


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

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

以下是我的電腦的電路圖示:


圖例如下:

深黑色的粗線:硬鐵棍

深黑色的細線:硬塑料棍

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

淺黑色細線:軟地指導線

大線圈:線圈
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

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


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


然而想實現我們前面所說的分支,跳轉,容易嗎?這裡有兩個問題:第一,紙帶是一個機械裝置,而記憶體中儲存的卻是
0

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

    

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


與門呢?看吧:


或門呢?如下:

自己想吧,哈哈

有了這三者,還有什麼能難倒我們的呢?“地址”是什麼概念?它在是與非的世界中無非就是一串
0

1
,接下來,我們迴歸到地址的本源,它無非一個索引,我們說需要實現從地址
2

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

    

在我的最基本的設計中,紙帶上有沒有小方塊鐵片構成了
1

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

    

至於編程問題,這就更簡單了,程式設計語言和機器硬體的介面就是指令集,我們知道,
Intel

AMD
是兩家處理器公司,它們的處理器實現肯定不同,然而它們的處理器上卻都能運行一套指令,這就是
ia32
相容指令,這就涉及了一個叫做指令集的概念,一個指令集只是一個介面,至於怎麼實現就無所謂了,各個廠商可以有不同的實現,只要相同的輸入能得到相同的輸出即可,比如一個指令為
a b(
可以是
add a)
,它被編碼為
xyyx(x,y

0

1)
,這個
xyyx
在首先存在指令寄存器中,比如是
0110
,當它執行的時候,指令寄存器會在相應的導線上分別發射出“
0V
”,“
12V
”,“
12V
”,“
0V
”的電壓,以表示
0110
,這樣這些電壓就會影響接下來的執行序列,如果
xyyx

add a(

a
是一個寄存器
)
的編碼話,那麼這個
0

12

12

0
的電壓肯定要影響寄存器
a
的各相關引線,引起它的值加
1
,這一切都是通過三個門的組合導致的哦,而且這一切都是同時發生的哦!

    

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

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.