做了n年程序猿,才知道電腦是這樣工作的

如果算上高中的編程課,接觸電腦有二十多年了。過去的二十年,幾乎天天與電腦打交道,但直到今天,對於電腦是如何工作的,還是一知半解。二十年間,電路圖畫過、單片機用過、數電模電學過、C和Java寫過、安卓遊戲也寫過,但就是沒弄清楚,那一行行代碼是怎麼變成人類可以感知的東西在電腦上呈現出來的?所以,打算把電腦的工作原理好好琢磨一下,然後寫出來。


好吧,上面這一段的想法給自己挖了個大坑。本來以為3天左右可以寫出來的,結果前後搞了快2個星期,越寫越發覺要搞清楚的東西太多了。也對,從第一臺電腦誕生,到如今70多年了,70多年間無數天才積累下來的東西,要說清楚,好難,WTF。


要把電腦是怎樣工作的這個問題說清楚,大概要從以下幾方面來闡述:

1. 電腦究竟做了些什麼?它的本質是什麼?

2. 現代電腦的標準結構

3. 二進制與晶體管

4. 基礎邏輯電路門

5. 全加器

6. 鎖存器

7. CPU是怎樣工作的?

8. 軟件是什麼?

9. 文件是什麼?

10. 輸入與輸出設備的本質

11. 其它

12. 電腦是這樣工作的

13. 雜談


1.電腦究竟做了些什麼?它的本質是什麼?

要弄懂電腦是如何工作的,我們先想一下它到底做了些什麼吧?


世界上的第一臺電腦於1946年誕生於美國賓夕法尼亞大學,叫做ENIAC(Electronic Numerical Integrator and Calculator)。從全稱“電子數字積分與計算器”,我們可以看出它是一臺用來對數字做處理並得出運算結果的機器,而設計ENIAC的目的確實是為了計算出使大炮打得更準的射擊數字參數。


七十多年過去了,現在各位家裡的PC電腦,Mac Book,包含各位在看這篇文章時使用的手機,都未曾改變一個本質:它們都是一臺對數據做處理的設備。是的,你沒有看錯,無論你打開的微信、刷的抖音快手、玩的吃雞與英雄聯盟、看的頭條,無論多麼酷炫的影音,無論多麼黑科技的AI,

它們一切的本質都是源於電腦(手機與PAD都是電腦的一種便攜化變體)按照人類事先設計好的規則對數據進行採集、整理、轉換與輸出,沒有其他。所以,電腦能做的一切,如果不計人力多少與時間長短,理論上人同樣可以做到。


如果各位對這個觀點表示懷疑,那麼就請一步一步跟著看下去。


2. 現代電腦的標準結構

在正式開始之前,我們先看一下現代電腦的標準結構。現代電腦的結構稱為馮諾依曼結構,由美籍匈牙利人馮.諾依曼提出,他同時也是博弈論之父。


以下是他提出的電腦結構:

1. 採用0和1構成的二進制工作。

2. 硬件上,電腦由五個部分組成:

- 輸入設備(例如鼠標、鍵盤)

- 輸出設備(例如顯示屏、音箱)

- 運算器與控制器(這兩個部分後來合為一體,也就是我們俗稱的CPU)

- 存儲器(例如內存、硬盤)

3. 程序(軟件)需要先存儲再執行。


一句話概括,電腦基於二進制工作,由軟件和硬件組成;硬件包含:CPU、存儲設備、輸入與輸出設備;軟件需要存儲之後再執行。


做了n年程序猿,才知道電腦是這樣工作的


3.二進制與晶體管

好了,讓我們來正式開始闡述電腦是如何工作的。


電腦的運作,無論是硬件,還是軟件,它們的基石都是二進制。


我們人類在日常生活中使用十進制,也就是滿10進1。這不難理解,因為我們的雙手是十根手指,原始人類在計數時很自然的會用雙手來數數,每當數到10(用滿10根手指)的時候,就記一個符號(進1位)。


而電腦是由各種電子元器件構成,對於電子元器件來說,它們的“雙手”天然是“兩根手指”。正負電子、正負電壓、有電流/無電流、有電壓/無電壓,通通都是兩種狀態,所以使用二進制是十分符合電子元器件的天然特性的。

另外,由於只有兩種狀態,降低了誤判的概率,同時也降低了電子元器件的製作複雜度。


那麼電腦裡最基礎最原子化的用來表示二進制的器件是什麼呢?好比一個人是由一個個細胞構成的,那麼電腦的細胞是什麼?答案是晶體管,電腦的CPU和內存都是由晶體管組成的。


晶體管的種類很多,不一一介紹了,只說明一下它的基本特性。早期的晶體管如下圖這樣(圖片來源於網絡):

做了n年程序猿,才知道電腦是這樣工作的

