编译相关
編譯的過(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é)
- 上一篇: 双向链表的快速排序
- 下一篇: 别说我不会玩,我来告诉你iPhone有多