天天看點

淺讀《編碼:隐匿在計算機硬體背後的語言》上

作者:循老師

概覽

淺讀《編碼:隐匿在計算機硬體背後的語言》上

書籍簡介

這是一本講述計算機工作原理的書。不過,你千萬不要因為“工作原理”之類的字眼就武斷地認為,它是晦澀而難懂的。作者用豐富的想象和清晰的筆墨将看似繁雜的理論闡述得通俗易懂,你絲毫不會感到枯燥和生硬。更重要的是,你會是以而獲得對計算機工作原理較深刻的了解。這種了解不是抽象層面上的,而是具有一定深度的,這種深度甚至不遜于“電氣工程師”和“程式員”的了解。

作者介紹

介紹一

淺讀《編碼:隐匿在計算機硬體背後的語言》上

介紹二

淺讀《編碼:隐匿在計算機硬體背後的語言》上

部分精彩點評

淺讀《編碼:隐匿在計算機硬體背後的語言》上
淺讀《編碼:隐匿在計算機硬體背後的語言》上
淺讀《編碼:隐匿在計算機硬體背後的語言》上

節選内容

用手電筒隔着大街聊天

你今年10歲,你最好的朋友就住在街對過。事實上,你們各自卧室的窗戶正好彼此相對。

直接方案:手電筒能用來交談嗎?這當然值得一試。我們在一年級的時候學習怎樣在紙上寫字母和單詞,是以,把同樣的方法運用到手電筒上似乎也是有道理的。隻需要站在窗戶邊,用光來畫出字母。對于字母“O”,打開手電筒,在空氣中劃一個圈,然後關掉手電筒。對于字母“I”,豎着劃一下。

演進方案:“A”是閃一次,“B”是閃兩次,“C”是閃三次,依此類推,“Z”就是閃26次。單詞BAD可以用閃2次,閃1次,閃4次這樣的一個組合來表示,而且在字元之間設定的小停頓使這個單詞不至于被誤認為是閃7次的字母“G”。另外,單詞之間停頓可以稍長些。

Morse碼:則有兩種閃爍——短閃和長閃

淺讀《編碼:隐匿在計算機硬體背後的語言》上
淺讀《編碼:隐匿在計算機硬體背後的語言》上

詳解Morse碼

莫爾斯碼(Morse Code)是由塞缪爾·莫爾斯發明的(1791-1872)

比起發送莫爾斯碼,接收編碼并進行解碼要費時費力得多,因為譯碼者不得不根據一串由“點”、“劃”組成的晦澀的編碼序列來反查字母。例如,如果你接收到一串形如“劃-點-劃-劃”的編碼,那麼你就必須從表的第一個字母開始逐個搜尋,直到找到與這串編碼相符的字母“Y”為止。問題就出在這裡,因為我們現在隻有一張提供“字母→莫爾斯碼”的編碼表,而缺少一張可以實作反向查詢的“莫爾斯碼→字母”譯碼表。在開始學習莫爾斯碼的初級階段,如果有這樣的一個表無疑将是很友善的。但是要建立這樣一張表,談何容易。似乎這些字母對應的“點-劃”序列并沒有什麼規律。

忘掉字母序列。根據編碼中所包含點、劃的多少來對其進行分組,是一個更好的組織這些編碼的方法

一組含有2個點或劃的編碼組合,可以給我們呈現出4個字母——I,A,N和M。

淺讀《編碼:隐匿在計算機硬體背後的語言》上

一組含有3個點或劃的莫爾斯碼可以為我們表示更多的字母。

淺讀《編碼:隐匿在計算機硬體背後的語言》上

最後(如果我們不想考慮存在數字和标點符号的莫爾斯碼的情況),一串由4個點或劃組成的莫爾斯碼就可以表示16個字元

淺讀《編碼:隐匿在計算機硬體背後的語言》上

每個表格所包含的碼字數目都是前一張的兩倍。這其實很好了解:每個表格所含有的碼字,可以看成是在前一張表格所包含的全部碼字上再加一個“點”,或者再加一個“劃”而組成的新碼字。

淺讀《編碼:隐匿在計算機硬體背後的語言》上

每張表的碼字數都是前一張表碼字數量的兩倍

淺讀《編碼:隐匿在計算機硬體背後的語言》上

當對一串碼字進行解碼時,我們需要沿着箭頭從左向右進行搜尋。以“點-劃-點”的碼字為例來說,當你需要找出這串碼字所代表的字母時,應首先從圖的左邊開始,選擇“點”的分支;然後繼續沿着箭頭向右選擇“劃”,接着又是一個“點”。找到最後一個“點”時結果就會緊随其後出現了,沒錯就是字母“R”

淺讀《編碼:隐匿在計算機硬體背後的語言》上

上面所做的關于二進制編碼的分析工作,其實是數學的一個分支,稱作“組合學”或“組合分析”,而我們所作的分析則隻能說是一個簡單的練習。傳統意義上來說,因為組合分析涉及類似像扔硬币、擲骰子這樣的需要對其組合數目進行推算的問題,是以它經常被應用到機率和統計學中。但是它對于我們了解碼字的組合與分解也是十分有幫助的。

解析布萊葉盲文

在布萊葉盲文中,每個在書寫文字中用到的符号——具體來說就是字母、數字和标點符号——都被編碼成為2×3的點碼單元中的一個或者多個凸起的點。這個點碼單元包含的點通常使用1到6的數字來編号。

淺讀《編碼:隐匿在計算機硬體背後的語言》上

小寫字母表

淺讀《編碼:隐匿在計算機硬體背後的語言》上
淺讀《編碼:隐匿在計算機硬體背後的語言》上

可以總結出一個規律。第一排(字母a到j)隻用到了點碼單元中最上面的四個點——第1、2、4和5點。第二排在複用了第一排的編碼的基礎上,把第3點改為凸點。第三排也沿用了同樣的規律,隻是将第3和6點改為凸點。

目前在英文出版物中最常用的盲文系統被稱為二級布萊葉盲文(Grade 2 Braille)。二級布萊葉盲文使用了很多縮寫,以便于儲存樹型結構和提高閱讀速度。例如,如果字母的碼字單獨出現,它們就表示一個普通的單詞。以下三排圖樣(包含“完整的”第三排)為我們展示了這些單詞的碼字。

淺讀《編碼:隐匿在計算機硬體背後的語言》上
淺讀《編碼:隐匿在計算機硬體背後的語言》上

看一個電路圖演進

普通雙向電報系統

淺讀《編碼:隐匿在計算機硬體背後的語言》上

優質節省25%的導線

淺讀《編碼:隐匿在計算機硬體背後的語言》上

極緻電報系統

電報機-繼電器

電磁鐵

淺讀《編碼:隐匿在計算機硬體背後的語言》上

傳統電報機

其實隻是一個被設計成有“最大開閉速度”的開關而已。如果需要長時間使用電鍵,最舒适的方法是,用拇指,食指和中指握住搖桿,輕擊它使其上下移動。保持電鍵的按下狀态一小段時間,就會産生一個“點”的莫爾斯碼。按下狀态保持的時間更長一些就會産生一個“劃”的莫爾斯碼

淺讀《編碼:隐匿在計算機硬體背後的語言》上

線路的另一端是一個接收器,它主要是由一塊電磁鐵拉動一根金屬杆構成的。最初,電磁鐵控制的是一隻鋼筆。有一個裝置通過使用一個壓緊的彈簧來拉動一卷紙經過裝置,與電磁鐵連接配接着的鋼筆就會彈起或落下,在紙上畫出點和劃。能讀懂莫爾斯電碼的人員就可以把這些“點”和“劃”譯成字母和單詞了。當然,我們人類是個懶惰的物種,電報操作員們很快發現,他們可以很容易地通過聽鋼筆彈起和落下的聲音來翻譯電碼。在傳統電報機中的“發聲器”的幫助下,鋼筆最終被廢棄,整個裝置看起來如下圖所示。

繼電器

開始時,你喜歡接收完一條完整的資訊後再把它轉發。首先,根據發聲器發出的滴答聲,将字母記下來;當資訊接收完畢時,再開始用你的電鍵來發送。最後,你終于掌握了訣竅,在聽到滴答聲的同時就可以發送資訊,不需要再把資訊記錄下來了。這節約了不少時間。

有一天,當你正在轉發資訊時,瞄了瞄發聲器上那根上蹿下跳的橫杠,又看了看在電鍵上上下翻飛的手指。然後你就這樣來來回回地瞅來瞅去,恍然發現發聲器上下跳躍的節奏與電鍵是一緻的。是以你就去外面找了根小木棍,然後用木棍和一些細繩把發聲器和電鍵連接配接到了一起,如下圖所示。

繼電器與發聲器很像,傳進來的電流驅動電磁鐵拉動金屬杠,金屬杠同時又作為一個開關的組成部分,而這個開關連接配接着電池和輸出線路。通過這種方法,輸入的比較弱的電流就被“放大”成了較強的輸出電流。

淺讀《編碼:隐匿在計算機硬體背後的語言》上

當輸入的電流觸發了電磁鐵,電磁鐵把一個彈性金屬條吸附下來,就像閉合了開關一樣,使電流可以從接口輸出

淺讀《編碼:隐匿在計算機硬體背後的語言》上
淺讀《編碼:隐匿在計算機硬體背後的語言》上

是以,把一個電報機電鍵、一個繼電器,還有一個發聲器連接配接好,差不多就是下圖的這個樣子。

淺讀《編碼:隐匿在計算機硬體背後的語言》上

十進制

淺讀《編碼:隐匿在計算機硬體背後的語言》上

數字最初起源于對事物的計數

如果有一個人有四隻鴨子

淺讀《編碼:隐匿在計算機硬體背後的語言》上

進一步表示為

淺讀《編碼:隐匿在計算機硬體背後的語言》上

假設有27隻鴨子

淺讀《編碼:隐匿在計算機硬體背後的語言》上

早期的數字系統中,隻有羅馬數字沿用到了今天

淺讀《編碼:隐匿在計算機硬體背後的語言》上

沿用到今天的羅馬數字元号有 I V X L C D M

這裡,字母I表示1,可以看做是一個劃線或者一根伸出的手指。字母V像一隻手,表示5。兩個V是一個X,代表數字10。L是50。C來自單詞centum,表示100。D是500。最後一個,M來自于拉丁文mille,意為1000。

羅馬數字易于加減而難于乘除。加法:五個I是一個V,兩個V是一個X,五個X是一個L,以此類推

我們所用的數字系統通常被稱為阿拉伯數字,也可以稱為印度-阿拉伯數字系統。它起源于印度

  • 阿拉伯數字系統是和位置相關的。100和1,000,000這兩個數中都隻有一個1,而我們知道,1,000,000要遠遠大于100
  • 早期的數字系統中也有一點是阿拉伯數字系統所沒有的,那就是用來表示數字10的專門的符号
  • 阿拉伯數字也有一點是幾乎所有早期數字系統所沒有的,而這恰恰是一個比代表數字10的符号還重要得多的符号,那就是0。零無疑是數字和數學史上最重要的發明之一。它支援位置計數法,是以可以将25、205和250區分開來。

假設我們使用的不是十進制

書寫十進制和八進制數時,我們可以利用下标标注來差別不同數字系統,避免混淆。下标TEN表示十進制,EIGHT表示八進制。

白雪公主遇到的小矮人數量是7TEN或7EIGHT;

卡通人物的手指數是8TEN或10EIGHT;

貝多芬所寫的交響曲的數目是9TEN或11EIGHT;

人類手指的數量是10TEN或12EIGHT;

一年中的月份數是12TEN或14EIGHT;

兩個星期的天數是14TEN或16EIGHT;

“情人”的生日慶祝會是16TEN或20EIGHT;

一天中的小時數是24TEN或30EIGHT;

拉丁字母表中的字母數是26TEN或32EIGHT;

...

在結構上,八進制數字系統與十進制數字系統并沒有什麼不同。它們隻是在細節上存在一些差異。例如,八進制數中的每個位所代表的值是該位數字乘以8的整數次幂的結果。

淺讀《編碼:隐匿在計算機硬體背後的語言》上

二進制

二進制數的時候通常将它們寫成帶有前導零的形式(即第一個1的左邊有零)。例如0011,而不是寫做11。這樣寫不會改變數字的大小,僅僅是為了美觀。例如,以下是前16個二進制數以及與它們等價的十進制數。

淺讀《編碼:隐匿在計算機硬體背後的語言》上

電線可以表示二進制數字。如果有電流流過這根電線就代表二進制數字1,如果沒有,則代表二進制數字0。開關可以表示二進制數字。如果開關接通(或閉合)就代表二進制數字1,如果開關關斷(或斷開),則代表二進制數字0。燈泡可以表示二進制數字。如果燈泡點亮,就代表二進制數字1,如果沒點亮,則代表二進制數字0。電報繼電器可以表示二進制數字。如果繼電器閉合,就代表二進制數字1,如果斷開,則代表二進制數字0。

二進制數與計算機之間有着緊密的聯系

大約在1948年,美國數學家約翰·威爾德·特克(John Wilder Turkey,生于1915年)就意識到随着計算機的普及,二進制數很可能會在未來發揮更重要的作用。他決定創造一個新的、更短的詞語來代替使用起來很不友善的五音節詞——binary digit。他曾經考慮使用bigit和binit,但是最終他還是選用了這個短小、簡單、精巧而且非常可愛的詞——bit

二進制數邏輯與開關

二進制對實體世界的表達:0和1的組合

二進制的運算:邏輯與開關。

淺讀《編碼:隐匿在計算機硬體背後的語言》上
淺讀《編碼:隐匿在計算機硬體背後的語言》上

淺讀《編碼:隐匿在計算機硬體背後的語言》上
淺讀《編碼:隐匿在計算機硬體背後的語言》上

繼電器像開關一樣,可以串聯或并聯在電路中執行簡單的邏輯任務。這種繼電器的組合叫做邏輯門(logic gates)

前面提到過,繼電器對于電報系統的工作而言是至關重要的。在長距離情況下,連接配接電報站的電線具有很高的電阻。這就需要采取一些措施來接收微弱信号并把它增強後再發射出去。繼電器就是通過電磁鐵控制開關來實作這一目的的。實際上,繼電器是通過放大微弱信号來生成強信号的

可以這麼用

淺讀《編碼:隐匿在計算機硬體背後的語言》上

也可以這麼用

淺讀《編碼:隐匿在計算機硬體背後的語言》上

繼電器串聯-與

淺讀《編碼:隐匿在計算機硬體背後的語言》上

兩個繼電器的串聯被稱為一個“與門”。為了避免複雜的圖示,電氣工程師用如下專門的符号表示一個與門

淺讀《編碼:隐匿在計算機硬體背後的語言》上

其實就是

淺讀《編碼:隐匿在計算機硬體背後的語言》上

衍生去看

淺讀《編碼:隐匿在計算機硬體背後的語言》上
淺讀《編碼:隐匿在計算機硬體背後的語言》上
淺讀《編碼:隐匿在計算機硬體背後的語言》上

繼電器并聯-或

淺讀《編碼:隐匿在計算機硬體背後的語言》上

這裡的關鍵詞是“或”,是以這樣的門被稱為“或門”。電氣工程師用如下符号表示或門。

淺讀《編碼:隐匿在計算機硬體背後的語言》上

或門的兩個輸入中,隻要有一個加上電壓,輸出就是高電平。如果将低電平看做0,高電平看做1,那麼或門也有四種可能的組合狀态

淺讀《編碼:隐匿在計算機硬體背後的語言》上

繼電器反着玩-反向器-非

淺讀《編碼:隐匿在計算機硬體背後的語言》上

開關閉合,燈泡就會熄滅。以這種方式連接配接的繼電器叫做反向器(inverter)。反向器不是邏輯門(一個邏輯門通常有兩個或多個輸入),盡管如此,它的用處還是很廣。反向器可以用如下的專門符号來表示。

淺讀《編碼:隐匿在計算機硬體背後的語言》上
淺讀《編碼:隐匿在計算機硬體背後的語言》上

或非門

淺讀《編碼:隐匿在計算機硬體背後的語言》上
淺讀《編碼:隐匿在計算機硬體背後的語言》上
淺讀《編碼:隐匿在計算機硬體背後的語言》上

與非門

淺讀《編碼:隐匿在計算機硬體背後的語言》上
淺讀《編碼:隐匿在計算機硬體背後的語言》上
淺讀《編碼:隐匿在計算機硬體背後的語言》上

回報與觸發器

電路

淺讀《編碼:隐匿在計算機硬體背後的語言》上

結果

淺讀《編碼:隐匿在計算機硬體背後的語言》上
淺讀《編碼:隐匿在計算機硬體背後的語言》上

周期的倒數就是振蕩器的頻率(frequency)。在這個例子中振蕩器的周期是0.05s,那麼其頻率就是1÷0.05s,即振蕩器每秒鐘産生20次循環,而相應的輸出每秒鐘也變化20次

淺讀《編碼:隐匿在計算機硬體背後的語言》上

為了紀念發送和接收無線電波的第一人——亨利希·魯道夫·赫茲(1857-1894),後人使用“赫茲”這個詞來表示這一概念

特殊的或非門

或非門:或非門的特點是隻有在兩個輸入端都沒有電壓時,輸出端才産生電壓

淺讀《編碼:隐匿在計算機硬體背後的語言》上

左邊或非門的輸出是右邊或非門的輸入,而右邊或非門的輸出是左邊或非門的輸入。這種連接配接方式我們稱之為回報(feedback)

淺讀《編碼:隐匿在計算機硬體背後的語言》上

在初始狀态下,電路中隻有左邊的或非門輸出電流,這是因為其兩個輸入均為0。讓我們閉合上面的開關,左邊或非門将立刻輸出0,右邊或非門的輸出也會随之變為1,這時燈泡将被點亮。

淺讀《編碼:隐匿在計算機硬體背後的語言》上

奇妙的是,這時一旦你關閉上邊的開關,燈炮依然閃閃發光。這是因為由于左邊或非門的輸入中有一個為1,其輸出依然是0,因而左邊或非門的輸出不變,是以燈泡仍然亮着

淺讀《編碼:隐匿在計算機硬體背後的語言》上

閉合下面的開關。我們會發現右邊或非門的輸入中有一個立刻變為1,其輸出就相應地變為0,燈泡随之熄滅。左邊或非門的輸出此刻變為1

淺讀《編碼:隐匿在計算機硬體背後的語言》上

再去斷開下面的開關就會發現,燈泡一直處在熄滅狀态

淺讀《編碼:隐匿在計算機硬體背後的語言》上

同樣是在兩個開關都斷開的狀态下,燈泡有時亮着,有時卻不亮。當兩個開關都斷開時,電路有兩個穩定态,這類電路統稱為觸發器(Flip-Flop)

觸發器電路可以保持資訊,它可以“記住”某些資訊

觸發器種類繁多,先前所講述的是最簡單的一種R-S(Reset-Set,複位/置位)觸發器。我們通常把兩個非或門繪制成另一種形式,加上辨別符就得到了下面這幅圖

未完待續...

繼續閱讀