我們可以看到它有3根金屬觸角,分別為基極(B)、集電極(C)、射極(E)。以下圖的NPN晶體管為例:

做了n年程序猿,才知道電腦是這樣工作的

當基極(B)給正電流,集電極(C)就與射極(E)導通,也就是電流可以通過晶體管從C流到E;反之集電極(C)與射極(E)斷開,也即電流無法通過。這像什麼?是不是像一個開關,有打開和閉合兩種狀態,而這兩種狀態可以分別對應二進制中的0和1。


另外還有一種PNP晶體管, 邏輯剛好相反,當基極(B)給負電流,集電極(C)與射極(E)導通;反之集電極(C)與射極(E)斷開。


就是這個晶體管,利用它的開關特性,讓電腦的二進制(0和1)有了最基本的表現形式。具體怎麼表現,我們下一節馬上就說。


八卦兩句,我們正在使用的各類CPU,都是由幾億甚至幾十億個晶體管組成。當然CPU裡面用的晶體管不是上面的形狀,否則別說幾十億,10個都塞不進去。CPU裡的幾十億晶體管,它們是由光蝕刻技術在一整塊硅晶片上,通過反覆的光與化學作用刻錄上去的。我們經常在新聞中看到的x納米技術,就是指一個晶體管的大小。而全世界能生產出用於製作這種頂級芯片的光刻機的公司,有一家在荷蘭,叫做ASML,是不是在很多新聞中也出現過?


4. 基礎邏輯電路門

有了晶體管之後,通過各種晶體管的巧妙組合,我們可以做出幾種常用的邏輯電路門(簡稱邏輯門)。它們是電腦運算數據的基礎, 也是組成CPU的基本元器件。


這些邏輯電路門通常叫做xx門,它們的作用是按照一定的邏輯規則對於輸入信號進行處理,轉變為輸出信號。就好比一扇神奇的門,一個人通過前可能是個中年油膩大叔,穿過這道門,就變成了十六歲的花季少女。


這些常用的門有:

1. 非門(NOT Gate)

2. 與門(AND Gate)

3. 或門(OR Gate)

4. 異或門(XOR Gate)


用非門做個詳細說明,首先非門的魔法邏輯如下

做了n年程序猿,才知道電腦是這樣工作的

也就是當輸入為0時,輸出為1;當輸入為1時,輸出為0。凡是入此門的都給你變化一下“性別”。


非門是如何通過晶體管來實現的呢?很簡單,下面是示意圖:

做了n年程序猿,才知道電腦是這樣工作的

當輸入端給正電流(1)的時候,由於晶體管是導通的,電流從晶體管流過,最終從接地處流出,那麼輸出端沒有電流(0);當輸入端沒有電流(0)時,晶體管閉合,電流無法穿過晶體管流出,於是從輸出端流出(1)。


依據同樣的原理:

-

通過2個晶體管串聯可以實現與門的邏輯

- 通過2個晶體管並聯可以實現或門的邏輯

- 通過2個與門、1個或門、1個非門的組合(也就是7個晶體管),可以實現一個異或門


具體的實現方法這裡不再詳述,免得各位失去看下去的耐心。這裡列一下與門、或門、異或門的魔法邏輯,供有興趣的各位參考。

與門邏輯

做了n年程序猿,才知道電腦是這樣工作的

或門邏輯

做了n年程序猿,才知道電腦是這樣工作的

異或門邏輯(輸入相同,輸出為0;輸入不同,輸出為1)

做了n年程序猿,才知道電腦是這樣工作的


5. 全加器

有了上一節介紹的基礎邏輯門,我們可以利用它們組成很多神奇而複雜的電路。


第一個是全加器,全加器顧名思義是做加法的器件。


為什麼要說全加器呢?因為它是電腦裡一切運算的基礎:

- A-B,可以看做是數字A加上一個負數B

- A*B,可以看做是數字A累加B次

- A/B,可以看做是數字A不斷的減去B,一直到不能再減(餘數小於B)


人類如果用以上的方法來做乘除運算,不僅慢,可能還會被認為腦子被門擠了。但對於(早期的)電腦來說,確實是利用這樣的邏輯在做乘除運算。其實,個人認為早期的人類也是用同樣的方法在做乘除運算 :)


所以,我們得把全加器說清楚。首先,我們看一下全加器的輸入和輸出:

做了n年程序猿,才知道電腦是這樣工作的

根據這樣的邏輯,可以利用2個異或門+2個與門+1個或門來實現1bit的全加器,如下圖所示(大家可以參照上一節基礎邏輯門的邏輯表來驗證):

做了n年程序猿,才知道電腦是這樣工作的

上面這個1bit的全加器是用20個晶體管構成。


