最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言 圖文并茂詳解程序編譯過程

 更新時間:2022年04月19日 14:27:26   作者:清風(fēng)自在 流水潺潺  
C語言是一種編譯型語言,需要把源文件進行編譯之后才能運行,它的編譯過程是:預(yù)處理:展開頭文件、宏替換,去掉注釋,條件編譯;編譯:檢查語法,生成匯編;匯編:把生成的匯編文件匯編成機器碼;鏈接:鏈接到一起生成可執(zhí)行程序

一、初識編譯器

編譯器是一個廣義的概念,真正的編譯器由下面幾個模塊組成,真正的編譯器是進行語法分析和語義分析的。

二、程序被編譯的過程

如下,file.i 是中間代碼,file.s 是一個匯編文件,file.o 是二進制文件。

預(yù)編譯

  • 處理所有的注釋,以空格代替
  • 將所有的 #define 刪除,并且展開所有的宏定義
  • 處理條件編譯指令 #if, #ifdef, #elif,#else,#endif
  • 處理 #include,展開被包含的文件
  • 保留編譯器需要使用的 #pragma 指令

預(yù)處理指令示例:gcc -E file.c -o file.i

編譯

對預(yù)處理文件進行詞法分析,語法分析和語義分析

  • 詞法分析:分析關(guān)鍵字,標(biāo)示符,立即數(shù)等是否合法
  • 語法分析:分析表達式是否遵循語法規(guī)則
  • 語義分析:在語法分析的基礎(chǔ)上進一步分析表達式是否合法

分析結(jié)束后進行代碼優(yōu)化生成相應(yīng)的匯編代碼文件

編譯指令示例:gcc -S file.i -o file.s

匯編

  • 匯編器將匯編代碼轉(zhuǎn)變?yōu)闄C器的可以執(zhí)行指令
  • 每條匯編語句幾乎都對應(yīng)一條機器指令

匯編指令示例:gcc -c file.s -o file.o

下面看一個源代碼單步編譯的示例:

demo.h

/*
    This is a header file.
*/
char* p = "Autumn";
 
int i = 0;

demo.c

#include "demo.h"
 
// Begin to define macro
 
#define GREETING "Hello world!"
 
#define INC(x) x++
 
// End
 
int main()
{   
    p = GREETING;
 
    INC(i);
 
    return 0;
 
}

輸入 gcc -E demo.c -o demo.i,如下:

然后就生成了 demo.i 文件,如下:

# 1 "demo.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "demo.c"
# 1 "demo.h" 1
# 9 "demo.h"
char* p = "Autumn";
 
int i = 0;
# 2 "demo.c" 2
# 11 "demo.c"
int main()
{
    p = "Hello world!";
 
    i++;
 
    return 0;
}

可以看到注釋都沒有了, demo.h 文件的全局變量被復(fù)制過來,宏也被替換掉了,#開頭的信息是給后續(xù)編譯器使用的。

輸入gcc -S demo.i -o demo.s,如下:

然后就生成了 demo.o 文件,如下:

	.file	"demo.c"
.globl p
	.section	.rodata
.LC0:
	.string	"Autumn"
	.data
	.align 4
	.type	p, @object
	.size	p, 4
p:
	.long	.LC0
.globl i
	.bss
	.align 4
	.type	i, @object
	.size	i, 4
i:
	.zero	4
	.section	.rodata
.LC1:
	.string	"Hello world!"
	.text
.globl main
	.type	main, @function
main:
	pushl	%ebp
	movl	%esp, %ebp
	movl	$.LC1, p
	movl	i, %eax
	addl	$1, %eax
	movl	%eax, i
	movl	$0, %eax
	popl	%ebp
	ret
	.size	main, .-main
	.ident	"GCC: (Ubuntu/Linaro 4.4.4-14ubuntu5.1) 4.4.5"
	.section	.note.GNU-stack,"",@progbits

最后輸入gcc -c demo.s -o demo.o,如下:

這樣就生成了一個 .o 文件

最后鏈接器出場了,輸入 gcc demo.o,如下:

這樣就生成一個 a.out 文件:

這樣就能運行了

三、小結(jié)

編譯過程分為預(yù)處理,編譯,匯編和鏈接四個階段

  • 預(yù)處理:處理注釋,宏以及已經(jīng)以 # 開頭的符號
  • 編譯:進行詞法分析,語法分析和語義分析等
  • 匯編:將匯編代碼翻譯為機器指令的目標(biāo)文件
  • 鏈接:鏈接到一起生成可執(zhí)行程序

