999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于lcc編譯工具的實現

2007-04-12 00:00:00黎紹發
中國新技術新產品 2007年4期

摘要:編譯工具是進行軟件系統開發和測試的強大工具。現有的編譯工具復雜、龐大并且為數不多,諸如Vtune之類的程序剖面分析工具更是昂貴,但是對程序進行靜態分析和動態跟蹤評估等工作在很多方面十分有用,因此,以現有編譯器為主體進行編譯器擴展來現相應工具是非常有必要的。LCC是一款廣為使用的ANSI C編譯器,由于自身的簡單和使用高效特點,由它出發通過修改、定制,構造其他特殊目的的編譯器相關工具就變得相對簡單。

關鍵詞:編譯器 編譯工具 LCC 編譯后端

Implementation of compilation-tools based on lcc

Abstract Compilation tools are powerfull tools for development and testing of software system. Compilation-tools existed are complex, large and infrequent and program profiling tools as VTune are costly. However, static analysing and dynamic tracing and evaluating for program is useful sometimes, so that, implementation these tools by extending a compiler existed is necessary. Lcc is a widely used compiler for ANSI C. construction compilation-tools by modifying, and configurating it is relatively simple because of its simple and effectiveness.

Keywords compiler, compilation- tools, lcc, compiler back-end

1.簡介

編譯器是編譯工具的一種,是進行軟件開發不可或缺的工具。編譯器強大而復雜,其他編譯相關工具也是如此。縱觀各種編譯相關的工具,如GCC編譯器、lint語法檢查器,以及許多程序剖面分析器等等,一直在強大、龐大、復雜和昂貴之間游走。對于許多特定目的的工作而言,一款輕便、高效和廉價的編譯工具是十分具有吸引力的,因此,以一個簡單高效的編譯器為主體,針對不同的用途進行定制,有時就變得十分有必要。本文以此為目的,介紹了一種以LCC為主體進行配置和實現編譯器相關工具的具體方法。

LCC是一款免費、開放源代碼并被廣泛使用的ANSI C編譯器。它的作者是美國ATT實驗室的Christopher W. Fraser和美國普林斯頓大學教授David R. Hanson,當前版本為4.2。LCC的分析代碼由手工編寫而成,編譯速度非常快;LCC沒有單獨的優化遍,但對于大多數應用來說,LCC產生的代碼已經足夠快了。[1],與廣為使用的GCC形成鮮明對比的是,LCC的源代碼簡單、緊湊,十分有利于進行修改。以可變目標為目的的設計,移植或對各種不同用途后端的實現比較簡單。我們的工作就針對該編譯器后端進行自定義配置的方法展開,它與LCC編譯器的移植工作沒有區別。

2.數據表示

類型和符號的數據結構是編譯器的核心數據表示。對于編譯后端而言,中間代碼有關的數據結構也是非常重要的。LCC使用DAG(有向無環圖)對中間代碼進行描述,它使用二叉樹的鏈表形式進行組織。所有的中間代碼通過代碼表進行管理,這種代碼表與優化器中用于控制流分析的基本塊有所區別,但可以看作是一種擴展基本塊[1],通過它可以方便進行基本塊的劃分,從而插入單獨的優化遍,使LCC成為優化編譯器。

編譯器后端的實現者需要熟悉至少四種LCC的核心數據結構,分別是類型、符號、DAG節點和后端接口描述,本文不對其細節進行贅述,可參考LCC編譯器源代碼。

對于這四種數據結構中,LCC從概念上將其劃分為三部分,一部分為編譯前端私有數據,根據LCC后端的訪問約定,LCC后端并不訪問這個部分的數據;第二部分為前后端共享的數據;第三部分為后端私有數據,前端對此一無所知。其中,前兩個部分的數據從形式上看沒有區別,而第三部分,作為后端的私有數據結構由后端自己實現,由各結構中的x域成員進行維護,它們的組織形式如下:

LCC為生成可執行目標代碼的代碼生成器提供了一種自動代碼生成的方法,使用這種方法,后端的實現者只需要提供一份規范描述的目標機器描述文本,由一個叫做iburg的程序據其自動生成相關代碼,而上圖所示的x域成員類型由相應的后端文件提供,其數據由自動生成的代碼進行訪問,相關類型和數據的聲明在config.h文件中聲明。對于手工生成的代碼,這些x域成,由實現者自行實現和訪問,可以將config.h文件替換為自己的實現。

LCC的中間代碼表示使用的是DAG(有向無環圖),其中多入口的節點就是公共子表達式節點。使用這樣的表示方法起到了刪除公共子表達式的目的,為后端生成高質量的目標代碼提供了有力的保障。

LCC中間代碼所提供的指令是通過仔細篩選的,能夠匹配大多數機器的硬件指令[2]:

實際使用中的中間代碼操作符由上表所示的操作碼和具體表示數據類型的后綴組合使用。

3.后端的移植和實現

LCC的后端是通過實現后端接口Interface結構聲明的數據和函數來實現的。Interface接口包括了一些接口標記和函數指針,還包含了一個可自定義的擴展接口Xinterface,它的作用是為基于iburg緊縮規范自動生成的代碼提供統一的接口。LCC的后端的任務就是實現并設置這些接口數據和函數。除開Xinterface接口,根據它們作用,下面分類介紹:

4.接口標記

后端接口包括數量適中的接口標記數據,它們描述了目標機器和后端實現的各種特性,為生成正確的代碼和數據提供依據:

其中CALLB操作碼是中間語言操作符CALL和后綴B的組合,它表示了對一個返回值類型為結構(struct)的函數的調用,由于一個類型為結構的變量常常不能存儲在一個寄存器之內,因此它需要進行特殊處理;同理,ARGB表示傳遞一個結構類型的函數參數。

5.接口函數

后端接口包含一些重要的接口函數,編譯器前端通過它們實現代碼的生成和發送工作,這些函數接口描述如下:

6.手工實現

實際上手工實現LCC編譯器后端是簡繁參半。簡單的是,后端的實現者可以自己定義Xinterface接口和Xnode、Xtype以及Xsymbol,而暴露給編譯前端的接口就會變得十分簡潔,只要實現Interface接口函數,就能使整個LCC編譯器順利的工作;麻煩的是,如此一來所有代碼生成工作包括指令選擇、寄存器分配等就需要全部自行設計和實行。

但是對于并不生成實際代碼但完成其他重要任務的編譯后端而言,這種做法則十分可行。這樣,可以完全拋棄config.h中聲明的結構和函數,僅提供一個簡潔的接口即可。實際上,正確的設置接口標記,然后將Interface接口函數都設置為什么都不做的空函數,并定義Xinterface為空結構,實現了一個很好的語法檢查器,它不實際生成并發送代碼,只是進行語法語義檢查,類似于UNIX平臺下的lint。

具體而言手工生成LCC后端的工作如下:

●聲明相應的X類型

●定義一個Interface接口實例

●設置所有接口標記

●實現所有接口函數

7.基于iburg緊縮規范的自動代碼生成

對于使用基于iburg緊縮規范自動代碼生成的后端實現方法而言,后端接口數據和函數分為兩個部分:一部分是LCC為優化后端接口函數而業已實現的那部分接口函數;而另一部分是根據代碼生成規范自動生成的接口數據和函數。在LCC的發展過程中,開發者將后端函數分為目標無關與目標相關部分,并實現了目標無關代碼的部分代碼。這樣,iburg規范中需要的內容就減到了最少。這樣做的目的是人工編寫一個規模中等的代碼生成器需要1000到1500行的C代碼。如果盡可能地隔離與目標機器相關的特性,這個數字就會銳減一半。盡管這樣做的代價增加了大約1000行與機器無關的代碼,但是,只要有兩個目標機器,就能從這種方法中獲得益處。更重要的是,如果我們盡可能多的使用已有(即與機器無關)代碼,開發一個新的代碼生成器就變得更加容易了。[1]

iburg是代碼生成器的生成器,它接受一份用類似于YACC語法規范的機器描述和自定義代碼段,生成用于編譯器后端的接口函數和接口數據,以配合編譯器進行正確的工作。

使用iburg自動生成代碼生成器需要使用LCC提供的config.h文件,它定義了相關的X開頭的結構類型并聲明了一些后端目標無關的工作函數。iburg生成相關的接口數據和接口函數。

