C/C+編程筆記:C語言的編譯器工作原理

2020-12-10 騰訊網

以gcc編譯器為例子,編譯實際上總共經歷了四個階段

預處理--->編譯--->彙編--->連結

1.預處理階段:編譯器以cpp文件作為一個單元,首先讀這個cpp文件,發現第一句與第二句包含一個頭文件,就會在所有搜索路徑中尋找這兩個頭文件,找到之後,就會到相應頭文件中再去處理宏、變量、函數聲明、嵌套的頭文件等。

檢測依賴關係,進行宏替換,看是否有重複定義與聲明的情況發生,最後將那些文件中所有的東東全部掃描進這個當前的cpp文件中,形成一個中間"cpp文件"。

在這一步中相當於將那個頭文件中的test變量掃描進了一個中間cpp文件,那麼test變量就變成了這個文件中的一個全局變量。在stdio.h這個頭文件中有一些函數的聲明,這時也把這些函數的聲明一股腦的掃描到了這個中間cpp文件中(只是掃描了函數的聲明,並沒有實現)。

2.編譯階段:此時就為這個中間cpp文件的所有變量、函數形參分配空間(原則上,在這裡只能看到.h文件中函數、變量的聲明,為變量和函數的形參等分配空間),將各個函數編譯成二進位碼,按照特定目標文件格式生成目標文件。

在這種格式的目標文件中進行各個全局變量、函數的符號描述(編譯器維護一個符號描述表),將這些二進位碼按照一定的標準組織成一個目標文件。

此時的每一個cpp文件都被編譯器編譯成了一個目標文件,同時每個目標文件都有一張符號表,這張符號表中記錄了這個cpp文件都用到了哪些變量,哪些函數,函數的參數是什麼類型的,有幾個參數。

同時為變量和函數形參開闢了內存空間。所以這裡編譯器把你這個cpp用到的所有的東西都記錄下來了,如果有重複定義或者沒有定義的變量、函數等,編譯器一下子就知道了。

3.連接階段:將上一步成生的各個目標文件,根據一些參數,連接生成最終的可執行文件,主要的工作就是重定位各個目標文件的函數、變量等,相當於將個目標文件中的二進位碼按一定的規範合到一個文件中。

