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

C語言?程序的編譯系統(tǒng)解析

 更新時間:2022年02月28日 16:54:58   作者:呆呆獸學(xué)編程  
編譯程序的基本功能是把源程序(高級語言)翻譯成目標(biāo)程序。但是,作為一個具有實(shí)際應(yīng)用價值的編譯系統(tǒng),除了基本功能之外,還應(yīng)具備語法檢查、調(diào)試措施、修改手段、覆蓋處理、目標(biāo)程序優(yōu)化、不同語言合用以及人-機(jī)聯(lián)系等重要功能

今天我來補(bǔ)一下C語言篇的程序的編譯的一篇文章,也算是有一個結(jié)尾了。

程序的翻譯環(huán)境和執(zhí)行環(huán)境

在ANSI C的任何一種實(shí)現(xiàn)中,存在兩個不同的環(huán)境 :

第1種是翻譯環(huán)境,在這個環(huán)境中源代碼被轉(zhuǎn)換為可執(zhí)行的機(jī)器指令。

第2種是執(zhí)行環(huán)境 ,它用于實(shí)際執(zhí)行代碼。

一個.c的文件事如何變成.exe的可執(zhí)行文件的呢?下面這張圖片是一個大概的過程:

請?zhí)砑訄D片描述

編譯和鏈接

翻譯環(huán)境

請?zhí)砑訄D片描述

  • 組成一個程序的每個源文件通過編譯過程分別轉(zhuǎn)換成目標(biāo)代碼( object code )。
  • 每個目標(biāo)文件由鏈接器( linker )捆綁在一 起,形成一個單一-而完整的可執(zhí)行程序。
  • 鏈接器同時也會引入標(biāo)準(zhǔn)C函數(shù)庫中任何被該程序所用到的函數(shù),而且它可以搜索程序員個人的程序庫,將其需要的函數(shù)也鏈接到程序中。

編譯的幾個階段

接下來,我來用Linux平臺來給大家演示一下編譯的三個過程:

我們先編寫一個簡單C程序:

請?zhí)砑訄D片描述

然后執(zhí)行這樣一句指令:

gcc test.c

這句指令是讓gcc這個編譯器來編譯我們的代碼,執(zhí)行完這句指令我們會發(fā)現(xiàn)會生成一個a.out這樣一個可執(zhí)行文件,

請?zhí)砑訄D片描述

我們執(zhí)行再下面這樣一句指令:

./a.out

這樣我們就可以執(zhí)行這個可執(zhí)行文件了,

請?zhí)砑訄D片描述

為了讓大家更好地感受到編譯的過程,我們來一步一步看:

預(yù)處理

我們執(zhí)行再下面這樣一句指令,讓代碼預(yù)處理完之后就停下來:

gcc -E test.c -o test.i

這句指令的意思就是把預(yù)處理完之后的信息輸出到一個test.i的文件中。

請?zhí)砑訄D片描述

可以發(fā)現(xiàn)的是,這里多了一個test,i的文件,我們可以打開看一看:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-pGZW3x4b-1637932306122)(C:\Users\久別重逢還不錯\AppData\Roaming\Typora\typora-user-images\image-20211126200920738.jpg)]

可以發(fā)現(xiàn)的是,有三個點(diǎn)發(fā)生了變化:

  • 頭文件被展開
  • 宏被文本替換了
  • 注釋被刪除了

我們對原代碼做一個處理,不包含stdio.h的頭文件,我們自己寫一個頭文件:

再來看一下,預(yù)處理后的文件是什么樣子的:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-jICkxv4k-1637932306124)(C:\Users\久別重逢還不錯\AppData\Roaming\Typora\typora-user-images\image-20211126201809726.jpg)]

效果通上面一樣。

所以預(yù)處理的幾個動作

  • 頭文件的包含
  • 預(yù)處理指令的完成(eg:#define、#pragma…)
  • 注釋的刪除

編譯

執(zhí)行再下面這樣一句指令讓文件進(jìn)行編譯形成匯編代碼:

gcc -S test.c

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-nYnbbB65-1637932306125)(C:\Users\久別重逢還不錯\AppData\Roaming\Typora\typora-user-images\image-20211126202540289.jpg)]

