日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

《程序员的自我修养》导读

發(fā)布時(shí)間:2023/12/20 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《程序员的自我修养》导读 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

大家好,我是Cone,一名畢業(yè)于雙非本科的抖音全棧程序猿。?

今天來(lái)和大家分享《程序員的自我修養(yǎng)————鏈接、裝載與庫(kù)》這本書(shū)的全書(shū)導(dǎo)讀經(jīng)驗(yàn),它在去年我拿下微信、抖音、百度等大廠sp及以上offer有非常大的幫助,分享與你,希望能夠?qū)δ銕?lái)啟發(fā)。

前言

最近在工作之余,重新認(rèn)真閱讀學(xué)生時(shí)代讀過(guò)的書(shū)籍,閱讀到了這本對(duì)我秋招幫助很大的書(shū),重新思考了一些原來(lái)讀這本書(shū)時(shí)的問(wèn)題,比如:windows系統(tǒng)相關(guān)知識(shí),我到底要不要精讀?一些晦澀難懂的知識(shí)該怎么辦?等等,所以打算梳理一篇該書(shū)的導(dǎo)讀內(nèi)容,希望對(duì)你能夠有所幫助。

PS:如果你還沒(méi)有讀過(guò)本書(shū),建議你去認(rèn)真閱讀本書(shū),你肯定能收獲不小。

閱讀前所需要具備的基礎(chǔ)知識(shí)

下面為你整理了,你閱讀本書(shū)前,最好所具備的前言知識(shí),這樣能夠在你閱讀的時(shí)候減少很多閱讀障礙。如果你缺少一些前言知識(shí),也沒(méi)關(guān)系,努努力,啃一啃,遇到問(wèn)題時(shí),去努力尋找相關(guān)知識(shí)弄懂解決,肯定會(huì)有不小收獲。

?C/C++編程語(yǔ)言基礎(chǔ)?匯編語(yǔ)言基礎(chǔ)?操作系統(tǒng)基礎(chǔ)?計(jì)算機(jī)組成原理基礎(chǔ)

全書(shū)概覽

如上圖所示,全書(shū)分為四個(gè)部分。

第一部分:溫故而知新?

通過(guò)hello、world 第一個(gè)C程序引出相關(guān)一些列問(wèn)題,拋出本書(shū)的目的,并回顧了操作系統(tǒng)相關(guān)的知識(shí),包括硬件、線程、進(jìn)程、內(nèi)存等基礎(chǔ)知識(shí)。

第二部分:靜態(tài)鏈接?

全面講解了編譯的基本概念和過(guò)程以及鏈接器歷史,然后通過(guò)講解目標(biāo)文件為引出靜態(tài)鏈接做鋪墊,最后詳細(xì)介紹了靜態(tài)鏈接知識(shí)。

第三部分:裝載與動(dòng)態(tài)鏈接?

首先講解了可執(zhí)行文件的轉(zhuǎn)載講解出內(nèi)存中的進(jìn)程虛擬空間布局、載入方式以及加載過(guò)程,之后詳細(xì)介紹了動(dòng)態(tài)鏈接相關(guān)知識(shí),后面追著介紹了Liunx下的動(dòng)態(tài)庫(kù)特性。

第四部分:庫(kù)與運(yùn)行庫(kù)

這一部分主要介紹了運(yùn)行時(shí)內(nèi)存利用相關(guān)知識(shí)、以及運(yùn)行庫(kù)基本知識(shí)和實(shí)現(xiàn),還講解了C++的全局析構(gòu)與構(gòu)造實(shí)現(xiàn),最后還講解了系統(tǒng)調(diào)用及其原理。

章節(jié)概覽

下面是一些章節(jié)的概覽,有些知識(shí)Windows的知識(shí)也不需要去完全掌握,畢竟我們可能很少接觸windows開(kāi)發(fā)吧。

第一章:溫故而知新?

