2010/10/11

讀後推薦:程式設計師的自我修養:連結、載入、程式庫 by 俞甲子/石凡/潘愛民

我看了這本書,覺得還不錯,對我很有幫助,釐清了很多概念與疑問。

書名:程式設計師的自我修養:連結、載入、程式庫
作者:俞甲子/石凡/潘愛民
出版社:碁峯




史瑞克說妖怪像洋蔥一樣,是有層次的,資訊科學這玩意兒更是如此,從上到下不知有多少層,有應用軟體層、有整合開發套件跟永遠看不完的類別庫與函式庫、有作業系統提供的API跟系統呼叫、有軔體層、有硬體層,每層都還可以繼續細分下去,另外還有網路服務跟雲端運算,各種數也數不清的結構與架構,嘿嘿,看來咱們比妖怪更有層次啊。




這本書的主旨就是副標題所說的,關於軟體程式從寫好開始,編譯成組合語言,組譯成機器指令,加上執行階段程式庫靜態連結成執行檔,執行時由作業系統載入到記憶體裡,動態載入與連結所需的程式庫,這一連串的過程;這本書解說了在x86架構下的ELF檔與PE檔格式,分別是在Linux與Windows系統下所使用的檔案格式,用來儲存執行檔(無附檔名或.exe)、中間目的檔(.o or .obj)、靜態程式庫(.a or .lib)、動態程式庫(.so or .dll)等等,書中有概念的闡述,也分解簡單的小程式來當實例,對我來說,幫助我釐清了很多觀念,例如什麼叫做runtime(runtime environment, runtime library, 執行階段程式庫)、編譯器之後的靜態連結器要處理哪些東西、動態程式庫(.so or .dll)背後的道理是什麼、符號表(symbol table)到底有多重要、在main()執行之前作業系統做了哪些事情、等等,真是太棒了,好書一本。



有一些書,偏重理論與概念,例如鐵甲武士惡鬥吐火龍,對於一個在應用軟體層的人來說,較不實用,我想要的是實際上用的工具與技術(compiler, dynamic linking, etc..)的概略說明,我想要的是當前廣泛使用的作業系統(Linux, Windows)與工具(gcc, Visual C++)與檔案格式(ELF, PE)的探討,當理論書籍說有哪些方法可以用來實作出什麼什麼技術,本書則告訴你Linux與Windows用的技術是什麼;這樣當我在其上開發軟體時,才不會被華麗文藻包裝過的說明文件迷惑,搞不懂共用物件與plug-in的差別。

PS 不要誤會,龍書是經典,編譯器也是資訊科學必修的課程。



還記得當初寫第一支程式的時候嗎?從寫好到執行看到螢幕上印出hello, world.,其實中間經過了許許多多的關卡,編譯器、組譯器、靜態連結器、作業系統載入、動態連結、虛擬記憶體系統、等等,不說不知道,稍稍往下鑽研就會被嚇到,疊床架屋一層又一層的技術,才能讓我們鍵入少少幾行程式按下個按鈕就可以寫出hello, world.,當我們在其上享受各種新式技術與便利之餘,也別忘了要了解一下底層的原理,因為三不五時,底層的東西會跑上來嚇人,有時候程式當的亂七八糟,可是又看不懂錯誤訊息,有時候甚至連錯誤訊息都沒有,這時若心理有底層技術的概念,解決問題的機會就會多個幾趴。




如作者所言,關於載入器(loader)與連結器(linker)的資料是不多的,就算有也是那種看起來很硬很技術性的著作,有這麼一本算是研究心得的著作,要謝謝作者所花的心力。

5 comments:

  1. tks for your i :)

    ReplyDelete
  2. I always motivated by you, your thoughts and way of thinking, again, thanks for this nice post.

    - Joe

    ReplyDelete
  3. 看了一篇不錯的文章,
    http://www.lisha.ufsc.br/~guto/teaching/os/exercise/hello.html
    講解一支小小的程式Hello World從原始碼開始,一直到執行,中間經歷過的程序。

    ReplyDelete
  4. 我也有買這本書…

    ReplyDelete
  5. Anonymous19/4/14 07:29

    你做的任何事都是理論,只是你不清楚理論不會應用,很多工程師對基礎理論觀念不清楚的誤解

    ReplyDelete