亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

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

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

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

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

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

請(qǐng)?zhí)砑訄D片描述

編譯和鏈接

翻譯環(huán)境

請(qǐng)?zhí)砑訄D片描述

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

編譯的幾個(gè)階段

接下來(lái),我來(lái)用Linux平臺(tái)來(lái)給大家演示一下編譯的三個(gè)過(guò)程:

我們先編寫(xiě)一個(gè)簡(jiǎn)單C程序:

請(qǐng)?zhí)砑訄D片描述

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

gcc test.c

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

請(qǐng)?zhí)砑訄D片描述

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

./a.out

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

請(qǐng)?zhí)砑訄D片描述

為了讓大家更好地感受到編譯的過(guò)程,我們來(lái)一步一步看:

預(yù)處理

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

gcc -E test.c -o test.i

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

請(qǐng)?zhí)砑訄D片描述

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

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

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

  • 頭文件被展開(kāi)
  • 宏被文本替換了
  • 注釋被刪除了

我們對(duì)原代碼做一個(gè)處理,不包含stdio.h的頭文件,我們自己寫(xiě)一個(gè)頭文件:

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

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

效果通上面一樣。

所以預(yù)處理的幾個(gè)動(dòng)作

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

編譯

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

gcc -S test.c

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

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

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

所以編譯的幾個(gè)動(dòng)作

  • 語(yǔ)法分析
  • 詞法分析
  • 語(yǔ)義分析
  • 符號(hào)匯總

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

匯編

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

gcc -c test.c

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

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

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

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

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

這個(gè)過(guò)程還做了一件件事——形成符號(hào)表

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

鏈接

鏈接做的兩個(gè)事情

  • 合并段表
  • 符號(hào)表的合并和符號(hào)表的重定位

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

elf會(huì)把文件組織成一個(gè)段。test.o和Add.o都有一個(gè)段,那么我們?cè)鯓硬拍芸炊甧lf格式的文件呢?

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

readelf test.o -a

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

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

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

然后這下面還有符號(hào)表的匯總:

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

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

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

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

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

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

相關(guān)文章

  • 十分鐘學(xué)會(huì)C++?Traits

    十分鐘學(xué)會(huì)C++?Traits

    本文試圖以最簡(jiǎn)潔的方式闡述對(duì)C++?traits?的理解,當(dāng)你理解了第二個(gè)例子的時(shí)候,相信你已經(jīng)理解了C++?traits,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2022-02-02
  • C語(yǔ)言柔性數(shù)組的實(shí)現(xiàn)示例

    C語(yǔ)言柔性數(shù)組的實(shí)現(xiàn)示例

    柔性數(shù)組既數(shù)組大小待定的數(shù)組, C語(yǔ)言中結(jié)構(gòu)體的最后一個(gè)元素可以是大小未知的數(shù)組,本文就來(lái)介紹一下柔性數(shù)組的用法,感興趣的可以了解一下
    2024-03-03
  • C++實(shí)現(xiàn)LeetCode(75.顏色排序)

    C++實(shí)現(xiàn)LeetCode(75.顏色排序)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(75.顏色排序),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++內(nèi)存管理詳細(xì)解析

    C++內(nèi)存管理詳細(xì)解析

    這篇文章主要給大家分享的是C++內(nèi)存管理的詳細(xì)內(nèi)容學(xué)習(xí),下面文章圍繞C++內(nèi)存管理的相關(guān)資料展開(kāi)具體學(xué)習(xí)內(nèi)容,需要的朋友可以參考一下,希望對(duì)你有所幫助
    2021-11-11
  • opencv3/C++圖像濾波實(shí)現(xiàn)方式

    opencv3/C++圖像濾波實(shí)現(xiàn)方式

    今天小編就為大家分享一篇opencv3/C++圖像濾波實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • c++驗(yàn)證哥德巴赫猜想

    c++驗(yàn)證哥德巴赫猜想

    這篇文章主要介紹了c++驗(yàn)證哥德巴赫猜想,哥德巴赫猜想就是任一大于2的偶數(shù),都可表示成兩個(gè)素?cái)?shù)之和,需要的朋友可以參考下
    2014-04-04
  • C語(yǔ)言的函數(shù)概念與規(guī)則你了解嗎

    C語(yǔ)言的函數(shù)概念與規(guī)則你了解嗎

    這篇文章主要介紹了C語(yǔ)言中的函數(shù)概念與規(guī)則,本文給大家介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下,希望能給你帶來(lái)幫助
    2021-08-08
  • C++數(shù)組指針和二維數(shù)組詳情

    C++數(shù)組指針和二維數(shù)組詳情

    這篇文章主要介紹了C++數(shù)組指針和二維數(shù)組,指針數(shù)組和二維數(shù)組在應(yīng)用中常用于函數(shù)傳參,下面我們就來(lái)看看指針數(shù)組和二維數(shù)組在應(yīng)用中的具體使用吧,需要的朋友可以參考一下
    2021-10-10
  • 使用C語(yǔ)言打印月歷

    使用C語(yǔ)言打印月歷

    這篇文章主要為大家詳細(xì)介紹了使用C語(yǔ)言打印月歷,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C語(yǔ)言實(shí)現(xiàn)萬(wàn)年歷源碼

    C語(yǔ)言實(shí)現(xiàn)萬(wàn)年歷源碼

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)萬(wàn)年歷源碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10

最新評(píng)論