如果有點暈的話,我們畫一個簡單的符號來代替這個全加器,如下圖:

做了n年程序猿,才知道電腦是這樣工作的

把兩個全加器級聯起來,我們可以做出一個2bit的全加器,如下圖:

做了n年程序猿,才知道電腦是這樣工作的

以此類推,可以做出8位、16位、32位、64位的全加器。通常所說的32位處理器、64位處理器,就是指CPU(包含加法器)能處理二進制數字的最大位數。不論處理多少位的二進制數,它們都是由一個個晶體管構成。


6.鎖存器

接著再來看鎖存器,鎖存器是可以在通電狀態下記住二進制信息的電子器件,一個1bit的鎖存器由1個與門+1個或門+1個非門組成,也就是5個晶體管。

做了n年程序猿,才知道電腦是這樣工作的

它的魔法邏輯如下所示

- 當設置位為1,清零位為0時,輸出為1

- 當清零位為1時,輸出為0

- 當設置位和清零位都為0時,輸出為上次的輸出(如之前輸出是1,那麼就是1;之前輸出是0,那麼就是0)

做了n年程序猿,才知道電腦是這樣工作的

所以,通過對設置位與清零位的操作,可以把輸出設為特定值X;然後把設置位與清零位改為0,這時輸出就被鎖定為X,我們就此存儲了1bit的信息!


基於以上鎖存器原理,再加上一些控制器件(是否准許數據寫入),一個完整的1bit存儲器長這樣:

做了n年程序猿,才知道電腦是這樣工作的

- 當準許寫入為0時,兩個黃色的與門被關閉,無論輸入數據是0或者1,這兩個黃色與門輸出始終為0,使得灰色的鎖存器電路保持之前的值不變。

- 當準許寫入為1時,兩個黃色的與門被打開,輸入數據可以通過

假設輸入數據為0,那麼黃色與門A輸出為0,黃色與門B輸出為1,根據鎖存器的邏輯,存儲數據被清零,相當於把輸入的0寫入存儲數據

假設輸入數據為1,那麼黃色與門A輸出為1,黃色與門B輸出為0,根據鎖存器的邏輯,存儲數據被設置為1,相當於把輸入的1寫入存儲數據


寫到這裡,不由得對發明這些邏輯電路的大神點個“贊”,真是太聰明瞭。百度了一下,沒搜到鎖存器的發明者,有知道的請留個言(微信公號好像還沒開通留言功能,請發私信)。


有了1bit的鎖存器,我們可以級聯出8位、16位、32位、64位的寄存器;如果把這些寄存器排成縱橫的矩陣,我們能得到什麼?那就是內存,對,就是你電腦裡用的8G、16G內存條!它同樣由很多晶體管組合而成。


有了全加器,有了寄存器,接下來我們來看看電腦的大腦:CPU(中央處理器)。


7.CPU是怎樣工作的

1971年,Intel推出了第一個微處理器4004,它是一個4bit的CPU,由2300個晶體管組成,長這樣(圖片來源於百度):

做了n年程序猿,才知道電腦是這樣工作的

前文說過(第2節),一個CPU通常由以下兩部分組成

- 運算器

- 控制器


運算器:由算術邏輯單元(ALU)和一堆專用寄存器組成,而ALU的主要組成部件就是上一節提到的X bit全加器。


控制器:用來控制指令的執行,具體一點說分三步:取指令,解析指令、執行指令,循環往復。指令是什麼?一條條的指令連接起來,就是我們通常所說的程序(軟件、APP),關於軟件在下一節會詳細說明。


我們先來看一下算術邏輯單元ALU,如下圖所示:

做了n年程序猿,才知道電腦是這樣工作的

- 兩個輸入數:A和B

- 一個輸入操作碼:告知ALU執行什麼操作,例如:加、減、取反等等

- 一個輸出數:輸出按照操作碼對於A和B操作之後得出的數

- 幾個輸出標記位:例如是否溢出,是否全零等


ALU的內部組成,以第5節介紹的全加器為核心,再加上一堆組合電路(由晶體管組成)來完成相應的邏輯操作與判斷。


有了ALU,加上第6節介紹的由鎖存器組成的寄存器和內存,再加上控制器,一個早期的CPU長這樣,如下圖所示:

做了n年程序猿,才知道電腦是這樣工作的

首先

- 軟件或程序(很多指令的集合體)被裝載進內存

- 軟件運行需要使用的數據也被裝載進內存


接著,控制器按照取指令、解析指令、執行指令的步驟循環往復的執行軟件指令。

- 控制器根據指令地址寄存器裡的值,上圖中是0,去內存中對應的0地址位置讀取指令,並把指令1100 0011存進指令寄存器

- 控制器用指令寄存器的前4位1100,通過內部的指令邏輯判斷電路,得出指令是“把數據存進寄存器C“,也即LOAD C

