《編譯原理實踐及應用》第1章編譯原理概述.ppt_第1頁
《編譯原理實踐及應用》第1章編譯原理概述.ppt_第2頁
《編譯原理實踐及應用》第1章編譯原理概述.ppt_第3頁
《編譯原理實踐及應用》第1章編譯原理概述.ppt_第4頁
《編譯原理實踐及應用》第1章編譯原理概述.ppt_第5頁
已閱讀5頁,還剩43頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、編譯原理實踐及應用,-清華大學出版社,2020年8月25日星期二,第2頁,教材及主要參考資料,教材:編譯原理實踐及應用,黃賢英,清華大學出版社 主要參考資料: (1) 編譯原理,陳火旺,國防工業(yè)出版社 程序設計語言編譯方法,肖軍模,大連理工大學出版社 編譯原理,張素琴,呂映芝,清華大學出版社 編譯原理,alfred V.Aho等著,李建中等譯,人民郵電出版社,2020年8月25日星期二,第3頁,C語言程序,void main( ) int x,y,z; x=3; y=2; z=x+y; ,匯編語言程序,序言,2020年8月25日星期二,第4頁,為什么要學習編譯原理?,1、有助于深刻理解和正確使

2、用程序設計語言,加深對高級語言程序執(zhí)行過程的理解 2、有助于加深對整個計算機系統(tǒng)的理解。 3、設計開發(fā)編譯程序的軟件技術同樣可以用于其他軟件的設計開發(fā)。 4、隨著微處理器技術的飛速發(fā)展,處理器性能在很大程度上取決于編譯器的質量、編譯技術成為計算機的核心技術,地位變得越來越重要。,2020年8月25日星期二,第5頁,編譯原理課程在計算機科學中的重要地位,(1) 學習編程最初是學習一門高級語言,C或Pascal,掌握編寫一些簡單程序的方法; (2) 學習數(shù)據(jù)結構,建立“算法”的概念,對編程有更深入的理解。遇到問題的時候,能夠尋找相應的數(shù)據(jù)結構模型,設計適當?shù)乃惴▉斫鉀Q問題; (3) 學習匯編語言,

3、這門課程是我們真正深入了解計算機內部工作的第一門課程。通過學習了解匯編語言如何變?yōu)闄C器語言,如何對應于一條指令; (4) 計算機組成原理課程的學習使我們了解到計算機的硬件組成,以及機器指令程序如何在計算機中運行的過程。 (5) 編譯原理課程幫助我們了解高級語言程序轉換成機器指令程序的過程。可以幫助我們更深刻地理解高級語言程序運行的內部機制。,2020年8月25日星期二,第6頁,編譯原理課程在計算機科學中的地位,2020年8月25日星期二,第7頁,學習本課程的目的和任務,加深對編程語言設計和實現(xiàn)的理解,對和編程語言有關的理論有所了解,對宏觀上把握編程語言來說,起一個奠基的作用,提升自身的編程能力

4、 掌握編譯程序的基本結構,掌握常用的編譯技術和方法,將編譯原理的理論和方法應用于一般的軟件設計中 培養(yǎng)團隊協(xié)作能力,2020年8月25日星期二,第8頁,本課程的特點,(1) 本課程理論性很強,學習時需要很強的邏輯思維能力 (2) 涉及的算法復雜,要深入地理解這些算法很困難 (3) 整個編譯程序的構造方法非常精妙,就像一部走時精確的時鐘,很多齒輪、部件協(xié)調地運轉,以驅動指針準確地旋轉;編譯程序也是如此,一邊掃描源程序,一邊經過各個部件的運算,準確地輸出為目標語言。 (4) 編譯原理課程各個部分之間的獨立性很強,包括詞法分析、語法分析、存儲的組織與分配、中間語言、語法制導翻譯、代碼生成與優(yōu)化這幾大

5、部分。詞法分析和語法分析是其中的重點,語言分析也是難點,需要掌握比較復雜的算法邏輯;其他部分相對來說知識性更強一些。各部分之間的方法也互相獨立,在學習時,便于逐個擊破。 (5) 考試考查的內容相對來說是很穩(wěn)定的,絕大多數(shù)題目的解法都非常機械。,2020年8月25日星期二,第9頁,學習方法,(1) 盡可能地掌握編譯原理的思想,要站得高一點,盡可能理解算法的思想,而不是背固定的算法。應該盡力理解為什么要這樣做,逐漸在頭腦中建立起編譯器的整體概念,而不是零零散散的一些算法。 (2) 很多題目的解法比較固定,要熟練掌握相應的具體方法。 (3) 多做習題, 對于編譯這樣的學科,題目的規(guī)模很大,步驟繁多,

