小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

讀書(shū)筆記之《程序員的自我修養(yǎng)

 看見(jiàn)就非常 2015-07-15
2015-07-13 23:14 4人閱讀 評(píng)論(0) 收藏 舉報(bào)

從編譯,鏈接到運(yùn)行,程序員應(yīng)該了解自己所寫(xiě)的代碼最終是怎么成為程序,又怎樣在計(jì)算機(jī)上運(yùn)行起來(lái)的。另不得不對(duì)作者能在碩士期間就能寫(xiě)出此書(shū)感到佩服。精讀此書(shū)需要花些功夫,當(dāng)然肯定能從中收獲很多。我對(duì)此書(shū)也只是泛讀,主要是想了解編譯,鏈接及程序在內(nèi)存中運(yùn)行整個(gè)實(shí)現(xiàn)原理。本篇筆記主要記錄自己在讀此書(shū)過(guò)程中一些概念上有誤解或不清晰的地方。

編譯和鏈接

IDE一般將編譯和鏈接的過(guò)程一步完成,通常將這種編譯和鏈接合并到一起的過(guò)程稱(chēng)為構(gòu)建(Build)
這里寫(xiě)圖片描述
預(yù)編譯(Prepressing)
處理源代碼中以”#“開(kāi)頭的預(yù)編譯指令
刪除”#define“ 展開(kāi)所有宏定義
處理?xiàng)l件預(yù)編譯指令,比如“#if”“#ifdef”等
處理“#include”,包含頭文件
刪除所有注釋
添加行號(hào)和文件名標(biāo)識(shí),便于編譯器產(chǎn)生調(diào)試用的行號(hào)信息
保留所有#pragma編譯器指令
編譯(Compilation)
把預(yù)處理文件進(jìn)行一系列詞法分析、語(yǔ)法分析、語(yǔ)義分析及優(yōu)化后產(chǎn)生相應(yīng)的匯編代碼文件
匯編(Assembly)
匯編器將匯編代碼轉(zhuǎn)變成機(jī)器可以執(zhí)行的指令。
鏈接(Linking)
組裝模塊,過(guò)程主要包括地址和空間分配,符號(hào)決議和重定位。對(duì)引用地址進(jìn)行重定位指向?qū)嶋H地址
extern “C”
C++代碼在進(jìn)行編譯時(shí)會(huì)對(duì)變量和函數(shù)符號(hào)進(jìn)行修飾,修飾規(guī)則與C語(yǔ)言不同,C++為了與C兼容,有一個(gè)用來(lái)聲明或定義一個(gè)C的符號(hào)的”extern “C”“ 關(guān)鍵字
這里寫(xiě)圖片描述
頭文件聲明了一些C語(yǔ)言編寫(xiě)的函數(shù)或全局變量,為了讓這個(gè)頭文件能正常被C++與C語(yǔ)言代碼包含,可以使用C++的宏”__cplusplus“,c++編譯器會(huì)在編譯C++程序時(shí)默認(rèn)定義這個(gè)宏,通過(guò)使用條件宏可以判斷當(dāng)前編譯的是不是C++代碼
這里寫(xiě)圖片描述

靜態(tài)鏈接庫(kù)

一個(gè)靜態(tài)庫(kù)可以簡(jiǎn)單地看成一組目標(biāo)文件的集## 標(biāo)題 ##合,即很多目標(biāo)文件經(jīng)過(guò)壓縮打包后形成的一個(gè)文件。linux下使用“ar”壓縮程序?qū)⒛繕?biāo)文件壓縮到一起,并且對(duì)## 標(biāo)題 ##其進(jìn)行編號(hào)和索引,以便于查找和檢索。(與自己對(duì)靜態(tài)庫(kù)的理解有差錯(cuò),不是簡(jiǎn)單的函數(shù)代碼集合。這也是方便于程序在對(duì)靜態(tài)庫(kù)進(jìn)行鏈接時(shí),只包含所使用到得函數(shù)代碼,而不是靜態(tài)庫(kù)中的全部函數(shù)代碼)