- 控制器根據指令寄存器的後4位0011(也就是十進制的3),去對應的內存地址第3位取出操作數據00001111,並把數據存進寄存器C

- 接著控制器會把指令地址寄存器的值設為0000 0001,也即下一條指令的位置


如此第1條指令就執行完成了!


如果要完成1+1的求和運算,首先1+1會被翻譯成n個二進制指令(下一節介紹翻譯的步驟),並被放入內存中的一個區域,接著CPU根據順序來執行指令。例如把1放入寄存器A,把另一個1放入寄存器B,把A和B作為ALU的兩個輸入,通過操作碼命令ALU計算兩個輸入之和;從ALU拿到輸出2之後,存入寄存器C,然後把寄存器C的值回寫到內存裡的一個指定位置(此處需要動畫 -_-!)。


至此,CPU是如何通過一個個晶體管組成的電路來工作的,已經說明完畢。


重複前文所說的,無論你打開的微信、刷的抖音快手、玩的吃雞與英雄聯盟、看的頭條,無論多麼酷炫的影音,無論多麼黑科技的AI,都是由大量這樣的一條條指令以及二進制數據構成的。這些指令無一例外都是對數據的操作,操作之後的數據通過各類輸出設備(屏幕、喇叭、耳機)轉化為圖像聲音呈現給你的眼睛和耳朵。來,讓我們繼續探索之旅。


8.軟件是什麼?

上一節提到,軟件是很多指令的集合體,這聽上去還是很抽象。


下面是一個C語言初學者基本都寫過的程序,程序的作用是在電腦屏幕上顯示一行字“Hello World”。

做了n年程序猿,才知道電腦是這樣工作的

這樣的程序人類可以讀懂,對不起,應該是非典型性人類(程序猿)可以讀懂。但是電腦收到這些符號的內心是萬馬奔騰的,如果電腦有表情的話,它一定是懵逼臉。


前文說過,電腦的世界是二進制的,它只能理解0和1組成的文字,在電腦的世界裡,程序應該長成這樣:

做了n年程序猿,才知道電腦是這樣工作的

但電腦爽了,人類卻一臉懵逼了。不得不說,最早的程序猿們寫出的正是0和1組成的代碼。


如果保持用0和1來編程,相信到了2046年,人類也用不上微信和頭條。幸運的是,有人發明了彙編語言,它長成這樣(下圖來源於網絡)

做了n年程序猿,才知道電腦是這樣工作的

有了彙編語言,程序猿們可以直接操作數據和寄存器來完成程序的編寫,然後由

彙編器把彙編語言翻譯成機器可以讀懂的0和1組成的機器指令。


再接著,有人發明了高級編程語言,使得程序猿不必再關心具體的寄存器和數據,可以把注意力和智慧專注在程序邏輯的設計上。第一個得到廣泛使用的高級編程語言是FORTRAN(Formula Translation的縮寫,又一個電腦和數據計算相關的佐證),大約誕生於上世紀五十年代。之後陸續誕生了大家(也許只是程序猿)耳熟能詳的的各個高級語言:BASIC、C/C++、Java、Python、Go等等。


所以當程序猿用高級編程語言寫完一段程序後,首先由編譯器把高級語言翻譯成彙編語言,然後再由彙編器,把彙編語言翻譯成機器指令。

做了n年程序猿,才知道電腦是這樣工作的

程序(軟件/APP)實質上是很多0和1組成的二進制機器指令的集合,是由程序猿採用高級編程語言編寫,通過編譯器和彙編器翻譯而來,也即程序歸根結底也是一堆0和1組成的數據!


9.文件是什麼?

第7節介紹CPU怎樣工作的時候,我們提到了程序和程序運行時需要用到的數據被存放在內存中。通過第8節我們已經知道程序的本質,那麼數據的本質是什麼?


首先,數據來源於電腦硬盤裡存放的每一個文件。無論一份word,一段視頻,還是一個程序,它們都是文件或者由很多文件組成。在操作系統裡,文件長這樣:

做了n年程序猿,才知道電腦是這樣工作的

同樣,這樣的形式,人類看得懂,電腦會懵逼。那麼一個文件,電腦為什麼能看懂呢?因為它的本質也是一堆0和1組成的數據。


以txt文件舉例,txt文件的內容是由很多字母和符號組成。這些字母和符號是按照ASCII碼錶的規則映射為對應的二進制數字存在電腦裡,如下所示

做了n年程序猿,才知道電腦是這樣工作的

電腦要從眾多的文件類型中區分一個文件是不是txt文件,需要在這個文件前面加上約定的元數據(Meta Data),同樣meta data也是一串0和1組成的二進制數據,只是有一定的規律可循,這裡不再展開。