本章也就是全書(shū)概覽上的第一部分,主要介紹一些背景知識(shí)和閱讀本書(shū)的一點(diǎn)鋪墊知識(shí),比如:CPU、內(nèi)存等硬件,操作系統(tǒng)進(jìn)程、線程相關(guān)知識(shí)。?

第二章:編譯和鏈接?

本章主要介紹基本的編譯概念以及編譯幾大過(guò)程還有鏈接器相關(guān)知識(shí)。?

第三章:目標(biāo)文件?

本章介紹了Windows和Liunx系統(tǒng)的目標(biāo)文件,回答了目標(biāo)文件是什么,目標(biāo)文件有哪些類型,目標(biāo)文件如存儲(chǔ)等問(wèn)題。?

第四章:靜態(tài)鏈接?

本章主要講解靜態(tài)鏈接基礎(chǔ)知識(shí)和靜態(tài)鏈接基本步驟和過(guò)程,還講解舉例了最“小”鏈接。?

第五章:Windows PE/COFF

本章介紹Windows平臺(tái)的目標(biāo)文件和可執(zhí)行文件。?

第六章:可執(zhí)行文件的轉(zhuǎn)載與進(jìn)程?

本章通過(guò)介紹進(jìn)程的基本概念,地址空間布局等知識(shí)引申出了可執(zhí)行文件的加載過(guò)程。?

第七章:動(dòng)態(tài)鏈接?

本章主要講解Liunx系統(tǒng)下的.so動(dòng)態(tài)庫(kù)的動(dòng)態(tài)鏈接過(guò)程。?

第八章:Liunx動(dòng)態(tài)庫(kù)?

本章主要詳解介紹動(dòng)態(tài)庫(kù)的相關(guān)知識(shí),包括動(dòng)態(tài)庫(kù)的分布和組織等。?

第九章:Windows下的動(dòng)態(tài)鏈接?

本章主要講Windows下面的動(dòng)態(tài)鏈接機(jī)制 第十章:內(nèi)存 這章主要講運(yùn)行時(shí)內(nèi)存相關(guān)知識(shí),包括堆與棧,堆的分配算法,函數(shù)調(diào)用棧等。?

第十一章:運(yùn)行庫(kù)?

本章主要介紹運(yùn)行庫(kù)的概念、c/c++運(yùn)行庫(kù)、Glibc和MSVC CRT相關(guān)知識(shí)。?

第十二章:系統(tǒng)調(diào)用與API

本章主要講系統(tǒng)調(diào)用知識(shí),包括系統(tǒng)調(diào)用流程以及相關(guān)API介紹。

第十三張:運(yùn)行庫(kù)實(shí)現(xiàn)?

本章主要實(shí)現(xiàn)了一個(gè)支持堆、基本文件操作等功能的Mini CRT.

導(dǎo)讀建議

通常閱讀一本書(shū),我們會(huì)有一個(gè)問(wèn)題:我需要從書(shū)中得到一些什么?可能是已有知識(shí)的總結(jié)回顧、也可能是新知識(shí)的獲取。不管怎么樣,我們會(huì)有想要得到的收獲,那么閱讀《程序員的自我修養(yǎng)》這本書(shū),你能得到什么呢?

?以CPU會(huì)為核心回顧計(jì)算機(jī)體系知識(shí)?了解代碼編譯的基本概念和步驟?Liunx系統(tǒng)下目標(biāo)文件格式以及如何存儲(chǔ)?靜態(tài)鏈接基本概念,為什么要有靜態(tài)鏈接?目標(biāo)文件如何被靜態(tài)鏈接到一起行程可執(zhí)行文件?靜態(tài)鏈接時(shí)的空間地址分配、符號(hào)決議和重定位如何進(jìn)行?可執(zhí)行文件如何被系統(tǒng)加載,與進(jìn)程的地址空間如何映射?動(dòng)態(tài)鏈接基本概念以及鏈接時(shí)相關(guān)問(wèn)題?運(yùn)行時(shí)的內(nèi)存分配以及入口程序初始化?上面是一些基本能得到的收獲,我們從中可以抽象為三個(gè)重要問(wèn)題:?源碼是如何被編譯成可執(zhí)行程序的??可執(zhí)行程序是如何被加載到內(nèi)存的??內(nèi)存中的進(jìn)程空間布局是怎么樣的?

