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

C語(yǔ)言 圖文并茂詳解程序編譯過(guò)程

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

一、初識(shí)編譯器

編譯器是一個(gè)廣義的概念,真正的編譯器由下面幾個(gè)模塊組成,真正的編譯器是進(jìn)行語(yǔ)法分析和語(yǔ)義分析的。

二、程序被編譯的過(guò)程

如下,file.i 是中間代碼,file.s 是一個(gè)匯編文件,file.o 是二進(jìn)制文件。

預(yù)編譯

  • 處理所有的注釋?zhuān)钥崭翊?/li>
  • 將所有的 #define 刪除,并且展開(kāi)所有的宏定義
  • 處理?xiàng)l件編譯指令 #if, #ifdef, #elif,#else,#endif
  • 處理 #include,展開(kāi)被包含的文件
  • 保留編譯器需要使用的 #pragma 指令

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

編譯

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

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

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

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

匯編

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

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

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

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;
}

可以看到注釋都沒(méi)有了, demo.h 文件的全局變量被復(fù)制過(guò)來(lái),宏也被替換掉了,#開(kāi)頭的信息是給后續(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,如下:

這樣就生成了一個(gè) .o 文件

最后鏈接器出場(chǎng)了,輸入 gcc demo.o,如下:

這樣就生成一個(gè) a.out 文件:

這樣就能運(yùn)行了

三、小結(jié)

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

  • 預(yù)處理:處理注釋?zhuān)暌约耙呀?jīng)以 # 開(kāi)頭的符號(hào)
  • 編譯:進(jìn)行詞法分析,語(yǔ)法分析和語(yǔ)義分析等
  • 匯編:將匯編代碼翻譯為機(jī)器指令的目標(biāo)文件
  • 鏈接:鏈接到一起生成可執(zhí)行程序

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

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

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

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

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

    C++實(shí)現(xiàn)簡(jiǎn)單迷宮游戲

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

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

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

    C語(yǔ)言之實(shí)現(xiàn)控制臺(tái)光標(biāo)隨意移動(dòng)的實(shí)例代碼

    下面小編就為大家?guī)?lái)一篇C語(yǔ)言之實(shí)現(xiàn)控制臺(tái)光標(biāo)隨意移動(dòng)的實(shí)例代碼。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-07-07
  • C語(yǔ)言深入探索之單鏈表與typedef的用法

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

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

最新評(píng)論

蓬莱市| 卓尼县| 昌平区| 酒泉市| 萨嘎县| 铜川市| 大化| 前郭尔| 贡山| 庄浪县| 丰顺县| 茶陵县| 南川市| 青海省| 宁陵县| 商丘市| 壶关县| 运城市| 浪卡子县| 宜宾县| 公主岭市| 溧水县| 大港区| 衡南县| 磐安县| 四平市| 白朗县| 杨浦区| 高青县| 清镇市| 太仓市| 孝感市| 大同市| 稻城县| 岳普湖县| 云梦县| 巧家县| 鄂伦春自治旗| 阜康市| 抚宁县| 临城县|