以此類推,聲音、圖像等文件也是一堆0和1組成的二進制數據,具體的原理,請看下一節。


10.輸入與輸出設備的本質

說了這麼多,人們操控電腦終歸要依靠鍵盤和鼠標;而感知電腦裡的豐富內容,則需要通過屏幕和音箱,所以這一節就說一說電腦輸入和輸出設備的本質。


輸入設備-鍵盤

鍵盤相對簡單一些,當你在鍵盤上敲擊每一個按鍵的時候,這些機械動作會被鍵盤轉化為特定規則的電信號,通過有線/無線的方式傳輸至電腦。這些電信號,不用問,代表的又是一串0和1組成的二進制數字。


當電腦的BIOS(基礎輸入輸出系統)接收到這些二進制數字後,會把它們傳送給操作系統(例如windwos),然後再由操作系統轉交給具體的程序,最後由程序根據自身的設定來做出相應的反饋。例如我們按一下空格鍵,word程序會空一格,FPS遊戲中的人物通常會跳一下,而視頻播放器會暫停/開始播放。


輸入設備-鼠標

鼠標有兩個基本操作,滑動和點擊按鍵。按鍵的原理和鍵盤一樣,不再贅述。


關於滑動,無論是早期的機械鼠標,還是現在的光電鼠標、激光鼠標,都是通過機械滾動或者光電感應來感知鼠標的移動方向和距離,並把這些信息轉化為數字電信號(0和1組成的二進制數字)傳送給電腦。接著通過BIOS->操作系統->應用程序的路徑,來做出具體的響應。


輸出設備-顯示器(屏幕)

電腦的顯示器,可以看成一個由大量小點構成的矩形方框(如下圖示例,咦,為啥下意識的又畫了個2)。

做了n年程序猿,才知道電腦是這樣工作的

- 顯卡從各類程序或者圖形文件裡讀取每個小點的顏色再填充進各個小點裡。

- 當顯示器(屏幕)上可以顯示的點足夠多時(例如iphone11的屏幕上大約有155萬個這樣的點),最終就會呈現出非常細膩的圖像。

- 同樣,每一個點的顏色又是0和1組成的二進制碼。我們知道由紅色、綠色和藍色按比例組合可以調合出任意一種顏色,一個點的顏色信息正是記錄了紅綠藍三色的配比。假設我們分別用8位二進制數來記錄紅綠藍三種顏色,那麼一共需要24個0或者1來組成一個點的顏色信息。例如(00000000, 00000000, 00000000)代表的是黑色,(11111111, 11111111, 11111111)代表的是白色。

- 那麼顯示器拿到顯卡傳來的這些0和1組成的顏色,又是怎麼通過光電轉換為真正的色彩呈現給人眼的?饒了我吧,臣妾確實不想再去深究了。

- 顯示器會以很快的速度刷新每個點顯示的顏色(大約1秒60次,也就是60Hz;高級一點的顯示器可能到了120Hz,也就是1秒刷新120次),所以在屏幕上能呈現出視頻動畫效果(你以為自己刷完了一部片,實際你只是以很快的速度看了很多圖片,再配上音樂)。


串聯一下,前面提到按空格鍵時FPS遊戲的人物會跳一下,這個過程實際上是這樣的

- 鍵盤把空格鍵按下彈起的動作轉換為一串0和1的數字傳遞給電腦的BIOS

- BIOS把這串數字交給操作系統,操作系統再交給對應的遊戲,比如吃雞或者CSGO

- CPU根據這串0和1的數字,跳轉到內存中相應的遊戲指令,開始執行;也就是把人物跳一下的動畫(0和1組成的數字)傳遞給顯卡

- 顯卡通過驅動程序把這些0和1組成的數字,按照1秒60次的速度在屏幕上刷新

- 於是通過屏幕上圖像的變化(0和1數字值的變化),你的眼睛看到人物跳了一下


所以,你以為是在打遊戲,而實際上你是在操作無數的0和1。


輸出設備-音箱和耳機

音箱和耳機都是用來輸出聲音的,先來看一下聲音的本質。


聲音實際上由物體的振動(例如人類的聲帶)引發空氣的共振,產生聲波,進而傳入人類的耳朵,引起耳鼓的振動從而帶動聽覺神經,再傳輸給大腦感知。所以沒有空氣的地方是沒有聲音的,例如太空。下圖是聲波的示意圖(此圖來源於網絡)

做了n年程序猿,才知道電腦是這樣工作的

既然聲音是一種振動的波,和圖像顯示的道理一樣,如果我們用數字來代表每一個時刻聲波的幅度,當這些數字的密度足夠大時(例如一秒鐘採集44100次),就可以記錄下聲音。