iburg規范的語法如下,term和nonterm分別代表終結符和非終結符[4]:

grammar: ‘%{‘ 配置文本 ‘%}’ { dcl } %% { rule } [ %% C代碼 ]

dcl: %startnonterm

%term { term = 整數 }

rule:

nonterm : tree template [ C表達式 ]

tree:

term [ ‘(‘ tree [ , tree ] ‘)’ ]

nonterm

template:

“ { 任意非引號字符 } “

iburg規范是按行組織的,由它自動生成的程序被叫做BURM。單詞“%{”、“%}”和“%%”必須單獨一行,每個dcl或rule必須出現在一行上,rule指定了代碼選擇進行的模式匹配規則,template指定了指令模版。配置文本是C語言代碼,它被原封不動的復制到BURM的開頭。如果第二個“%%”出現,那么它之后的正文也被原封不動的復制到BURM的末尾。%start聲明了待分析樹的根,%term聲明了樹節點的編碼。

自動生成LCC后端的工作如下:

創建一份iburg規范文本

在規范文本中書寫代碼生成規則

在規范文本中書寫代碼選擇以外的接口函數

定義接口實例并進行接口綁定

8.結論

LCC由于自身緊湊的設計和簡單的代碼以及比較清晰的接口設計使得修改和定制的工作比較簡單,這樣,對于很多具有實用價值的工具的實現不再因為編譯器相關工具的復雜而變得遙不可及,它為有特殊用途的編譯工具的實現提供了一個有價值的選擇。

主站蜘蛛池模板: 天天激情综合| 久久精品免费国产大片| 中文无码伦av中文字幕| 国产成人做受免费视频| 美女国产在线| 国产va欧美va在线观看| 久久久久久国产精品mv| 亚洲第一区欧美国产综合| 亚洲天堂成人| 欧美激情第一区| 亚洲精品中文字幕午夜| 国产成人福利在线| 国产精品一区二区在线播放| 中文字幕在线播放不卡| 亚洲天天更新| 亚洲日本一本dvd高清| 黄片一区二区三区| 久久精品国产999大香线焦| 8090午夜无码专区| 凹凸精品免费精品视频| 青青草91视频| 亚洲国产天堂久久综合| 97亚洲色综久久精品| 欧日韩在线不卡视频| 999国内精品久久免费视频| 在线观看精品自拍视频| 免费看美女毛片| 日a本亚洲中文在线观看| 国产精品无码在线看| 美女裸体18禁网站| 免费AV在线播放观看18禁强制| 毛片一级在线| 波多野结衣一二三| 婷婷六月色| 蜜桃臀无码内射一区二区三区 | 亚洲 欧美 日韩综合一区| 国产一二视频| 国产草草影院18成年视频| 亚洲国产清纯| 色综合综合网| 强奷白丝美女在线观看| 波多野结衣一区二区三区四区| 久久久久国产一级毛片高清板| 国产JIZzJIzz视频全部免费| 亚洲第七页| 国产成人夜色91| 久久久久国产一区二区| Aⅴ无码专区在线观看| a在线亚洲男人的天堂试看| 中文字幕免费在线视频| 日韩区欧美区| 国模极品一区二区三区| 日韩精品视频久久| 国产va免费精品观看| 国产电话自拍伊人| 久久亚洲国产视频| 亚洲无码一区在线观看| 欧美在线视频不卡第一页| 看av免费毛片手机播放| 国产成人夜色91| 亚洲无码精品在线播放| 在线观看视频一区二区| 欧美日韩在线第一页| 久久久四虎成人永久免费网站| 中文字幕亚洲另类天堂| 在线a视频免费观看| 国产成人综合日韩精品无码首页| a级毛片在线免费| 久久狠狠色噜噜狠狠狠狠97视色 | 亚洲开心婷婷中文字幕| 大香伊人久久| 欧美日韩国产综合视频在线观看| 人妻精品久久无码区| 亚洲av中文无码乱人伦在线r| 天天色综网| 亚洲欧洲日产无码AV| 国产成人啪视频一区二区三区 | 高清欧美性猛交XXXX黑人猛交| 在线观看国产精品日本不卡网| 伊人久久青草青青综合| 夜精品a一区二区三区| 青青久在线视频免费观看|