![編譯器家族GCC內(nèi)部探密探索GCC前端的_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-4/16/15ddd934-0a9c-437b-90bf-cbff057fe2a8/15ddd934-0a9c-437b-90bf-cbff057fe2a81.gif)
![編譯器家族GCC內(nèi)部探密探索GCC前端的_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-4/16/15ddd934-0a9c-437b-90bf-cbff057fe2a8/15ddd934-0a9c-437b-90bf-cbff057fe2a82.gif)
![編譯器家族GCC內(nèi)部探密探索GCC前端的_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-4/16/15ddd934-0a9c-437b-90bf-cbff057fe2a8/15ddd934-0a9c-437b-90bf-cbff057fe2a83.gif)
![編譯器家族GCC內(nèi)部探密探索GCC前端的_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-4/16/15ddd934-0a9c-437b-90bf-cbff057fe2a8/15ddd934-0a9c-437b-90bf-cbff057fe2a84.gif)
![編譯器家族GCC內(nèi)部探密探索GCC前端的_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-4/16/15ddd934-0a9c-437b-90bf-cbff057fe2a8/15ddd934-0a9c-437b-90bf-cbff057fe2a85.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、.編譯器家族 GCC 內(nèi)部探密 探究 GCC 前端的GNU編譯器家族GCC內(nèi)部探密:探究GCC前端的內(nèi)部構(gòu)造2020年06月03日星期四下午09:28GNU編譯器家族GCC內(nèi)部探密:探究GCC前端的內(nèi)部構(gòu)造screen.width*0.7this.resized=true;this.width=screen.width*0.7;this.alt='Click here to open new windownCTRL+Mouse wheel to zoom in/out';"onmouseover="ifthis.width screen.width*0.7t
2、his.resized=true;this.width=screen.width*0.7;this.style.cursor='hand';this.alt='Click here to open new windownCTRL+Mouse wheel to zoom in/out';"onclick="if!this.resizedreturn true;elsewindow.open'onmousewheel="return imgzoomthis;"alt=""/screen.width*
3、0.7this.resized=true;this.width=screen.width*0.7;this.alt='Click here to open new windownCTRL+Mouse wheel to zoom in/out';"onmouseover="ifthis.width screen.width*0.7this.resized=true;this.width=screen.width*0.7;this.style.cursor='hand';this.alt='Click here to open new w
4、indownCTRL+Mouse wheel to zoom in/out';"onclick="if!this.resizedreturn true;elsewindow.open'onmousewheel="return imgzoomthis;"alt=""/screen.width*0.7this.resized=true;this.width=screen.width*0.7;this.alt='Click here to open new windownCTRL+Mouse wheel to zoo
5、m in/out';"onmouseover="ifthis.width screen.width*0.7this.resized=true;this.width=screen.width*0.7;this.style.cursor='hand';this.alt='Click here to open new windownCTRL+Mouse wheel to zoom in/out';"onclick="if!this.resizedreturn true;elsewindow.open'onmous
6、ewheel="return imgzoomthis;"alt=""/screen.width*0.7this.resized=true;this.width=screen.width*0.7;this.alt='Click here to open new windownCTRL+Mouse wheel to zoom in/out';"onmouseover="ifthis.width screen.width*0.7this.resized=true;this.width=screen.width*0.7;thi
7、s.style.cursor='hand';this.alt='Click here to open new windownCTRL+Mouse wheel to zoom in/out';"onclick="if!this.resizedreturn true;elsewindow.open'onmousewheel="return imgzoomthis;"alt=""/screen.width*0.7this.resized=true;this.width=screen.width*0.7
8、;this.alt='Click here to open new windownCTRL+Mouse wheel to zoom in/out';"onmouseover="ifthis.width screen.width*0.7this.resized=true;this.width=screen.width*0.7;this.style.cursor='hand';this.alt='Click here to open new windownCTRL+Mouse wheel to zoom in/out';"
9、;onclick="if!this.resizedreturn true;elsewindow.open'onmousewheel="return imgzoomthis;"alt=""/未顯示需要javascript的文檔選項screen.width*0.7this.resized=true;this.width=screen.width*0.7;this.alt='Click here to open new windownCTRL+Mouse wheel to zoom in/out';"onmouseo
10、ver="ifthis.width screen.width*0.7this.resized=true;this.width=screen.width*0.7;this.style.cursor='hand';this.alt='Click here to open new windownCTRL+Mouse wheel to zoom in/out';"onclick="if!this.resizedreturn true;elsewindow.open'onmousewheel="return imgzoomt
11、his;"alt=""/趙蔚zhaoway,Linux和自由軟件技術(shù)獨立參謀2003年7月10日我們在本文中說明GCC源碼包中的例子編程語言Treelang的實現(xiàn)細(xì)節(jié)。主要目的在于輯此說明所謂GCC前端的編程方法。限于篇幅,本文只能略略講一下GCC前端的內(nèi)部構(gòu)造的框架部分。本文中所涉及到的源程序均位于GCC源碼包中的gcc/目錄和gcc/treelang/目錄下。本文的代碼分析基于GCC CVS中的最新2003年六月的開發(fā)版本。GNU編譯器家族GCC介紹作為自由軟件的旗艦工程,Richard Stallman在十多年前剛開場寫作GCC的時候,還只是把它當(dāng)作僅僅一個
12、C程序語言的編譯器;GCC的意思也只是GNU CCompiler而已。經(jīng)過了這么多年的開展,GCC已經(jīng)不僅僅能支持C語言;它如今還支持Ada語言,C+語言,Java語言,Objective C語言,Pascal語言,COBOL語言,以及支持函數(shù)式編程和邏輯編程的Mercury語言,等等。而GCC也不再單只是GNU C語言編譯器的意思了,而是變成了GNU Compiler Collection也即是GNU編譯器家族的意思了。另一方面,說到GCC對于各種硬件平臺的支持,概括起來就是一句話:無所不在。幾乎所有有點實際用處的硬件平臺,甚至包括有些不那么有實際用處的硬件平臺,比方Don Knuth設(shè)計的
13、MMIX計算機(jī),GCC都提供了完善的支持。我們在這篇文章中要弄清楚的就是GCC是如何做到可以支持這么多種程序語言的。所謂的GCC的程序語言前端到底是怎么回事。假設(shè)我們要設(shè)計實現(xiàn)自己的編程語言的話,應(yīng)該從何入手。答復(fù)這些問題的第一步,就是分析清楚GCC源碼包中,為了說明GCC的程序語言前端的編寫方法,而寫作的Treelang編程語言在GCC中的實現(xiàn)細(xì)節(jié)。假設(shè)把我們自己的程序語言的實現(xiàn)建立于GCC之上,也立即使得我們的程序語言的實現(xiàn)版本可以運行在幾乎所有有用的硬件平臺之上。這對于程序語言的作者來說,也是一個確實的有極大誘惑力的好處。screen.width*0.7this.resized=true
14、;this.width=screen.width*0.7;this.alt='Click here to open new windownCTRL+Mouse wheel to zoom in/out';"onmouseover="ifthis.width screen.width*0.7this.resized=true;this.width=screen.width*0.7;this.style.cursor='hand';this.alt='Click here to open new windownCTRL+Mouse whe
15、el to zoom in/out';"onclick="if!this.resizedreturn true;elsewindow.open'onmousewheel="return imgzoomthis;"alt=""/screen.width*0.7this.resized=true;this.width=screen.width*0.7;this.alt='Click here to open new windownCTRL+Mouse wheel to zoom in/out';"
16、onmouseover="ifthis.width screen.width*0.7this.resized=true;this.width=screen.width*0.7;this.style.cursor='hand';this.alt='Click here to open new windownCTRL+Mouse wheel to zoom in/out';"onclick="if!this.resizedreturn true;elsewindow.open'onmousewheel="return
17、imgzoomthis;"alt=""/screen.width*0.7this.resized=true;this.width=screen.width*0.7;this.alt='Click here to open new windownCTRL+Mouse wheel to zoom in/out';"onmouseover="ifthis.width screen.width*0.7this.resized=true;this.width=screen.width*0.7;this.style.cursor='
18、hand';this.alt='Click here to open new windownCTRL+Mouse wheel to zoom in/out';"onclick="if!this.resizedreturn true;elsewindow.open'onmousewheel="return imgzoomthis;"alt=""/screen.width*0.7this.resized=true;this.width=screen.width*0.7;this.alt='Click
19、 here to open new windownCTRL+Mouse wheel to zoom in/out';"onmouseover="ifthis.width screen.width*0.7this.resized=true;this.width=screen.width*0.7;this.style.cursor='hand';this.alt='Click here to open new windownCTRL+Mouse wheel to zoom in/out';"onclick="if!th
20、is.resizedreturn true;elsewindow.open'onmousewheel="return imgzoomthis;"alt=""/回頁首關(guān)于代碼分析在這一小節(jié)里面我們著重說明兩個問題:第一、為什么要閱讀源代碼;第二、代碼分析應(yīng)該怎么寫。閱讀源代碼對進(jìn)步自己的編程程度是非常有幫助的。這個幫助至少表達(dá)在兩個方面。第一個方面是學(xué)會大型軟件工程設(shè)計的形式。這樣的形式是真實可靠的第一手資料,這樣學(xué)來的形式要比從書本上,用日常語言陳述的形式,更能深化到你的腦海中去。而且它的真實性和可靠性都是有保證的。并且這樣的形式還非常的詳細(xì)。我
21、曾經(jīng)看到計算機(jī)系的同學(xué)推薦去讀亞歷山大的建筑學(xué)方面的經(jīng)典著作;個人以為這是走的太遠(yuǎn)了。與其去讀建筑學(xué)的書,不如去分析一下成功的自由軟件工程的源代碼。詳細(xì)的用代碼說明的形式,無論如何要比虛無飄渺的美學(xué)概念,或者模棱兩可的工程紀(jì)律,都要更加容易學(xué)習(xí)吧?閱讀源代碼的第二個好處,是增加自己的自信心。就象學(xué)習(xí)英語,要和別人談話,要看看別人的文章,不能只是看教科書上的簡單的例子。教科書上的例子限于篇幅,不可能做到像真實、完好的英文小說那樣,把一個完好的設(shè)計呈如今你的面前。只有當(dāng)你硬著頭皮,拋開字典,把一本英文小說生生啃下來之后,你才能有把握說:我確實能做到。類似的,只有當(dāng)我們看過大型軟件工程的源代碼,作過
22、修改,摸爬滾打之后,我們才能有把握的說:我也能寫出來。上面說了閱讀源代碼至少有這么兩個好處。那么在閱讀源代碼的時候,我們必然要做代碼分析筆記。這個代碼分析筆記如何寫,這就是我們關(guān)心的一個問題了。在這里,我提出一些我自己的也許不太成熟的看法,也請讀者朋友們不吝指教。我總覺得,與其作一行一行的代碼注釋,說明每一行代碼的作用;不如設(shè)計一個故事,把代碼的框架說清楚。這也是我前面提到的,所謂形式一說。因為閱讀源代碼,最關(guān)鍵的是要理解大型軟件工程設(shè)計的形式,而不是要把每一次讀者分析每一行代碼細(xì)節(jié)的樂趣從此剝奪掉。另一方面,代碼分析的寫作風(fēng)格,可以是參考手冊似的;也可以是航海日志似的。我個人覺得參考手冊似的
23、代碼分析是比較乏味的,讀起來乏味,寫起來也不免乏味,雖然它可能更有用。對于一個急著要快點完畢加班工作的軟件工程師來說,也許參考手冊更加實用。但是對于一個想要理解這一份成功的軟件背后的工作奧秘的探究者來說,一個航海日志似的代碼分析,也許讀起來更有味道,更能讓一個程序員在鍵盤與屏幕之間,體會到那地理大發(fā)現(xiàn)的沖動與樂趣。本文后面的代碼分析,就是希望能寫成這樣的風(fēng)格。可是作者筆力有限,如有缺乏之處,還請讀者朋友們不吝指教。screen.width*0.7this.resized=true;this.width=screen.width*0.7;this.alt='Click here to o
24、pen new windownCTRL+Mouse wheel to zoom in/out';"onmouseover="ifthis.width screen.width*0.7this.resized=true;this.width=screen.width*0.7;this.style.cursor='hand';this.alt='Click here to open new windownCTRL+Mouse wheel to zoom in/out';"onclick="if!this.resized
25、return true;elsewindow.open'onmousewheel="return imgzoomthis;"alt=""/screen.width*0.7this.resized=true;this.width=screen.width*0.7;this.alt='Click here to open new windownCTRL+Mouse wheel to zoom in/out';"onmouseover="ifthis.width screen.width*0.7this.resize
26、d=true;this.width=screen.width*0.7;this.style.cursor='hand';this.alt='Click here to open new windownCTRL+Mouse wheel to zoom in/out';"onclick="if!this.resizedreturn true;elsewindow.open'onmousewheel="return imgzoomthis;"alt=""/screen.width*0.7this.re
27、sized=true;this.width=screen.width*0.7;this.alt='Click here to open new windownCTRL+Mouse wheel to zoom in/out';"onmouseover="ifthis.width screen.width*0.7this.resized=true;this.width=screen.width*0.7;this.style.cursor='hand';this.alt='Click here to open new windownCTRL
28、+Mouse wheel to zoom in/out';"onclick="if!this.resizedreturn true;elsewindow.open'onmousewheel="return imgzoomthis;"alt=""/screen.width*0.7this.resized=true;this.width=screen.width*0.7;this.alt='Click here to open new windownCTRL+Mouse wheel to zoom in/out
29、39;;"onmouseover="ifthis.width screen.width*0.7this.resized=true;this.width=screen.width*0.7;this.style.cursor='hand';this.alt='Click here to open new windownCTRL+Mouse wheel to zoom in/out';"onclick="if!this.resizedreturn true;elsewindow.open'onmousewheel=&qu
30、ot;return imgzoomthis;"alt=""/回頁首Treelang的代碼框架讀者朋友們在閱讀這一部分代碼分析的時候,手邊最好能準(zhǔn)備上一份GCC 3.3的源代碼。這個源代碼可以從GCC的站點上獲得。本文作者力圖做到把整個情況像說故事一樣娓娓道來,但是讀者朋友們假設(shè)在適當(dāng)?shù)臅r候可以查閱一下源代碼,可能更能把問題理解的清楚透徹。這個treelang語言的實現(xiàn),主要有兩個C語言文件,把整個代碼框架分成兩個部分。第一部分以tree1.c為主,帶上parse.y這個YACC源程序,組成了和GCC前端的接口;第二部分以treetree.c為主,組成了和GCC后端
31、的接口。這里首先說明一下tree1.c這個文件。它和上級目錄中的GCC框架文件toplev.c交互作用,實現(xiàn)tree1這個執(zhí)行程序的主體部分。這個tree1就相當(dāng)于GCC的C語言前端中的cc1執(zhí)行程序,該程序是C語言編譯器前端的主體。我們首先試圖說明從toplev.c到tree1.c的途徑。這樣我們就注意到toplev.c中這個引人注目的lang_hooks變量。當(dāng)然,接下來就注意到在toplev.c同一目錄下的langhooks.c這個文件。我們希望在其中發(fā)現(xiàn)一點有趣的東西。這一共是三個文件:langhooks.ch和langhooks-def.h其中在langhooks.h中定義了一堆各式
32、各樣的struct lang_hooks_for_xxx構(gòu)造,以及最后還有一個struct lang_hooks構(gòu)造把前面的那些for_xxx的構(gòu)造都總括了起來。這每一個構(gòu)造都是假設(shè)干個至少看上去像是回調(diào)函數(shù)的函數(shù)指針。看來這就是我們要尋找的東西。那么大概就是這樣了,編譯器前端向GCC主體部分注冊自己的lang_hooks來完成各樣的任務(wù)。接下來一個自然的問題就是這個注冊是如何進(jìn)展的;另外一個問題就是要對這些回調(diào)函數(shù)指針進(jìn)展分析了。這個langhooks.h文件中關(guān)于struct lang_hooks構(gòu)造字段的注釋很詳細(xì),這里我們暫時先跳過去。等到treelang中詳細(xì)的注冊回調(diào)函數(shù)出現(xiàn)的時候
33、,我們根據(jù)需要再做仔細(xì)說明。在langhooks-def.h文件中定義了一些這個struct lang_hooks構(gòu)造的默認(rèn)值。如今我們進(jìn)入treelang目錄下的treetree.c這個文件。來觀察一下在treelang中對struct lang_hooks這個構(gòu)造的初始化過程。這個過程不是按照我們通常所熟悉的C語言的C99標(biāo)準(zhǔn)或者是GCC擴(kuò)展語法來進(jìn)展的。而是采用了大量的#define和#undef并結(jié)合上層目錄中的langhooks-def.h來進(jìn)展。細(xì)想一下,這是理所當(dāng)然的事情,因為這是在編譯C語言編譯器本身嘛。當(dāng)然就不好用到C語言的新的東西或者是自己做的擴(kuò)展的東西。注釋開場:我們以初
34、始化如下定義的struct sample構(gòu)造為例。struct sampleint member_int;char*member_str;void*member_funvoid;在C99中,初始化一個struct構(gòu)造數(shù)據(jù),使用下面這樣的語法。struct sample inst_c99=.member_int=78,.member_str="iloveqhq",.member_fun=real_fun,;在C99標(biāo)準(zhǔn)出現(xiàn)之前,GCC定義了自己的擴(kuò)展,下面的例子就是按照這個GCC對C語言的擴(kuò)展,來初始化一個struct構(gòu)造數(shù)據(jù)。struct sample inst_gcc=m
35、ember_int:76,member_str:"zhaoway",member_fun:real_fun,;在GCC的源代碼中沒有使用上面的兩種方法,而是大量使用了宏定義。這個方法首先要申明一份輔助的宏定義。這些個輔助的宏定義,在一個軟件工程里面,針對一個struct構(gòu)造,只需要一份即可。#define MEMBER_INT 0#define MEMBER_STR""#define MEMBER_FUN NULL#define SAMPLE_INITIALIZERMEMBER_INT,MEMBER_STR,MEMBER_FUN,按照上面這樣的方法申明了
36、這些關(guān)于這個struct sample的輔助宏定義以后,在每次要初始化一個struct sample數(shù)據(jù)構(gòu)造的時候,只需要按照如下操作即可。除了要略微多打一些字以外,這個方法的方便程度和以上兩種方法是差不多的。#undef MEMBER_INT#define MEMBER_INT 12#undef MEMBER_STR#define MEMBER_STR"trtr"#undef MEMBER_FUN#define MEMBER_FUN real_fun struct sample inst_def=SAMPLE_INITIALIZER;這樣就也可以像C99標(biāo)準(zhǔn)或者GCC的擴(kuò)
37、展一樣,按照成員變量的名稱來初始化一個struct類型的數(shù)據(jù)構(gòu)造了。不過話又說回來,在我們一般的軟件工程中,還是應(yīng)該沿著C99標(biāo)準(zhǔn)這個C語言的開展方向來走的。:注釋完畢接下來的線路很清楚,就是一個一個的分析這些個回調(diào)函數(shù)啦。screen.width*0.7this.resized=true;this.width=screen.width*0.7;this.alt='Click here to open new windownCTRL+Mouse wheel to zoom in/out';"onmouseover="ifthis.width screen.w
38、idth*0.7this.resized=true;this.width=screen.width*0.7;this.style.cursor='hand';this.alt='Click here to open new windownCTRL+Mouse wheel to zoom in/out';"onclick="if!this.resizedreturn true;elsewindow.open'onmousewheel="return imgzoomthis;"alt=""/scre
39、en.width*0.7this.resized=true;this.width=screen.width*0.7;this.alt='Click here to open new windownCTRL+Mouse wheel to zoom in/out';"onmouseover="ifthis.width screen.width*0.7this.resized=true;this.width=screen.width*0.7;this.style.cursor='hand';this.alt='Click here to o
40、pen new windownCTRL+Mouse wheel to zoom in/out';"onclick="if!this.resizedreturn true;elsewindow.open'onmousewheel="return imgzoomthis;"alt=""/screen.width*0.7this.resized=true;this.width=screen.width*0.7;this.alt='Click here to open new windownCTRL+Mouse wheel to zoom in/out';"onmouseover="ifthis.width screen.width*0.7this.resized=true;this.width=screen.width*0.7;this.style
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《100 以內(nèi)的加法和減法(二)-不進(jìn)位加》(說課稿)-2024-2025學(xué)年二年級上冊數(shù)學(xué)人教版
- 13《人物描寫一組》第二課時《巧用多種方法寫“活”身邊人物》說課稿-2023-2024學(xué)年五年級語文下冊統(tǒng)編版
- Revision Being a good guest Period 2(說課稿)-2024-2025學(xué)年人教PEP版(2024)英語三年級上冊
- 2024秋九年級語文上冊 第五單元 18《懷疑與學(xué)問》說課稿 新人教版
- Unit5 What will you do this weekend?Lesson25(說課稿)-2023-2024學(xué)年人教精通版英語四年級下冊
- 5 國家機(jī)構(gòu)有哪些 第三課時 《國家機(jī)關(guān)的產(chǎn)生》 說課稿-2024-2025學(xué)年道德與法治六年級上冊統(tǒng)編版
- 《 關(guān)注新詞新語讓語言鮮活生動》說課稿 2024-2025學(xué)年統(tǒng)編版高中語文必修上冊
- 1~5的認(rèn)識和加減法《第幾》(說課稿)-2024-2025學(xué)年一年級上冊數(shù)學(xué)人教版
- Module 9 Unit 1 It's winter.(說課稿)-2024-2025學(xué)年外研版(一起)英語二年級上冊
- 1《水到哪里去了》說課稿-2023-2024學(xué)年科學(xué)五年級下冊冀人版
- 西安經(jīng)濟(jì)技術(shù)開發(fā)區(qū)管委會招聘筆試真題2024
- 2025屆浙江省高三歷史選考總復(fù)習(xí)模擬測試(八)歷史試題(含答案)
- 六年級2025寒假特色作業(yè)
- 2025年江蘇轄區(qū)農(nóng)村商業(yè)銀行招聘筆試參考題庫含答案解析
- 人教版六年級數(shù)學(xué)下冊完整版教案及反思
- 少兒財商教育講座課件
- (八省聯(lián)考)云南省2025年普通高校招生適應(yīng)性測試 物理試卷(含答案解析)
- 2025藥劑科工作人員工作計劃
- 春節(jié)節(jié)后安全教育培訓(xùn)
- 2025年新高考數(shù)學(xué)一輪復(fù)習(xí)第5章重難點突破02向量中的隱圓問題(五大題型)(學(xué)生版+解析)
- 水土保持方案投標(biāo)文件技術(shù)部分
評論
0/150
提交評論