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

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

生活随笔

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

编程问答

看完这篇文章之后,终于明白了编译到底怎么回事

發(fā)布時(shí)間:2025/4/5 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 看完这篇文章之后,终于明白了编译到底怎么回事 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

看完這篇文章之后,終于明白了編譯到底怎么回事。

1

對(duì)于同一個(gè)語(yǔ)句,有如下三種:高級(jí)語(yǔ)言、低級(jí)語(yǔ)言、機(jī)器語(yǔ)言的表示

  • C語(yǔ)言?
    a=b+1;

  • 匯編語(yǔ)言?
    mov -0xc(%ebp),%eax
    add $0x1,%eax
    mov %eax,-0x8(%ebp)

  • 機(jī)器語(yǔ)言?
    8b 45 f4
    83 c0 01
    89 45 f8

我們都知道,機(jī)器是只能做數(shù)字計(jì)算的,能夠讓機(jī)器去運(yùn)算的、數(shù)字的語(yǔ)言就是機(jī)器語(yǔ)言,除此之外的所有計(jì)算機(jī)語(yǔ)言都是非機(jī)器語(yǔ)言。這樣的相對(duì)于機(jī)器語(yǔ)言的高級(jí)語(yǔ)言都需要一個(gè)轉(zhuǎn)換,從高級(jí)、機(jī)器不可理解,轉(zhuǎn)換為機(jī)器可理解的機(jī)器語(yǔ)言。這樣的一個(gè)轉(zhuǎn)換過(guò)程就叫做編譯(Compile),由編譯器(Compiler)來(lái)完成。

由C轉(zhuǎn)換為匯編語(yǔ)言這一過(guò)程是由匯編器(Assembler)來(lái)執(zhí)行的。

C和匯編語(yǔ)言轉(zhuǎn)換為機(jī)器語(yǔ)言都是由編譯器來(lái)完成的。

2

這里面,C是可跨平臺(tái)的,也可以說(shuō)是與平臺(tái)無(wú)關(guān)的。這里的平臺(tái)有兩種說(shuō)法,一種是指計(jì)算機(jī)的體系(Architecture),另一種是指操作系統(tǒng)(Operate System),也可以是指兩種的結(jié)合。不同的平臺(tái),他們所需要的執(zhí)行機(jī)器語(yǔ)言的指令集是不同的。C的跨平臺(tái)性是指,只需要編寫一份不需要修改的C程序代碼,就可以在不同體系、不同操作系統(tǒng)的計(jì)算機(jī)上運(yùn)行。這都要靠編譯器的功勞,編譯器將C程序翻譯為了適合當(dāng)前計(jì)算機(jī)體系的機(jī)器語(yǔ)言。

下面說(shuō)一下將C語(yǔ)言編譯為機(jī)器語(yǔ)言的整個(gè)過(guò)程:

首先,我們寫出一份C程序代碼,命名該代碼為hello.c,這個(gè)代碼文件,我們稱之為源代碼(Srouce Code)。

然后我們運(yùn)行編譯器,對(duì)該源代碼文件進(jìn)行編譯,在整個(gè)編譯的過(guò)程中,編譯器并不會(huì)執(zhí)行該源代碼,只是生成一份新的機(jī)器語(yǔ)言代碼文件,如hello.out。這份新生成的代碼文件稱為目標(biāo)代碼(Object Code)或可執(zhí)行代碼(Executable)。

3

對(duì)于編譯過(guò)程,里面還涉及到具體的一些可以說(shuō)的細(xì)節(jié)步驟。

在Linux下,使用gcc編譯器:

預(yù)編譯hello.c文件:

gcc?-E -o hello.i hello.c

執(zhí)行成功后就會(huì)生成一個(gè)新的hello.i的文件,可以用編輯器(Vim)查看它的內(nèi)容,這個(gè)文件就是經(jīng)過(guò)預(yù)編譯后的內(nèi)容。

預(yù)編譯又稱為預(yù)處理,是做些代碼文本的替換工作。預(yù)編譯可以處理#開(kāi)頭的指令,比如拷貝#include包含的文件代碼,#define的宏定義的替換,條件編譯等。

純粹的進(jìn)行編譯:

gcc?-S -o hello.s hello.i

把.i文件寫為hello.c也行,就是跳過(guò)手動(dòng)預(yù)編譯,直接完成預(yù)編譯和編譯兩個(gè)過(guò)程。這時(shí)會(huì)得到一個(gè)hello.s文件,打開(kāi)看一下,里面是編譯好的使用于當(dāng)前體系結(jié)構(gòu)的匯編代碼。

把匯編代碼進(jìn)行匯編可執(zhí)行:

gcc?-c -o hello.o hello.s

把.s文件換成.c也行,就是自動(dòng)完成預(yù)編譯、編譯和匯編三個(gè)過(guò)程。現(xiàn)在得到一個(gè)hello.o文件,這是一個(gè)二進(jìn)制文件,但不是最后的可執(zhí)行二進(jìn)制文件,因?yàn)樗€缺少最后一步連接處理。

最后對(duì).o文件進(jìn)行連接,我們這里就一個(gè).o文件所以簡(jiǎn)單,經(jīng)常是需要有多個(gè).o文件需要連接。連接執(zhí)行:

gcc?-o hello hello.o

如果把最后的.o文件寫成.c,那就和最開(kāi)始我們用hello.c編譯時(shí)示范的那樣了。實(shí)際上那樣是完成了預(yù)編譯、編譯、匯編和連接一連串的過(guò)程。

想了解更多gcc的只是可以到GNU的網(wǎng)站上去看看。

BTW,gdb是常用的調(diào)式軟件。

總結(jié)

以上是生活随笔為你收集整理的看完这篇文章之后,终于明白了编译到底怎么回事的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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