星期日, 5月 11, 2008

Linkers and Loaders

終於把這本書看完了,這本書花的時間比我想像中得多,原本看這本書的厚度,想說大概兩三下就看完了吧,結果因為這本書編排和內容的選擇都頗糟的關係所以就看了很久。

這本書的內容在講些什麼呢?說明怎麼把一個原始碼編譯成一個物件檔的書多到數不完,稍微深一點的語言書(如The C++ language)都會提到某段code被compile之後會變成什麼樣子。但說明如何把很多分原始碼編出來的物件檔變成一份執行檔的書,市場上有名的好像就只有這本。一直以來,我一直都無法把C++的那些原始碼,和書上看到的記憶體定址那些東西連結在一起,也就是我對上游的原始碼到最下游的二進位碼,以及二進位碼如何和山頭林立結構各不相同的CPU合作,被作業系統放到記憶體執行這個過程,中間一直有一些想不通卻又不知道如何形容的空洞感和蒼白感,看了這本書講如何把很多物件檔修修改改連結在一起,以及執行檔如何經過即時性代碼修改放到記憶體執行,雖然還是不知道個別的細節,但整體的概念大概是有了。

這本書為甚麼說內容糟?首先這本書的作者很強,根據內文推斷他看過的compiler和Linker搞不好比小T打過的電動還要多,問題就是這個人太強了,所以他根本搞不清楚看這本書的人到底缺乏什麼,就很像一個游泳強的人搞不懂初學者到底哪裡不會一樣,因為初學者不會的地方對他來說都理所當然,其實作者太強也沒關係,C爸爸不是很強嗎?他的The C++ Language還不是經典?所以更根本的問題就是這本書的讀者定位不明,雖然這本書最前面就寫說學生很適合看這本書,但學生的等級也可以差很多啊,作者應該言明讀者應該要有哪些prior knowledge才適合看這本書,然後prior knowledge涵蓋範圍內的知識的就不提,超越prior knowledge的就講詳細點。

讀者定位不明,意味著這本書對細節的掌握不好,這本書提到了一大堆CPU和Object Format,SPARC啦,x86啦,ELF啦,PE啦blahblahblah,在有限的篇幅提一大堆format,意思就是每個都沒辦法講的很仔細,偏偏作者又很喜歡烙細節,每個format都拿其中的一些欄位出來講,搭配一些模糊的概念性描述。結果這本書做不到抽象、概念性的講解,因為他拿了很多細節,但這些細節又講的不夠細,統統講一半欲語還羞,沒有明確到能讓初學的讀者看得懂的程度。卡在中間的尷尬地帶,苦的就是像我這種程度不高的讀者了,套一句Amazon上的書評,就是:「Too many omissions to be useful, too general to instruct」

這本書的編排也不對,很多相關的概念或名詞解釋,基本上第一次遇到的時候都應該略為講解,但這本書碰到比較重要的名詞,常常都是「deferred to chapter XX」一語帶過,於是悲慘的讀者就只能看著整個章節一直狂講看不懂的名詞,然後一邊事倍功半的看一邊修正自己猜測出來的定義,然後等一直翻翻到後面作者心情好終於想開始講前面的名詞的時候,才有辦法搞懂前面的章節到底是講些什麼碗糕。於是乎讀這本書的感覺可以引用書中的概念:連結是一個two pass process,第一個pass把所有symbol都蒐集整理起來,第二個pass才實際解讀這些symbol。讀這本書也差不多,讀第一遍是把看得懂的部份看懂,看不懂的部份硬記,讀第二遍的時候因為之前看不懂的部份在後面的章節都有講,就可以把硬記的東西在腦海變成看得懂的語言。讀書的步驟竟然可以和Linking一樣,不愧是Linkers and Loaders,真是偉哉!

其實這種講一大堆零散東西的書,並不是沒有辦法解決讀者因為太零散搞不懂的問題,之前讀過的Design Pattern : Elements of reusable objects其實也是講了一大堆零散卻又相關的Design Pattern,可是我覺得那本書並不會讓我讀得很痛苦,為甚麼?因為那本書最前面的地方有一個叫Lexi的Helloworld,把後面章節會出現的東西用很簡單的方式表達,並且告訴讀者他們怎麼組合在一起,如果那本書少了Lexi這個章節,直接在後面的Pattern講說:這個Flyweight可以和這個XX pattern合作啦,就這樣這樣這樣,那個Command Pattern可以實做成blahblahblah,如XX公司的產品就有。變成這種零碎的樣子我大概也會摔書吧。

回到Linkers and Loaders這本書,這本書只要加一個章節就可以化腐朽為神奇:寫一個會用到DLL的Hello world,然後從compile之後的物件檔一路講到連結,再講到Windows怎麼把他放進來執行,有了這個Example,後面講一大堆不同CPU/作業系統的不同Object file,讀者自然有辦法用先前的範例來比較。簡而言之,講一大堆零碎的東西前,記得給個Helloworld來個整體性的介紹,不要一開始就直接跳到局部去講細節。如果一本C++入門教科書先講一大堆syntax然後把Helloworld放到最後一個章節才講,你覺得這本書會是一本好的入門書嗎?

這本書的綜合評價,我個人還是認為值得讀,畢竟專門講Linking和Loading的書市面上好像就這麼一本,讀完以後對程式從出生到執行會有完整的概念,當然要有心理準備跟一大堆沒碰過的format奮戰,然後一邊讀一邊罵作者就是。

下本電腦書是Programming Applications for Microsoft Windows,不能一輩子都讀理論書沒coding啊...XD 全文連結

0 意見: