miniCC編譯工具鏈解說_第1頁
miniCC編譯工具鏈解說_第2頁
miniCC編譯工具鏈解說_第3頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第0頁:各位同學(xué),我們今天來講的是miniCC編譯工具鏈,這是我們課程組的老師對標(biāo)gcc等來自主開發(fā)的。gcc功能強大,可靠性高,但源代碼有一百多萬行,想要深入理解其中的原理,非常困難。而miniCC的源代碼大概在一萬多行左右,用java來開發(fā),容易理解。源代碼都向大家開放,前面幾屆都有同學(xué)基于這些源碼進(jìn)行了完善,大家如果有興趣來參與其中,也可以跟老師聯(lián)系。第1頁:所謂的編譯工具鏈,就是輸入符合要求的程序,然后輸出可執(zhí)行的代碼。在計算機的世界里,約定無處不在,這個c語言規(guī)范就是我們與編譯工具鏈的一種約定,只有按照規(guī)范來寫代碼,才符合我們編譯工具鏈的輸入要求,gcc是能支持完整的c語言規(guī)范,我們的miniCC只支持c語言的子集。后面我們要接觸到的匯編語言、機器指令、可執(zhí)行文件的格式等等,都是人制定的規(guī)范,都是軟件硬件之間進(jìn)行交流的約定。大家可以看右邊的這個圖,當(dāng)我們寫好一個c的代碼時,如果我們不清楚這個c語言規(guī)范,那么就無法知道這個c代碼的執(zhí)行結(jié)果,但我們在大一的時候?qū)W習(xí)了c語言的這個規(guī)范,明白這個約定,那么我們的大腦就具有了c語言的編譯功能,當(dāng)然每個人的編譯能力有強有弱。gcc編譯工具鏈把整個編譯過程,分成了編譯、匯編、鏈接等步驟,也就是說,編譯工具鏈包括了編譯器、匯編器、鏈接器等工具。對于普通用戶來說,只要關(guān)注輸入輸出即可,但我們是計算機專業(yè)的學(xué)生,需要搞清楚這中間每一步發(fā)生了什么,需要自己去調(diào)整和優(yōu)化,甚至還有可能要寫這些工具。我們的miniCC就是一個很好的例子,上個學(xué)期我們所實現(xiàn)的cpu,gcc是沒有辦法把一個c代碼編譯成我們cpu上可以執(zhí)行的代碼,因此就需要自己來實現(xiàn)編譯工具鏈。下面我們就來詳細(xì)介紹下miniCC。第2頁:這是miniCC編譯器的功能。它的作用是將c代碼轉(zhuǎn)換成匯編語言,這中間還會有一個過程,就是先將c代碼轉(zhuǎn)成四元組。左邊是一個非常簡單的c代碼,右邊是轉(zhuǎn)換后的四元組,請大家注意,四元組是一種更抽象和簡單的形式表示源代碼的操作,四個元素分別是操作符,第一個操作數(shù),第二個操作數(shù),操作結(jié)果,這與哪一種編程語言無關(guān),與在什么樣的機器上運行也無關(guān)。我們來簡單看下這個c代碼生成的四元組,第一行,就是輸入整數(shù)a的值,第二行就對應(yīng)著左邊的賦值語句c=0,而整個for循環(huán)就對應(yīng)著第三行到第10行這8個四元組,第三行是for循環(huán)的賦初值b=a,第四行就是判斷一下b是否大于0,如果大于0,則跳轉(zhuǎn)到第8行,如果小于等于0,就不跳轉(zhuǎn),接著執(zhí)行第五個四元組,第五個就是直接跳轉(zhuǎn)第11行,也就是結(jié)束循環(huán),準(zhǔn)備執(zhí)行輸出c的值,而第8行則是滿足循環(huán)的條件,開始執(zhí)行循環(huán)體中的語句,將b的值與c相加,結(jié)果放到臨時變量T1中,然后第9行就是將這個臨時變量賦值給b,完成了c=c+b這一語句,第10行是直接跳轉(zhuǎn)到第6行,將b的值減1,然后直接跳轉(zhuǎn)到第4行,再次判斷是否需要循環(huán)。編譯器涉及到的知識在《編譯原理》課程中會進(jìn)行詳細(xì)的講解,我們課程組基于javaCC對這個過程進(jìn)行了簡化,以現(xiàn)在大家的編程能力,也是可以來實現(xiàn)一個編譯器的,我們在頭歌平臺上設(shè)計了一個闖關(guān)實驗,大概一千多行代碼拆解成了28關(guān),同學(xué)們可以去試試。第3頁:下一步,編譯器就需要將四元組轉(zhuǎn)成匯編代碼,從這個階段開始,就需要考慮具體的機器類型了。比如我們是需要轉(zhuǎn)換成我們原型機上能執(zhí)行的代碼,這就是轉(zhuǎn)換的結(jié)果,可以看到,每一個四元組都轉(zhuǎn)換成了若干條原型機匯編指令。為了便于大家學(xué)習(xí),每一條匯編指令后面都加了詳細(xì)的注釋。第4頁:cpu只能執(zhí)行機器指令,因此需要將匯編代碼轉(zhuǎn)成機器指令,這種轉(zhuǎn)換需要參照指令集的說明,例如我們上個學(xué)期的cpu就有這樣的一個表,說明了如何將匯編指令轉(zhuǎn)成機器碼。我們的模擬器vspm可以直接運行匯編代碼,因此這一步就可以略過。第5頁:下一步就是鏈接器,它的作用是按照操作系統(tǒng)等的約定,把生成的這些機器指令,加上一些信息,組裝成一個操作系統(tǒng)認(rèn)可的文件,這樣就可以交給操作系統(tǒng)了。而在我們的原型機模擬器中,直接就約定了第一行是一個數(shù)字,表示需要分配的數(shù)據(jù)段大小,而后面的字節(jié),則是按行來裝入指令,因此原型機的鏈接器非常簡單,就是計算一下變量和臨時變量的個數(shù),將這個值和匯編指令寫到一個文檔中,然后vspm就可以來執(zhí)行了。第6頁:miniCC不僅僅是能實現(xiàn)原型機上的匯編和鏈接,還能夠?qū)崿F(xiàn)ubunut操作系統(tǒng)上的匯編和鏈接,當(dāng)然前面的c代碼到四元組還是一樣的過程。第7頁:因為我們的目標(biāo)系統(tǒng)是intelCPU+32位Ubuntu操作系統(tǒng),所以將四元組轉(zhuǎn)換成了這個環(huán)境下的匯編代碼。不同環(huán)境下的匯編代碼都各不相同,因此需要根據(jù)不同環(huán)境下的約定,將四元組轉(zhuǎn)成適合這個環(huán)境的匯編代碼。目前我們還只是實現(xiàn)了這個環(huán)境下的功能,歡迎同學(xué)們來加入到開發(fā)團隊,生成不同環(huán)境下匯編指令的轉(zhuǎn)換程序。第8頁:在匯編指令生成后,就需要轉(zhuǎn)成機器指令,我們的目標(biāo)是x86intelCPU,所以就需要詳細(xì)了解intel的約定,這個約定有點復(fù)雜,所以實現(xiàn)的代碼也有點兒長,大概有1500多行,最后實

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論