然後,電腦把這些數字聲音信息傳遞給喇叭或者耳機,由它們把數字聲音信息還原為振動,聲音就被再造了出來。


那麼問題又來了,郭德綱和迪麗熱巴都說了一句“新年好”,按上面的理論波形應該是一樣的,那麼請郭老師來做程序猿鼓勵師和熱巴的效果不就一樣了麼?好吧,這裡又涉及到很多聲學知識,恕臣妾無能為力了,以我有限的知識,這裡面涉及到formant(共振峰),當採樣密度足夠大的時候,這些聲音特徵信息也被保留在了這數不清的0和1之中。


11.其它

至此,電腦每個主要部件運作的基本原理都弄清了。當然還有很多沒說的,例如

- 硬盤的數據存儲原理

- CPU的工作頻率(這是驅動CPU處理數據的源泉,要說清楚估計又得開一篇)

- 操作系統(例如windows)的作用

- 互聯網和雲

- AI


這些點和一臺電腦的基本運作關(yin)聯(wei)性(wo)不(hen)大(lan),就不再詳述了。


稍微展開兩個點:

互聯網是什麼?互聯網是一個傳播媒介,它把一臺電腦裡存儲的0和1的二進制數據,按照約定好的規則發送給另一臺電腦,比如你敲的字、P的自拍都被轉化為0和1,傳到另一臺電腦(手機)上,再由接收的電腦(手機)按照上一節介紹的圖像和聲音的呈現方式呈現出來。


雲呢?雲不是天上的棉花糖,雲是一臺或者多臺通過互聯網連接起來的電腦,它們可能在佳木斯,可能在貴州的某個山裡,還可能在隔壁老王家,反正不在你家。這些雲端電腦存儲了一些我們自己電腦不具備的信息,或者能處理一些我們自己電腦無法處理的任務,例如:轉點錢、買點貨、人臉識個別、看個小電影,諸如此類。它們的本質是提供我們沒有的數據,或者處理我們不能處理的數據,而這一切都是基於互聯網來實現。


AI呢?AI也是數據和數據的處理,更復雜一些而已,比如從圖中識別一條狗。人類認識一條狗,是從小時候起無數次路上遇條狗,被大人灌輸:“離遠點,當心被狗咬。”久而久之,就認識狗了。AI也是一樣,用無數張帶有狗或者不帶狗的照片傳進AI系統,告訴它這是條狗或者這裡沒有狗,AI通過算法總結出狗的樣子,當下一次你給AI一張照片時,它就能判斷出照片裡有沒有狗。


當然,還有終極AI(這可能是終結人類社會的終極),這類AI就像人類一樣具有自我發現和自我創造力。牛頓家親戚從來沒有告訴過牛頓萬有引力,但他自己發現了萬有引力;馮諾依曼的老爸老媽不知電腦為何物,但是他卻能準確定義出電腦的結構。同樣,終極AI可以不依靠人類的輸入,自我發現宇宙自然的規律,或者創造出新興的事務。這一天,無法說還很遙遠,記得二十多年前當深藍戰勝卡斯帕羅夫的時候,人們說電腦在圍棋上永遠無法戰勝人類,因為圍棋的變化是無窮的。可二十年的時間,人類最好的圍棋國手已被電腦擊敗。


扯遠了,讓我們用一個例子來看看電腦到底怎樣工作的。


12.電腦是這樣工作的

舉個什麼樣的例子合適呢?太複雜的怕說不好,用hello world舉例有點脫離時代,思來想去,小視頻那麼火,那麼就舉個例子:大家在手機上點擊抖音、快手小視頻並播放出來的過程。


先說明一下,手機也是電腦的一種,是電腦的一種便攜化變體。鼠標被觸摸屏取代,鍵盤被觸摸屏+軟鍵盤取代,加上了電話功能,其餘沒有大的不同。一句題外話,個人判斷電話這個功能終有一天要消失,取而代之的是通過互聯網模擬電話功能的通話軟件。


當年大明湖畔的夏雨荷,發生了這麼幾件事(以下步驟為了說清楚還是忽略了很多細節,輕拍)


a. 首先,程序猿們按照產品經理和設計獅們的設定,通過好幾種高級編程語言,把抖音/快手APP的操作邏輯編寫好。再通過編譯彙編的過程,把高級語言轉化為電腦可以理解的0和1組成的機器指令。這些指令一部分被放在雲端的電腦上,另一部分被用戶下載安裝到自己手機存儲空間的某個位置,回顧下這樣圖。

做了n年程序猿,才知道電腦是這樣工作的

b. 當用戶點擊APP圖標時,觸摸屏感知到手指的觸達與鬆開(機械能),它把這些動作轉化為相應的數字電信號,也即一串由0和1組成的二進制數字。這串數字包含了一些信息:觸壓點的座標、手指觸壓的動作、手指脫離屏幕的動作(鬆開)。


