




已閱讀5頁(yè),還剩62頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
(計(jì)算機(jī)應(yīng)用技術(shù)專業(yè)論文)嵌入式系統(tǒng)c編譯器移植中核心技術(shù)與歸約規(guī)則的研究.pdf.pdf 免費(fèi)下載
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
ab s t r a c t t h i s d i s s e r t a ti o n m a i n l y d i s c u s s e s i m p l e m e n t a t i o n o f a c r o s s c c o m p i l e r f o r a 1 6 b i t r i s c a n d h a r v a r d a r c h it e c t u r e m i c r o p r o c e s s o r . n o w a d a y s , t h e u s u a l m e a n s o f im p l e m e n t a t io n o f a c r o s s c o m p i l e r i s c r o s s - tr a n s p l a n t g c c c o m p i l e r , b u t s u c h m e t h o d i s a l s o in a d e q u a t e . t h e p a p e r b r ie fl y i n tr o d u c e s g c c a n d g c c tr a n s p l a n t , a n d p o i n t s o u t t h e l i m it a t i o n s a n d s h o rt c o m i n g s o f t h i s m e t h o d o f t r a n s p l a n t a t i o n , a n d p r e s e n t s a n e w m e t h o d f o r t h e r a p i d c r o s s c o m p i l e r d e v e lo p m e n t . l c c i s a r e t a r g e t a b l e o p e n - s o u r c e s m a l l c c o m p i l e . i t is a r ig h t m e t h o d t o i m p l e m e n t c r o s s c o m p i l e r b a s e d o n l c c . t h i s p a p e r f i r s t a n a l y s e s t h e a r c h it e c t u r e o f l c c , t h e n p r e s e n t s i m p l e m e n t a t i o n o f c r o s s c o m p i l e r tr a n s p l a n t a t i o n b a s e d o n l c c . t h i s p a p e r d i s c u s s e s k e y t e c h n o l o g y o f i m p l e m e n t in d e t a i l , w h i c h i n c l u d e s p r o v i d in g c c r o s s c o m p i l e r a b i a n d g iv i n g d a g r u l e s , a n d b a s e d o n p r a c t i c a l e x p e r i e n c e p u t s f o r w a r d g u i d e l i n e s f o r g i v i n g d a g r u l e s . k e y wo r d s : c r o s s c o m p l i e r a b i b a c k e n d d a g r u l e 南開大學(xué)學(xué)位論文版權(quán)使用授權(quán)書 木人完全了 解南開大學(xué)關(guān)于收集、保存、 使用學(xué)位論文的規(guī)定, 同意如下各項(xiàng)內(nèi)容:按照學(xué)校要求提交學(xué)位論文的印 刷本和電子版 本;學(xué)校有權(quán)保存學(xué)位論文的印刷本和電 子版,并采用影印、縮印、 掃描、 數(shù)字化或其它手段保存論文; 學(xué)校有權(quán)提供目 錄檢索以 及提供 本學(xué)位論文全文或者部分的閱覽服務(wù); 學(xué)校有權(quán)按有關(guān)規(guī)定向國(guó)家有 關(guān)部門或者機(jī)構(gòu)送交論文的復(fù)印件和電子版; 在不以贏利為日 的的前 提下,學(xué)校可以適當(dāng)復(fù)制論文的部分或全部?jī)?nèi) 容用于學(xué)術(shù)活動(dòng)。 學(xué) 位 論 文 作 者 簽 名 : c p l心 補(bǔ) 夕 年9 月; x 日 經(jīng)指導(dǎo)教師同意,本學(xué)位論文屬于保密, 在 本授權(quán)書。 年解密后適用 指導(dǎo)教師簽名:學(xué)位論文作者簽名: 解密時(shí)間: 年月日 各密級(jí)的最長(zhǎng)保密年限及書寫格式規(guī)定如下: 內(nèi)部5年 ( 最長(zhǎng) 5 年,可少于 5 年) 秘密*1 0 年 ( 最長(zhǎng) 1 0 年,可少于 1 0 年、 機(jī)密*2 0 年 ( 最 長(zhǎng)2 0 年,可少于 2 0 年) 南開大學(xué)學(xué)位論文原創(chuàng)性聲明 本人鄭重聲明: 所呈交的學(xué)位論文,是本人在導(dǎo)師指導(dǎo)下,進(jìn)行 研究工作所取得的成果。 除文中己經(jīng)注明引用的內(nèi)容外, 本學(xué)位論文 的研究成果不包含任何他人創(chuàng)作的、 己公開發(fā)表或者沒有公開發(fā)表的 作品的內(nèi)容。對(duì)本論文所涉及的研究工作做出貢獻(xiàn)的其他個(gè)人和集 體, 均己在文中以明確方式標(biāo)明。 本學(xué)位論文原創(chuàng)性聲明的法律責(zé)任 由本人承擔(dān)。 學(xué) 位 論 文 作 者 簽 名 : 改 、 磚 - .呵 年s 月 含 日 第一 章 緒論 第一章 緒論 第一節(jié) 嵌入式系統(tǒng)簡(jiǎn)介 嵌入式系統(tǒng)是以 應(yīng)用為中心,以計(jì)算機(jī)技術(shù)為基礎(chǔ),并且軟硬件可裁剪, 適用于對(duì)功能、可靠性、成本、體積、功耗有嚴(yán)格要求的實(shí)際應(yīng)用的專用計(jì)算 機(jī)系統(tǒng)。它一般由嵌入式微處理器、外圍硬件設(shè)備、嵌入式操作系統(tǒng)以及用戶 的應(yīng)用程序等四個(gè)部分組成,用于實(shí)現(xiàn)對(duì)其他設(shè)備的控制、監(jiān)視或管理等功 能。 嵌入式系統(tǒng)同 通用型計(jì)算機(jī)系統(tǒng)相比具有以 下特點(diǎn): 1 .嵌入式系統(tǒng)通常是面向 特定應(yīng)用的。 嵌入式c p u 與通用型c p u 有很大的 不同,它通常都具有低功耗、體積小、集成度高等特點(diǎn),能夠把通用 c p u中許多由板卡完成的任務(wù)集成在芯片內(nèi)部,從而有利于嵌入式系統(tǒng) 設(shè)計(jì)趨于小型化,移動(dòng)能力大大增強(qiáng),與網(wǎng)絡(luò)的禍合也更緊密。 2 .嵌入式系統(tǒng)必須量體裁衣、 去除冗余, 力爭(zhēng)在同樣的硅片面積上實(shí)現(xiàn)更 高的性能,這樣才能在具體應(yīng)用中對(duì)處理器的選擇更具有競(jìng)爭(zhēng)力。 3 .嵌入式系統(tǒng)和具體應(yīng)用有機(jī)地結(jié)合在一起, 它的升級(jí)換代也是和具體產(chǎn) 品同步進(jìn)行, 因此嵌入式系統(tǒng)產(chǎn)品一旦進(jìn)入市場(chǎng), 具有較長(zhǎng)的生命周期 4 .為了提高 執(zhí)行速度和系統(tǒng)可靠性, 嵌入式系統(tǒng)中的軟件一般都固化在存 儲(chǔ)器芯片或單片機(jī)本身中,而不是存貯于磁盤等載體中。 5 .嵌入式系統(tǒng)本身通常不具備開發(fā)能力。 用戶通常是不能直接對(duì)嵌入式系 統(tǒng)中運(yùn)行的程序功能進(jìn)行修改的, 必須有一套開發(fā)工具和環(huán)境才能進(jìn)行 開發(fā)。 由于上述特點(diǎn), 嵌入式系統(tǒng)中的軟件開發(fā)一般采用主從模式。 嵌入式微處理 器所在的 機(jī) 器稱為目 標(biāo) 機(jī) ( t a r g e t ) , 而 進(jìn)行 程序 開 發(fā)的 機(jī) 器稱 為 宿主 機(jī) ( h o s t ) . 通常目 標(biāo)機(jī)的處理器功能和存儲(chǔ)容量都十分有限,其主要任務(wù)只是運(yùn)行嵌入式 系統(tǒng)程序而不包括針對(duì)本系統(tǒng)的軟件開發(fā)工具;宿主機(jī)通常構(gòu)建在功能強(qiáng)大的 通用機(jī)環(huán)境中,完成代碼的編輯、編譯、匯編、鏈接和地址分段等開發(fā)工作。 同時(shí)由于嵌入式系統(tǒng)自 身具備的這些特點(diǎn)使得它必然種類繁多,而針對(duì)一款專 用的系統(tǒng)都需要在宿主機(jī)上建立良好的軟件工具鏈和開發(fā)環(huán)境,使得宿主機(jī)上 第 章 緒論 針對(duì)專用嵌入式系統(tǒng)的軟件工具鏈和開發(fā)環(huán)境的開發(fā)工作變的非常急迫而且重 要。 第二節(jié) 嵌入式系統(tǒng)平臺(tái)及軟件工具鏈簡(jiǎn)介 在嵌入式系統(tǒng)軟件開發(fā)中,使用高級(jí)語言進(jìn)行程序開發(fā)是一種發(fā)展趨勢(shì)。由 高級(jí)語言源文件變?yōu)樽罱K的可執(zhí)行文件需要經(jīng)過編譯、匯編和鏈接三個(gè)過程。 編譯器將用高級(jí)語言編寫的程序文件編譯生成特定的匯編文件,匯編器將匯編 文件轉(zhuǎn)換為某種格式的目 標(biāo)文件,由于一個(gè)程序的目 標(biāo)文件可能有多個(gè),所以 還需要鏈接器將它們鏈接在一起, 形成最終的可執(zhí)行文件。 這個(gè)過程如圖1 . 1 所 不 . 圖1 . 1編譯、匯編與鏈接過程 由于編譯器、 匯編器和鏈接器在宿主機(jī)上工作, 但生成的卻是目 標(biāo)機(jī)上的可 執(zhí)行代碼, 這種編譯器、匯編器和鏈接器被稱為交叉編譯器、交叉匯編器和交 叉鏈接器。 嵌入式開發(fā)過程中另一個(gè)重要的步驟是調(diào)試編寫好嵌入式應(yīng)用程序。 調(diào)試時(shí) 第一章 緒論 需要將編譯鏈接好的應(yīng)用程序裝載到在宿主機(jī)上運(yùn)行的虛擬機(jī)中。虛擬機(jī)模擬 目 標(biāo)機(jī)運(yùn)行并且根據(jù)程序運(yùn)行提供調(diào)試信息,便于程序員快速便捷的開發(fā)嵌入 式軟件。 由此可見, 交叉編譯器、 匯編器、 鏈接器和虛擬機(jī)構(gòu)成了嵌入式系統(tǒng)的開發(fā) 工具鏈.由于它們都是單獨(dú)的程序,必須以 命令行方式運(yùn)行,不是很方便,于 是又需要提供帶有圖形界面的集成開發(fā)環(huán)境 ( i n t e g r a t e d d e v e l o p m e n t e n v i r o n m e n t 簡(jiǎn)稱i d e ) 。 在 i d e中用戶只需點(diǎn) 擊工具欄上的按鈕就可以 完成編 譯、鏈接等過程, 源代碼級(jí)調(diào)試也用可視化方式進(jìn)行。編譯器、匯編器、鏈接 器、虛擬機(jī)等系統(tǒng)程序完成實(shí)質(zhì)工作,而i d e則提供用戶友好的圖形界面。二 者的配合大大提高了程序開發(fā)的效率。 目 前我們針對(duì)一款自 行設(shè)計(jì)的1 6 位r i s c 微處理器己 經(jīng)基本完成了 上述系統(tǒng) 程序的開發(fā)。他們的基本結(jié)構(gòu)如圖1 .2 所示。 i d e集成開發(fā)環(huán)境 虛擬機(jī)鏈接器 匯編器編譯器 圖1 .2嵌入式軟件開發(fā)平臺(tái) 第三節(jié) 本文研究的主要內(nèi) 容 本文的研究課題為:針對(duì)一款自 行研制的1 6 位r i s c體系結(jié)構(gòu)的微處理器 設(shè)計(jì)實(shí)現(xiàn)相應(yīng)的交叉c編譯器。交叉c編譯器就是運(yùn)行在宿主機(jī)上,為目 標(biāo)機(jī) 編譯生成目 標(biāo)代碼的 編譯程序。本文主要討論設(shè)計(jì)實(shí)現(xiàn)交叉 c編譯器中的核心 技術(shù)。 在嵌入式系統(tǒng)的軟件開發(fā)平臺(tái)中,交叉編譯器是工具鏈中的一個(gè)重要的環(huán) 節(jié),它對(duì)嵌入式系統(tǒng)開發(fā)具有重要意義。嵌入式系統(tǒng)的編程語言通常有匯編語 言,但是匯編語言編寫煩瑣、閱讀困難、代碼嚴(yán)格依賴于特定機(jī)器,束縛了嵌 入式系統(tǒng)的應(yīng)用與開發(fā),這就需要交叉編譯器的支持,它能夠大大提高開發(fā)速 第一章 緒論 度降低維護(hù)成本。 嵌入式系統(tǒng)發(fā)展日新月異,快速開發(fā)交叉編譯器對(duì)于嵌入式系統(tǒng)就至關(guān)重 要。重新設(shè)計(jì)開發(fā)一款編譯器往往要耗費(fèi)數(shù)年時(shí)間,因此移植現(xiàn)有的編譯器就 不失為一個(gè)快速有效的方法。由于現(xiàn)有的大多數(shù)嵌入式的軟件都是由c語言編 寫的,大多數(shù)嵌入式系統(tǒng)開發(fā)人員習(xí)慣使用的高級(jí)語言也是 c語言,所以許多 嵌入式系統(tǒng)都是通過移植現(xiàn)有的 c編譯器來實(shí)現(xiàn)自己的交叉編譯器。 我們也是 通過移植現(xiàn)有的c編譯器來實(shí)現(xiàn)目 標(biāo)機(jī)的交叉編譯器的。本文將對(duì)嵌入式系統(tǒng) 交叉c編譯器的移植技術(shù)進(jìn)行探討。 本文首先對(duì)通過移植 g c c l2 j 來實(shí)現(xiàn)交叉 c編譯器進(jìn)行了研究和探討。g c c 是目 前一款優(yōu)秀的開源編譯器,它的開發(fā)人員做了大量的工作使其移植變得簡(jiǎn) 單且高度抽象化。 文中簡(jiǎn)要的分析了g c c的結(jié)構(gòu)和移植方法,總結(jié)了通過移植 g c c實(shí)現(xiàn)交叉c編譯器的優(yōu)點(diǎn)和缺點(diǎn)。由于g c c移植的高度抽象化使得對(duì)其 移植缺少靈活性和可伸縮性,特別是對(duì)于新設(shè)計(jì)的、有獨(dú)特設(shè)計(jì)的和自 主設(shè)計(jì) 的嵌入式系統(tǒng)尤其如此,鑒于此我們并沒有選擇移植g c c . 本文簡(jiǎn)要分 析了l c c i l 代碼, 詳細(xì) 討論了 通過移植l c c 實(shí)現(xiàn)c 編譯器. l c c 也是一款優(yōu)秀的開源編譯器。 文中分析了l c c的前后端的接口 數(shù)據(jù)結(jié)構(gòu)和函數(shù), 簡(jiǎn)要描述了l c c的編譯過程。文中詳細(xì)討論了針對(duì)我們的目 標(biāo)機(jī)設(shè)計(jì)和實(shí)現(xiàn)交 叉c編譯器過程中的關(guān)鍵技術(shù)。 本文最后給出了 通過移植l c c實(shí)現(xiàn)交叉c編譯 器的實(shí)踐結(jié)果和經(jīng)驗(yàn)終結(jié)。 第四節(jié) 本文的結(jié)構(gòu) 本文通過以 下幾個(gè)部分討論針對(duì)一款1 6 為r i s c的微處理器的交叉c編譯 器的設(shè)計(jì)與實(shí)現(xiàn): 第二章簡(jiǎn)單介紹了 編譯系統(tǒng)的基本概念原理和基本結(jié)構(gòu),交叉編譯系統(tǒng)的 概念。 第三章簡(jiǎn)要分析 g c c的移植技術(shù)和優(yōu)缺點(diǎn)。詳細(xì)介紹 l c c的結(jié)構(gòu)和移植 手段。 第四章介紹具體移植的工作。主要討論交叉 c編譯器的設(shè)計(jì),以 及移植過 程中的關(guān)鍵技術(shù),包括函數(shù)棧幀的實(shí)現(xiàn)和歸約規(guī)則的制定,最后討論了移植的 交叉c編譯器的測(cè)試。 第五章總結(jié)了 我們的移植工作, 介紹移植的交叉 c編譯器還存在的問題, 提出了一些改進(jìn)方法。 第_ 二 章 編譯的基本概念 第二章 編譯程序的基本概念 在計(jì)算機(jī)上執(zhí)行高級(jí)語言程序一般要分為兩步:第一步,用一個(gè)編譯程序 把高級(jí)語言編譯成機(jī)器語言 ;第二步, 運(yùn)行所得的機(jī)器語言程序求得計(jì)算結(jié)果。 通常將源語言如f o r t r a n , p a s c a l , c這樣的高級(jí)語言轉(zhuǎn)換成邏輯上等價(jià)的諸 如匯編或機(jī)器語言的 程序就被稱為編譯程序4 1 根據(jù)不同用途和側(cè)重,編譯程序還可以 進(jìn)一步分類。專門用于幫助程序開 發(fā) 和 調(diào) 試的 編 譯 程 序 被稱 為 診 斷 編 譯 程 序( d ia g n o s t i c c o m p i le r ) 17 1著重 于 提 高目 標(biāo) 代碼效率的 編譯程序叫 優(yōu)化編譯 程序 ( o p t i m i z i n g c o m p i l e r ) .目 前很多 編譯程序同時(shí)提供了調(diào)試、優(yōu)化等多種功能,用戶可以通過一些 “ 開關(guān)”進(jìn)行 選擇。運(yùn)行編譯程序的計(jì)算機(jī)被稱為宿主機(jī),運(yùn)行編譯程序所生成的應(yīng)用程序 的計(jì)算機(jī)系統(tǒng)叫目 標(biāo)機(jī)。如果一個(gè)編譯程序產(chǎn)生不同于宿主機(jī)的機(jī)器代碼,則 稱之為 交叉編 譯 器( c r o s s c o m p i l e r ) , 本文 主 要討論的即為 此類編譯器。 如果不 需要重新編寫編譯程序中與機(jī)器無關(guān)的部分就能改變目 標(biāo)機(jī),則稱該編譯程序 為 可變目 標(biāo)編 譯 程序 ( r e t a r g e t a b l e c o m p i l e r ) . 本文 提到的g c c , l c c都屬于 此類。 第一節(jié) 編譯過程簡(jiǎn)介 編譯過程是一個(gè)復(fù)雜的 過程,編譯程序也是一個(gè)復(fù)雜的程序。 在翻譯過程 中,一般可以劃分為五個(gè)階段:詞法分析、語法分析、語義分析與中間代碼產(chǎn) 生及優(yōu)化、目 標(biāo)代碼產(chǎn)生4 1 第一階段,詞法分析。詞法分析的任務(wù)是:輸入源程序,對(duì)組成源程序的 字符串進(jìn)行掃描和分解,識(shí)別出其中的單詞 ( 亦稱單詞符號(hào)或簡(jiǎn)稱符號(hào)) ,如基 本字 ( if , e l s e , f o r , w h i l e 等) ,標(biāo)識(shí)符、常數(shù)、算符和界符 ( 標(biāo)點(diǎn)符號(hào)、左右 符號(hào)等等) 。單詞符號(hào)是語言的基礎(chǔ)組成部分,是理解和編寫程序的基本要素。 在詞法分析階段,依循語言的詞法規(guī)則識(shí)別出各種字符串。描述詞法規(guī)則的有 效工具是正規(guī)式和有限自 動(dòng)機(jī)。 第二階段,語法分析。語法分析的任務(wù)是:在詞法分析的基礎(chǔ)上,根據(jù)語 言的語法規(guī)則, 把單詞符號(hào)串 構(gòu)成各類語法單位, 如“ 短句” 、 “ 子句” 、 “ 句子氣 “ 程序段” 和 “ 程序”等。通過語法分析,確定整個(gè)輸入串是否構(gòu)成語法上正 確的“ 程序” 。語法分析所依循的是語言的語法規(guī)則。語法規(guī)則通常用上下文無 關(guān)文法描述。詞法分析是一種線性分析,而語法分析是一種層次結(jié)構(gòu)分析。 第三階段,語義分析與中間代碼產(chǎn)生。這一階段的任務(wù)是:對(duì)語法分析所 第章 編譯的基本概念 識(shí)別出的各類語法范疇,分析其含義,并進(jìn)行初步翻譯 ( 產(chǎn)生中間代碼) 。這一 階段通常包括兩個(gè)方面的工作。首先,對(duì)每種語法范疇進(jìn)行靜態(tài)語義檢查,例 如,變量是否定義、類型是否正確等等。如果語義正確,則進(jìn)行另一方面工作, 即進(jìn)行中間代碼的翻譯。這一階段所依循的是語言的語義規(guī)則。通常使用屬性 文法描述語義規(guī)則。 “ 翻譯”僅僅在這里才開始涉及到。所謂 “ 中間代碼”是一 種含義明確、便于處理的記號(hào)系統(tǒng),它通常獨(dú)立于具體的硬件。這種記號(hào)系統(tǒng) 或者與現(xiàn)代計(jì)算機(jī)指令形式有某種程度的接近,或者能夠比 較容易地變換成現(xiàn) 代計(jì)算機(jī)的機(jī)器指令。一般而言,中間代碼是一種獨(dú)立于硬件的記號(hào)系統(tǒng)。 第四階段, 優(yōu)化。優(yōu)化的 任務(wù)是在對(duì)于前面產(chǎn)生的中間代碼進(jìn)行加工變換, 以期在最后階段產(chǎn)生更為高效 ( 節(jié)省時(shí)間和空間)的目 標(biāo)代碼。優(yōu)化的主要方 面有:公共子表達(dá)式的提取、 循環(huán)優(yōu)化、刪除無用代碼等等。在目 前的編譯技 術(shù)中, 優(yōu)化己 經(jīng)成為一個(gè)重要的課題,是編譯器優(yōu)劣的重要指標(biāo)。大量?jī)?yōu)秀的 優(yōu)化技術(shù)己經(jīng)在很多商用編譯器中運(yùn)用。 第五階段,目 標(biāo)代碼生成。這一階段的任務(wù)是:把中間 代碼 ( 或經(jīng)優(yōu)化處 理后) 變換成特定機(jī)器上的低級(jí)語言代碼。這階段實(shí)現(xiàn)了最后的翻譯,它的工 作有賴于硬件系統(tǒng)結(jié)構(gòu)和機(jī)器指令含義。這階段工作非常復(fù)雜,涉及到硬件系 統(tǒng)功能部件的運(yùn)用,機(jī)器指令的選擇,各種數(shù)據(jù)類型變量的存儲(chǔ)空間分配,以 及寄存器和后備寄存器的調(diào)度, 等等。如何產(chǎn)生出足以充分發(fā)揮硬件效率的目 標(biāo)代碼是一件不容易的事情。 目 標(biāo)代碼的形式可以是絕對(duì)指令代碼或可重定位的指令代碼或匯編指令代 碼。如果目 標(biāo)代碼是絕對(duì)指令代碼,則這種目 標(biāo)代碼可以立即執(zhí)行。如果目 標(biāo) 代碼是匯編指令代碼,則需匯編器匯編之后才能運(yùn)行。必須指出,現(xiàn)代多數(shù)實(shí) 用編譯程序所產(chǎn)生的目 標(biāo)代碼都是一種可重定位的指令代碼。這種目 標(biāo)代碼在 運(yùn)行前必須借助一個(gè)鏈接裝配程序把各個(gè)目標(biāo)模塊 ( 包括系統(tǒng)提供的庫(kù)模板) 鏈接在一起,確定程序變量 ( 或常數(shù)) 在主存中的位置, 裝入內(nèi) 存中 指定的起 始地址, 使之成為一個(gè)可以 運(yùn) 行的 絕對(duì)指令代碼程序4 1 第二節(jié) 編譯器的結(jié)構(gòu) 編譯過程的五個(gè)階段是一種典型的分法。編譯程序的結(jié)構(gòu)可以 按照這五階 段的任務(wù)分模塊進(jìn)行設(shè)計(jì)。圖2 . 1 給出了編譯程序典型的總體框架。 第_章 編譯的基本概念 圖2 . 1編譯器系統(tǒng)處理流程 如圖2 . 1 所示, 在編譯器中除了完成上述五個(gè)階段任務(wù)的五大模塊之外還有 表格管理和錯(cuò)誤處理兩大模塊。 編譯程序在工作過程中需要保持一系列的表格,以登記源程序的各類信息 和編譯各階段的進(jìn)展?fàn)顩r。合理地設(shè)計(jì)和使用表格是編譯程序構(gòu)造的一個(gè)重要 問 題。 在編譯器的各種表格中, 最重要的是符號(hào)表。 它用來登記源程序中出現(xiàn) 的每個(gè)名字以及名字的各個(gè)屬性。編譯過程中,當(dāng)掃描識(shí)別出一個(gè)名字后,把 該名字添加到符號(hào)表中。但這時(shí)不能完全確定名字的屬性,它的各種屬性要在 后續(xù)階段才能填入,編譯的各個(gè)階段都要涉及到構(gòu)造、查找或更新有關(guān)的表格。 編譯器不僅應(yīng)能對(duì)書寫正確的程序進(jìn)行翻譯,而且應(yīng)能對(duì)出現(xiàn)在源程序中 的錯(cuò)誤進(jìn)行處理。如果源程序有錯(cuò)誤,編譯器應(yīng)能發(fā)現(xiàn)并且把有關(guān)錯(cuò)誤信息報(bào) 告給用戶。這部分工作就是由 錯(cuò)誤處理模塊來完成。編譯過程的每個(gè)階段都可 能檢測(cè)出錯(cuò)誤。其中,絕大多數(shù)錯(cuò)誤可以在編譯的前三階段檢測(cè)出來。源程序 中的錯(cuò)誤通常分為語法錯(cuò)誤和語義錯(cuò)誤兩大類。語法錯(cuò)誤是指源程序中不符合 語法或詞法規(guī)則的錯(cuò)誤,它們可以在詞法分析和語法分析中檢測(cè)出來。語義錯(cuò) 誤是指程序中不符合語義規(guī)則的錯(cuò)誤。這些錯(cuò)誤在語義分析中檢測(cè)出來,但有 些語義錯(cuò)誤要在運(yùn)行時(shí)才能檢測(cè)出來。 在概念上,我們往往把編譯程序又劃分為編譯前端和編譯后端。前端主要 由與源語言有關(guān)但與目標(biāo)機(jī)無關(guān)的那些部分組成。這些部分包括詞法分析、語 第二章 編譯的基本概念 法分析、語義分析與中間代碼生成,有時(shí)代碼優(yōu)化工作也有一部分在前端進(jìn)行。 后端包括編譯程序中與目 標(biāo)機(jī)有關(guān)的那些部分, 如與目 標(biāo)機(jī)相關(guān)的代碼優(yōu)化部 分已及目標(biāo)代碼生成等。 通常來說,前端可以 被認(rèn)為是只依賴于源語言。各種不同編譯器的這部分 的功能都類似。由于前端可以根據(jù)一些自動(dòng)機(jī)和文法來確定,目前已經(jīng)有一些 成熟前端自動(dòng)生成工具,如l e x , y a c c等。正是由于前端具有相對(duì)的獨(dú)立性, 許多編譯器可以針對(duì)不同的高級(jí)語言由不同的模塊進(jìn)行處理,生成相同的中間 代碼。比 如g c c的前 端就 可以 接收c , c + + , j a v a 等多 種高 級(jí)語言。 前端將接 收到的各種源語言的程序處理之后生成相同格式的中間代碼,然后交由后端生 成相應(yīng)的匯編代碼。針對(duì)不同高級(jí)語言前端的處理程序是不同的,但用戶感覺 不到這一點(diǎn)。 后端和前端相比, 更多的依賴于目 標(biāo)機(jī)的體系結(jié)構(gòu)和指令集特性。根據(jù)前 端傳來的中間代碼,不同的后端會(huì)生成不同的目 標(biāo)代碼。當(dāng)然與前端類似,一 個(gè)編譯器也可以擁有多個(gè)后端。用戶在使用編譯器時(shí)設(shè)置一些編譯選項(xiàng)即可挑 選自己所需的后端來生成相應(yīng)的目 標(biāo)機(jī)代碼。如果選擇的后端與宿主機(jī)的后端 不同, 那么這就是了 我們通常所說的交叉編譯器 ( c r o s s c o m p i l e r ) 。 如果編譯器 設(shè)計(jì)的非常好,代碼抽象程度非常高,不需要重新編寫編譯器中與機(jī)器無關(guān)的 部 分就能 實(shí) 現(xiàn)新的目 標(biāo) 機(jī) 后 端, 則 稱該 編譯 器為 可 變目 標(biāo) 編 譯 器 7 l ( r e t a r g e t a b l e c o m p i l e r ) 。前、后端之間 進(jìn)行溝通的 橋梁就是中間 語言。圖2 .2展示了典型編 譯器前端、后端和中間語言的關(guān)系。 第二章 編譯的基本概念 翌 臀 其他 源 語 言 前 端 c+十 語 言 的前端 c語 言 的 前 端 x8 6 的 后 端 其他 目標(biāo) 機(jī) 的后端 h 幻 ps 的 后 端 圖2 .2典型的編譯器前端、后端和中 間語言的關(guān)系 所謂中間語言,不同的 編譯器大多都會(huì)根據(jù)本編譯器的特點(diǎn)設(shè)計(jì)一套自己 的中間語言標(biāo)準(zhǔn)。前端對(duì)源程序分析的結(jié)果按照標(biāo)準(zhǔn)生成相應(yīng)的中間語言,然 后傳遞給后端。制定中間語言的標(biāo)準(zhǔn)是一件非常困難的事情,因?yàn)橐粋€(gè)優(yōu)秀的 中間語言需要表達(dá)多種前端能夠表達(dá)的語義, 還要便于各種后端理解語義然后 翻譯成目標(biāo)語言,同時(shí),它還需要附加許多額外的信息便于各種優(yōu)化算法的優(yōu) 化??梢哉f在一個(gè)編譯器的實(shí)現(xiàn)過程中,設(shè)計(jì)一個(gè)優(yōu)秀的中間語言至關(guān)重要, 它直接影響到編譯器的復(fù)雜程度和編譯效率。g c c在中間語言的制定上做的非 常優(yōu)秀,它的中間語言為一種名叫寄存器傳遞語言一r t l的語言,該中間語言 能夠表達(dá)十幾種前端語言,同時(shí)能夠提供目 前幾乎所有優(yōu)化技術(shù)所需的附加信 息, 還做到了后端的高度抽象化, 做到了可重定向 ( r e t a r g e t a b l e ) ,但是 g c c 也為此在代碼量和結(jié)構(gòu)復(fù)雜性上付出了巨大的代價(jià)。 在編譯過程中,優(yōu)化的問題比較復(fù)雜。有些優(yōu)化在前端即完成了,例如循 環(huán)優(yōu)化等等,因此被認(rèn)為是前端優(yōu)化。這些優(yōu)化大多是對(duì)詞法語法分析產(chǎn)生的 結(jié)果進(jìn)行的,目前這類優(yōu)化算法非常成熟,基本上所有的編譯器前端都支持。 另一些優(yōu)化是和目 標(biāo)機(jī)相關(guān)的,它必須在后端進(jìn)行,被認(rèn)為是后端優(yōu)化。后端 優(yōu)化通常與目標(biāo)機(jī)的體系結(jié)構(gòu)和指令集特點(diǎn)緊密相關(guān),如寄存器的調(diào)度、特殊 指令的選取等等。還有一些優(yōu)化是根據(jù)語義進(jìn)行的優(yōu)化,通常是生成中間代碼 后,使用相應(yīng)的優(yōu)化算法根據(jù)中間代碼提供的額外信息進(jìn)行的優(yōu)化,這類不能 一t 0- 第二 章 編譯的基本概念 簡(jiǎn)單的歸于前端或后端,這類優(yōu)化不是所有編譯器都能夠提供的,必須有中間 代碼的支持才可。圖2 .3 說明了典型編譯器中的代碼優(yōu)化。 圖2 .3典型的代碼優(yōu)化 前文中 提到的 代碼優(yōu)化器其實(shí)是指對(duì)中間代碼的 優(yōu)化模塊,它還不足以概 括編譯器中所有的優(yōu)化內(nèi)容。 第三節(jié) 典型的c編譯器簡(jiǎn)介 前面簡(jiǎn)要介紹了編譯器原理及其基本構(gòu)造,下面將簡(jiǎn)要介紹目 前幾款常用 的c編譯器及其采用的 技術(shù)。 2 .3 . 1 g c c簡(jiǎn)介e3 g c c 2 1 是 美國(guó)自 由 軟 件基金會(huì) 任 r e e s o ft w a r e f o u n d a t i o n ) 開發(fā)的編譯系統(tǒng), 由 于 表現(xiàn)優(yōu)良 而倍 受程序 設(shè)計(jì)人員 們推崇。 g c c 表示g n u c o m p i l e r c o l l e c ti o n . 它包含一系列編譯器, 這些編譯器針對(duì)不同語言和不同目 標(biāo)平臺(tái),因此g c c向 上可接收多種語言, 向 下可支持多種平臺(tái), 它所接收的 語言有c . c + + , o b j e c t iv e - c 和f o r t r a n等。 g c c系統(tǒng)用c 語言實(shí)現(xiàn), 高度的 優(yōu)化和可移植性是該編譯系 第二章 編譯的基本概念 統(tǒng)最為突出的兩大特點(diǎn),也是技術(shù)上的最為成功和精彩的地方。由于程序設(shè)計(jì) 人員可以彼此共享g n u有關(guān)軟件和技術(shù), 使得g n l 軟件都較同級(jí)的商業(yè)軟件 產(chǎn)品更為穩(wěn)定可靠、性能指標(biāo)更高,而且發(fā)展極為迅速,每一個(gè)季度就有一個(gè) 功能更強(qiáng)、品質(zhì)更優(yōu)的新版本推出。因此g n u軟件具有很強(qiáng)的生命力,隨著人 們對(duì)其價(jià)值認(rèn)識(shí)的提高,用戶也迅速地?cái)U(kuò)大。由 于優(yōu)化和可移植性是衡量現(xiàn)代 編譯系統(tǒng)的主要標(biāo)準(zhǔn), g c c當(dāng)之無愧是當(dāng)前最優(yōu)秀的編譯器之一。目 前g c c的 最新穩(wěn)定版本號(hào)是4 . 1 1 . 由于g c c能夠交叉編譯c程序, 以 及它在代碼優(yōu)化方面的杰出表現(xiàn)和高度 的可移植性,g c c成為了 我們移植c編譯器的重要選擇,下文中將會(huì)對(duì)它進(jìn)一 步分析。 2 3 . 2 l c c簡(jiǎn)介 l c c 1 1 是一 個(gè)可重定向 的a n s i c 編譯器, 最初由p r in c e t o n 大學(xué)兩位老師開 發(fā),僅定位于針對(duì)c語言的一個(gè)子集的編譯器, 作為編譯原理的教學(xué)、學(xué)習(xí)使 用,后來演化成了 適于實(shí)用的a n s i c編譯器,由 于其不凡的性能,開始推廣, 成為一個(gè)比較流行的c編譯器。 l c c比大多數(shù)其它a n s i c編譯器更小、 更快。 l c c 以產(chǎn)生好的 本地代碼為設(shè)計(jì)目 標(biāo),能夠生成相當(dāng)高效的目 標(biāo)代碼,但其它 編譯器所具有的全局優(yōu)化并不在l c c的設(shè)計(jì)目 標(biāo)之中。 作為可重定向的編譯器, l c c做到了 可以 根據(jù)目 標(biāo)機(jī)器的約定產(chǎn)生調(diào)用代 碼序列,為了實(shí)現(xiàn)這一點(diǎn), l c c也將程序分為與目 標(biāo)無關(guān)的前端及與目 標(biāo)相關(guān) 的后端,前端與后端通過共享數(shù)據(jù)及接口 進(jìn)行信息交互,但是由于l c c的代碼 只有將近兩萬行, l c c不可能如 g c c那樣做到如此高度的抽象化。但是正是 l c c的代碼量相對(duì)較少并且結(jié)構(gòu)相對(duì)簡(jiǎn)單使它也成為了我們編譯器移植工作的 重要選擇,下文中將會(huì)詳細(xì)分析l c c的結(jié)構(gòu)和移植技術(shù)。 2 3 . 3 t u r b o c簡(jiǎn)介 t u r b o c是美國(guó)b o r l a n d 公司的產(chǎn)品, b o r l a n d 公司是一家專門從事軟件開發(fā)、 研制的公司。 該公司在1 9 8 7 年首次推出t u r b o c 1 .0 產(chǎn)品, 其中使用了集成開發(fā) 環(huán)境,即使用了一系列下拉式菜單,將文本編輯、程序編譯、連接以及程序運(yùn) 行一體化,大大方便了 程序的開發(fā)。1 9 8 8 年, b o r l a n d公司又推出t u r b o c 1 .5 版本, 增加了圖形庫(kù)和文本窗口函數(shù)庫(kù)等, 而t u r b o c 2 .0 則是該公司1 9 8 9 年出 第 乙 章 編譯的基本概念 版的。 t u r b o c 2 . 0 在原 來集成 開發(fā)環(huán)境的 基礎(chǔ)上 增加了 查 錯(cuò)功能, 并 可以 在t 吻 模式下直接生成.c o m ( 數(shù)據(jù)、代碼、堆棧處在同一 6 4 k 內(nèi)存中)文件。還可 對(duì)數(shù)學(xué)協(xié)處理器 ( 支持8 0 8 7 / 8 0 2 8 7 / 8 0 3 8 7 等) 進(jìn)行仿真。 t u r b o c系列c編譯器也得到了廣泛的應(yīng)用, 而且由于它是商業(yè)軟件, 其配 套的庫(kù)文件非常的齊全,集成開發(fā)環(huán)境也很優(yōu)秀,但同樣因?yàn)樗巧虡I(yè)軟件, 我們不能通過修改它的源代碼來移植 c編譯器。在此對(duì)其就不進(jìn)行進(jìn)一步介紹 了。 我們初步分析了 現(xiàn)在幾款常用的c編譯器,由于g c c和l c c的開源代碼 和優(yōu)秀的性能,最后我們認(rèn)為這兩款編譯器將是我們移植工作主要的借鑒對(duì)象。 第三章 g c c與l c c的分析 第三章 g c c與l c c編譯技術(shù)分析 如前一章所述,編譯器是非常復(fù)雜的系統(tǒng)軟件,編寫者很容易陷入錯(cuò)誤和 誤區(qū)之中??紤]到編寫編譯器所花費(fèi)的人力物力巨大,而移植一個(gè)開源代碼編 譯器可以使得開發(fā)的工作量大大減少,同時(shí)由于開源代碼編譯器經(jīng)過互聯(lián)網(wǎng)上 用戶的廣泛使用和測(cè)試,還可以相當(dāng)程度上地減少編譯器隱含的錯(cuò)誤。所以我 們選擇了通過移植一個(gè)開源代碼編譯器來實(shí)現(xiàn)我們的交叉 c編譯器。g c c和 l c c是兩款優(yōu)秀的開源代碼編譯器。為了實(shí)現(xiàn)我們的交叉c編譯器,我們對(duì)它 們的整體結(jié)構(gòu)和移植技術(shù)進(jìn)行了比較系統(tǒng)的分析。 第一節(jié) g c c編譯技術(shù)分析 3 . 1 . 1 g c c的結(jié)構(gòu) g c c 12 1 作為 一個(gè) 可重定向 的編譯器( r e t a r g e t a b l e c o m p i l e r ) ,實(shí)際 上是一 個(gè) 編譯器快速開發(fā)平臺(tái)。它不僅包括了 編譯器的前端,和一些標(biāo)準(zhǔn)的后端。而且 對(duì)于一種新型體系結(jié)構(gòu)的特定指令系統(tǒng)和硬件資源,它提供給設(shè)計(jì)人員一個(gè)配 置接口,使他們能夠方便地定義和描述這種機(jī)器地體系結(jié)構(gòu),并根據(jù)這種描述 自 動(dòng)生成面向該機(jī)器體系結(jié)構(gòu)的編譯器后端,包括代碼生成器和優(yōu)化器。 g c c的與其他編譯器類似,前端 ( fr o n t e n d )包括:詞法分析和語法分析、 創(chuàng)建符號(hào)表、語義分析,生成中間代碼。同時(shí)前端也進(jìn)行一部分代碼優(yōu)化 ( 高 層優(yōu)化) ,和出 錯(cuò)處理。前端主要依賴于源語言,與目 標(biāo)機(jī)體系結(jié)構(gòu)無關(guān)。 通過 分析我們了解到, 在g c c中不僅有a n s i c的前端還包括其他十幾種高級(jí)語言 的前端。 g c c中也包含許多類型的目標(biāo)機(jī)后端,使用者可以通過設(shè)定一些編譯參數(shù) 來選擇特定的 后 端。 它的 后端 ( b a c k e n d ) 通常 包 括1 1 2 1 : 代 碼優(yōu)化部分、 代碼 選 擇、代碼生成、寄存器分配、必要的出錯(cuò)處理,以及符號(hào)表操作。一般來說, 這些部分獨(dú)立于源語言,而僅僅依賴于中間表示和目 標(biāo)機(jī)器。 g c c與其他編譯器的不同之處在于它規(guī)定了自己的中間語言,該語言被稱 為寄 存器 傳 輸 語 言 12 1 ( r e g is t e r t r a n s f e r l a n g u a g e ) , 這 種 語 言的 語句通常 被稱 為r t k 表達(dá)式, 前端分析的結(jié)果就是一個(gè)r t x 表達(dá)式的雙向鏈表。我們還可以通過一個(gè) 被稱為機(jī)器描述文件的程序來定制后端。g c c自 帶的編譯器生成工具可以根據(jù) 第三章 g c c與 l c c的分析 這些機(jī)器 描述 文件生 成一個(gè)符合特定目 標(biāo)機(jī) 特性的 后端1 1 2 1 圖3 . 1 為我們展示了g c c的具體結(jié)構(gòu)和機(jī)器描述文件的作用。 圖3 . 1機(jī)器描述文件在g c c中的作用 3 . 1 . 2 g c c的移植技術(shù)的簡(jiǎn)單介紹 g c c提供許多編譯器的自 動(dòng)生成工具,我們可以利用它們來自 動(dòng)生成編譯 器的各種部件。利用詞法分析器的生成器 ( 例如, l e x工具) ,可以為正則表達(dá) 式生成詞法分析器; 利用語法分析器的生成器 ( 例如, y a c c工具) , 可以為上 下文無關(guān)的文法生成歸約語法分析器;利用語法制導(dǎo)的翻譯引擎,可以生成周 游和操作 語 法 樹的 模 塊; 利 用 代碼產(chǎn) 生 器的 生 成 器 2 1 ( c o d e g e n e r a t o r g e n e r a t o r 簡(jiǎn)稱c g g ) ,可以為目 標(biāo)機(jī)生成代碼生成器 ( c g) . g c c主 要是 面向 具體 機(jī)器結(jié)構(gòu)來 生成編譯器y18 1 , 它具 有以 下一些 特點(diǎn)和功 能: 1 、 能夠提供給設(shè)計(jì)人員一個(gè)清晰方便的硬件資源和指令系統(tǒng)描述接口。 第三章 g c c與l c c的分析 描述包括: 1 )對(duì)處理器的指令系統(tǒng), 包括指令集和尋址方式等的描述。 2 )對(duì)寄存器和存儲(chǔ)的描述。 3 ) 對(duì)各種數(shù)據(jù)格式的描述。 4 ) 對(duì)寄存器使用和函數(shù)調(diào)用給出編譯器約定。如規(guī)定參數(shù)傳遞方法, 過程調(diào)用時(shí)棧的操作等。 5 ) 對(duì)于不能直接對(duì)應(yīng)目 標(biāo)機(jī)指令的中間表示操作符,給出實(shí)現(xiàn)該操作 的方法。 6 ) 對(duì)處理器的其他體系結(jié)構(gòu)特性, 如流水線, c a c h e等的描述。 利用 這些信息可以進(jìn)行底層的調(diào)度和優(yōu)化。 2 , g c c能夠利用這些資源描述來自 動(dòng)構(gòu)造一個(gè)代碼產(chǎn)生器c g和代碼優(yōu) 化器。 如果要想通過移植g c c來實(shí)現(xiàn)我們的交叉c編譯器, 那么我們不需要重新 編寫前端,可以直接使用g c c提供的a n s i c的前端。我們只需要重新編寫后 端的機(jī)器描述文件,然后使用g c c提供的后端生成器自 動(dòng)生成后端即可。按照 下面的 步驟就可以完成我們的 移植工作19 1 . l 、 實(shí)現(xiàn)目 標(biāo)機(jī)模型 在g c c中, 有 三個(gè)文件用來描 述目 標(biāo)機(jī), 分別是t a r g e t m d , t a r g e t h、 t a r g e t .c ,通過這三個(gè)文件對(duì)目 標(biāo)機(jī)的特點(diǎn)及其每條指令進(jìn)行詳細(xì)的描 述。 t a r g e t .m d : 對(duì)所有機(jī)器指令進(jìn)行描述 t a r g e t .h : 另外一些對(duì)目 標(biāo)機(jī)器的 描述,以 宏定義的形式記錄 t a r g e t s : 以 上兩個(gè)文件用到的函 數(shù)在該文件中進(jìn)行定義 2 、生成新目 標(biāo)機(jī)的 交叉編譯程序 3 ,測(cè)試編譯結(jié)果,重復(fù)2 , 3 步,直到生成正確的目 標(biāo)機(jī)匯編代碼 很明顯,整個(gè)移植的過程關(guān)鍵就在于書寫和修改那三個(gè)目 標(biāo)機(jī)描述文件。 要想寫好這三個(gè)目 標(biāo)機(jī)描述文件,其前提是制定出一系列行之有效的資源分配 規(guī)則。由于我們的嵌入式系統(tǒng)是自 行設(shè)計(jì)的,許多硬件資源的使用規(guī)則就必須 第三章 g c c與l c c的分析 要我們自 行規(guī)定。編寫二個(gè)目 標(biāo)機(jī)描述文件之前,首先應(yīng)該確定兩個(gè)方面的規(guī) 則: 1 、寄存器的使用規(guī)則,這個(gè)問題比較重要。它可能決定生成的匯編 代碼的執(zhí)行效率。 2 、如何分配存儲(chǔ)空間。 在開始正式書寫機(jī)器描述文件之前,我們還應(yīng)該確定通常被稱為應(yīng)用二進(jìn) 制 接口( a p p l i c a t i o n b i n a ry i n t e r f a c e 簡(jiǎn)稱a b i ) 的內(nèi) 容。 也就是目 標(biāo)機(jī)是如何實(shí) 現(xiàn)應(yīng)用所需的基本數(shù)據(jù)類型和函數(shù)調(diào)用過程。比如,數(shù)據(jù)類型如何對(duì)應(yīng)到字節(jié) 和位, 數(shù)據(jù)類型的存儲(chǔ)空間分配, 如何調(diào)用函 數(shù)和如何返回函 數(shù)值。 實(shí)際上a b i 大部分都己 經(jīng)由 機(jī)器的 體系結(jié)構(gòu)決定了。它主要分為兩部分19 1 , 1 、目 標(biāo)機(jī)的數(shù)據(jù)表示,字節(jié)編碼方式,基本數(shù)據(jù)類型。 2 、目標(biāo)機(jī)的函數(shù)調(diào)用過程,函數(shù)調(diào)用:包含函數(shù)幀的使用,參數(shù)傳 遞,函數(shù)返回 上述所需信息全部準(zhǔn)備好之后,我們可以 進(jìn)行具體的 移植工作,包括: 1 、移植目標(biāo)機(jī)頭文件,主要包括三方面的內(nèi)容。 ( 1 ) 延時(shí)槽定義 ( 2 ) 整數(shù)種類約束定義 ( 3 ) 匯編指令修改( 涉及修改很多宏定為 2 、移植目標(biāo)機(jī)描述文件,主要包括兩方面的內(nèi)容。 ( 1 ) 模板描述方法 ( 2 ) 模板分類 a 、算數(shù)運(yùn)算和邏輯運(yùn)算指令類 b 、跳轉(zhuǎn)指令類 c 、數(shù)據(jù)移動(dòng)指令類 d 、函數(shù)調(diào)用指令 3 、移植目 標(biāo)機(jī)c文件 目 標(biāo)機(jī)描述文件中.mi 文件是一個(gè)正文文件,其中除了允許以“ ; ”開始的 注解行之外 ( 字符串中的分號(hào)除外) , 其余的均是采用r t l外部語法形式書寫的 r t x表達(dá)式。這些表達(dá)式最外層的操作碼是專門用于機(jī)器描述的操作碼,由它們 組成的 機(jī)器描 述包含了目 標(biāo)機(jī) 指令集的 各種內(nèi) 容, 主要有1 1 1 . 1 、 指令樣板, 描述目 標(biāo)機(jī)所支持的每一條指令以 及該指令對(duì)應(yīng)的r t l指令 形式和匯編代碼輸出格式。 2 、 指令樣板的補(bǔ)充, 指出可以進(jìn)行與目 標(biāo)相關(guān)的優(yōu)化動(dòng)作及相應(yīng)的r t l指 第三章 以二 c與l c c的分析 令形式, 如將一條復(fù)雜的r t l 指令分解為多條r t l指令, 進(jìn)行窺孔優(yōu)化,或者 將若干條r t l 指令歸并為單條指令等等。 3 、 指令有關(guān)特性, 這些特性有: 指令的分類, 它指出 有哪幾種類型的指令, 如分支、轉(zhuǎn)移、轉(zhuǎn)子、存數(shù)、取數(shù)、算術(shù)運(yùn)算等等。指令中允許的數(shù)據(jù)類型, 它指出目 標(biāo)機(jī)具體支持機(jī)器模式所規(guī)定的各種數(shù)據(jù)類型中的哪幾種類型。指令 的長(zhǎng)度, 它指出目 標(biāo)機(jī)具有哪幾種長(zhǎng)度的指令以及各種長(zhǎng)度的指令所屬的類型。 指令的延遲槽口,它指出目 標(biāo)機(jī)是否有延遲槽口的指令, 哪些指令具有這一特 征以及在延遲槽口中允許插入什么樣的指令等等。功能部件。描述目 標(biāo)機(jī)有哪 些功能部件,各類指令執(zhí)行所在的部件名稱以及功能部件有關(guān)的時(shí)間參數(shù)。具 體書寫目 標(biāo)機(jī)描述文件,必須詳細(xì)了 解這方面的內(nèi)容,掌握書寫的規(guī)則、方法。 機(jī)器描述它是一個(gè)正文文件, 需要被轉(zhuǎn)換成為g c c編譯器的一部分, 這一 工作就由“ g en* ” 系列的代碼生成器的生成器來完成。u g en* , 是一套專門的 轉(zhuǎn) 換程序。它們針對(duì)不同的編譯處理目 的分析機(jī)器描述, 將正文形式的md文件 轉(zhuǎn)換成含有接口 所需數(shù)據(jù)結(jié)構(gòu)與函數(shù)的c文件或h文件 “ i n s n - ,這些 c源 程序與g c c的其它源程序一起才構(gòu)成了某個(gè)機(jī)器上運(yùn)行完整的g c c編譯源程 序, 然后重新編譯g c c即可。 g c c具體使用和分析目 標(biāo)機(jī)器描述文件 ( md文 件)的方法如下圖3 .2 所示u 伙 第三章 g c c與l c c的分析 圖3 .2 md文件的具體作用 3 . 1 . 3 g c c的缺點(diǎn)以及不使用它的原因 g c c是當(dāng) 前最優(yōu)秀的開源代碼編譯器,它的開發(fā)人員做了大量的工作使其 移植變得簡(jiǎn)單且高度抽象化, 如今許多嵌入式系統(tǒng)都是通過移植g c c來實(shí)現(xiàn)它 們的交叉編譯器。但是,也正是由于g c c移植的高度抽象化使得對(duì)其移植缺少 靈活性和可伸縮性,特別是對(duì)于新設(shè)計(jì)的、有獨(dú)特設(shè)計(jì)的和自 主設(shè)計(jì)的嵌入式 系統(tǒng)尤其如此。 根據(jù)上面的介紹,如果我們選擇g c c進(jìn)行移植,步驟簡(jiǎn)單明了,首先構(gòu)造 目 標(biāo)機(jī)描 述文件m a c h i n e .h 和m a c h i n e .m d 文 件; 然后 將它交 給g en去處理, 目 標(biāo)機(jī)的g c c編譯器就出 現(xiàn)了。 這樣的后端移植過程看似清晰, 實(shí)際上是一個(gè) 非常繁瑣的過程。 因?yàn)槿绻麅H僅通過修改m d文件來移植g c c , 那么g c c只能 產(chǎn)生a t r+r拍 下1古v)i11.去甲姐 c則切 cvd+f杏杏addrf+p ddrf+p,-,-,-k . 產(chǎn).尹 口戶 一 ” 人 c d b a 0 r d o u b le 月一碑,: 鑫 。 ,二fl o c . 圖3 .6語法分析后的抽象語法樹 這些樹使隱含在源代碼中的一些含義更加清晰了。上面的類型轉(zhuǎn)換在源代 碼中并沒有顯式的體現(xiàn), 但是在a n s i c標(biāo)準(zhǔn)中是有明確規(guī)定的, 在這些樹中完 成了這些類型轉(zhuǎn)換。此外,樹中還明確給出了所有操作的類型,如源代碼中的 加法都沒有顯式給出操作類型,但是在樹中與對(duì)應(yīng)的節(jié)點(diǎn)都標(biāo)明了具體的操作 類型信息。這些語義分析是前端語義分析器完成的,由于這些操作的實(shí)現(xiàn)方法 是完全按照編譯理論進(jìn)行的,在這里就不細(xì)述了. 根據(jù)圖3 .6 的樹, l c c前端將生成圖3 .7 所示的d a g , 編號(hào)為 1 和2 的d a g 第三章 g c c與l c c的分析 是從圖3 .6中的樹轉(zhuǎn)換而來的。操作符標(biāo)記中不再有 “ 十 ”號(hào),而是將這些節(jié)點(diǎn) 轉(zhuǎn)換成相應(yīng)的 操作符。 樹變成d a g后, 一些隱含的事實(shí)變得更加明顯 化, 如樹 中c n s t + d節(jié)點(diǎn)的常量0 . 5 , 在d a g中成了名字為“ 2 ” 的靜態(tài)變量, c n s t + d 操作符被替換成取地址操作符a d d r g p和取值操作符i n d i r d 。圖3 .7中的第 三個(gè)d a g定義了 名字為勺”的標(biāo)號(hào), 該標(biāo)號(hào)將出 現(xiàn)在目 標(biāo)程序e x a m p l e 的 末 尾處,程序中的返回指令被翻譯成跳轉(zhuǎn)到該標(biāo)號(hào)。 cvdiaddd ( q a s g n f 人ddr f p . i ndi rd 杏 人 ddr gp 寧 “ 2 ,. 0 _ 5 妙杏addrfp t. 。 m al 圖3 7生成的d a g 前端生成的d a g的順序與圖3 .8 所示的代碼表的執(zhí)行順序是相同的。代碼 表的 第一 個(gè)入口 是s an , 后面的 每個(gè)入口 代 表e x a m p l e 一部 分代碼。 入口d e f p o i n t 表示源代碼的 位置, 入口b l o c k b e g 和b l o c k e n d 表示e x a m p l e 代碼中復(fù)合語句的 邊界。 兩個(gè)入口g e n 分別表示圖3 .7 中的d a g1 和d a g 2 。 入口l a b e l 表示d a g 3 。到此l c c前端的工作基本完成。 - 2 4- 第三章 g c c與 l c c的分析 s t a r t d e,二 ,,1, exam ples x . o 丘 比 t = 期 . a . o 幻 ls e t = p - a . n a me =q 。乙n a me 呂 。 山“ ; 丫一 _ 二 s t r l n 以i %d , ,p - z . o ff s e t r 諾蕩 馨湍甜增硯 p - - j - = q . s c l a s s = a u t o ; 。 找 妞 t + = r o u n d u p ( q - t y p e - s 詠, 我 矍 、 乏 邵咨 飛 手 然黔聶 愁淤共攘越 鑫 搶夸蠢羲漏熟薰霹簍蘸露蒸 頭 一 4 8- 第四章 交叉c編譯器的設(shè)計(jì)與移植 / *
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 山東省濰坊市壽光第一中學(xué)2024-2025學(xué)年高一下學(xué)期第二次期末模擬物理試題
- 2025年山東省菏澤市經(jīng)濟(jì)技術(shù)開發(fā)區(qū)中考三?;瘜W(xué)試題
- 消費(fèi)者教育與美妝品牌成長(zhǎng)策略
- 鐵路餐飲配送線上推廣企業(yè)制定與實(shí)施新質(zhì)生產(chǎn)力項(xiàng)目商業(yè)計(jì)劃書
- 休閑服裝品牌故事書籍出版創(chuàng)新創(chuàng)業(yè)項(xiàng)目商業(yè)計(jì)劃書
- 胰腺癌靶向藥品研制行業(yè)深度調(diào)研及發(fā)展項(xiàng)目商業(yè)計(jì)劃書
- 乒乓球賽事與策劃創(chuàng)新創(chuàng)業(yè)項(xiàng)目商業(yè)計(jì)劃書
- 2025年中國(guó)防霉玻璃膠市場(chǎng)調(diào)查研究報(bào)告
- 2025年中國(guó)有繩手腕帶市場(chǎng)調(diào)查研究報(bào)告
- 2025年中國(guó)拉鏈門窗市場(chǎng)調(diào)查研究報(bào)告
- 呼吸科患者出院指導(dǎo)
- 校園食堂升級(jí)服務(wù)方案
- 中醫(yī)治療協(xié)議書范本(2篇)
- 沐足行業(yè)嚴(yán)禁黃賭毒承諾書
- 2024年初級(jí)招標(biāo)采購(gòu)從業(yè)人員《招標(biāo)采購(gòu)法律法規(guī)》考前通關(guān)必練題庫(kù)(含答案)
- 供應(yīng)柴油月結(jié)算合同范本
- 2024年《風(fēng)力發(fā)電原理》基礎(chǔ)技能及理論知識(shí)考試題庫(kù)與答案
- 2.10豐巢智能柜合作協(xié)議
- 電商平臺(tái)用戶使用手冊(cè)
- 2024秋國(guó)家開放大學(xué)《外國(guó)文學(xué)》形考任務(wù)1-4答案
- 房顫的規(guī)范化治療
評(píng)論
0/150
提交評(píng)論