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