相關焦點

  • 什麼是C語言的編譯器?從計算機原理的角度談編譯器
    相對機器語言和彙編語言,C語言已經算是高級語言了。相信你們已經知道什麼是機器語言和彙編語言,如果有不知道的朋友可以關注參考編者的另外一篇文章:C語言基礎:二進位和計算機語言雜談(編程新手福利),當然也可以自行百度。
  • c語言編程軟體哪個好?c語言編程軟體下載地址
    c語言編程軟體哪個好?c語言編程軟體下載地址 2019年1月14日 HuangJiang來源:網際網路 繁體
  • 高效的C編程之:C編譯器及其優化
    本章首先從ARM編譯器及其優化入手,講解C編譯器在優化代碼時所碰到的一些問題。理解這些問題,將有助於編寫出在提高執行速度和減少代碼尺寸方面更高效的C原始碼。本章假定讀者熟悉C語言,並且有一些彙編語言編程方面的知識。有關ARM編程的詳細信息,請參閱本書的相關章節。
  • C語言編譯器哪個好_6款好用的C語言編譯器推薦
    C語言編譯器哪個好其實win tc是款很不錯的軟體。去用一下你就知道了,因為我自學c時就是用的那個軟體,真的向你推薦它!
  • C/C+編程筆記:C語言預處理命令是什麼?不要以為你直接寫#就行!
    C語言源文件要經過編譯、連結才能生成可執行程序: 1) 編譯(Compile)會將源文件(.c文件)轉換為目標文件。 預處理是C語言的一個重要功能,由預處理程序完成。當對一個源文件進行編譯時,系統將自動調用預處理程序對源程序中的預處理部分作處理,處理完畢自動進入對源程序的編譯。 編譯器會將預處理的結果保存到和源文件同名的.i文件中,例如 main.c 的預處理結果在 main.i 中。
  • 現代程式語言起點,C語言之環境搭建
    C 語言是一種廣泛使用的計算機語言,它與 Java 程式語言一樣普及,二者在現代軟體程式設計師之間都得到廣泛使用。C 語言被廣泛使用,比如:Linux 作業系統和 RDBMS(關係資料庫管理系統) MySQL 都是使用 C 語言編寫的。
  • 世界上第一個C語言編譯器是怎麼編寫的?它為什麼能夠用C語言編寫?
    所謂C語言編譯器,就是把編程得到的文件,比如.c,.h的文件,進行讀取,並對內容進行分析,按照C語言的規則這些操作,C語言都是可以實現的。 所以用C語言來做C語言的編譯器是完全可行的。 但是,歷史上的第一個C語言編譯器,肯定不是C語言寫的,因為在沒有編譯器時,無法把C語言轉換成可執行文件。只要有了第一版其它語言的編譯器,就可以用C語言寫編譯器了。
  • 為什麼要學習「 C」程式語言?
    「 C」編程是另一種程式語言的基本基礎,像java、php,C++等熱門程式語言都是「 C」編程最為底層開發,所以我們通常稱「 C」編程編程「母語」。「 C」編程是一種簡單的語言,可以更快地執行。「 C」編程還是一種極其緊湊的語言,這意味著以「 C」編程方式尋址的程序可以在不同的機器上運行。C程式語言的優勢作為中級語言,C連接了低級和高級語言的功能。C語言可用於底層編程。例如用於內核和驅動程序的腳本,它還有助於使用高級程式語言,例如用於軟體應用程式的腳本等。
  • 【C語言】02.第一個C語言程序
    我們前面編寫的C語言代碼,應該保存為一個拓展名為.c的文件,這個.c文件稱為C語言程序的「原始碼文件」,也稱為「源文件」。按下快捷鍵command + s,輸入文件名(我這裡叫做one.c),選擇文件格式
  • 嵌入式系統高級C語言編程
    內容簡介  《嵌入式系統高級C語言編程》將主要介紹針對嵌入式系統的基於C語言的軟體項目開發的流程,較為複雜的c語言編程知識和技巧,編程風格和調試習慣
  • c編譯器so easy,gcc c編譯器生成、使用動靜態庫
    第一章程序開發人員大多接觸過c編譯器,請注意,不要將c編譯器和編輯器弄混淆哦。本文對c編譯器的講解,同樣基於gcc c編譯器,本文主要目的在於對linux環境下gcc c編譯器生成和使用靜態庫和動態庫予以介紹。此外,本文為系列教程第一篇——基本概念篇,之後將帶來另外兩篇。
  • C語言編譯器哪個好?6款好用的C語言編譯器推薦
    一些剛開始接觸C語言編譯的網友想下載一款C語言編譯器來使用,不過,網絡上有不少C語言編譯器相關的軟體,讓人很難抉擇。那麼,C語言編譯器哪個好?今天的文章裡,小編給大家整理了6款好用的C語言編譯器推薦給大家,需要下載C語言編譯器的網友,不妨了解一下!
  • C/C++編程筆記:如何理解C語言中的回調函數,零基礎也看得懂
    在c語言中,回調是使用函數指針來實現的。在函數指針的初始化之前具有f的原型是很重要的,否則編譯器就無法檢查f的類型是否與pf所指向的類型一致。通過一個例子簡單介紹回調函數的使用大家應該都對c語言的庫函數qsort有所了解,qsort聲明如下:void qsort(void*base,size_tnitems,size_tsize,int(*compar)(constvoid*,constvoid*))可以看到,它的第三個參數是一個函數指針,傳入兩個沒有定義指針指向的類型的參數
  • (宇宙最強C/C++編譯器)樂創DIY C語言講義​——2.6 GCC的使用
    GCC之前簡單介紹過,它是用來開發GNU C語言的編譯器,這個GNU C說的通俗易懂一些就是Linux底下的C語言開發,之前我們說了,目前市面上的C語言編譯器,要麼是完全不區分C語言和C++的MSVC,要麼是老到掉牙的Borland C,但就Borland C來說吧,它支持的最多也就C89,而且可能還不完全支持,因此在開發的時候會很麻煩,也不建議用。
  • C語言編程核心要點
    原文標題C語言編程核心要點,男人看了沉默,女人看了本文轉載自【微信公眾號:碼磚雜役,ID:whatis9527want】引言筆者有十餘年的C++開發經驗,相比而言,我的C經驗只有一兩年,C比較簡單,簡單到《The C Programming Language》(C程序設計語言)只有區區的200多頁,相比上千頁的C++大部頭,不得不說真的很人性化了
  • C程序編程四步走
    測試環境為探究預處理,編譯,彙編和連結的功能,我們在 Ubuntu 系統中使用 Gcc 編譯器( version=4.8.4 ),用簡單的也是最經典的入門程序 "Hello World!" 作為測試代碼。
  • C語言簡單編程速成
    例如,C 語言的特性之一是數組,但是它不提供字典(除非你自己寫一個)。當你學習 C 語言時,你會學習編程的基礎組成部分,它可以幫助你認識到如今的程式語言的改進及其的精心設計。因為 C 語言是一種最小化的程式語言,你的應用程式很可能會獲得性能上的提升,這在其它許多程式語言中是看不到的。
  • C/C+編程筆記:如何在電腦上手動配置C+編譯環境?不懂收藏
    如果您想要設置 C++ 語言環境,您需要確保電腦上有以下兩款可用的軟體,文本編輯器和 C++ 編譯器。 C++ 程序的源文件通常使用擴展名 .cpp、.cp 或 .c。 在開始編程之前,請確保您有一個文本編輯器,且有足夠的經驗來編寫一個電腦程式,然後把它保存在一個文件中,編譯並執行它。
  • C語言編程工具選擇
    一、編程工具計算機處理的數據、接受的指令是二進位數據,用C語言編寫的程序需要轉變成計算機能識別的二進位,才能讓計算機工作,這個轉換過程就是使用編譯器對源程序進行編譯,雖然可以使用命令行的方式編譯源程序,但使用編程工具不僅可以編譯源程序,還可以編寫、調試等,可以簡化編程工作。
  • C語言項目中.h和.c文件的關係和概念
    在編譯器只認識.c(.cpp))文件,而不知道.h是何物的年代,那時的人們寫了很多的.c(.cpp)文件,漸漸地,人們發現在很多.c(.cpp)文件中的聲明語句就是相同的。