讀書筆記之《程式員的自我修養–連結、裝載與庫》

來源:互聯網
上載者:User

從編譯,連結到運行,程式員應該瞭解自己所寫的代碼最終是怎麼成為程式,又怎樣在電腦上運行起來的。另不得不對作者能在碩士期間就能寫出此書感到佩服。精讀此書需要花些功夫,當然肯定能從中收穫很多。我對此書也只是泛讀,主要是想瞭解編譯,連結及程式在記憶體中運行整個實現原理。本篇筆記主要記錄自己在讀此書過程中一些概念上有誤解或不清晰的地方。

編譯和連結

IDE一般將編譯和連結的過程一步完成,通常將這種編譯和連結合并到一起的過程稱為構建(Build)

先行編譯(Prepressing)

處理原始碼中以”#“開頭的先行編譯指令

  • 刪除”#define“ 展開所有宏定義
  • 處理條件先行編譯指令,比如“#if”“#ifdef”等
  • 處理“#include”,包含標頭檔
  • 刪除所有注釋
  • 添加行號和檔案名稱標識,便於編譯器產生調試用的行號資訊
  • 保留所有#pragma編譯器指令
編譯(Compilation)

把預先處理檔案進行一系列詞法分析、文法分析、語義分析及最佳化後產生相應的彙編代碼檔案

彙編(Assembly)

彙編器將彙編代碼轉變成機器可以執行的指令。

連結(Linking)

組裝模組,過程主要包括地址和空間分配,符號決議和重定位。對引用地址進行重定位指向實際地址

extern "C"

C++代碼在進行編譯時間會對變數和函數符號進行修飾,修飾規則與C語言不同,C++為了與C相容,有一個用來聲明或定義一個C的符號的”extern "C"“ 關鍵字

標頭檔聲明了一些C語言編寫的函數或全域變數,為了讓這個標頭檔能正常被C++與C語言程式碼封裝含,可以使用C++的宏”__cplusplus“,c++編譯器會在編譯C++程式時預設定義這個宏,通過使用條件宏可以判斷當前編譯的是不是C++代碼

靜態連結庫

一個靜態庫可以簡單地看成一組目標檔案的集合,即很多目標檔案經過壓縮打包後形成的一個檔案。linux下使用“ar"壓縮程式將目標檔案壓縮到一起,並且對其進行編號和索引,以便於尋找和檢索。(與自己對靜態庫的理解有差錯,不是簡單的函數代碼集合。這也是方便於程式在對靜態庫進行連結時,只包含所使用到得函數代碼,而不是靜態庫中的全部函數代碼)

進程的建立
  1. 建立虛擬位址空間,並不是建立實際的物理空間,而是建立映射函數所需要的相應的資料結構。頁映射函數將虛擬空間的各個頁映射至相應的物理空間。

  2. 讀取可執行檔頭,並且建立空間與可執行檔的映射關係。這一步所做的是虛擬空間與可執行檔的映射關係。當對所需的頁進行裝載時,易定位到其在可執行檔中的位置。

  3. 將CPU指令寄存器設定成可執行檔入口,啟動運行。

上面步驟執行完以後,其實可執行檔的真正指令和資料都沒有被裝載入到記憶體中。作業系統是通過捕獲程式運行時產生的頁錯誤,通過先前建立的映射關係計算出相應的頁面在可執行檔中的位移,然後在實體記憶體中分配一個物理頁面,將其載入再將進程中該虛擬頁與分配的物理頁之間建立映射關係。進程從剛產生頁錯誤的位置重新開始執行。

系統調用,Win32 API,C運行庫

C標準運行庫 是C語言程式與不同程式之間的抽象層,將不同的作業系統API抽象成相同的庫函數。但現在各個作業系統提供的C運行庫包含了更多的功能如線程相關函數。

  • Linux下的C運行庫是Glibc,它是完全支援POSIX標準,除了實現C標準庫之外,還提供對linux系統調用的封裝函數(例如read,write,標頭檔unistd.h)
  • windows下的C運行庫是MSVCRT 實現了C標準庫之外還實現了線程相關操作函數。

系統調用 是應用程式(運行庫也是應用程式的一部分)與作業系統核心之間的介面,它決定了應用程式時如何與核心打交道的。無論程式是直接進行系統調用,還是通過運行庫,最終還是會達到系統調用這個層面上。

Linux的系統調用的C語言形式被定義在 unistd.h中,應用程式可以繞過C標準庫的相關函數如fopen,而直接使用open來實現檔案的讀取。

Windows API (Win32是使用最廣泛也是最成熟的版本)是Windows作業系統提供給應用程式開發人員的最底層、最直接與Windows打交道的介面。CRT是建立在Windows API之上的。MFC是對API一種C++形式的封裝庫。標頭檔"Windows.h"包含了Windows API的核心部分。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.