連接器大全 C語(yǔ)言、匯編語(yǔ)言、機(jī)器指令、CPU之間是怎么聯(lián)系起來(lái)的?
C語(yǔ)言、匯編語(yǔ)言、機(jī)器指令、CPU之間是怎么聯(lián)系起來(lái)的?CPU的全稱是中央處理單元,是計(jì)算機(jī)進(jìn)行運(yùn)算的核心,根據(jù)使用的技術(shù)不同,CPU又分為X86,X64,ARM、DSP、單片機(jī)等不同的體系結(jié)構(gòu)。在每
C語(yǔ)言、匯編語(yǔ)言、機(jī)器指令、CPU之間是怎么聯(lián)系起來(lái)的?
CPU的全稱是中央處理單元,是計(jì)算機(jī)進(jìn)行運(yùn)算的核心,根據(jù)使用的技術(shù)不同,CPU又分為X86,X64,ARM、DSP、單片機(jī)等不同的體系結(jié)構(gòu)。在每種CPU上都有一套特定的指令集,這就是人們常說(shuō)的機(jī)器指令,直接使用機(jī)器指令編寫的程序就是機(jī)器語(yǔ)言程序。
理論上來(lái)說(shuō),是可以通過(guò)機(jī)器語(yǔ)言直接編寫任何程序的(早期都是直接使用機(jī)器語(yǔ)言編程,那時(shí)程序相對(duì)比較簡(jiǎn)單),并且編寫的程序可以直接運(yùn)行,但是使用機(jī)器語(yǔ)言編程對(duì)程序員的要求極高,代碼無(wú)法移植且不便于人直接閱讀,于是人們發(fā)明了一組符號(hào),用來(lái)表示這些機(jī)器指令,這就是匯編語(yǔ)言。匯編語(yǔ)言編寫的程序計(jì)算機(jī)無(wú)法直接運(yùn)行,需要一個(gè)叫做匯編器的程序轉(zhuǎn)換為機(jī)器語(yǔ)言才可以在特定機(jī)器上運(yùn)行。
而C語(yǔ)言是比匯編語(yǔ)言更高級(jí)的語(yǔ)言,使用C語(yǔ)言編寫的程序也是無(wú)法在計(jì)算機(jī)上直接運(yùn)行的,它需要編譯器將C語(yǔ)言代碼轉(zhuǎn)換為機(jī)器語(yǔ)言,這個(gè)過(guò)程又分為幾個(gè)子步驟,見(jiàn)下圖。
為了使題主的問(wèn)題更加完善,在這里補(bǔ)充兩個(gè)概念,鏈接器與反匯編。
在大型程序中,往往會(huì)將任務(wù)分解為許多不同的子任務(wù),每個(gè)子任務(wù)對(duì)應(yīng)一個(gè)源文件,在C語(yǔ)言中就是多個(gè)C文件,編譯器將每個(gè)C文件編譯成一個(gè)目標(biāo)文件(一般在Windows中是obj文件,Linux中是
.o
文件),這些目標(biāo)文件也是機(jī)器指令,但是缺少一些必要的信息,無(wú)法直接運(yùn)行,需要鏈接器將這些文件鏈接起來(lái),再加上一些庫(kù)文件與可執(zhí)行文件頭信息,成為一個(gè)可執(zhí)行文件(Windows是PE格式,Linux是ELF格式)。通常,在查看一個(gè)二進(jìn)制文件時(shí)(目標(biāo)文件或者可行性文件),不會(huì)直接顯示機(jī)器指令,而是以匯編語(yǔ)言顯示,這是因?yàn)榇诉^(guò)程中有一個(gè)反匯編程序,將機(jī)器指令轉(zhuǎn)換為匯編語(yǔ)言,它的功能剛好與匯編過(guò)程相反。
C語(yǔ)言開發(fā)用什么工具比較好?
我是宇宙君,干了20多年開發(fā),我來(lái)說(shuō)說(shuō)。
C的開發(fā)從根本上來(lái)說(shuō)你需要三個(gè)東西:編輯器,C編譯連接器,目標(biāo)代碼調(diào)試器。我們分開來(lái)說(shuō)說(shuō)。
1、編輯器(或IDE):原則上說(shuō)你可以用任何一種純文本編輯器來(lái)編輯代碼,但為了編輯效率,一般會(huì)使用專業(yè)的代碼編輯器(或IDE),比如:在windows下有微軟為大家提供的宇宙第一的VS,你可以選任何一個(gè)最近版本的V,當(dāng)然VS因?yàn)楣δ芴珡?qiáng)也就比較大如果你的機(jī)器不是很給力那你還可以選擇VSCode(需要C編譯調(diào)試插件),source insight,UtraEdit,DevC 等。Linux下選擇也很多,你如果是原教旨主義工程師那么必須選擇VI或VIM:),不講究呢就sublime甚至geditor等。
2、編譯器:C因?yàn)橛玫暮軓V,實(shí)際上有很多不同使用場(chǎng)景的編譯器,但我理解你是為了學(xué)習(xí)C對(duì)吧?那正常只有兩個(gè)選擇,微軟的C編譯連接器和GCC。微軟的C編譯器與它的集成開發(fā)環(huán)境VC,VS直接打包在一起你不用了解細(xì)節(jié)直接用它的IDE就可以。而gcc你需要自己將其配置但開發(fā)編輯器中,你至少需要了解gcc的編譯開關(guān)參數(shù)。另外多說(shuō)一點(diǎn)gcc,gcc是GNU編譯器套件(GNU Compiler Collection)的縮寫,它實(shí)際上包括了C、C 、Objective-C、Fortran、Java、Ada、Go語(yǔ)言和D語(yǔ)言的前端,也包括了這些語(yǔ)言的庫(kù)(如libstdc 、libgcj等等),非常強(qiáng)大!而且是跨平臺(tái)的,你以后給經(jīng)常用到它,有必要熟悉一下。
3、調(diào)試器:如果是使用微軟的IDE,啊你也不需要了解細(xì)節(jié),微軟都集成好了,直接用就好啦!當(dāng)前另一些比如DevC 也集成好了。如果是其它的獨(dú)立編輯和編譯環(huán)境就需要自己配置,一般使用gcc配套的gdb來(lái)做。
最后總結(jié)一下。
Windows系統(tǒng)下:初學(xué)者不折騰那就是微軟的VS集成環(huán)境,機(jī)器不行就換DevC (但這個(gè)平臺(tái)實(shí)際上有些煩人的bug..)或者VSCode,如果不嫌版本低甚至可以VC6,哈哈。
Linux系統(tǒng)下:VSCode,sublime,vim都是好選擇!
然后,給到學(xué)習(xí)C的朋友一句鼓勵(lì)的話:C語(yǔ)言江湖深似海,入此江湖遍歷鬼雨旭日,回首往已百年身。。。慎重??!
:)