c. 這串信號被傳遞給手機的操作系統(安卓或者IOS),操作系統判斷出觸壓座標點對應的程序是抖音/快手APP。於是操作系統把APP從手機的存儲空間裡喚起,也就是把APP的一條條指令裝載進手機內存中,回顧下這張圖。

做了n年程序猿,才知道電腦是這樣工作的

d. 手機CPU中的控制器,從內存中APP對應的第一條指令處開始執行。這裡面涉及很多指令,但必然有指令是讀取APP用戶界面的圖片顏色與文字信息(實際上有很多張圖片,有些圖片還是從雲端獲得,這裡簡化為一張圖片;且過程中省略了GPU的概念)。當屏幕的上百萬個點的顏色信息被讀取完畢後,這些信息被推給屏幕的驅動程序去驅動屏幕的硬件做出響應,在每一個小點上顯示出對應的顏色信息,先回顧下這張圖。

做了n年程序猿,才知道電腦是這樣工作的

於是我們看到了APP的首頁(如下圖),接下來我們點擊這幾個視頻當中的一個

做了n年程序猿,才知道電腦是這樣工作的

e. 手機的各個部件重複步驟b,觸摸後產生的0和1二進制信息被傳遞給操作系統,操作系統進一步傳遞給APP,而APP根據座標信息判斷出用戶點擊的是哪一個短視頻。這一過程的實質是觸摸信息被存放於內存的某一個地址中;CPU控制器的指令地址寄存器移動到操作系統指令對應的地址,執行後再把指令地址寄存器移動到APP指令存放的對應地址。


接著CPU控制器開始執行APP的播放視頻相關指令,由於視頻的內容存在雲端,所以首先要從雲端獲取相應的視頻文件。這時APP按照互聯網傳輸協議的規定格式,開始準備相應的指令,以便這些指令能被順利的傳遞到雲端的電腦上,進一步從雲端電腦獲取視頻內容。


大家心裡可能會有疑問,這麼複雜的功能,那個CPU中看似簡單的ALU能處理麼?答案是肯定的。APP發到雲端的指令,它的本質還是一串符號。我們假設這串符號為“play”(實際上遠比這複雜),那麼CPU的工作就是通過ALU的計算,在內存中的某一段中存下這個指令。


在前文提到的ASCII表中,p對應二進制符號0111 0000,l對應二進制符號0110 1100,a對應二進制符號0110 0001,y對應二進制符號0111 1001。在一個32位的CPU體系中,按如下步驟可以組成play:

- 把0111 0000(p)通過ALU左移24位,存入寄存器

- 把0110 1100(l)通過ALU左移16位,存入寄存器

- 把0110 0001(a)通過ALU左移8位,存入寄存器

- 把0111 1001(y),存入寄存器

- 把四個寄存器的數字依次相加後得到E,並把E存入內存中


做了n年程序猿,才知道電腦是這樣工作的

指令組合完畢,CPU再轉去執行網絡驅動的指令,驅動網絡硬件把這些0和1的二進制字符轉換為電磁波發送給中國移動的交換機(一臺負責轉發信息的電腦),最終這串0和1的指令進入雲端的電腦。


f. 雲端的電腦按照指令準備好相應的視頻數據(包括圖像和聲音,一長串由0和1組成的二進制數字),通過互聯網返回給用戶的手機。這時手機裡的CPU跳轉到屏幕和喇叭的驅動程序指令地址開始執行指令,把圖像和聲音數據分別傳送給屏幕和喇叭,通過快速的刷新數據,圖像和聲音就被連續的呈現出來了(其實圖像和聲音是串行執行的,只是因為切換的速度很快,人類的感知才認為是同時播放的)。


注:實際的步驟更復雜,雲端先返回視頻存放的地址,再由手機去相應的地址獲取數據;而數據也不是一次性傳輸完,是分段傳輸的,為了描述簡單就當做一次性都返回了。


至此,好像簡單梳理了一下電腦的工作流程,但感覺又好像什麼都沒說明白 -_-! 只能寫到這個程度了,見諒。另外,由於涉及的領域眾多,時間倉促,如有錯漏之處,請各位海涵。


13.雜談

在寫這篇文章的同時,雜七雜八想了很多,畫蛇添足扯一扯吧,畢竟2020年的春節待在家裡碼字是最安全的 :)


社會發展為何加速?


在我們祖父、父輩的那個年代,時間過去5年、10年,甚至30年,都感覺不到太大的變化。可進入21世紀後,明顯感覺到隨著時間的推移,社會發展的速度越來越快,以至於30-40歲的人都開始覺得有點兒跟不上了。


