《程序员的自我修养》导读
大家好,我是Cone,一名畢業于雙非本科的抖音全棧程序猿。?
今天來和大家分享《程序員的自我修養————鏈接、裝載與庫》這本書的全書導讀經驗,它在去年我拿下微信、抖音、百度等大廠sp及以上offer有非常大的幫助,分享與你,希望能夠對你帶來啟發。
前言
最近在工作之余,重新認真閱讀學生時代讀過的書籍,閱讀到了這本對我秋招幫助很大的書,重新思考了一些原來讀這本書時的問題,比如:windows系統相關知識,我到底要不要精讀?一些晦澀難懂的知識該怎么辦?等等,所以打算梳理一篇該書的導讀內容,希望對你能夠有所幫助。
PS:如果你還沒有讀過本書,建議你去認真閱讀本書,你肯定能收獲不小。
閱讀前所需要具備的基礎知識
下面為你整理了,你閱讀本書前,最好所具備的前言知識,這樣能夠在你閱讀的時候減少很多閱讀障礙。如果你缺少一些前言知識,也沒關系,努努力,啃一啃,遇到問題時,去努力尋找相關知識弄懂解決,肯定會有不小收獲。
?C/C++編程語言基礎?匯編語言基礎?操作系統基礎?計算機組成原理基礎
全書概覽
如上圖所示,全書分為四個部分。
第一部分:溫故而知新?
通過hello、world 第一個C程序引出相關一些列問題,拋出本書的目的,并回顧了操作系統相關的知識,包括硬件、線程、進程、內存等基礎知識。
第二部分:靜態鏈接?
全面講解了編譯的基本概念和過程以及鏈接器歷史,然后通過講解目標文件為引出靜態鏈接做鋪墊,最后詳細介紹了靜態鏈接知識。
第三部分:裝載與動態鏈接?
首先講解了可執行文件的轉載講解出內存中的進程虛擬空間布局、載入方式以及加載過程,之后詳細介紹了動態鏈接相關知識,后面追著介紹了Liunx下的動態庫特性。
第四部分:庫與運行庫
這一部分主要介紹了運行時內存利用相關知識、以及運行庫基本知識和實現,還講解了C++的全局析構與構造實現,最后還講解了系統調用及其原理。
章節概覽
下面是一些章節的概覽,有些知識Windows的知識也不需要去完全掌握,畢竟我們可能很少接觸windows開發吧。
第一章:溫故而知新?
本章也就是全書概覽上的第一部分,主要介紹一些背景知識和閱讀本書的一點鋪墊知識,比如:CPU、內存等硬件,操作系統進程、線程相關知識。?
第二章:編譯和鏈接?
本章主要介紹基本的編譯概念以及編譯幾大過程還有鏈接器相關知識。?
第三章:目標文件?
本章介紹了Windows和Liunx系統的目標文件,回答了目標文件是什么,目標文件有哪些類型,目標文件如存儲等問題。?
第四章:靜態鏈接?
本章主要講解靜態鏈接基礎知識和靜態鏈接基本步驟和過程,還講解舉例了最“小”鏈接。?
第五章:Windows PE/COFF
本章介紹Windows平臺的目標文件和可執行文件。?
第六章:可執行文件的轉載與進程?
本章通過介紹進程的基本概念,地址空間布局等知識引申出了可執行文件的加載過程。?
第七章:動態鏈接?
本章主要講解Liunx系統下的.so動態庫的動態鏈接過程。?
第八章:Liunx動態庫?
本章主要詳解介紹動態庫的相關知識,包括動態庫的分布和組織等。?
第九章:Windows下的動態鏈接?
本章主要講Windows下面的動態鏈接機制 第十章:內存 這章主要講運行時內存相關知識,包括堆與棧,堆的分配算法,函數調用棧等。?
第十一章:運行庫?
本章主要介紹運行庫的概念、c/c++運行庫、Glibc和MSVC CRT相關知識。?
第十二章:系統調用與API
本章主要講系統調用知識,包括系統調用流程以及相關API介紹。
第十三張:運行庫實現?
本章主要實現了一個支持堆、基本文件操作等功能的Mini CRT.
導讀建議
通常閱讀一本書,我們會有一個問題:我需要從書中得到一些什么?可能是已有知識的總結回顧、也可能是新知識的獲取。不管怎么樣,我們會有想要得到的收獲,那么閱讀《程序員的自我修養》這本書,你能得到什么呢?
?以CPU會為核心回顧計算機體系知識?了解代碼編譯的基本概念和步驟?Liunx系統下目標文件格式以及如何存儲?靜態鏈接基本概念,為什么要有靜態鏈接?目標文件如何被靜態鏈接到一起行程可執行文件?靜態鏈接時的空間地址分配、符號決議和重定位如何進行?可執行文件如何被系統加載,與進程的地址空間如何映射?動態鏈接基本概念以及鏈接時相關問題?運行時的內存分配以及入口程序初始化?上面是一些基本能得到的收獲,我們從中可以抽象為三個重要問題:?源碼是如何被編譯成可執行程序的??可執行程序是如何被加載到內存的??內存中的進程空間布局是怎么樣的?
帶著這個三個問題,去閱讀本書,效果會更好。
首先我們從書本脈絡出發,嘗試回答第一個問題
源碼是如何被編譯成可執行程序的?
這個涉及相關編譯問題,從上面的章節概覽可以知道,在第二章:編譯和鏈接就能找到相關答案,所以你需要認真閱讀第二章全部內容,不過這里只稍微展開講了編譯的大致過程,并沒有講解可執行文件如何生成的,生成可執行文件還需要鏈接,所以順著下去需要搞懂鏈接。?
那么在學習鏈接之前,書本第三章:目標文件里面有什么,就講解了需要鏈接的輸入產物長什么樣子,以及鏈接前的基本知識:鏈接的接口(基本單位)等,所以第三章是一個基礎知識章節,主要讓你掌握目標文件內容和格式,是為后面章節做鋪墊的,你能大致清楚目標文件的基本知識,第三章也是需要全部認真閱讀的。?
接下來就是鏈接了,第四章:靜態鏈接,本章首先根據目標文件,講解了兩種鏈接方法,之后講解了鏈接的兩個步驟,然后引申出C++的相關問題,其次講解了靜態庫的鏈接,最后有一個小實驗,讓你動手體驗。
?到這里你很好的回答上面的這個問題了。你能知道靜態鏈接是在做什么,它生成了什么,為什么需要它了。?接下來我們繼續下一個問題。
可執行程序是如何被加載到內存的?
回答完前面那個問題后,你了解了可執行程序的文件內容以及格式,前文開篇提到需要由操作系統的基礎知識,操作系統知識中程序運行的基本單位是進程,可執行程序加載到內存肯定首先需要了解進程的地址空間,其次需要知道是以什么方式加載到內存的。
在加載到內存之前需要進行進程的建立等操作,所以在本書第六章主要為你解答這些問題。?認真理解靜態鏈接之后,我們會有一個疑問,那些在靜態鏈接沒有被重定位的符號怎么辦?符號表里都是存在的偏移地址,那真實地址如何確定。這就涉及到了動態鏈接了,在靜態鏈接沒有完成的工程,由程序加載時進行動態鏈接完成。本書在第七章詳細介紹了動態鏈接的相關知識,包括步驟實現、懶加載等等。?
在了解完動態鏈接之后,可能還想要動態鏈接時鏈接的動態庫特性,所以在第八章介紹了Liunx下動態庫相關的知識。?讀完前面八章內容,你已經非常熟悉編譯鏈接加載相關知識了。?
那么可執行文件通過動態鏈接以及加載,完了之后是運行,運行離不開空間布局,所以接下來一個問題就是第三個問題了。
內存中的進程空間布局是怎么樣的?
進程的空間布局直接影響會影響程序的運行,運行時也需要用到一些堆、棧等空間,所以在本書第十章講解了內存相關知識,包括進程的空間布局、棧與調用慣例、堆與內存管理等知識,讀完本章,你能夠大致明白,程序運行時的一些地址是怎么回事。?
程序運行你肯定好奇入口,也就是計算機是如何進入執行程序的。那么本書第十章:運行庫,第一節為你講解了相關知識。?讀到這里你對于計算機的編譯、鏈接、加載、運行有了很深刻的認識,從全局層面進行了系統性的學習。
回答完三個問題,相信正在閱讀的你已經心中有底了。
帶著問題閱讀書籍往往是有非常棒的效果。
導讀總結
p1-109,建議精讀,讀懂讀透,讀完就能系統的計算機編譯鏈接相關知識。P127,使用ld鏈接腳本,本節需要自己動手嘗試,計算機是一門工科,多動手體會。
P149-175,講解可執行文件的轉載和進程,需要精讀。
P179-P219,講解動態鏈接,這一部分內容稍有難度,需要花些精力認真讀。P229-P248 講解動態庫,如果動態鏈接有些吃力,這一章可跳過也不影響。P283-334,這一部分就需要回到上面的第三個問題了,也需要認真弄懂。
整體下來前面175頁的知識讀下來會比較輕松,同時也能掌握很多的知識,從動態鏈接開始難度有會有提升了。但是只有理解了動態鏈接,你才能理解程序編譯鏈接時給動態鏈接留下接口是為什么,當然你也可以大致把動態庫理解為一堆功能代碼的共享。導讀總結就到這里了,希望你讀完有所收獲。
閱讀到這里,趕緊行動起來吧~?
這里為你精心準備了電子書:
鏈接:https://pan.baidu.com/s/1zmegxUifY4x9aN7H17ui3Q? 密碼:o589
總結
正如這本書的取名一樣,程序員也需要有自身的技術修養,在自我修養這條路上,筆者和大家一起成長。
總結
以上是生活随笔為你收集整理的《程序员的自我修养》导读的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python123填充颜色_WPS表格中
- 下一篇: 网上银行安全手段面面观