從同學的書桌上無意間拾起《程序員的自我修養——鏈接、裝載與庫》這本書,翻看了前幾頁,即被他追根溯源的精彩描述吸引,花了兩整天的時間,通讀完這本書。忍不住寫篇讀書筆記,以為備忘,如果對其他的朋友有所助益,秉承這開源的精神,就最好了~
《程序員的自我修養——鏈接、裝載與庫》PDF版下載地址:http://www.linuxidc.com/Linux/2011-09/43809.htm
這本書正是我一直想要的學習資料。它並不是簡單的講述了某些技術的機理(這是大多數的書籍做的,讀者會時常莫名其妙的接收了幾個新的機制,而不知道,為什麼這樣),更是將龍去脈依依列出,讓人深入理解其本質。對於剛入門的新手們,這應該算不可多得的好書了。
在讀這本書以前,我對 文本中的程序代碼 和 它在計算機中實際運行的過程 的關系知之甚少。對於計算機的發展,也是糊裡糊塗。之前對編譯原理、匯編等知識僅有若隱若現的了解,讀了這本書,才感受到這些基礎知識對於提高編程效率的重要作用。排除自我膨脹的因素,這本書確實讓我這只菜鳥對程序、對計算機的認識上升了一個台階。
正如作者所言,這本書的內容,本身不是那些最新潮的東西。它是實打實的基礎,是所有程序運行的本質機理,掌握了它們,對於以後的編程的思路會有幫助。就好比習武中的內功吧。
在此,向寫書的三位致敬,其中兩位還是浙大的學長^^. 下面,簡略的列出其中的內容以及我的認識和感悟。
全書分為四大部分,循序漸進的展開了linux及windows下程序的鏈接、裝載和系統庫的簡單機理的介紹。
第一部分為預備章節,綜述了操作系統的一些基礎知識。比如 CPU + 內存 + IO 的三大核心,比如 程序運行時的內存管理的分頁、分段,以及多線程的安全問題等。那些技術實現並不是冷冰冰的技術點,作者已經用生動的文字,將他們串成了一串。如果你自覺對操作系統的認識零散,通覽此部分,對於只是體系的疏導有很好的作用。
第二部分 介紹靜態鏈接。 先對編譯器的處理過程(預編譯、編譯、匯編、鏈接)做了簡明的介紹,之後詳細介紹了 我們C編程時,常見的obj目標文件(編譯後未鏈接的文件)的文件結構(ELF),實現機理。以此為鋪墊,闡釋了 靜態鏈接的實現方法。鏈接器的歷史是長於編譯器的。舉例來說,即使是最簡單的一個hello world在屏幕上的顯示都是要鏈接到很多文件的。
第三部分 是裝載與動態鏈接的介紹,並介紹了linux的共享庫的組織以及windows下的dll機制。C和C++作為linux和windows實現的基礎,他們是如何發揮其作用的,這裡都有描述。(不過可能由於基礎不扎實,對於其中動態鏈接的PIC部分,全局變量的處理問題,我看了好幾遍都沒太懂的說><...實踐最重要,以後自己動手研究)
第四部分 是程序對內存的使用,運行時庫的初步介紹,系統調用與API 和 一個簡單運行時庫 的實現實踐。模塊內容相對分散,看過內存部分的介紹後,我對程序的運行過程才有了個真正整體的概念。