日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

C语言编译执行过程

發(fā)布時(shí)間:2024/1/1 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言编译执行过程 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、C語(yǔ)言的編譯執(zhí)行過(guò)程

我們?cè)贑語(yǔ)言編輯的文件是以.c為文件拓展名的,稱(chēng)為源文件;C語(yǔ)言編譯器的功能就是將源文件,經(jīng)過(guò)編譯、鏈接之后可以形成可執(zhí)行文件

那么具體的步驟是什么呢?

C源程序頭文件-->預(yù)編譯處理(cpp)-->編譯程序本身-->優(yōu)化程序-->匯編程序-->鏈接程序-->可執(zhí)行文件

二、編譯執(zhí)行過(guò)程詳解

第一步:在編輯器中編輯源文件

第二步:編譯預(yù)處理;

預(yù)處理的作用就是讀取源文件中的字符流,對(duì)偽指令和特殊符號(hào)進(jìn)行處理

預(yù)編譯程序的功能是將源文件中的特殊內(nèi)容進(jìn)行替換,但是不會(huì)改變?cè)次募暮x,預(yù)編譯程序的輸出文件將作為下一步操作的原始文件

偽指令(以#開(kāi)頭的指令)和特殊符號(hào)包括以下四種類(lèi)型:

?1.宏定義指令:#define、#undef......#define Name *** 的功能是將源文件中的Name全部替換為***,而#undef的功能是取消某個(gè)宏的定義,使其不再生效

?2.條件定義指令:#ifdef、#ifndef、#endif等,這些偽指令的引入使得程序員可以通過(guò)定義不同的宏來(lái)決定編譯工具對(duì)哪些代碼進(jìn)行處理,可以通過(guò)此方法過(guò)濾掉無(wú)用代碼

?3.頭文件包含指令:#include< >、#include" ",使用頭文件的目的是使得某些定義可以被多個(gè)源程序引用,預(yù)編譯程序?qū)㈩^文件中的定義加入到其輸出文件中,以便編譯程序能夠?qū)ζ溥M(jìn)行處理;

?兩者的區(qū)別為#include< >引用的是系統(tǒng)提供的頭文件,而#include" "引用的為用戶自定義頭文件,其文件存放位置必須和源文件在同一路徑

?4.特殊符號(hào):預(yù)編譯程序可以識(shí)別一些特殊符號(hào),例如在源程序中出現(xiàn)的LINE標(biāo)識(shí)將被解釋為當(dāng)前行號(hào)(十進(jìn)制數(shù)),FILE則被解釋為當(dāng)前被編譯的C源程序的名稱(chēng)

?

此外,在預(yù)處理階段,編譯器會(huì)刪除注釋內(nèi)容,"//"和"/*"的內(nèi)容,并且會(huì)添加代碼行號(hào)和文件標(biāo)識(shí),便于在后續(xù)過(guò)程中輸出報(bào)錯(cuò)信息時(shí)定位到錯(cuò)誤位置

第三步:編譯

經(jīng)過(guò)預(yù)編譯程序的處理,其輸出文件將只包含變量。如數(shù)字、字符串、變量的定義,其工作就是將預(yù)編譯處理程序進(jìn)行語(yǔ)法檢查和語(yǔ)句檢查,確認(rèn)語(yǔ)句符合規(guī)范之后,將其翻譯為中間代碼或者匯編代碼

第四步:優(yōu)化

優(yōu)化是編譯程序中的重要部分,它涉及到的問(wèn)題不僅包括編譯技術(shù),還與機(jī)器的硬件環(huán)境有很大的關(guān)系

優(yōu)化過(guò)程分為兩種:一是對(duì)中間代碼的優(yōu)化,另一種是針對(duì)目標(biāo)代碼進(jìn)行的生成進(jìn)行的優(yōu)化

第一種優(yōu)化的主要方式是刪除公共表達(dá)式以及循環(huán)優(yōu)化,此方式不依賴計(jì)算機(jī)硬件平臺(tái),主要包括代碼外提、強(qiáng)度削弱、變換循環(huán)控制條件、已知量的合并、復(fù)寫(xiě)傳遞以及無(wú)用賦值的刪除

第二種優(yōu)化則依賴硬件環(huán)境,最主要的問(wèn)題是充分利用硬件的寄存器來(lái)保存有關(guān)變量的值,以減少內(nèi)存訪問(wèn)次數(shù),此外,根據(jù)機(jī)器硬件的指令特點(diǎn)將代碼量減少以及增加代碼執(zhí)行效率也是很重要的問(wèn)題

經(jīng)過(guò)優(yōu)化的代碼必須經(jīng)過(guò)匯編程序的匯編轉(zhuǎn)化為機(jī)器指令才能夠正常執(zhí)行

第五步:匯編

匯編過(guò)程的主要功能是將匯編代碼轉(zhuǎn)化為機(jī)器指令,目標(biāo)文件存放的就是和源文件相對(duì)應(yīng)的機(jī)器指令

目標(biāo)文件通常由段組成:數(shù)據(jù)段和代碼段

代碼段中包含的主要是程序的指令,一般文件權(quán)限是可讀可執(zhí)行但不可寫(xiě)

數(shù)據(jù)段中包含的主要是各種全局變量或靜態(tài)變量的數(shù)據(jù),一般文件權(quán)限為可讀可寫(xiě)可執(zhí)行

?

匯編程序生成的是可重定位文件,其中包含了其它目標(biāo)文件鏈接來(lái)創(chuàng)建一個(gè)可執(zhí)行文件或共享的目標(biāo)文件所需的代碼和數(shù)據(jù)

第六步:鏈接

?由匯編程序生成的目標(biāo)文件并不能被直接執(zhí)行,它可能還存在著許多的問(wèn)題

?例如:某個(gè)源文件中的函數(shù)引用了另一個(gè)源文件中的內(nèi)容,或者在程序中調(diào)用了函數(shù)庫(kù)中的函數(shù),解決這些問(wèn)題必須進(jìn)行鏈接這一過(guò)程

?鏈接過(guò)程的主要功能是將有關(guān)目標(biāo)文件相互連接,也就是將在某文件中對(duì)其它文件的引用與另一個(gè)文件中此引用的定義鏈接,使得這些目標(biāo)文件能夠被操作系統(tǒng)裝入執(zhí)行的整體

?根據(jù)開(kāi)發(fā)人員同庫(kù)函數(shù)的鏈接方式的不同, 鏈接方式可分為:靜態(tài)鏈接和動(dòng)態(tài)鏈接

  • 靜態(tài)鏈接:在這種鏈接方式下,函數(shù)的代碼將從其所在地靜態(tài)鏈接庫(kù)中被拷貝到最終的可執(zhí)行文件中,這樣該程序在執(zhí)行時(shí),相關(guān)代碼將被裝載到該進(jìn)程的虛擬地址空間中。靜態(tài)鏈接庫(kù)實(shí)際上是一個(gè)目標(biāo)文件的集合,其中每個(gè)文件含有庫(kù)中的一個(gè)或一組相關(guān)函數(shù)的代碼
  • 動(dòng)態(tài)鏈接:在這種鏈接方式下,函數(shù)的代碼被放到動(dòng)態(tài)鏈接庫(kù)或共享對(duì)象的某個(gè)目標(biāo)文件中。鏈接程序所做的就是在最終的可執(zhí)行程序中記錄下共享對(duì)象的名字以及相關(guān)登記信息。在可執(zhí)行文件運(yùn)行時(shí),動(dòng)態(tài)鏈接庫(kù)中的所有內(nèi)容都被映射到相應(yīng)進(jìn)程的虛地址空間中,可執(zhí)行程序再根據(jù)相關(guān)登記信息找到相關(guān)執(zhí)行代碼

?

經(jīng)過(guò)上述過(guò)程,C源程序就轉(zhuǎn)化為了可執(zhí)行程序,默認(rèn)可執(zhí)行程序的名字為a.out(Linux環(huán)境下)

三、編譯過(guò)程中的文件類(lèi)型

  • ? ? ? ?在Windows平臺(tái)上,C語(yǔ)言源代碼文件一般擴(kuò)展名為.c,目標(biāo)文件擴(kuò)展名一般為.obj,生成的可執(zhí)行文件擴(kuò)展名一般為.exe
  •   在Linux平臺(tái)上,C語(yǔ)言源代碼文件一般擴(kuò)展名為.c,預(yù)處理操作后的文件名擴(kuò)展名一般為.i,編譯器生成的匯編代碼一般擴(kuò)展名為.s,生成的可執(zhí)行文件一般擴(kuò)展為.out,它是有匯編器生成的,所以默認(rèn)gcc生成的程序名為a.out意思即為Assembler output
  • UNIX環(huán)境下主要有三種類(lèi)型的目標(biāo)文件:

    (1)可重定位文件  其中包含有適合于其它目標(biāo)文件鏈接來(lái)創(chuàng)建一個(gè)可執(zhí)行的或者共享的目標(biāo)文件的代碼和數(shù)據(jù)

    (2)共享的目標(biāo)文件  這種文件存放了適合于在兩種上下文里鏈接的代碼和數(shù)據(jù)。第一種事鏈接程序可把它與其它可重定位文件及共享的目標(biāo)文件一起處理來(lái)創(chuàng)建另一個(gè)目標(biāo)文件;第二種是動(dòng)態(tài)鏈接程序?qū)⑺c另一個(gè)可執(zhí)行文件及其它的共享目標(biāo)文件結(jié)合到一起,創(chuàng)建一個(gè)進(jìn)程映象

    (3)可執(zhí)行文件 它包含了一個(gè)可以被操作系統(tǒng)創(chuàng)建一個(gè)進(jìn)程來(lái)執(zhí)行的文件

參考鏈接:http://lavasoft.blog.51cto.com/62575/187229

總結(jié)

以上是生活随笔為你收集整理的C语言编译执行过程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。