帶著這個(gè)三個(gè)問(wèn)題,去閱讀本書(shū),效果會(huì)更好。

首先我們從書(shū)本脈絡(luò)出發(fā),嘗試回答第一個(gè)問(wèn)題

源碼是如何被編譯成可執(zhí)行程序的?

這個(gè)涉及相關(guān)編譯問(wèn)題,從上面的章節(jié)概覽可以知道,在第二章:編譯和鏈接就能找到相關(guān)答案,所以你需要認(rèn)真閱讀第二章全部?jī)?nèi)容,不過(guò)這里只稍微展開(kāi)講了編譯的大致過(guò)程,并沒(méi)有講解可執(zhí)行文件如何生成的,生成可執(zhí)行文件還需要鏈接,所以順著下去需要搞懂鏈接。?

那么在學(xué)習(xí)鏈接之前,書(shū)本第三章:目標(biāo)文件里面有什么,就講解了需要鏈接的輸入產(chǎn)物長(zhǎng)什么樣子,以及鏈接前的基本知識(shí):鏈接的接口(基本單位)等,所以第三章是一個(gè)基礎(chǔ)知識(shí)章節(jié),主要讓你掌握目標(biāo)文件內(nèi)容和格式,是為后面章節(jié)做鋪墊的,你能大致清楚目標(biāo)文件的基本知識(shí),第三章也是需要全部認(rèn)真閱讀的。?

接下來(lái)就是鏈接了,第四章:靜態(tài)鏈接,本章首先根據(jù)目標(biāo)文件,講解了兩種鏈接方法,之后講解了鏈接的兩個(gè)步驟,然后引申出C++的相關(guān)問(wèn)題,其次講解了靜態(tài)庫(kù)的鏈接,最后有一個(gè)小實(shí)驗(yàn),讓你動(dòng)手體驗(yàn)。

?到這里你很好的回答上面的這個(gè)問(wèn)題了。你能知道靜態(tài)鏈接是在做什么,它生成了什么,為什么需要它了。?接下來(lái)我們繼續(xù)下一個(gè)問(wèn)題。

可執(zhí)行程序是如何被加載到內(nèi)存的?

回答完前面那個(gè)問(wèn)題后,你了解了可執(zhí)行程序的文件內(nèi)容以及格式,前文開(kāi)篇提到需要由操作系統(tǒng)的基礎(chǔ)知識(shí),操作系統(tǒng)知識(shí)中程序運(yùn)行的基本單位是進(jìn)程,可執(zhí)行程序加載到內(nèi)存肯定首先需要了解進(jìn)程的地址空間,其次需要知道是以什么方式加載到內(nèi)存的。

在加載到內(nèi)存之前需要進(jìn)行進(jìn)程的建立等操作,所以在本書(shū)第六章主要為你解答這些問(wèn)題。?認(rèn)真理解靜態(tài)鏈接之后,我們會(huì)有一個(gè)疑問(wèn),那些在靜態(tài)鏈接沒(méi)有被重定位的符號(hào)怎么辦?符號(hào)表里都是存在的偏移地址,那真實(shí)地址如何確定。這就涉及到了動(dòng)態(tài)鏈接了,在靜態(tài)鏈接沒(méi)有完成的工程,由程序加載時(shí)進(jìn)行動(dòng)態(tài)鏈接完成。本書(shū)在第七章詳細(xì)介紹了動(dòng)態(tài)鏈接的相關(guān)知識(shí),包括步驟實(shí)現(xiàn)、懶加載等等。?