6、而且前面的步驟一旦出錯,后面都錯。 (4) 要扎扎實實地牢記重要算法,配合大量的習題進行練習,達到拿到題目就可以動手做的地步。 (5) 一邊學習,一邊總結,關鍵是找差異:同一問題可以用多種方法來求解,不同方法適用于不同的文法,對文法的限制和要求,相應的表格的構造、使用等,各個方面的差異都要關注。 (6) 親自動手實現(xiàn)書上的一些算法,完成實驗指導書上給出的一個簡單的編譯程序,或者編譯程序的一部分,這樣能更靈活地掌握編譯程序構造的精髓。,2020年8月25日星期二,第10頁,編譯技術的發(fā)展,1954年至1957年間,F(xiàn)ORTRAN語言及其編譯器的開發(fā)?;?8個人年。 幾乎與此同時,Noam Ch

7、omsky開始研究語言文法(grammar,結構規(guī)則)的難易程度以及識別它們所需的算法來為語言分類。 在6 0年代和7 0年代進行的分析問題(parsing problem,用于限定上下文無關語言的識別的有效算法)的研究。 有窮自動機(finite automata)和正規(guī)式(regular expression) 的研究與喬姆斯基的研究幾乎同時開始,引出了表示程序設計語言的單詞的符號方式。 接著又深化了生成有效的目標代碼的方法,這就是最初的編譯器,實際上應稱作代碼改進技術(code improvement technique)。 當分析問題變得好懂起來時,人們就在開發(fā)程序上花費了很大的功夫來

8、研究這一部分的編譯器的自動構造。Lex與Yacc。 在70年代后期和80年代早期,大量的項目都關注于編譯器其他部分的生成自動化,這其中就包括了代碼生成。這些嘗試并未取得多少成功。,2020年8月25日星期二,第11頁,編譯器設計最近的發(fā)展,與復雜的程序設計語言的發(fā)展結合在一起。如用于函數(shù)語言編譯的Hindley-Milner類型檢查的統(tǒng)一算法。 編譯器已成為基于窗口的交互開發(fā)環(huán)境(IDE)的一部分,IDE的標準并沒有多少,但已對標準的窗口環(huán)境進行了開發(fā)。近年來對此進行了大量研究,但是基本的編譯器設計近20年來沒有多大的改變,現(xiàn)在正迅速地成為計算機科學課程中的中心一環(huán)。 由多處理機的發(fā)展以及對并

9、行處理的要求,最近的研究方向是并行編譯。 隨著嵌入式應用的迅速增長,推動了交叉編譯技術的發(fā)展;對系統(tǒng)芯片設計方法和關鍵EDA技術的研究,也帶動了專用語言VHDL等及其編譯技術的不斷深化。,2020年8月25日星期二,第12頁,編譯技術的應用,語言的結構化編輯器 :Turbo-Edit、editplus和Ultraedit等 語言程序的調試工具 語言程序的測試工具 高級語言之間的轉換工具 交叉編譯程序,引 論,第一章,2020年8月25日星期二,第14頁,本章要求,主要內容:各種翻譯程序的概念,編譯過程和階段劃分,編譯程序的組成和結構,編譯程序的構造方法 重點掌握:編譯程序工作的基本過程及其各階

10、段的基本任務,編譯程序總框。,2020年8月25日星期二,第15頁,機器語言 (machine language) C7 06 0000 0002 匯編語言 (assembler language) MOV X , 2 高級語言 (high-level language) X = 2,為什么要使用編譯器?,2020年8月25日星期二,第16頁,計算機中的語言層次和轉換關系,2020年8月25日星期二,第17頁,操作系統(tǒng) 匯編語言,編譯程序所處的層次,計算機硬件,2020年8月25日星期二,第18頁,1.1 什么叫編譯程序,翻譯程序:能夠將某種語言寫的程序轉換成另一種語言的程序,而且后者與前者在

11、邏輯上是等價的。 編譯程序:是一種將高級語言程序(源程序)翻譯成低級語言(目標程序)的程序 解釋程序:接受某高級語言的一個語句輸入,進行解釋并控制計算機執(zhí)行,馬上得到這句的執(zhí)行結果,然后再接受下一句。,2020年8月25日星期二,第19頁,1.1 什么叫編譯程序,編譯程序(Compiler)將高級程序設計語言程序翻譯成邏輯上等價的低級語言(匯編語言,機器語言)程序的翻譯程序。 功能,編譯程序,源程序,目標程序,計算機運行,輸入數(shù)據(jù),結果,2020年8月25日星期二,第20頁,解釋程序,解釋程序(Interpreter)將高級程序設計語言寫的源程序作為輸入,邊解釋邊執(zhí)行源程序本身,而不產生目標程

12、序的翻譯程序。 功能,解釋程序,源程序,輸入數(shù)據(jù),結果,2020年8月25日星期二,第21頁,對編譯程序的一些說明,編譯程序實質上是一個翻譯程序,要注意等價變換 本課程的任務就是講解在這個轉換過程中所涉及到的一些理論和方法,最后,使用這些理論和方法,自己編寫一個小的編譯器 轉換是一個總體的功能,要抓住總體結構,逐層細分,寫編譯器時要體現(xiàn)軟件工程中軟件設計的原則,自頂向下,逐層分解。 編譯器要完成的轉換任務相當復雜,實現(xiàn)編譯器時必須分步驟分階段實現(xiàn)。分階段實現(xiàn)的好處是能夠簡化程序的設計,當然也可以不分階段實現(xiàn)。,2020年8月25日星期二,第22頁,編譯程序的分類,診斷編譯程序 優(yōu)化編譯程序 可

13、變目標編譯程序 交叉編譯程序,2020年8月25日星期二,第23頁,與編譯程序相關的程序,解釋程序(Interpreter) 匯編程序(assembler) 連接程序(linker) 連接系統(tǒng)函數(shù)與系統(tǒng)資源 裝入程序(loader) 重定位(relocation) 預處理器(Preprocessor) 編輯器(editor) Debugger,Profiler,Project Manager,2020年8月25日星期二,第24頁,編譯原理是討論編譯程序設計的基本理論、基本概念、基本方法,什么是編譯原理,2020年8月25日星期二,第25頁,1.2 編譯過程概述,1、邏輯上分五個階段:詞法分析、

14、語法分析、語義分析與中間代碼生成、代碼優(yōu)化、目標代碼生成 每個階段把源程序從一種表示變換成另一種表示,2020年8月25日星期二,第26頁,按照詞法分析、語法分析、語義分析等這種方式來劃分階段的原因是:每個階段的復雜程度不同,所依據(jù)的理論基礎不同,實現(xiàn)時采用的方法也不同。主要是方便理解和實現(xiàn)。 劃分階段的依據(jù)是什么?每個階段所實現(xiàn)的功能相對獨立。,2020年8月25日星期二,第27頁,第一階段:詞法分析,任務:從左到右掃描源程序,識別出每個單詞 附加任務:a、濾掉空格 b、識別單詞 單詞符號是語言的基本組成成分 詞法分析的工作主要依據(jù)語言的詞法規(guī)則,描述詞法規(guī)則的有效工具是正規(guī)式和有限自動機。

