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

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

生活随笔

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

编程问答

编译相关

發(fā)布時(shí)間:2023/12/2 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 编译相关 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

編譯的過(guò)程 :

1. 詞法分析,程序被掃描成:關(guān)鍵字,標(biāo)識(shí)符,字面量和特殊符號(hào)這些記號(hào)。

2. 語(yǔ)法分析,對(duì)記號(hào)進(jìn)行語(yǔ)法分析產(chǎn)生語(yǔ)法樹(shù)。(代碼最終由表達(dá)式組合)

3. 語(yǔ)義分析,經(jīng)過(guò)類(lèi)型匹配和轉(zhuǎn)換,把語(yǔ)法樹(shù)上的表達(dá)式都標(biāo)識(shí)上類(lèi)型。

4. 運(yùn)行時(shí)無(wú)關(guān)的中間碼的生成,此時(shí)的語(yǔ)法樹(shù)可以轉(zhuǎn)換成三址碼,并進(jìn)行初步優(yōu)化。

5. 生成目標(biāo)代碼,但此時(shí)變量的地址并未確定。

?

目標(biāo)文件的內(nèi)容: 段里放的都是真正的東西,比如指令,變量值。至于名稱(chēng)都在符號(hào)表里,所以.bss段沒(méi)有內(nèi)容。 符號(hào)表里列舉出了所有的符號(hào),以及那些符號(hào)對(duì)應(yīng)的值或指令在哪。 在鏈接中用到的符號(hào)主要是函數(shù)名和變量名,而且是經(jīng)過(guò)修飾的(C和C++的修飾不一樣,注意extern "C")。 需要重定位的地方會(huì)被記錄到重定位段里。

?

鏈接的背景: 程序經(jīng)常改變,于是指令和變量的地址就會(huì)跟著改變,導(dǎo)致跳轉(zhuǎn)指令也要跟著調(diào)整。 于是人們用符號(hào)標(biāo)識(shí)位置,并在每次匯編的時(shí)候都重新計(jì)算符號(hào)的地址,然后統(tǒng)一填入。 獨(dú)立編譯模塊變得流行,需要解決變量和函數(shù)的跨模塊訪問(wèn)問(wèn)題。

?

鏈接的過(guò)程:

1. 掃描所有的輸入目標(biāo)文件,合并相同段,分配地址空間,收集全局符號(hào)表。這一步后,所有符號(hào)都有了地址。

2. 讀取重定位信息,調(diào)整代碼地址。

?

常常在我腦子中轉(zhuǎn)的一個(gè)問(wèn)題是:context switch是哪個(gè)程序?當(dāng)系統(tǒng)中運(yùn)行一個(gè)shell,然后由shell調(diào)用hello,那個(gè)執(zhí)行context switch的system call是算哪個(gè)程序?答案是:那個(gè)system call對(duì)應(yīng)的那一串執(zhí)行context switch的指令不是程序。程序是在操作系統(tǒng)之上的概念,當(dāng)指令落入操作系統(tǒng)手中,就不是程序的概念了。如果要考慮context switch層面上的問(wèn)題,計(jì)算機(jī)工作過(guò)程就不應(yīng)該看成是進(jìn)程切換的過(guò)程,而是單一的一維指令執(zhí)行的過(guò)程,在那個(gè)層面上,沒(méi)有進(jìn)程的概念,只有指令周期和有限狀態(tài)機(jī)的概念。

?

理解這個(gè)過(guò)程值得注意的點(diǎn)有:context switch對(duì)于進(jìn)程來(lái)說(shuō)是透明的,fork()函數(shù)也只是一個(gè)函數(shù)而已,它并不負(fù)責(zé)那個(gè)新進(jìn)程是怎么創(chuàng)建的,它只管執(zhí)行一下這條指令然后收結(jié)果,在它看來(lái)結(jié)果是立即收到的,并沒(méi)有等“很多有關(guān)創(chuàng)建一個(gè)新進(jìn)程的指令執(zhí)行”再收到結(jié)果,因?yàn)槟切┒际撬旧磉M(jìn)程外的事情。收到結(jié)果,如果結(jié)果是0表示那個(gè)“任務(wù)”成功完成了,如果是其它的,表示那個(gè)“任務(wù)”沒(méi)有完成,至于那個(gè)“任務(wù)”是什么,它并不在乎。

?

于是,我需要重新思考什么是操作系統(tǒng),它給應(yīng)用程序提供了怎么樣一個(gè)平臺(tái),它提供的系統(tǒng)調(diào)用接口是怎么樣的,我需要了解清楚操作系統(tǒng)的全貌,才能在編程的工作中游刃有余。要知道,當(dāng)計(jì)算正在執(zhí)行一條指令時(shí),這條指令要么來(lái)自應(yīng)用程序,要么來(lái)自操作系統(tǒng),我需要知道,哪些是操作系統(tǒng)份內(nèi)的事情,哪些是應(yīng)用程序份內(nèi)的事情。

?

?

?

?

轉(zhuǎn)載于:https://www.cnblogs.com/caicaiandtutu/archive/2012/07/08/2581500.html

總結(jié)

以上是生活随笔為你收集整理的编译相关的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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