在了解完動(dòng)態(tài)鏈接之后,可能還想要?jiǎng)討B(tài)鏈接時(shí)鏈接的動(dòng)態(tài)庫(kù)特性,所以在第八章介紹了Liunx下動(dòng)態(tài)庫(kù)相關(guān)的知識(shí)。?讀完前面八章內(nèi)容,你已經(jīng)非常熟悉編譯鏈接加載相關(guān)知識(shí)了。?

那么可執(zhí)行文件通過(guò)動(dòng)態(tài)鏈接以及加載,完了之后是運(yùn)行,運(yùn)行離不開(kāi)空間布局,所以接下來(lái)一個(gè)問(wèn)題就是第三個(gè)問(wèn)題了。

內(nèi)存中的進(jìn)程空間布局是怎么樣的?

進(jìn)程的空間布局直接影響會(huì)影響程序的運(yùn)行,運(yùn)行時(shí)也需要用到一些堆、棧等空間,所以在本書(shū)第十章講解了內(nèi)存相關(guān)知識(shí),包括進(jìn)程的空間布局、棧與調(diào)用慣例、堆與內(nèi)存管理等知識(shí),讀完本章,你能夠大致明白,程序運(yùn)行時(shí)的一些地址是怎么回事。?

程序運(yùn)行你肯定好奇入口,也就是計(jì)算機(jī)是如何進(jìn)入執(zhí)行程序的。那么本書(shū)第十章:運(yùn)行庫(kù),第一節(jié)為你講解了相關(guān)知識(shí)。?讀到這里你對(duì)于計(jì)算機(jī)的編譯、鏈接、加載、運(yùn)行有了很深刻的認(rèn)識(shí),從全局層面進(jìn)行了系統(tǒng)性的學(xué)習(xí)。

回答完三個(gè)問(wèn)題,相信正在閱讀的你已經(jīng)心中有底了。

帶著問(wèn)題閱讀書(shū)籍往往是有非常棒的效果。

導(dǎo)讀總結(jié)

p1-109,建議精讀,讀懂讀透,讀完就能系統(tǒng)的計(jì)算機(jī)編譯鏈接相關(guān)知識(shí)。P127,使用ld鏈接腳本,本節(jié)需要自己動(dòng)手嘗試,計(jì)算機(jī)是一門工科,多動(dòng)手體會(huì)。

P149-175,講解可執(zhí)行文件的轉(zhuǎn)載和進(jìn)程,需要精讀。

P179-P219,講解動(dòng)態(tài)鏈接,這一部分內(nèi)容稍有難度,需要花些精力認(rèn)真讀。P229-P248 講解動(dòng)態(tài)庫(kù),如果動(dòng)態(tài)鏈接有些吃力,這一章可跳過(guò)也不影響。P283-334,這一部分就需要回到上面的第三個(gè)問(wèn)題了,也需要認(rèn)真弄懂。

整體下來(lái)前面175頁(yè)的知識(shí)讀下來(lái)會(huì)比較輕松,同時(shí)也能掌握很多的知識(shí),從動(dòng)態(tài)鏈接開(kāi)始難度有會(huì)有提升了。但是只有理解了動(dòng)態(tài)鏈接,你才能理解程序編譯鏈接時(shí)給動(dòng)態(tài)鏈接留下接口是為什么,當(dāng)然你也可以大致把動(dòng)態(tài)庫(kù)理解為一堆功能代碼的共享。導(dǎo)讀總結(jié)就到這里了,希望你讀完有所收獲。

閱讀到這里,趕緊行動(dòng)起來(lái)吧~?

這里為你精心準(zhǔn)備了電子書(shū):

鏈接:https://pan.baidu.com/s/1zmegxUifY4x9aN7H17ui3Q? 密碼:o589

總結(jié)

正如這本書(shū)的取名一樣,程序員也需要有自身的技術(shù)修養(yǎng),在自我修養(yǎng)這條路上,筆者和大家一起成長(zhǎng)。

總結(jié)

以上是生活随笔為你收集整理的《程序员的自我修养》导读的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。