文/賴勇浩
儘管大多數程式員寫的代碼都在相同的平台上運行,但程式員對同一平台卻有著不同的理解。有些程式員認為平台應該是對自己透明的不必自己去瞭解它,而另一部分的程式員卻認為瞭解平台有利於自己在寫程式的時候充分發揮平台的優勢及規避平台的缺陷。久而久之前者就有可能淪為在網上討論程式員三十歲三十五歲應該怎麼辦的那類人;後者則可能慢慢成就了自己成為卓越程式員的夢想。
因為國內關於電腦體繫結構的書籍太少,即使有也是非常理論化或者總是在討論早已經不再流行的架構,學習資料的匱乏使想深入理解電腦體繫結構的朋友舉步維艱。幸好現在組合語言編程名著《The Art Of Assembly Language》一書的作者Randall Hyde給我們帶來了《Write Great Code》四卷本,該書的第一卷《Understanding the Machine》已經翻譯成中文版出版了,這實在是追求卓越代碼的程式員的福音!《編程卓越之道 第一卷 深入理解電腦》到手之後,我讀得不捨得放下,讀完之後,掩卷沉思,認為這本書有新、俗、通三大特點。
這本書新。它講述了當前流行的PC硬體技術,比如高效能緩衝、流水線架構的CPU、並行和超標量及亂序執行技術、AGP介面、PCI-E介面、火線(Firewire)甚至是USB。這些跟得上時代的技術肯定比學生時代只講8086/286的《電腦導論》要強得多。因為我讀硬體方面的書籍比較少,我是讀到這本書才知道原來流水線是怎樣組織的,超標量是怎麼回事,AGP介面和PCI-E介面先進在哪裡,甚至你可以從原理上理解USB介面的外設為什麼會流行全世界。
這本書俗。一本書講述的技術越是先進越是複雜,它就有可能越難讓人讀懂。Randall Hyde把這本書寫得非常俗,寫成了一本面向程式員的通俗手冊。作者把整數、定點數、浮點數和字串在機器裡的表示講解得深入淺出。他那循序漸進由淺入深的行文結構讓人讀起來不忍罷手。對於字元集、指令集這兩大塊,Randall Hyde不僅深入剖析現在流行的ASCII字元集、X86指令集,並提出了自己的見解,然後嚴謹地論述這樣設計的先進性和意義,這樣的章節在傳統的電腦理論書籍裡面是見不到的。在每一個章節,作者都力求向讀者解釋清楚為什麼電腦的某一模組會被設計成這樣,設計成這樣有什麼好處有什麼壞處,我們怎麼寫代碼才能更好地利用這一方案的優勢,避免代碼劣化。這樣的一本書,對此有很大的指導意義。
這本書通。卓越的代碼是能“感覺”到底層的硬體的,因為代碼運行在硬體組成的電腦上。電腦群組成或者對程式員可見,或者有助於理解為什麼系統架構師選擇了某個特定的系統設計方案,學習計算群組成的目的不是為了讓讀者能夠自己設計CPU或者電腦系統,而是為了教會讀者如何最有效地利用現有的電腦設計。在這方面,作者Randall Hyde縱合橫連地把電腦資料標記法、記憶體的組織與訪問、複雜資料類型及其記憶體對象、布爾邏輯和數字設計、CPU體繫結構、指令集體繫結構、記憶體的體繫結構與記憶體組織和輸入與輸出融匯在這本書裡。從章節編排到內容過渡都渾然天成,讓讀者如飲仙露、甘之如飴。
紮實的電腦基本知識是寫出卓越代碼的基石,而典型的電腦科學或者電腦工程的課程恰恰對這些底層細節語焉不詳、甚至刪繁就簡。這本書將電腦科學的幾門課程的內容加以融合,最難能可貴的是這本書從程式員的角度進行闡述,讓我們可以知其然更知其所以然,寫出卓越的代碼。嗯,舉個例子,看完這本書,當你找工作時遇到一道重寫CRT裡的memcpy函數的面試題,你的答案將比以前高效得多。這並不是因為本書講述了怎樣寫出高效的memcpy,而是它讓你知道電腦的記憶體組織與訪問的原理,你可以規避它的不足。
人無完人、金無足赤,這本書也不是完美無缺的。要求一本只有四百餘頁的書講清道明複雜的X86電腦體繫結構的方方面面是不可能的,本書只是從程式員需要的角度來闡述程式員需要瞭解的硬體特性,很多細節仍然被隱藏了起來。這些隱藏的細節其實對於很多程式員而言仍然重要,如有興趣可以參考其它專門論述相關課題的專著。在這本書的中文版裡,看得出譯者花費了不少工夫和心血,品質不錯;雖然有一些排版錯誤和最後一章譯得稍顯生硬,但瑕不掩瑜,它仍是一本值得各大中專院校師生、職業程式員一讀的好書。
在深入理解了電腦體繫結構之後,怎樣在實際工作中應用這些知識呢?即將出版《編程卓越之道 第二卷 應用底層語言思想編寫高層語言代碼》馬上就會帶給大家格物致用的答案,現在就開始坐上快車尖叫出發吧!