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

基于插件的編譯原理課程實驗設(shè)計

2011-12-31 00:00:00計衛(wèi)星王貴珍李侃
計算機教育 2011年11期


  摘要:根據(jù)編譯技術(shù)的最新進展及目前廣泛使用的各種編譯器框架,提出基于插件的編譯原理課程實驗設(shè)計的思想與方法,解除后端實踐依賴于前端分析結(jié)果的限制,使學(xué)生能夠利用現(xiàn)有的編譯器框架直接進行后端語義分析、代碼優(yōu)化和代碼生成等方面的實踐;同時,文章介紹了基于插件的編譯原理課程實驗設(shè)計的必要性、可能性,并以Phoenix編譯器框架為例說明了該方案的可行性。
  關(guān)鍵詞:編譯原理;課程實驗;插件;Phoenix
  
  編譯程序各個邏輯功能之間具有較強的依賴性,如后端的語義分析和中間代碼生成、代碼優(yōu)化、目標(biāo)代碼生成等都依賴于前端的正確分析與處理。如果沒有前端的輸出,就無法進行后續(xù)的加工和處理。考慮到編譯原理程序本身組織結(jié)構(gòu)的特點、教學(xué)學(xué)時限制和學(xué)生實踐動手能力等因素,目前課程實踐環(huán)節(jié)普遍向編譯器前端靠攏[1-2]。即使設(shè)置了與后端相關(guān)的實驗,學(xué)生也往往無法完成。因此目前比較缺乏針對后端處理的、較為獨立的小規(guī)模課程實驗供學(xué)生練習(xí),這勢必影響學(xué)生對編譯器整體性的掌握及對編譯器各部分有機關(guān)聯(lián)和接口的學(xué)習(xí)理解。
  隨著計算機體系結(jié)構(gòu)的不斷發(fā)展,編譯技術(shù)也在不斷進步和變化。為了快速對各種研究思想進行驗證,并縮短編譯相關(guān)研究成果與實際實現(xiàn)之間的轉(zhuǎn)換時間,各種供研究人員使用的編譯器框架平臺應(yīng)運而生。例如,微軟公司推出的Phoenix編譯器框架[3]、開源的Open64和GCC等。這些已有的編譯器框架能夠簡化編譯程序的設(shè)計與實現(xiàn);同時,為了支持編譯器的定制及相關(guān)理論的快速驗證,有些編譯器框架(如Phoenix和GCC4.5)允許以插件的形式對部分處理階段進行修改或者加強。基于插件的設(shè)計方法對于研究人員而言其價值是毋容置疑的,同時也為編譯原理課程實踐提供了便利。我們可以利用這些編譯框架提供的前端分析與識別功能,以及后端的部分處理能
  力,設(shè)計針對語義分析與中間代碼生成、代碼優(yōu)化和目標(biāo)代碼生成相關(guān)的實驗環(huán)節(jié),其好處在于:
  1) 可以縮短實驗完成所需要的時間,降低實驗的難度,從而為教學(xué)目標(biāo)的完成奠定良好基礎(chǔ);
  2) 能夠培養(yǎng)學(xué)生的科研能力和創(chuàng)新意識,為使他們順利走上科研道路打下堅實的基礎(chǔ);
  3)基于插件的設(shè)計思想和技術(shù)也是目前許多大型軟件的普遍設(shè)計與實現(xiàn)方法,如Firefox、Eclipse和IDA Pro等。學(xué)生通過基于插件的課程實驗?zāi)軌蚣訌妼W(xué)生對大型復(fù)雜軟件架構(gòu)、設(shè)計思想和實現(xiàn)方法等各個方面的認識,提升軟件工程管理和軟件設(shè)計水平。
  目前清華大學(xué)“編譯原理專題訓(xùn)練”課程已經(jīng)將開放源碼軟件GCC和Open64作為實驗框架引入實踐教學(xué)[4],GCC 4.5及以上版本已經(jīng)實現(xiàn)了對插件設(shè)計的支持。筆者僅以微軟的Phoenix為例詳細說明基于插件的實驗設(shè)計的可行性。
  1Phoenix編譯框架
  Phoenix是由微軟公司新推出的用于構(gòu)造編譯程序,各種程序分析、優(yōu)化和測試工具的一個基礎(chǔ)框架。Phoenix編譯器框架主要功能包括:
  1)Phoenix是一個編譯器。該編譯器有著與其他編譯器相似的功能,能夠?qū)⒃创a編譯為二進制代碼。
  2) 是一個編譯器開發(fā)工具。由于Phoenix采用了統(tǒng)一的中間形式,編譯器開發(fā)者只需將新語言的源程序轉(zhuǎn)化為這種中間形式,然后就可利用Phoenix后端工具完成中間語言的轉(zhuǎn)化、優(yōu)化以及二進制代碼的生成。
  3)Phoenix作為一個框架,同時還是可插接的(Plug-in),Phoenix包含一些API,使用這些API能編寫利用Phoenix特性的工具。
  Phoenix體系結(jié)構(gòu)具有高度的可伸縮性,使得開發(fā)者或研究人員能夠在該體系結(jié)構(gòu)上開發(fā)各種各樣的編譯器以及分析優(yōu)化工具。在Phoenix中,遍(Pass)和階段(Phase)是兩個極重要的概念,也是支持插件式設(shè)計的主要結(jié)構(gòu)。Phoenix支持多遍處理,因此后端由多個Pass構(gòu)成,而且允許使用者插入自己的Pass,用于特定處理。一個函數(shù)的分析過程可以劃分為若干階段,每個階段的處理對應(yīng)一個Phase。使用者可以插入、刪除一個Phase或重新排列原有的Phase,Pass和Phase的關(guān)系如圖1所示。
  2基于插件的課程實驗設(shè)計
  插件是指能夠被Phoenix核心編譯模塊(C2.exe)調(diào)用的外部模塊。假設(shè)設(shè)計了一個名為MyPlugin.dll的插件,當(dāng)使用命令行選項-d2plugin:MyPlugin.dll啟動C2時,C2就會在編譯的過程裝載并執(zhí)行MyPlugin.dll中的代碼。
  如圖2所示,源代碼程序經(jīng)過前端C1.exe的分析和處理之后,然后交給C2中的各個Pass和Phase進行處理。當(dāng)C2運行時,Myplugin能夠訪問C2內(nèi)部的所有數(shù)據(jù)結(jié)構(gòu),因此,通過MyPlugin能夠改變C2的行為,如增加新的Phase,旁路已經(jīng)存在的Phase,或者替換可選的Phase等。例如,Myplugin可以提供一個寄存器分配Phase替換掉C2中已有的部分,可以向被編譯的每個函數(shù)中插入一些其他的代碼,輸出某個函數(shù)編譯所形成的IR等。
  編寫一個Phoenix的插件非常簡單,例如,我們想輸出被編譯的每個函數(shù)的名字,則需要編寫一個插件FuncNames。為此,首先定義一個實現(xiàn)PlugIn接口的類MyPlugIn,作為插件FuncNames與C2.exe交互的接口。MyPlugIn必須實現(xiàn)PlugIn中的兩個接口:RegisterObjects和BuildPhase。Phoenix編譯框架在裝載插件之后調(diào)用RegisterObjects并注冊插件對命令行選項進行處理。本例中不支持任何命令行命令,所以該接口的實現(xiàn)為空。BuildPhase接口有一個PhaseConfiguration類型的參數(shù),這個參數(shù)是C2.exe提供給插件的,插件中的代碼通過這個參數(shù)能夠訪問C2中的Phase列表。本例中我們只需要創(chuàng)建一個新的Phase實例并將其插入到列表中合適的位置就可以了,程序代碼如下:
  
  class MyPlugIn : Phx::PlugIn{
  ...
   virtual void RegisterObjects() override;
   virtual void BuildPhases ( Phx::Phases:: PhaseConfiguration ^ config ) override;
  ...
  };
  void MyPlugIn::RegisterObjects() {}
  void MyPlugIn::BuildPhases( Phx::Phases::PhaseConfiguration ^ config) {
   Phx::Phases::Phase ^ encodingPhase;
   Phx::Phases::Phase ^ funcNamesPhase;
   encodingPhase = config->PhaseList->FindByName ("Encoding");
   funcNamesPhase = MyPhase::New(config);
   encodingPhase->InsertBefore(funcNamesPhase);
  }
  
  此外我們需要創(chuàng)建的一個新的Phase類,該類是從父類Phase繼承而來,且其必須實現(xiàn)父類的兩個方法New和Execute。New是在前述的BuildPhases方法中調(diào)用的,主要作用是構(gòu)造和初始化MyPhase對象;而Execute是C2編譯每個方法時都會調(diào)用的方法,實際完成函數(shù)名輸出的方法,程序代碼如下:
  
  
  class MyPhase : Phx::Phases::Phase{
  ...
   static Phx::Phases::Phase ^New ( Phx:: Phases::PhaseConfiguration ^ config );
   virtual voidExecute (Phx::Unit ^ unit ) override;
  };
  Phx::Phases::Phase ^ MyPhase::New( Phx:: Phases::PhaseConfiguration ^ config) {
   Phase ^ phase = gcnew MyPhase();
   phase->Initialize(con

主站蜘蛛池模板: 视频在线观看一区二区| 国产精品成人AⅤ在线一二三四| 国产精品一区在线麻豆| 国产91透明丝袜美腿在线| 亚洲无码A视频在线| 亚洲美女操| 久久精品女人天堂aaa| 国产99视频免费精品是看6| 欧美区国产区| 欧美精品在线观看视频| a色毛片免费视频| 国产精品极品美女自在线| 波多野结衣一级毛片| 免费国产黄线在线观看| 综合色在线| 伊人成人在线视频| 国产好痛疼轻点好爽的视频| 国产视频一二三区| 欧美亚洲一区二区三区导航| 色精品视频| 香港一级毛片免费看| 手机在线免费毛片| 毛片在线播放网址| 欧美日韩精品在线播放| 99爱在线| 精品一区二区三区自慰喷水| 免费国产无遮挡又黄又爽| 国产乱子伦无码精品小说| 色老二精品视频在线观看| 欧美日本视频在线观看| 国产成人精品日本亚洲| 狠狠综合久久久久综| 99视频国产精品| 国产国语一级毛片在线视频| 亚洲国产午夜精华无码福利| 国产区人妖精品人妖精品视频| 992Tv视频国产精品| 麻豆国产原创视频在线播放 | 狼友视频国产精品首页| 91久久国产综合精品| 亚洲精品天堂在线观看| 精品天海翼一区二区| 国产亚洲欧美在线中文bt天堂 | 亚洲AV电影不卡在线观看| 日韩在线欧美在线| 欧美亚洲日韩不卡在线在线观看| 国产亚洲欧美日韩在线一区二区三区| 日韩少妇激情一区二区| 国产成人高清精品免费软件| 综合色区亚洲熟妇在线| 日日碰狠狠添天天爽| 欧美人与牲动交a欧美精品| 女人毛片a级大学毛片免费| 成人国产一区二区三区| 久久国产V一级毛多内射| 91精品视频播放| 成人国产小视频| 欧美一区精品| 亚洲精品动漫在线观看| 全裸无码专区| 国产特级毛片| 69av免费视频| 久久精品国产一区二区小说| 蝌蚪国产精品视频第一页| 国产一级二级三级毛片| 久久精品国产精品一区二区| 在线无码av一区二区三区| 久久综合结合久久狠狠狠97色| 一区二区三区国产| 亚洲国产日韩在线观看| 亚洲人成电影在线播放| 在线亚洲小视频| 天天色综合4| 成人亚洲视频| AV无码一区二区三区四区| 国产一区免费在线观看| 亚洲最大情网站在线观看 | 亚洲系列无码专区偷窥无码| 久久黄色免费电影| 欧美视频在线播放观看免费福利资源| 亚洲无码一区在线观看| 亚洲国产综合精品一区|