欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

一、初識(shí)編譯器

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

二、程序被編譯的過程

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

預(yù)編譯

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

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

編譯

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

  • 詞法分析:分析關(guān)鍵字,標(biāo)示符,立即數(shù)等是否合法
  • 語法分析:分析表達(dá)式是否遵循語法規(guī)則
  • 語義分析:在語法分析的基礎(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ī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;
}

可以看到注釋都沒有了, 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,如下:

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

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

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

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

三、小結(jié)

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

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

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

相關(guān)文章

  • C語言實(shí)現(xiàn)3個(gè)數(shù)從小到大排序/輸出的方法示例

    C語言實(shí)現(xiàn)3個(gè)數(shù)從小到大排序/輸出的方法示例

    這篇文章主要給大家介紹了關(guān)于如何利用C語言實(shí)現(xiàn)3個(gè)數(shù)從小到大排序/輸出的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用C語言具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • C++中“#”號(hào)的使用技巧

    C++中“#”號(hào)的使用技巧

    本篇文章是對C++中“#”號(hào)的使用技巧進(jìn)行了分析介紹,需要的朋友參考下
    2013-05-05
  • 《C++ primer plus》讀書筆記(一)

    《C++ primer plus》讀書筆記(一)

    本讀書筆記是C++ primer plus(第六版)前3章的學(xué)習(xí)筆記。非常的淺顯易懂,復(fù)習(xí)C++基礎(chǔ)知識(shí)的可以瞄瞄。
    2014-10-10
  • C語言算法練習(xí)之抓交通肇事犯

    C語言算法練習(xí)之抓交通肇事犯

    這篇文章主要該大家分享C語言算法抓交通肇事犯的練習(xí),文章主要通過描述抓交通肇事犯得問題然后確定程序框架將結(jié)果運(yùn)算出來,下面來看詳細(xì)內(nèi)容吧,需要的朋友可以參考一下
    2022-03-03
  • C語言中輸入輸出流與緩沖區(qū)的深入講解

    C語言中輸入輸出流與緩沖區(qū)的深入講解

    一般情況下,由鍵盤輸入的字符并沒有直接送入程序,而是被存儲(chǔ)在一個(gè)緩沖區(qū)當(dāng)中。下面這篇文章主要給大家介紹了關(guān)于C語言中輸入輸出流與緩沖區(qū)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-09-09
  • C語言如何實(shí)現(xiàn)循環(huán)輸入

    C語言如何實(shí)現(xiàn)循環(huán)輸入

    這篇文章主要介紹了C語言如何實(shí)現(xiàn)循環(huán)輸入問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 一文帶你入木三分地理解字符串KMP算法以及C++實(shí)現(xiàn)

    一文帶你入木三分地理解字符串KMP算法以及C++實(shí)現(xiàn)

    KMP算法是一種改進(jìn)的字符串匹配算法,KMP算法的核心是利用匹配失敗后的信息,盡量減少模式串與主串的匹配次數(shù)以達(dá)到快速匹配的目的。本文就來和大家聊聊KMP算法的原理與實(shí)現(xiàn),需要的可以參考一下
    2022-12-12
  • C++類和對象實(shí)戰(zhàn)之Date類的實(shí)現(xiàn)方法

    C++類和對象實(shí)戰(zhàn)之Date類的實(shí)現(xiàn)方法

    C++ 標(biāo)準(zhǔn)庫沒有提供所謂的日期類型,C++ 繼承了C語言用于日期和時(shí)間操作的結(jié)構(gòu)和函數(shù),這篇文章主要給大家介紹了C++類和對象實(shí)戰(zhàn)之Date類的實(shí)現(xiàn)方法,需要的朋友可以參考下
    2021-12-12
  • matlab遺傳算法求解車間調(diào)度問題分析及實(shí)現(xiàn)源碼

    matlab遺傳算法求解車間調(diào)度問題分析及實(shí)現(xiàn)源碼

    這篇文章主要為大家介紹了matlab遺傳算法求解車間調(diào)度問題解析,文中附含詳細(xì)實(shí)現(xiàn)源碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-02-02
  • 基于C語言實(shí)現(xiàn)shell指令的詳解

    基于C語言實(shí)現(xiàn)shell指令的詳解

    本篇文章是對C語言實(shí)現(xiàn)shell指令的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05

最新評論