執(zhí)行完之后就可以生產(chǎn)出一個test.s的文件,我們可以打開看一看:

這里其實(shí)就是匯編代碼。

所以編譯的幾個動作

  • 語法分析
  • 詞法分析
  • 語義分析
  • 符號匯總

符號匯總: 符號匯總的都是全局的符號。例如上面我們的代碼頭文件就匯總了一個Add,.c文件就匯總的一個Add和main。

匯編

接下來我們執(zhí)行這樣一條指令:

gcc -c test.c

對源文件進(jìn)行匯編,結(jié)果生成了一個test.o的目標(biāo)文件:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-Segd6oKn-1637932306126)(C:\Users\久別重逢還不錯\AppData\Roaming\Typora\typora-user-images\image-20211126203431140.jpg)]

打開這個文件,我們會發(fā)現(xiàn)這是一個我們看不懂的二進(jìn)制文件:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-YjEQb15l-1637932306127)(C:\Users\久別重逢還不錯\AppData\Roaming\Typora\typora-user-images\image-20211126203517294.jpg)]

所以其實(shí)匯編是把匯編代碼轉(zhuǎn)換為二進(jìn)制代碼(機(jī)器指令)。

這個過程還做了一件件事——形成符號表

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-O6xmUQVU-1637932306127)(C:\Users\久別重逢還不錯\AppData\Roaming\Typora\typora-user-images\image-20211126204552806.jpg)]

鏈接

鏈接做的兩個事情

  • 合并段表
  • 符號表的合并和符號表的重定位

在Linux系統(tǒng)下,test.o二進(jìn)制文件是用一個elf這樣的格式來組織文件的。

elf會把文件組織成一個段。test.o和Add.o都有一個段,那么我們怎樣才能看懂elf格式的文件呢?

我們有這樣一個工具叫做readelf,他可以看懂這樣一個文件,所以我們輸入這樣一條指令:

readelf test.o -a

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-kDmpTiYe-1637932306128)(C:\Users\久別重逢還不錯\AppData\Roaming\Typora\typora-user-images\image-20211126205639154.jpg)]

我們就確實(shí)可以看到這樣一個段的存在。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-xQnwleYa-1637932306128)(C:\Users\久別重逢還不錯\AppData\Roaming\Typora\typora-user-images\image-20211126210149263.jpg)]

然后這下面還有符號表的匯總:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-ufzQtz4Y-1637932306129)(C:\Users\久別重逢還不錯\AppData\Roaming\Typora\typora-user-images\image-20211126210550360.jpg)]

其實(shí)a.out這個文件也是elf格式的,所以其實(shí)鏈接就是把這幾個elf格式的文件的段表合并,然后test中的Add函數(shù)就有了地址。

運(yùn)行環(huán)境

程序執(zhí)行的過程:

  • 程序必須載入內(nèi)存中。在有操作系統(tǒng)的環(huán)境中:一般這個由操作系統(tǒng)完成。在獨(dú)立的環(huán)境中,程序的載入必須由手工安排,也可能是通過可執(zhí)行代碼置入只讀內(nèi)存來完成。
  • 程序的執(zhí)行便開始。接著便調(diào)用main函數(shù)。
  • 開始執(zhí)行程序代碼。這個時候程序?qū)⑹褂靡粋€運(yùn)行時堆棧(stack),存儲函數(shù)的局部變量和返回地址。程序同時也可以使用靜態(tài)(static)內(nèi)存,存儲于靜態(tài)內(nèi)存中的變量在程序的整個執(zhí)行過程一直保留他們的值。
  • 終止程序。正常終止main函數(shù);也有可能是意外終止。

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

相關(guān)文章

  • C++實(shí)現(xiàn)主機(jī)字節(jié)序和網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換示例

    C++實(shí)現(xiàn)主機(jī)字節(jié)序和網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換示例

    這篇文章主要為大家介紹了C++實(shí)現(xiàn)主機(jī)字節(jié)序和網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • 完美解決QT?QGraphicsView提升到QChartView報錯的問題

    完美解決QT?QGraphicsView提升到QChartView報錯的問題

    使用QT提供的QChartView來繪制圖表,提升QGraphicsView控件繼承QChartView后,然后將QGraphicsView提升到我們自己寫的類,怎么才能確保提升后編譯不報錯呢,下面小編給大家?guī)砹薗T QGraphicsView 提升到QChartView報錯解決方案,感興趣的朋友一起看看吧
    2023-05-05
  • 在VC中隱藏控制臺程序窗口的實(shí)現(xiàn)代碼

    在VC中隱藏控制臺程序窗口的實(shí)現(xiàn)代碼

    大家都知道,當(dāng)編寫一個win32 console application時,當(dāng)運(yùn)行此類程序的時候默認(rèn)情況下會有一個類似dos窗口的console窗口,但是有的時候我們只想在程序中運(yùn)行一段功能代碼,不希望顯示這個console窗口,讓代碼執(zhí)行完畢之后程序自動退出
    2013-04-04
  • C++版本基于ros將文件夾中的圖像轉(zhuǎn)換為bag包

    C++版本基于ros將文件夾中的圖像轉(zhuǎn)換為bag包

    這篇文章主要介紹了C++版本基于ros將文件夾中的圖像轉(zhuǎn)換為bag包,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-01-01
  • C++中關(guān)于union的使用方法說明

    C++中關(guān)于union的使用方法說明

    這篇文章主要介紹了C++中關(guān)于union的使用方法說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C++?opencv實(shí)現(xiàn)幾何圖形繪制

    C++?opencv實(shí)現(xiàn)幾何圖形繪制

    這篇文章主要為大家介紹了C++?opencv實(shí)現(xiàn)幾何圖形的繪制示例實(shí)現(xiàn)代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • C++ List鏈表的介紹和使用

    C++ List鏈表的介紹和使用

    list是可以在常數(shù)范圍內(nèi)在任意位置進(jìn)行插入和刪除的序列式容器,并且該容器可以前后雙向迭代,這篇文章主要介紹了C++ List鏈表的介紹和使用,需要的朋友可以參考下
    2023-03-03
  • C++派生類與基類的轉(zhuǎn)換規(guī)則

    C++派生類與基類的轉(zhuǎn)換規(guī)則

    基類與派生類對象之間有賦值兼容關(guān)系,由于派生類中包含從基類繼承的成員,具體表現(xiàn)在以下幾個方面,需要的朋友可以參考下
    2012-11-11
  • C語言函數(shù)棧幀解析

    C語言函數(shù)棧幀解析

    下面小編就為大家?guī)硪黄獪\談C語言函數(shù)調(diào)用參數(shù)壓棧的相關(guān)問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-09-09
  • VisualStudio?禁用移動文件到文件夾自動修改命名空間功能

    VisualStudio?禁用移動文件到文件夾自動修改命名空間功能

    這篇文章主要介紹了VisualStudio?禁用移動文件到文件夾自動修改命名空間功能,文章底部給大家介紹了解決安裝VS2022時,出現(xiàn)未能安裝包“Microsoft.VisualCpp.Redist.14,version=14.32.31332,chip”=x86,的問題及解決方法,需要的朋友可以參考下
    2022-09-09

最新評論

淳化县| 天峻县| 金乡县| 昌邑市| 深州市| 都昌县| 六枝特区| 含山县| 枝江市| 保定市| 武平县| 九江市| 呈贡县| 南溪县| 平阴县| 浦江县| 河津市| 丹凤县| 赤城县| 汉中市| 广东省| 浙江省| 若羌县| 河津市| 丰都县| 和顺县| 云安县| 雷波县| 泰州市| 广汉市| 肇东市| 神木县| 西乡县| 沈阳市| 仁化县| 曲水县| 绥滨县| 浦北县| 兴城市| 祁门县| 永城市|