進(jìn)程的建立

創(chuàng)建虛擬地址空間,并不是創(chuàng)建實(shí)際的物理空間,而是創(chuàng)建映射函數(shù)所需要的相應(yīng)的數(shù)據(jù)結(jié)構(gòu)。頁(yè)映射函數(shù)將虛擬空間的各個(gè)頁(yè)映射至相應(yīng)的物理空間。
讀取可執(zhí)行文件頭,并且建立空間與可執(zhí)行文件的映射關(guān)系。這一步所做的是虛擬空間與可執(zhí)行文件的映射關(guān)系。當(dāng)對(duì)所需的頁(yè)進(jìn)行裝載時(shí),易定位到其在可執(zhí)行文件中的位置。
將CPU指令寄存器設(shè)置成可執(zhí)行文件入口,啟動(dòng)運(yùn)行。
上面步驟執(zhí)行完以后,其實(shí)可執(zhí)行文件的真正指令和數(shù)據(jù)都沒(méi)有被裝載入到內(nèi)存中。操作系統(tǒng)是通過(guò)捕獲程序運(yùn)行時(shí)產(chǎn)生的頁(yè)錯(cuò)誤,通過(guò)先前建立的映射關(guān)系計(jì)算出相應(yīng)的頁(yè)面在可執(zhí)行文件中的偏移,然后在物理內(nèi)存中分配一個(gè)物理頁(yè)面,將其載入再將進(jìn)程中該虛擬頁(yè)與分配的物理頁(yè)之間建立映射關(guān)系。進(jìn)程從剛產(chǎn)生頁(yè)錯(cuò)誤的位置重新開(kāi)始執(zhí)行。
這里寫(xiě)圖片描述

系統(tǒng)調(diào)用,Win32 API,C運(yùn)行庫(kù)

C標(biāo)準(zhǔn)運(yùn)行庫(kù) 是C語(yǔ)言程序與不同程序之間的抽象層,將不同的操作系統(tǒng)API抽象成相同的庫(kù)函數(shù)。但現(xiàn)在各個(gè)操作系統(tǒng)提供的C運(yùn)行庫(kù)包含了更多的功能如線程相關(guān)函數(shù)。
Linux下的C運(yùn)行庫(kù)是Glibc,它是完全支持POSIX標(biāo)準(zhǔn),除了實(shí)現(xiàn)C標(biāo)準(zhǔn)庫(kù)之外,還提供對(duì)linux系統(tǒng)調(diào)用的封裝函數(shù)(例如read,write,頭文件unistd.h)
windows下的C運(yùn)行庫(kù)是MSVCRT 實(shí)現(xiàn)了C標(biāo)準(zhǔn)庫(kù)之外還實(shí)現(xiàn)了線程相關(guān)操作函數(shù)。
系統(tǒng)調(diào)用 是應(yīng)用程序(運(yùn)行庫(kù)也是應(yīng)用程序的一部分)與操作系統(tǒng)內(nèi)核之間的接口,它決定了應(yīng)用程序時(shí)如何與內(nèi)核打交道的。無(wú)論程序是直接進(jìn)行系統(tǒng)調(diào)用,還是通過(guò)運(yùn)行庫(kù),最終還是會(huì)達(dá)到系統(tǒng)調(diào)用這個(gè)層面上。
Linux的系統(tǒng)調(diào)用的C語(yǔ)言形式被定義在 unistd.h中,應(yīng)用程序可以繞過(guò)C標(biāo)準(zhǔn)庫(kù)的相關(guān)函數(shù)如fopen,而直接使用open來(lái)實(shí)現(xiàn)文件的讀取。
Windows API (Win32是使用最廣泛也是最成熟的版本)是Windows操作系統(tǒng)提供給應(yīng)用程序開(kāi)發(fā)者的最底層、最直接與Windows打交道的接口。CRT是建立在Windows API之上的。MFC是對(duì)API一種C++形式的封裝庫(kù)。頭文件”Windows.h”包含了Windows API的核心部分。
這里寫(xiě)圖片描述

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多