今年二月份拿到這本書的電子稿時,還不是現在這個名字。
《程式設計師的自我修養》這個名字聽起來比原來的那個名字感覺好一些,但又讓人感覺有點不知所謂。還是副標題直接:《鏈結、裝載與庫》。我更願意接受這樣的乙個名字,有如那本多年前讀過的英文經典:《linkers & loaders》。
那段時間很忙,一直到現在都是。書稿我壓了很久,直到有一天,博文的朋友說,約個時間和 fenng 、俞甲子等杭州的程式設計師碰頭聚一下。我連夜開始讀書稿。不然,見面了談起這本書來,說不出所以然多不好意思。
書很厚,但是我看的很快。可能是因為內容很熟悉吧。大約花了乙個通宵就基本讀完了。寫的很細,當時快速翻過去的時候,發現幾處小筆誤,由於我的 pdf 閱讀器不能做評注,就忘記了。
我自己寫過書,知道寫書的艱辛。
很簡單的道理,自己本以為明白的很,要寫出來讓人明白,是件非常不容易的事。前幾年,我在 blog 上隨手寫的乙個關於鏈結方面的帖子,就引起了無窮無盡的爭議。blog 尚可隨意為之,可出版成白紙黑字,必然戰戰兢兢。一旦寫錯點什麼,很容易誤導許多人。見過俞甲子以後,我相信他和我一樣,是個從內心對讀者負責的人。
關於鏈結,裝載等問題。是作業系統中很基礎很重要的乙個部分。從特定的作業系統的解決方案:分析 windows 的 pe 或是 linux 的 elf 的結構,可以理解作業系統是如何讓一段**工作起來、怎樣讓不同的二進位制模組協同工作的。這是理解整個系統的乙個起點。
一方面,我們理解系統如何去做,是為了悟到為何這樣去設計。了解了為什麼,反過來更能理解怎樣去做。我為我的系統做過一段時間的 loader ,為了隔離作業系統的差異,來解決二進位制的**復用。不少朋友問我怎樣做到的。其實答案很簡單:自己來寫 loader 。理解作業系統怎樣幹的後,這並不是難事。至於需不需要越俎代庖替代作業系統去做,那就需要對這方面更多的理解了。這絕不是簡單的是否應該重新發明輪子的問題。
好吧,說起重造輪子的話題,怕又引起無窮盡的爭議。但有一點應該是有比較少的爭議的。你可以不自己造輪子,但應該了解輪子的構造,而且越詳盡越好。這是程式設計師的自我修養吧。
另一方面,我們對自己每天用的系統多一些了解,那是百利而無一害。即使從最實用主義的角度看,碰到一些表面上看起來無可適從的 bug ,也能分析清楚。比如,我前段時間碰到的那個詭異的 bug 。
前幾天收到博文寄過來的書,本答應周老師寫一篇書評,一直沒能動筆。端午節休假,終於把這筆欠帳還上了。:) 這本書是本好書,我會放在書架上,相信總有需要的時候拿出來查閱。
《程式設計師的自我修養》筆記 靜態鏈結
在通過編譯和彙編後,就生成了目標檔案,鏈結就是把這些目標檔案加工後合併成乙個輸出檔案的過程。鏈結過程可以分為兩步 第一步 空間與位址分配。掃瞄所有的輸入目標檔案,獲得它們每個各個段的長度 屬性和位置,並且將輸入目標檔案中的符號表中所有 的符號定義和符號引用收集起來,統一放到乙個全域性符號表。這一步中...
程式設計師的自我修養四靜態鏈結
真正了不起的程式設計師對自己的程式的每乙個位元組都了如執掌。a.c extern intshared int main 全域性符號 b.c int shared 1 全域性符號 void swap int a,int b 全域性符號 對於鏈結器來說,整個鏈結過程中,它就是將幾個輸入目標檔案加工後合併...
程式設計師的自我修養 編譯和鏈結
hello world程式hello.c include int main 在linux下,使用gcc編譯和執行hello world程式時,只需使用最簡單的命令。gcc hello hello.c hello hello world 事實上,上述過程可以分解為4個步驟,分別是預處理 prepres...