15、 單詞的種類: (1) 標識符 (2) 關鍵字(char、int、if、else、switch、while、for等) (3) 運算符(即運算符號 +、*、/、,例:,2020年8月25日星期二,第29頁,第二階段:語法分析,任務: 在詞法分析的基礎上,根據(jù)語言的語法規(guī)則,將單詞符號串分解成各類語法短語(例:程序、語句、表達式)。 確定整個輸入串是否構成語法上正確的程序。 根據(jù)規(guī)則判定:賦值語句:標識符:表達式 表達式:標識符、常數(shù)是表達式; 表達式的運算也是表達式 例:識別符號串id1:=int1 + id2 * id3 + id2 * id3(即 result:= 5B * CB * C)

16、是一個賦值語句, 而int1 + id2 * id3 + id2 * id3 (5B * CB * C) 是一個表達式,2020年8月25日星期二,第30頁,語法分析所依據(jù)的是語言的語法規(guī)則, 表示語法規(guī)則的工具是上下文無關文法,用下推自動機實現(xiàn)。,id1:=int1 + id2 * id3 + id2 * id3,2020年8月25日星期二,第31頁,第三階段:語義分析和中間代碼生成,任務:對語法分析所識別出的各類語法范疇分析其含義,進行初步的翻譯(翻譯成中間代碼)。 靜態(tài)語義審查 變量定義 類型匹配 類型轉換 例:C:=A*B (檢查C與、類型) 中間代碼的翻譯 中間代碼有多種形式,如:

17、四元式: (運算符,運算對象1,運算對象2,結果),2020年8月25日星期二,第32頁,例:對賦值語句: id1:=int1 + id2 * id3 + id2 * id3 1. 檢查result、C是否定義、類型 2. 生成中間代碼,(運算符,運算對象1,運算對象2,結果) (*, id2, id3, T1) (+, int1, T1, T2) (*, id2, id3, T3) (+, T2, T3, T4) (:=, T4, _, id1),id1:=int1 + id2 * id3 + id2 * id3,2020年8月25日星期二,第33頁,第四階段: 代碼優(yōu)化,任務:對已產生的中

18、間代碼進行加工變換,使生成的目標代碼更為高效(時間和空間)。 優(yōu)化方法包括:公共子表達式的提取、循環(huán)優(yōu)化、刪除無用代碼等。 代碼的優(yōu)化依據(jù)的是程序的等價變換規(guī)則。,2020年8月25日星期二,第34頁,第五階段:目標代碼的生成,任務:把中間代碼(或經優(yōu)化的中間代碼)變換成特定機器上的低級語言代碼。 依賴于機器的硬件系統(tǒng)結構和機器指令的含義 目標代碼可以是:絕對指令代碼、可重定位的指令代碼、匯編指令代碼,2020年8月25日星期二,第35頁,1.3編譯程序的結構,由左圖可以看出,詞法分析是實現(xiàn)編譯器的基礎,語法分析是實現(xiàn)編譯器的關鍵。 因此按照這個順序來實現(xiàn)編譯器 每一步的實現(xiàn)都依賴于一定的理論

19、基礎。 數(shù)學,尤其是離散數(shù)學是程序設計方法學的理論基礎,2020年8月25日星期二,第36頁,1.3 編譯程序的結構(續(xù)),幾個概念 符號表:登記源程序中出現(xiàn)的名字以及名字的各種屬性 遍:對源程序或源程序的中間結果從頭到尾掃描一次,并作有關的加工處理,生成新的中間結果或目標程序。 編譯前端:主要指與源語言有關,與目標語言無關的部分,通常包括詞法分析、語法分析、語義分析和中間代碼生成,與機器無關部分的代碼優(yōu)化 編譯后端:指與目標機器有關的部分。如與機器有關的優(yōu)化、目標代碼生成,2020年8月25日星期二,第37頁,編譯階段的組合,2020年8月25日星期二,第38頁,為什么生成中間代碼,2020

20、年8月25日星期二,第39頁,1.3 編譯程序的結構(續(xù)),(1) 記號(token) 當掃描程序將字符收集到一個記號中時,它通常是以符號表示這個記號;這也就是說,作為一個枚舉數(shù)據(jù)類型的值來表示源程序的記號集。,編譯程序中的主要數(shù)據(jù)結構:,2020年8月25日星期二,第40頁,編譯程序中的主要數(shù)據(jù)結構,(2) 語法樹(syntax tree) 如果分析程序確實生成了語法樹,它的構造通常為基于指針的標準結構,在進行分析時動態(tài)分配該結構,則整棵樹可作為一個指向根節(jié)點的單個變量保存。結構中的每一個節(jié)點都是一個記錄,它的域表示由分析程序和之后的語義分析程序收集的信息。,2020年8月25日星期二,第4

21、1頁,(3) 符號表(symbol table) 這個數(shù)據(jù)結構中的信息與標識符有關:函數(shù)、變量、常量以及數(shù)據(jù)類型。符號表幾乎與編譯器的所有階段交互:掃描程序、分析程序或將標識符輸入到表格中的語義分析程序;語義分析程序將增加數(shù)據(jù)類型和其他信息;優(yōu)化階段和代碼生成階段也將利用由符號表提供的信息選出恰當?shù)拇a。因為對符號表的訪問如此頻繁,所以插入、刪除和訪問操作都必須比常規(guī)操作更有效。盡管可以使用各種樹的結構,但雜湊表卻是達到這一要求的標準數(shù)據(jù)結構。有時在一個列表或棧中可使用若干個表格。,編譯程序中的主要數(shù)據(jù)結構:,2020年8月25日星期二,第42頁,(4) 常數(shù)表(literal table) 常數(shù)表的功能是存放在程序中用到的常量和字符串,因此快速插入和查找在常數(shù)表中也十分重要。但是,在其中卻無需刪除,這是因為它的數(shù)據(jù)全程應用于程序而且常量或字符串在該表中只出現(xiàn)一次。,編譯程序中的主要數(shù)據(jù)結構:,2020年8月25日星期二,第43頁,(5) 中間代碼(intermediate code) 根據(jù)中間代碼的類型(例如三元式代碼)和優(yōu)化的類型,該代碼可以是文本串的數(shù)組、臨時文本文件或是結構的連接列

溫馨提示

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

最新文檔

評論

0/150

提交評論