互聯網、移動互聯網、AI,一個緊跟一個。不但個體容易被淘汰,就連頭部公司的更新換代也越來越快,5年就可能產生一個新的巨無霸。


個人認為,社會演進的加速,來自電腦和相關技術的普及。


電腦大規模普及之前的社會,人類的處理速度限制了事物發展的速度。電腦的普及,從方方面面提升了演進的速度;而且隨著時間的推移,加速度越來越大。


例如信息的交換,以前發一封信需要幾天的時間才能到達,而如今只需要幾秒;當信息交換加速,提升了溝通效率,於是很多事情的決策變快了。


例如設計,無論是基礎設施設計還是產品設計,沒有電腦之前,需要人們手工畫圖並且推演各種數據進行論證。有了電腦輔助之後,加速了。


例如資金,資金是很多事物發展的助推劑。銀行電子化之前,資金需要在各類實體間轉運,即使是支票,也需要一定的時間成本來兌現。而現在,只要幾秒鐘,資金就可以在全球流轉;資金流轉的加速,推動了社會演進的加速。


再例如教育,社會的演進離不開人才。電腦普及之前,培養一個職業人才需要大量的言傳身教。電腦普及之後,知識的傳播提速了。社會發展需要的方方面面的人才,可以快速的培養與獲取。因此,也推動了社會的演進。


當AI時代來臨,這個加速度還會進一步的提升。“三十年河東三十年河西”這句老話,恐怕得變為“三年河東三年河西”了。


中國在電腦技術基礎領域,什麼時間可以追上世界水平?


這篇文章涉及了電腦相關技術的很多基礎領域,但這些可能只是九牛一毛;而且技術的深度,估計也就高中到大一的水平。


但我們國家每年畢業的幾百萬大學生裡,到底有多少人是鑽研這些領域的呢?在初高中,到底有多少有天賦的00後能獲取學習到相關的技術知識呢?


我們所看到的,是大量優秀的有天賦的人才流向了可以快速掙錢的行業(應用軟件研發、應用芯片研發、AI應用、互聯網金融等等)。無一例外,都是技術的組合應用。


如果拿造樓來比喻,我們不缺建築師、不缺設計師、不缺施工隊,但造樓的水泥、鋼筋我們自己做不出來,得依靠別人。而電腦技術基礎領域的水泥、鋼筋,其技術複雜度要更勝一籌。


這一類的人才不是集中培養幾個人就可以出來的。集中培養,我們可以造出世界第一的超級計算機,但是我們造不出世界通用的芯片架構。要追上世界水平,需要依靠大量的人才梯隊。隨著時間的推移,一些人在發展競爭中從梯隊裡嶄露頭角。道理和中國足球一樣,沒有足夠的梯隊,就永遠沒有11個世界水平的主力。


所以,當我們的電腦技術基礎教育能真正夯實,吸引大量的年輕人進入方方面面相關的領域(底層芯片設計、軟件編譯器設計、光刻機制造、新電子材料研發等等),以這個時間為起點,再過20年,才有可能追上世界水平。


好了,就扯到這裡了,祝各位闔家安康、開工大吉!


寫在最後

此文完成之時,疫情還沒有很糟糕。那麼現在,就再寫點什麼吧。


鼠年的正月初八,街市的冷清與醫院的喧囂是這個春節的主旋律。圈裡的熱度不減,各類關於新型冠狀病毒的消息鋪天蓋地,而我自己也不由得為這場信息漩渦添加了一份助力。


記起1999年我們在南聯盟的大使館被炸,一時群情激奮,各類遊行請願。而我所在的學校還專門開了辯論會,那個紛雜的現在看來毫無意義的辯論會,已然記不起辯題到底是什麼了。只記得在旁觀了很多人的慷慨陳詞之後,輪到自己時說了一句冷場的話,大意是這樣:“現在坐在這裡的每一個人說的每一句話都毫無意義,對於太平洋另一端的那個國度毫髮無傷,我們只是在安慰自己。如果要做點什麼,我們應該好好學習。大家都這麼做,將來就不會再發生同樣的事。”感謝過去這二十年裡,那些默默用自己所學為我們這個國度添磚加瓦的普通人,正是千千萬萬這樣的普通人使得我們今天不會再遭受二十年前的屈辱(同樣的戲碼,前段時間剛剛發生在伊朗頭上)。


正如此,今天的我們如果希望將來不再出現類似的情況,能做的就是做好自己分內的事兒,讓我們的國度在方方面面繼續一點一滴的強大起來。怒其不爭也好,哀其不幸也罷,意見要表達,但行動更重要。捐錢捐物資,不佔用有限的醫療資源;等到情況好轉的時候,多出去吃吃飯購購物,多加加班,便是行動。而魑魅魍魎,已然曝露在光天化日之下,自會有人收拾。


分享到:


相關文章: