2012年1月11日 星期三

Code: The Hidden Language of Computer Hardware and Software (簡體中文版本) 讀後感

the 1st edition: 20120111 (3)
the 2nd edition: 20170420 (4)

作者 Charles Petzold 在 1999 年開始寫這本書, 我很久之前擁有的是英文版, 曾經試圖翻閱, 卻總是在其艱難的英文句子中敗退下來。這是很久很久之前不知道在哪裡聽說到的書, 因為作者 Charles Petzold (windows programming 界的大師級人物) 很有名, 我相信這會是一本好書, 而閱讀過後, 這本書比我想像的還要更好。


簡體中文譯為 - 编码: 隐匿在计算机软硬件背后的语言
20111212 在台南若水堂看到簡體中文版本, 意外驚喜之下, 立刻買了下來。55X6 = 330, 花了 330 台幣。這本的簡體中文翻譯算是不錯, 不熟悉閱讀簡體中文書籍的我也讀得津津有味, 也沒有任何的不流暢之處, 在缺乏繁體中文的版本下, 是唯一也是不錯的選擇。

這本書的內容是什麼呢?從書名 CODE 來看, 又, 它是一本電腦相關書籍, 作者又是軟體界大師級人物, 也許有人會猜和程式語言相關, 教怎麼寫程式吧! 不過從簡體中文的翻譯可以看出, CODE 被翻成編碼的意思 ... 嗯!還是猜不到是吧?

這本書是在講述計算機的故事, 從燈泡、開關到打造出一台計算機以及後來的軟體發展到網路的故事, 很意外吧!從書名完全看不出來是這樣的內容。

書中作者有一句話我很喜歡:「明喻與暗喻是文學描述中精妙的輔助手段, 但它們常常掩蓋了科學技術的真正光芒。」在解釋一些專業的技術時, 大多會聽到一些比喻的方式, 不過有時候的確只有精確的解釋, 才能了解其內涵。

因此我基本不會使用類比,因為類比其實就是在用外部知識來理解當前的話題,很容易把話題扯開出去。
ref: 我对“语言之争”的看法:别随便拉我入场 

在《iWoz 科技頑童沃茲尼克》這本書中讀到, Steven Wozniak 從小被傳授電子學相關的知識, 其中包括原子核裡電子的流動與電流的關係, 我那時候心想: 「好厲害!原來電流可以細談到電子。」而在本書 CODE 中, 從第四章 - 手電筒的剖析, 我知道這是怎麼一回事了, 也許中學教育早已教過, 但我真的不記得了。

作者從第一章的摩斯電碼開始, 告訴讀者編碼的概念, 如何簡化編碼還原到原來的意思, 盲人使用的文字也是編碼的一種, 封面上每六個凸起或是平的圓點 (簡體中文版本才有) 就是 C, O, D, E 本書書名。

手電筒的線路到電子的流動完成整個電流的移動, 有趣而令人容易理解的比擬, 實在令人佩服。

從人類十個手指頭的十進位 -> 卡通人物四個手指頭的八進位 -> 龍蝦螯的四進位 -> 海豚兩個鰭的二進位, 原來印度人發明的阿拉伯數字是如此的偉大, 有了它, 我們得以用同樣的原理計算八進位、四進位、二進位, 不過得先準備好其他進位的加法表和乘法表。一路的解釋下來, 讓我有豁然開朗的感覺, 頓悟了原來數字這回事。

再來的邏輯學和燈泡完成了 and/or 運算, 真是神奇, 原來這些數學和計算機是這樣關聯起來的。快要提到燈泡、電池、開關、導線和計算機的關係, 真期待後面的內容。

本書有 25 章, 372 頁, 平均一章 10 多頁, 很容易就可以看完一個章節, 很容易看下去, 也很容易沉迷的繼續看下去, 大學時期要是有這樣有趣的教科書, 哪裡需要靠考試逼我, 自己找時間就會看書, 也就瞭解計算機的工作原理了。是的 code 就是在講述計算機構造, 如何用相關技術, 完成計算。我一直以為作者是軟體相關工作者, 沒想到果然軟體大師級人物, 從數學、硬體果然有都有涉獵, 一直以來總是懷疑學校所學的知識到底是應用在哪裡? 因為工作上幾乎沒用到相關的知識, 現在總算解了我的疑惑, 第十章的邏輯與開關, 精彩的闡釋了這樣的學問如何應用在計算機的 and/or 運算。

原文版本的封面沒有使用盲人的凸點印刷, 簡體中文版本多花了點成本使用了盲人的凸點印刷。

不過原文版本的燈泡圖形有紅色線條, 簡體中文版本就沒有了, 這樣的確比較不好看。

or gate, and gate, xor gate, nand gate, not gate, buffer 原來是繼電器 (其原理是透過電池鐵來實作) 透過不同的組合來完成的, 從燈泡開關線路到這些基本 gate, 慢慢的解釋計算機原理, 再來要講述加法器了, 你會和我一樣很期待嗎?

我似乎開始有印象學生時代的加法器了, 那時候讀起來很無趣, 沒想到透過 code, 我豁然開朗, 原來半加器、全加器 (half adder, full adder) 是這樣兜出來的, 嗯!這我有印象。而一補數、二補數原來是用來做減法運算用, 而不是純粹一種數學運算, 計算機必須透過這樣的方式來完成減法的運算, 知其然的學習方式果然有趣多了。

用電子線路完成加法器很厲害, 但運用機械裝置, 齒輪、槓桿做出計算機我覺得更是神奇, 這可是不用電的哦!不過可能大台了點 XD

而我也在這之後, 購入了一台《monroe 機械式計算機》。

ref: http://moodle.ncnu.edu.tw/file.php/13923/Ch01_%E8%A8%88%E7%AE%97%E6%A9%9F%E7%99%BC%E5%B1%95%E5%8F%B2.pdf
英國發明家巴貝奇(Charles Babbage)於1833年製造了一部計算用的機器,被命名為巴貝奇差分機
(Babbage Difference Engine),整部機器包含了25,000個零件,重約3噸,雖然著個機器經常故障,
但他並沒有氣餒,再接再厲與他兒子在1847年製造出分析機(Analytical Engine),
這也是世界上第一部完全自動計算的機器,它包括了輸入、處理、控制、儲存、輸出五部門,
可說是後來電腦構想的先驅;因此被稱為電腦之父(Father of the Computer)。

第十四章的內容對我有些難度, 閱讀速度慢了下來, 主要是運用 feedback 的概念來完成很多神奇的電路。oscillator, R-S Flip-Flop, 電平觸發的 D 型觸發器 (可以用來儲存訊號), 邊沿觸發的 D 型觸發器, 然後使用 oscillator 和邊沿觸發的 D 型觸發器完成 frequency divider, 在透過連接幾個 frequency divider 完成計數器。

電平觸發的 D 型觸發器 (可以用來儲存訊號) 這可以拿來幹嘛呢?前面有了加法器, 可以相加兩個數, 如果要加三個數呢?那就需要這個電平觸發的 D 型觸發器來把第一次相加的結果保存下來, 在與第三個數相加, 是不是很重要呢?也許你馬上想到這就是電腦上的 dram。

計數器: 很簡單, 就是從 0000, 0001, 0010, 0011 ... 數到 1111 在回到 0000。



第十六章講述儲存器, RAM 為什麼會被稱為 RAM (Random Access Memory) 是因為它可以讀取某個位址上的任何一個 bit, 若是其他循序型的儲存器 (ex: tape), 要讀取 101 的位址值, 需要先讀取 100 的位址。原來是這樣兜起來的阿!

第十七章很複雜, 也是很精彩的一章, 我還無法 100% 理解其中內容, 不過對於計算機的概念已經有深刻的體認, 要多花點腦力來閱讀。這章的內容雖然也有硬體的部份 (有很多可怕的硬體元件連接起來), 但我想系統軟體程式設計師一定會很喜歡。從一個加法器漸漸演變成為可使用組合語言指令的計算機 (computer), 這是怎麼開始的呢?很有趣吧!從 ram array 開始, 導入 instruction code/operation code (就是常聽到的 op code), 開始了一個簡單的組合語言程式。

之前聽說過:「設計一顆 cpu 就要設計其組合語言」, 我現在終於有了深刻的認識, 原來這道理是這麼的自然, 哪裡需要花時間搞懂那句話呢? 而不知道 cpu 是怎麼設計出來的, 只能對那句話有粗淺的體認, 無法了解其真正想說的內容。到了第十九章介紹 intel 8080 時, 為什麼那些 op code 要設計成這樣也有所理解, 能搞懂這些關係, 真是令我舒體通暢, 沐浴春風。

手上真的有股衝動, 想去買個麵包版, 親手打造第十七章裡頭的計算機電路。而我也能理解為什麼總是要有個 clock 來產生時脈, 這才能讓 cpu 從 0 開始運轉, 由下而上的貫通, 了解整個計算機結構, 讓只專注於軟體設計的我非常受用, 原來我寫的 code, 就是變成這樣來執行的。

前面幾章所提到的硬體元件, 就是要用來打造這樣的一台計算機, 看似簡單的元件, 但經過複雜的組成後, 就變成你我在用的電腦了。

這是用 intel 8080 打造的 Altair 8800


看過本書後, 就會知道為什麼上面會有開關和那些燈泡了。現在的電腦當然不會長這樣, 但基本原理都是和這台有著開關和燈泡是一樣的。

在自然環境的包圍下, 閱讀如此精妙的好書, 充實感官與知識上的養份, 實在是一大享受, 我坐在樹下的陰涼處, 舉著 code, 盡情吸收著書中的技術, 享受專業書籍帶來的震憾。

從 22 章之後, 內容離開了生硬的計算機結構, 慢慢往軟體的部份而去, 從作業系統 (中國翻譯為操作系統)、程式語言、網路 ... 這是我比較熟悉的部份, 對於計算機原理製作的部份, 我非常喜愛。我不是熱愛和 and gate, or gate, xor gate, nand gate 奮鬥的硬體工程師, 但關於這部份卻也讓我看的津津有味。果然了解計算機結構, 才能更深入了解組合語言。

看完這本簡體中文的版本, 讓我了解不少中國的翻譯術語, 所以本篇心得有些辭彙是中國術語, 因為我不知道對應的英文或是台灣術語, 所以我也無法標示其後。

在中國術語日漸入侵的台灣, 台灣工程師也慢慢開始使用著這些中國術語。例如:支援/支持、實作/實現、呼叫/調用、質數/素數, 演算法/算法、物件導向/面向对象, 有些術語中國翻的很有意思, 不過大部份我還是習慣於台灣的用語。

簡體中文的版本 p 347 提到一個找尋質數的演算法 (Sieve of Eratosthenes), 在程式設計討論區上有時候會看到求質數的問題, 把這個拿出來用還不賴哦!

在圖書館有發現一本類似的書籍, 也是在講計算機結構, 裡頭的電子線路更是多樣, 看起來很嚇人, 還是燈泡與開關令人覺得友善, 看起來也不那麼可怕, 要是能先讀這本書, 也許在大學的時候, 我也能好好的看看數位電路的書籍, 這門學問也和寫程式一樣有趣呢!

真是一本很棒的書籍, 要是因為英文的關係不能吸收裡頭的知識, 那真是太可惜了!翻譯工業還是很重要的, 不是每個人都能為了學習專業知識而先把英文學好, 若能把原文這道牆的門檻降低, 也間接可以提高工程人員的專業。要不然還有俄文、德文、日文的專業書籍, 工程人員本身要學習的專業知識已經很難, 還要分心對付這些外文實在辛苦, 這都是可以靠政府力量來幫忙的, 可惜我們的政府並不重視這塊。

最後提一下這個課程 - Nand2Tetris 我沒特別看這個課程, 但聽說過其內容, 其實就和這本書很類似, 從邏輯閘打造出電腦。



Charles Petzold 的網站: http://www.charlespetzold.com/home.html

順便介紹 Charles Petzold 的另一本大作:
不是 Programming Windows, 這本大家都知道, 而是图灵的秘密:他的生平、思想及论文解读

6 則留言:

  1. 感覺很讚的一本書喔 希望之後還買的到

    回覆刪除
  2. 買得到阿, 若水堂還有簡體中文版本。

    回覆刪除
  3. 新竹沒買到,之後在台南 若水堂 買到囉 感謝

    回覆刪除
  4. 請問 機械式計算機是哪裡購買的

    回覆刪除
    回覆
    1. 請參考這篇:
      http://descent-incoming.blogspot.tw/2012/10/monroe-adding-machine-calculator.html

      刪除

使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。

我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。