到此這篇關(guān)于C語言 圖文并茂詳解程序編譯過程的文章就介紹到這了,更多相關(guān)C語言 編譯過程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言詳細分析宏定義與預(yù)處理命令的應(yīng)用

    C語言詳細分析宏定義與預(yù)處理命令的應(yīng)用

    宏定義是用宏名來表示一個字符串,在宏展開時又以該字符串取代宏名,這只是一種簡單的替換。字符串中可以含任何字符,可以是常數(shù),也可以是表達式,預(yù)處理程序?qū)λ蛔魅魏螜z查,如有錯誤,只能在編譯已被宏展開后的源程序時發(fā)現(xiàn)
    2022-07-07
  • 算法之排列算法與組合算法詳解

    算法之排列算法與組合算法詳解

    這篇文章主要介紹了算法之排列算法與組合算法詳解,本文以字典序法、遞歸法為例講解了排列算法、全組合算法等,需要的朋友可以參考下
    2014-08-08
  • C語言使用深度優(yōu)先搜索算法解決迷宮問題(堆棧)

    C語言使用深度優(yōu)先搜索算法解決迷宮問題(堆棧)

    這篇文章主要介紹了C語言使用深度優(yōu)先搜索算法解決迷宮問題,涉及C語言堆棧的使用與深度優(yōu)先算法解決迷宮問題的相關(guān)操作技巧,需要的朋友可以參考下
    2017-09-09
  • C++ cin.get用法案例詳解

    C++ cin.get用法案例詳解

    這篇文章主要介紹了C++ cin.get用法案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • VScode上配置 c語言環(huán)境的圖文教程

    VScode上配置 c語言環(huán)境的圖文教程

    這篇文章主要介紹了配置VScode c語言環(huán)境,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05
  • C++ Qt開發(fā)之CheckBox多選框組件的用法詳解

    C++ Qt開發(fā)之CheckBox多選框組件的用法詳解

    Qt是一個跨平臺C++圖形界面開發(fā)庫,利用Qt可以快速開發(fā)跨平臺窗體應(yīng)用程序,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實現(xiàn)圖形化開發(fā)極大的方便了開發(fā)效率,本章將重點介紹CheckBox單行輸入框組件的使用方法,需要的朋友可以參考下
    2023-12-12
  • C++實現(xiàn)簡單迷宮游戲

    C++實現(xiàn)簡單迷宮游戲

    這篇文章主要為大家詳細介紹了C++實現(xiàn)簡單迷宮游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • C++原地刪除有序數(shù)組重復(fù)項的N種方法

    C++原地刪除有序數(shù)組重復(fù)項的N種方法

    給定一個排序數(shù)組,你需要在原地刪除重復(fù)出現(xiàn)的元素,使得每個元素只出現(xiàn)一次,返回移除后數(shù)組的新長度,不要使用額外的數(shù)組空間,你必須在 原地 修改輸入數(shù)組 并在使用O(1)額外空間的條件下完成,故本文介紹了C++原地刪除有序數(shù)組重復(fù)項的N種方法,需要的朋友可以參考下
    2025-03-03
  • C語言之實現(xiàn)控制臺光標(biāo)隨意移動的實例代碼

    C語言之實現(xiàn)控制臺光標(biāo)隨意移動的實例代碼

    下面小編就為大家?guī)硪黄狢語言之實現(xiàn)控制臺光標(biāo)隨意移動的實例代碼。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-07-07
  • C語言深入探索之單鏈表與typedef的用法

    C語言深入探索之單鏈表與typedef的用法

    typedef為C語言的關(guān)鍵字,作用是為一種數(shù)據(jù)類型定義一個新名字,單鏈表是后面要學(xué)的雙鏈表以及循環(huán)鏈表的基礎(chǔ),要想繼續(xù)深入了解數(shù)據(jù)結(jié)構(gòu)以及C語言,我們就要奠定好這塊基石!接下來就和我一起學(xué)習(xí)吧
    2022-05-05

最新評論

临江市| 宁海县| 澄迈县| 塔河县| 铅山县| 射阳县| 昂仁县| 汾西县| 涡阳县| 揭阳市| 桃园县| 阿鲁科尔沁旗| 林甸县| 马龙县| 潮安县| 衡水市| 鄂尔多斯市| 孟津县| 沁阳市| 合江县| 丹棱县| 三原县| 中江县| 高唐县| 衢州市| 济南市| 惠州市| 巢湖市| 海安县| 时尚| 剑川县| 和田市| 泸州市| 栖霞市| 新野县| 灵台县| 霸州市| 邵阳县| 娱乐| 信阳市| 万山特区|