日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

C語(yǔ)言的編譯機(jī)制:分制原則與三種文件

 

C語(yǔ)言編寫程序時(shí),編寫的內(nèi)容被存儲(chǔ)在文本文件中,該文件被稱為源代碼文件(source-code-file)。大部分C系統(tǒng),包括之前提到的,都要求文件名以.c結(jié)尾(如,wordcount.c和budget.c)。在文件名中,點(diǎn)號(hào)(.)前面的部分稱為基本名(basename),點(diǎn)號(hào)后面的部分稱為擴(kuò)展名(extension)。因此,budget是基本名,c是擴(kuò)展名。基本名與擴(kuò)展名的組合(budget.c)就是文件名。文件名應(yīng)該滿足特定計(jì)算機(jī)操作系統(tǒng)的特殊要求。我們來(lái)看一下具體的應(yīng)用,假設(shè)有一個(gè)名為concrete.c的源文件,其中的C源代碼如程序清單1.2所示。

Listing 1.2 The concrete.c Program

int main(void)
{
    printf("Concrete contains gravel and cement.n");
    return 0;
}

1 目標(biāo)代碼文件、可執(zhí)行文件和庫(kù)

C編程的基本策略是,用程序把源代碼文件轉(zhuǎn)換為可執(zhí)行文件(其中包含可直接運(yùn)行的機(jī)器語(yǔ)言代碼)。典型的C實(shí)現(xiàn)通過編譯和鏈接兩個(gè)步驟來(lái)完成這一過程。編譯器把源代碼轉(zhuǎn)換成中間代碼,鏈接器把中間代碼和其他代碼合并,生成可執(zhí)行文件。

C使用這種分而治之的方法方便對(duì)程序進(jìn)行模塊化,可以獨(dú)立編譯單獨(dú)的模塊,稍后再用鏈接器合并已編譯的模塊。通過這種方式,如果只更改某個(gè)模塊,不必因此重新編譯其他模塊。另外,鏈接器還將你編寫的程序和預(yù)編譯的庫(kù)代碼合并。中間文件有多種形式。我們?cè)谶@里描述的是最普遍的一種形式,即把源代碼轉(zhuǎn)換為機(jī)器語(yǔ)言代碼,并把結(jié)果放在目標(biāo)代碼文件(或簡(jiǎn)稱目標(biāo)文件)中(這里假設(shè)源代碼只有一個(gè)文件)。雖然目標(biāo)文件中包含機(jī)器語(yǔ)言代碼,但是并不能直接運(yùn)行該文件。因?yàn)槟繕?biāo)文件中存儲(chǔ)的是編譯器翻譯的源代碼,這還不是一個(gè)完整的程序。

目標(biāo)代碼文件缺失啟動(dòng)代碼(startup-code)。啟動(dòng)代碼充當(dāng)著程序和操作系統(tǒng)之間的接口。

目標(biāo)代碼還缺少庫(kù)函數(shù)。幾乎所有的C程序都要使用C標(biāo)準(zhǔn)庫(kù)中的函數(shù)。例如,concrete.c中就使用了printf()函數(shù)。目標(biāo)代碼文件并不包含該函數(shù)的代碼,它只包含了使用printf()函數(shù)的指令。printf()函數(shù)真正的代碼存儲(chǔ)在另一個(gè)被稱為庫(kù)的文件中。庫(kù)文件中有許多函數(shù)的目標(biāo)代碼。鏈接器的作用是,把你編寫的目標(biāo)代碼、系統(tǒng)的標(biāo)準(zhǔn)啟動(dòng)代碼和庫(kù)代碼這3部分合并成一個(gè)文件,即可執(zhí)行文件。對(duì)于庫(kù)代碼,鏈接器只會(huì)把程序中要用到的庫(kù)函數(shù)代碼提取出來(lái)(見圖1)。

C語(yǔ)言的編譯機(jī)制:分制原則與三種文件

Figure 1 Compiler and linker.

簡(jiǎn)而言之,目標(biāo)文件和可執(zhí)行文件都由機(jī)器語(yǔ)言指令組成的。然而,目標(biāo)文件中只包含編譯器為你編寫的代碼翻譯的機(jī)器語(yǔ)言代碼,可執(zhí)行文件中還包含你編寫的程序中使用的庫(kù)函數(shù)和啟動(dòng)代碼的機(jī)器代碼。在有些系統(tǒng)中,必須分別運(yùn)行編譯程序和鏈接程序,而在另一些系統(tǒng)中,編譯器會(huì)自動(dòng)啟動(dòng)鏈接器,用戶只需給出編譯命令即可。接下來(lái),了解一些具體的系統(tǒng)。

2 GNU編譯器集合和LLVM項(xiàng)目

GNU和LLVM都可以使用-v選項(xiàng)來(lái)顯示版本信息,因此各系統(tǒng)都使用cc別名來(lái)代替gcc或clang命令。以下組合:

cc -v

顯示你所使用的編譯器及其版本。gcc和clang命令都可以根據(jù)不同的版本選擇運(yùn)行時(shí)選項(xiàng)來(lái)調(diào)用不同C標(biāo)準(zhǔn)。

gcc -std=c99 inform.c
gcc -std=c1x inform.c
gcc -std=c11 inform.c

第1行調(diào)用C99標(biāo)準(zhǔn),第2行調(diào)用GCC接受C11之前的草案標(biāo)準(zhǔn),第3行調(diào)用GCC接受的C11標(biāo)準(zhǔn)版本。Clang編譯器在這一點(diǎn)上用法與GCC相同。

C語(yǔ)言的編譯機(jī)制:分制原則與三種文件

 

分享到:
標(biāo)簽:編譯 機(jī)制 語(yǔ)言
用戶無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定