第一篇:經(jīng)典美文呼喚“經(jīng)典”編譯
經(jīng)典美文呼喚“經(jīng)典”編譯
《在馬克思墓前的講話》,這篇文章是一位世界無產(chǎn)階級的偉大導(dǎo)師為另一位偉大導(dǎo)師所寫的悼詞。自入選高中語文課本以來,歷經(jīng)數(shù)次課本的變化,許多名家大家的作品相繼被置換,這篇文章卻穩(wěn)如泰山,成了高中語文教材的保留課文。筆者多次講授這篇課文,發(fā)現(xiàn)文中誤譯較多,也查找了多種版本的教材,所選的這篇課文都一樣,甚至連標(biāo)點(diǎn)也絲毫不差?,F(xiàn)一一指出,有待方家指正。
一、標(biāo)點(diǎn)之誤
“正像達(dá)爾文發(fā)現(xiàn)有機(jī)界的發(fā)展規(guī)律一樣,馬克思發(fā)現(xiàn)了人類歷史的發(fā)展規(guī)律,即歷來為繁蕪叢雜的意識形態(tài)所掩蓋著的一個簡單事實(shí):人們首先必須吃、喝、住、穿,然后才能從事政治、科學(xué)、藝術(shù)、宗教等等;所以,直接的物質(zhì)的生活資料的生產(chǎn),從而一個民族或一個時代的一定的經(jīng)濟(jì)發(fā)展階段,便構(gòu)成基礎(chǔ)……”
其中“然后才能從事政治、科學(xué)、藝術(shù)、宗教等等”后的分號,明顯是一處誤用,因?yàn)榉痔柍S糜凇氨硎疽痪湓捴虚g并列分句之間的停頓”。而“人們首先必須吃、喝、住、穿,然后才能從事政治、科學(xué)、藝術(shù)、宗教等等”是一個完整的句子,與“所以,直接的物質(zhì)的生活資料的生產(chǎn),從而一個民族或一個時代的一定的經(jīng)濟(jì)發(fā)展階段,便構(gòu)成基礎(chǔ)……”既非同屬一個句子,也非并列分句,所以此處應(yīng)該用句號。
還有第四段,“不僅如此。馬克思還發(fā)現(xiàn)了現(xiàn)代資本主義生產(chǎn)方式和它所產(chǎn)生的資產(chǎn)階級社會的特殊的運(yùn)動規(guī)律?!薄安粌H……還……”,它是一套關(guān)聯(lián)詞,是一句話,中間不能用句號隔開,明顯應(yīng)該用逗號。
第七段“最早的《萊茵報》(1842年),巴黎的《前進(jìn)報》(1844年),《德意志―布魯塞爾報》(1847年),《新萊茵報》(1848―1849年),《紐約每日論壇報》(1852―1861年)”,各個報紙名稱的羅列,相當(dāng)于各個名詞的羅列,各名詞間的停頓應(yīng)用頓號,不能用逗號。
二、連詞之誤
第三段中“直接的物質(zhì)的生活資料的生產(chǎn),從而一個民族或一個時代的一定的經(jīng)濟(jì)發(fā)展階段,便構(gòu)成基礎(chǔ)”,其中“從而”一詞,解釋為“上文是原因、方法等,下文是結(jié)果、目的等;因此就?!笨梢?,它是一個表因果關(guān)系的關(guān)聯(lián)詞,而此處“從而”前是一個短語,其中心語是“生產(chǎn)”,其后的短語中心語是“經(jīng)濟(jì)發(fā)展階段”,二者是并列關(guān)系,不具備使用“從而”的條件,應(yīng)換作“以及”等詞。還有“人們的國家設(shè)施、法的觀點(diǎn)、藝術(shù)以至宗教觀念,就是從這個基礎(chǔ)上發(fā)展起來的”,其中的“以至”,“表示在時間、數(shù)量、程度、范圍上的延伸?!倍皣以O(shè)施、法的觀點(diǎn)、藝術(shù)”與“宗教觀念”明顯是并列關(guān)系,并不存在“延伸”。
三、語序之誤
課文第二段“這個人的逝世,對于歐美戰(zhàn)斗的無產(chǎn)階級,對于歷史科學(xué),都是不可估量的損失。這位巨人逝世以后所形成的空白,不久就會使人感覺到。”應(yīng)改為“這個人的逝世,對于歷史科學(xué),對于歐美戰(zhàn)斗的無產(chǎn)階級,都是不可估量的損失。這位巨人逝世以后所形成的空白,不久就會使人感覺到?!边@樣才能與下文照應(yīng),因?yàn)椋逻叺谌?、四、五、六段寫的多是歷史科學(xué),七、八兩段寫的是馬克思對于歐美戰(zhàn)斗的無產(chǎn)階級所做的付出。
還有,第六段開頭“他作為科學(xué)家就是這樣。但是這在他身上遠(yuǎn)不是主要的?!本瓦@句話分析,它是一個過渡句,承上而啟下,那么所“啟”的就不應(yīng)該是作為科學(xué)家的一面,而應(yīng)該是別的方面。但譯文卻譯出了:“在馬克思看來,科學(xué)是一種在歷史上起推動作用的、革命的力量。任何一門理論科學(xué)中的每一個新發(fā)現(xiàn)――它的實(shí)際應(yīng)用也許還根本無法預(yù)見――都使馬克思感到衷心喜悅,而當(dāng)他看到那種對工業(yè)、對一般歷史發(fā)展立即產(chǎn)生革命性影響的發(fā)現(xiàn)的時候,他的喜悅就非同尋常了。例如,他曾經(jīng)密切注視電學(xué)方面各種發(fā)現(xiàn)的進(jìn)展情況,不久以前,他還密切注視馬賽爾?德普勒的發(fā)現(xiàn)?!?這還是馬克思作為科學(xué)家的一面。若把這句話放于第七段開頭,是比較恰當(dāng)?shù)??!八鳛榭茖W(xué)家就是這樣,但是這在他身上遠(yuǎn)不是主要的,因?yàn)轳R克思首先是一個革命家。他畢生的真正使命,就是以這種或那種方式參加推翻資本主義社會及其所建立的國家設(shè)施的事業(yè)……”正好可以做到“承上”,即承三、四、五、六段寫的歷史科學(xué);亦可做到“啟下”,即啟七、八兩段寫的馬克思對于無產(chǎn)階級所做的付出。
四、語法之誤
“最早的《萊茵報》(1842年),巴黎的《前進(jìn)報》(1844年),《德意志―布魯塞爾報》(1847年),《新萊茵報》(1848―1849年),《紐約每日論壇報》(1852―1861年),以及許多富有戰(zhàn)斗性的小冊子,在巴黎、布魯塞爾和倫敦各組織中的工作”,這段話沒有一個動詞,亦無主語,相當(dāng)于幾個名詞羅列在一塊,不知所云,嚴(yán)重違反語法規(guī)范。
恩格斯的原文寫得非常流暢而嚴(yán)密,富有感情與文采,堪作議論文與悼詞的典范。既然作為一篇保留的課文,就要把它翻譯好,譯出恩格斯思維的嚴(yán)密,譯出恩格斯情感的真摯,把一篇經(jīng)典譯成經(jīng)典。
本文系教育部人文社會科學(xué)研究規(guī)劃基金項(xiàng)目“中學(xué)生經(jīng)典閱讀誤讀研究”(10YJA880178)的階段性研究成果之一。
參考文獻(xiàn):
[1]中國社會科學(xué)院語言研究所詞典編輯室.現(xiàn)代漢語詞典(第5版)[Z].北京:商務(wù)印書館,2008.(師修武 河南省淮陽中學(xué) 466700)
第二篇:編譯原理課程設(shè)計
課 程 設(shè) 計 報 告
設(shè)計題目:一個簡單文法的編譯器前端的設(shè)計與實(shí)現(xiàn)
班
級: 計算機(jī)1206 組長學(xué)號:201239 組長姓名:閆智宣 指導(dǎo)教師:李曉華 設(shè)計時間:2014年12月
[在此處鍵入]
設(shè)計分工
組長學(xué)號及姓名: 20123974
閆智宣
分工:
語法分析,四元式生成,目標(biāo)代碼優(yōu)化及生成 組員1學(xué)號及姓名:20123977
廖峭 分工:
詞法分析,錯誤處理 組員2學(xué)號及姓名:20123959
郭天龍
分工:
符號表生成,語義動作插入,操作界面[在此處鍵入]
摘要
編譯原理課程設(shè)計是通過C語言編譯器相關(guān)子系統(tǒng)的設(shè)計,進(jìn)一步加深對編譯器構(gòu)造的理解;第一部分詞法分析,設(shè)計各單詞的狀態(tài)轉(zhuǎn)換圖,并為不同的單詞設(shè)計種別碼,制作掃描器識別一個個單詞,返回值為識別碼的序號,返回Token序列。將詞法分析器設(shè)計成供語法分析器調(diào)用的子程序。詞法分析器具備預(yù)處理功能。將不翻譯的注釋等符號先濾掉,只保留要翻譯的符號串,即要求設(shè)計一個供詞法分析調(diào)用的預(yù)處理子程序;第二部分,語法分析,用遞歸下降法,實(shí)現(xiàn)對表達(dá)式、各種說明語句、控制語句進(jìn)行語法分析。若語法正確,則用語法制導(dǎo)翻譯法進(jìn)行語義翻譯;生成并打印出語法樹;若語法錯誤,要求指出出錯性質(zhì)和出錯位置(行號)。
我們還做了附加功能,即編譯后端,有中間代碼優(yōu)化,生成目標(biāo)代碼匯編語言。通過此次課程設(shè)計,提高了我們的獨(dú)立分析問題、解決問題的能力,以及系統(tǒng)軟件設(shè)計的能力; 提高程序設(shè)計能力、程序調(diào)試能力,團(tuán)結(jié)協(xié)作能力
關(guān)鍵詞:詞法分析,語法分析,四元式生成,錯誤處理,符號表生成,語義動作插入,中間代碼優(yōu)化,生成目標(biāo)代碼 [在此處鍵入]
目錄
摘要
1.概述
2.課程設(shè)計任務(wù)及要求
2.1 設(shè)計任務(wù)
2.2 設(shè)計要求
3.算法及數(shù)據(jù)結(jié)構(gòu)
3.1算法的總體思想(流程)
3.2 詞法分析模塊
3.2.1 功能
3.2.2 數(shù)據(jù)結(jié)構(gòu)
3.2.3 算法
3.3 語法分析模塊
3.3.1功能
3.3.2 數(shù)據(jù)結(jié)構(gòu)
3.3.3算法
3.4 符號表模塊
3.4.1功能
3.4.2 數(shù)據(jù)結(jié)構(gòu)
3.4.3算法
3.5 四元式模塊
3.5.1功能
[在此處鍵入]
3.5.2 數(shù)據(jù)結(jié)構(gòu)
3.5.3算法
3.6 語義動作分析模塊
3.6.1功能 3.6.2 數(shù)據(jù)結(jié)構(gòu)
3.6.3算法
3.7 錯誤處理模塊
3.7.1功能
3.7.2 數(shù)據(jù)結(jié)構(gòu)
3.7.3算法
3.8 目標(biāo)代碼模塊
3.8.1功能
3.8.2 數(shù)據(jù)結(jié)構(gòu)
3.8.3算法
4.程序設(shè)計與實(shí)現(xiàn)
4.1 程序流程圖
4.2 程序說明
4.3 實(shí)驗(yàn)結(jié)果
5.結(jié)論 6.參考文獻(xiàn)。7.收獲、體會和建議。
[在此處鍵入]
1.概述
編譯器是將C語言翻譯為匯編語言代碼的計算機(jī)程序。編譯器將源程序(source language)編寫的程序作為輸入,翻譯產(chǎn)生目標(biāo)語言(target language)機(jī)器代碼的等價程序。通常地,源程序?yàn)楦呒壵Z言(high-level language),C語言程序,而目標(biāo)則是 機(jī)器語言的目標(biāo)代碼(object code),也就是可以在計算機(jī)硬件中運(yùn)行的機(jī)器代碼軟件程序。這一過程可以表示為:
源程序→編譯器 →目標(biāo)機(jī)器代碼程序
2.課程設(shè)計任務(wù)及要求
2.1設(shè)計任務(wù)
學(xué)生在學(xué)習(xí)《編譯原理》課程過程中,結(jié)合各章節(jié)的構(gòu)造編譯程序的基本理論,要求用C#語言描述及上機(jī)調(diào)試,實(shí)現(xiàn)一個 C編譯程序(包括詞法分析,語法分析等重要子程序),使學(xué)生將理論與實(shí)際應(yīng)用結(jié)合起來,受到軟件設(shè)計等開發(fā)過程的全面訓(xùn)練,從而提高學(xué)生軟件開發(fā)的能力。
2.2設(shè)計要求 要求:
(1)設(shè)計詞法分析器
設(shè)計各單詞的狀態(tài)轉(zhuǎn)換圖,并為不同的單詞設(shè)計種別碼。將詞法分析器設(shè)計成供語法分析器調(diào)用的子程序。功能包括:
a.具備預(yù)處理功能。將不翻譯的注釋等符號先濾掉,只保留要翻譯的符號串,即要求設(shè)計一個供詞法分析調(diào)用的預(yù)處理子程序;
b.能夠拼出語言中的各個單詞; [在此處鍵入]
c.返回(種別碼,屬性值,行號)。
(2)語法分析
要求用學(xué)習(xí)過的自底向上或自頂向下的分析方法等,實(shí)現(xiàn)對表達(dá)式、各種說明語句、控制語句進(jìn)行語法分析。若語法正確,則用語法制導(dǎo)翻譯法進(jìn)行語義翻譯;生成并打印出語法樹;若語法錯誤,要求指出出錯性質(zhì)和出錯位置(行號)。
3.算法及數(shù)據(jù)結(jié)構(gòu)
3.1算法的總體思想(流程)
本節(jié)主要分析程序的代碼結(jié)構(gòu)和代碼工程文件的劃分。(程序由幾個類組成: Token類和Variable類SymbolTable類ObjectCode類Lexical類Grammar類Four_Yuan類Action類ErrorItem類,分別為詞法分析和語法分析類。工程分為幾個文件:Form1.cs,Token.cs,Variable.cs,SymbolTable.cs,ObjectCode.cs,Lexical.cs,Grammar.cs,Four_Yuan,cs,Action.cs,ErrorItem.cs分別對應(yīng)Token類和Variable類SymbolTable類ObjectCode類Lexical類Grammar類Four_Yuan類Action類ErrorItem類的聲明和實(shí)現(xiàn)文件)。本程序采用C#語言以面向?qū)ο蟮乃枷刖帉?,程序分為幾部分:詞法分析(Lexical),語法分析(Grammer),目標(biāo)代碼生成(ObjectCode)。Lexical類主要的工作是詞法分析獲取Token。Grammer類的主要工作是根據(jù)Lexical類詞法分析之后的Token進(jìn)行語法分析,生成語法樹,最后并輸出語法樹。在處理過程中,Token類的對象作為Lexical類的一個成員變量,配合Grammer類進(jìn)行語法分析。
工程文件總體上是按照九個類的格局分為十個文件,分別是九個類的聲明文件和實(shí)現(xiàn)文件。十個文件為Form1.cs,Token.cs,Variable.cs,SymbolTable.cs,ObjectCode.cs,Lexical.cs,Grammar.cs,Four_Yuan,cs,Action.cs,ErrorItem.cs,他們分別是Lexical類聲明文件、Lexical類實(shí)現(xiàn)文件、Grammer類聲明文件、Grammer類實(shí)現(xiàn)文件。[在此處鍵入]
程序流程
在程序中,Lexical類的對象(Token)作為Grammer類中的一個成員變量,配合Grammer類進(jìn)行語法分析。它們的關(guān)系是這樣的:Grammer類的一個成員變量temp首先對源程序刪除注釋,然后進(jìn)行詞法分析獲取所有Token,并將獲取的Token存儲在Token對象的tokenList(List類型)中。然后Grammer類的語法分析程序就根據(jù)tokenList中的Token進(jìn)行語法分析,生成語法樹,最后打印語法樹。同時,這也是程序的流程。[在此處鍵入]
3.2 詞法分析模塊 3.2.1功能
Lexical類主要的工作是詞法分析獲取Token序列。
3.2.2數(shù)據(jù)結(jié)構(gòu)
詞法分析階段的代碼被封裝成一個類——Lexical,Token中主要是Lexical類的聲明代碼,Lexical.cs中主要是Lexical類的實(shí)現(xiàn)代碼。Lexical類對外提供的函數(shù)主要有:
static public int RecogId(string str, int i),static public int RecogDig(string str,int i),static public int RecogOperator(string str, int i),static public int RecogBound(string str, int i),以上幾個函數(shù)構(gòu)成了詞法分析的骨架,在Lexical類中還有其他成員變量和函數(shù),主要作為這三個函數(shù)處理過程的中間步驟,為這三個函數(shù)服務(wù)。Lexical類的代碼結(jié)構(gòu)和主要的成員變量和函數(shù)及其含義如下圖所示:
3.2.3算法
算法的基本任務(wù)是從字符串表示的源程序中識別出具有獨(dú)立意義的單詞符號,其基本思想是[在此處鍵入]
根據(jù)掃描到單詞符號的第一個字符的種類,拼出相應(yīng)的單詞符號。
主程序示意圖:
主程序示意圖如圖3-1所示。
⑴ 關(guān)鍵字表的初值。
關(guān)鍵字作為特殊標(biāo)識符處理,把它們預(yù)先安排在一張表格中(稱為關(guān)鍵字表),當(dāng)掃描程序識別出標(biāo)識符時,查關(guān)鍵字表。如能查到匹配的單詞,則該單詞為關(guān)鍵字,否則為一般標(biāo)識符。
(2)程序中需要用到的主要變量為type和number 掃描子程序的算法思想:
首先設(shè)置3個變量: [在此處鍵入]
①token用來存放構(gòu)成單詞符號的字符串; ②number用來整型單詞;
③type用來存放單詞符號的種別碼。
Token定義
Token定義:
Token類型(TokenType):
3.3 語法分析模塊
3.3.1功能
語法分析是編譯過程的一個邏輯階段。語法分析的功能是在詞法分析的基礎(chǔ)上將單詞序列組合成各類語法短語,如“程序”,“語句”,“表達(dá)式”等等.語法分析程序判斷源程序在結(jié)構(gòu)上是否正確.源程序的結(jié)構(gòu)由上下文無關(guān)文法描述.3.3.2 數(shù)據(jù)結(jié)構(gòu)
下圖為實(shí)現(xiàn)語法分析的類Grammar,屬性與方法的作用都已說明 在此處鍵入]
3.3.3算法
1.文法
下面終結(jié)符與非終結(jié)符意義
B程序開始
Z 數(shù)據(jù)類型,如int,char,float等
V 標(biāo)識符
S 語句
P 語句塊
E 加減算術(shù)表達(dá)式
D 逗號表達(dá)式
T 乘除算術(shù)表達(dá)式
C 關(guān)系表達(dá)式
L 邏輯表達(dá)式
Q 標(biāo)識符或圓括號
e 表示空
i 表示標(biāo)識符 a)函數(shù)文法
B----ZV()S
[
[在此處鍵入]
b)語句塊文法
P----SP|e
S----{P} c)語句文法
表達(dá)式語句文法
S----V=E
goto語句文法
S----i:S
S----goto i
if語句文法
S----if(E)S[else S]
while語句文法
S----while(E)S
聲明語句文法
S----ZVD
D----,VD|=ED|e d)表達(dá)式文法
E----T|E+T|E-T
T----F|T*F|T/F
C----C|C
L----Q|L&&Q|L||Q
Q----i|(E)|!Q
2.遞歸下降程序流程圖
對應(yīng)于每個文法編寫如下遞歸下降子程序
主程序(B)[在此處鍵入] [在此處鍵入]
3.4 符號表模塊
3.4.1功能
進(jìn)行符號表的儲存,添加,更新,查找,保存標(biāo)識符活躍信息以及輸出。3.4.2 數(shù)據(jù)結(jié)構(gòu)
在此處鍵入]
3.4.3算法
3.5 四元式模塊
3.5.1功能
四元式為中間代碼,編譯程序進(jìn)行完語義分析后,先生成中間代碼作為過渡,此時中間代碼與目標(biāo)代碼已經(jīng)比較相似
3.5.2 數(shù)據(jù)結(jié)構(gòu)
[ 在此處鍵入]
3.5.3算法
3.6語義動作分析模塊
3.6.1功能
在語法分析中嵌入相應(yīng)的語義動作,生成四元式 3.6.2 數(shù)據(jù)結(jié)構(gòu)
[
[在此處鍵入]
3.6.3算法 GEQ(+)(-)(*)(/)
(+,i1,i2,t)PUSH(i)ASSI(=)
(=,t,_,POP)LABER(i)
(lb,_,_,i)GOTO(i)
(gt,_,_,i)IF(if)
(if,a,_,_)EL(el)
(el,_,_,_)IE(ie)
(ie,_,_,_)WH()
(wh,_,_,_)DO()
(do,a,_,_)WE(we)
(we,_,_,_)
3.7 錯誤處理模塊
3.7.1功能 保存運(yùn)行時發(fā)現(xiàn)的錯誤,儲存行號已經(jīng)詳細(xì)信息并輸出。
3.7.2 數(shù)據(jù)結(jié)構(gòu)
3.7.3算法 [在此處鍵入]
public static void AddErrorMessage(int lineno,string content)函數(shù)用作在發(fā)現(xiàn)錯誤時保存錯誤信息以及行號。
public static string PrintErrorList()把所有發(fā)現(xiàn)的錯誤格式化后統(tǒng)一輸出。
錯誤信息在語法分析,語義分析,符號表檢錯中添加。3.8 目標(biāo)代碼模塊
3.8.1功能
目標(biāo)代碼生成把優(yōu)化后的中間代碼變換成目標(biāo)代碼,此處的目標(biāo)代碼為匯編代碼,采用單寄存器生成目標(biāo)代碼 3.8.2 數(shù)據(jù)結(jié)構(gòu)[在此處鍵入]
3.8.3算法
對于一個基本塊有如下流程圖
W:操作符,B:第一操作數(shù),C:第二操作數(shù),R:寄存器
5.結(jié)論
網(wǎng)上找一段話抄上 [在此處鍵入]
6.測試
測試打開文件
測試保存文件
如果沒打開文件,直接敲代碼,點(diǎn)保存時會彈出另存為窗口[在此處鍵入]
測試錯誤檢測,程序缺少main函數(shù)的類型,錯誤列表中顯示第一行函數(shù)缺少錯誤類型。
測試錯誤檢測,程序缺少分號,錯誤列表中顯示該行缺少語句結(jié)束標(biāo)志';' 單擊錯誤列表,會自動選定錯誤行
編譯成功,生成并顯示token串、符號表、四元式與目標(biāo)代碼 [在此處鍵入]
測試if與while語句,而且while嵌套在if當(dāng)中
測試goto語句,結(jié)果正確。[在此處鍵入]
測試優(yōu)化,輸入課件中的代碼,結(jié)果與課件一樣
6.參考文獻(xiàn)。
1、陳火旺.《程序設(shè)計語言編譯原理》(第3版).北京:國防工業(yè)出版社.2000.2、美 Alfred V.Aho Ravi Sethi Jeffrey D.Ullman著.李建中,姜守旭譯.《編譯原理》.24 [在此處鍵入]
北京:機(jī)械工業(yè)出版社.2003.3、美 Kenneth C.Louden著.馮博琴等譯.《編譯原理及實(shí)踐》.北京:機(jī)械工業(yè)出版社.2002.4、金成植著.《編譯程序構(gòu)造原理和實(shí)現(xiàn)技術(shù)》.北京:高等教育出版社.2002.7.收獲、體會和建議。
直接拷貝好歹也檢查一下錯誤
對于編譯原理的這次課程設(shè)計,自己經(jīng)歷了從剛開始的不懂?明白任務(wù)的要求和內(nèi)容?理論知識的了解?開始著手寫代碼?完成基本功能?根據(jù)DFA及自頂向下等理論修改完善代碼等這些過程。
自己著手寫詞法分析的時候還不清楚詞法分析的任務(wù)內(nèi)容,還不知道詞法分析的結(jié)果是什么,詞法分析出錯的情況和類型有哪些,也總是將詞法分析和語法分析混在一起,不明白哪些錯誤在詞法分析中報,哪些錯誤在語法分析中判斷,后來經(jīng)過查書、網(wǎng)上資料、請教同學(xué)等途徑逐步清晰了詞法分析的工作內(nèi)容是從源代碼文件中獲取出Token,供語法分析使用。在充分了解了語法分析需要哪些信息時,我才真正了解了詞法分析的工作內(nèi)容和目標(biāo),才知道詞法分析需要完成哪些任務(wù)獲取到哪些信息。充分了解了詞法分析的任務(wù)之后,就開始理論知識的學(xué)習(xí)。經(jīng)過揣摩書上的例子,自己理解和掌握了怎么設(shè)計過濾注釋和分析程序中Token的DFA,于是開始根據(jù)設(shè)計好的DFA進(jìn)行編碼,最后經(jīng)過調(diào)試已經(jīng)可以正確地完成詞法階段的任務(wù)了。這只是詞法分析的原始代碼,在之后還進(jìn)行了兩次徹底的改動。雖然之前寫的詞法分析的代碼已經(jīng)完成了詞法分析的需求,也是根據(jù)DFA的原理編寫的,但是在代碼結(jié)構(gòu)上卻難以體現(xiàn),在對書上的根據(jù)已知DFA寫代碼的例子進(jìn)行了詳細(xì)的研究之后,發(fā)現(xiàn)自己的代碼并沒有像書上那樣完全按照所依據(jù)的DFA各狀態(tài)轉(zhuǎn)移的關(guān)系進(jìn)行編寫,所以對代碼進(jìn)行了重寫,像書上一樣嚴(yán)格按照狀態(tài)之間轉(zhuǎn)移的方式進(jìn)行編寫,將狀態(tài)劃分成11個狀態(tài),狀態(tài)分別按1~11進(jìn)行標(biāo)注,程序也按照DFA來編寫,也實(shí)現(xiàn)了詞法分析的功能。再后來寫報告的時候,發(fā)現(xiàn)分析出Token的那個DFA并不是最簡的,有很多多余的狀態(tài),完全可以用一個flag標(biāo)志來標(biāo)識,從而簡化代碼結(jié)構(gòu),于是又重寫了一次詞法分析函數(shù)scan()的代碼,將狀態(tài)縮減為5個,且不再用1-5來表示,而是像書上那樣分別取了名字(START、INNUM、INID、INDBSYM、DONE),同時為了簡化代碼將輸出Token到文件的部分從scan()中剝離開來,而在Lexical類中加了一個printToken()的函數(shù),使scan()函數(shù)邏輯更加清晰,使讀者能夠容易地將代碼與DFA進(jìn)行查看比照。
在寫語法分析的時候,已經(jīng)對編譯器的語法分析的內(nèi)容有了一定的了解,所以直接進(jìn)行了理論的學(xué)習(xí)。首先自己對遞歸向下分析法進(jìn)行了學(xué)習(xí),將書上的幾個遞歸向下分析的偽代碼看過之后,自己對遞歸向下的分析方法的原理有了初步的認(rèn)識,大概知道了根據(jù)文法怎么分析,但是對于如何編寫代碼卻還在此處鍵入]
是難以下手,于是就對照TINY語言的文法看了幾遍書后面的TINY語言的遞歸向下分析的語法分析程序,這樣就基本知道了C-語言的語法分析程序怎么寫。由于C-語言給出的文法有左遞歸存在,于是自己將存在左遞歸的文法改寫成EBNF的形式,并據(jù)此進(jìn)行代碼編寫。由于在編寫代碼的過程中需要確定分析是否正確或選擇多個文法中的某一個文法進(jìn)行分析,有時必須探測需要的或下一個Token的類型,在這種情況下需要求First集合,在推導(dǎo)中若存在empty,又需要求Follow集合,所以這樣又需要我了解First集合和Follow集合,自己在程序中也根據(jù)求出的First集合和Follow集合進(jìn)行判斷,以確定程序的走向。在編寫過程中,還有一類問題,就是存在公共左因子,如文法expression→ var = expression | simple-expression,左因子為ID,在分析過程中,由于已經(jīng)取出了一個ID的Token,且生成了一個IdK的節(jié)點(diǎn),但是在當(dāng)前狀態(tài)無法確定是哪一個推導(dǎo),然而IdK節(jié)點(diǎn)已經(jīng)生成,又無法回退,并且是使用自頂向下的分析方法,已經(jīng)生成的IdK在程序上方無法使用,自己通過查閱資料等途徑的學(xué)習(xí)確定了在這種情形下的處理方式:將已經(jīng)生成的IdK節(jié)點(diǎn)傳到下方的處理程序,所以TreeNode * simple_expression(TreeNode * k)、TreeNode * additive_expression(TreeNode * k)等函數(shù)都被設(shè)計成有節(jié)點(diǎn)類型參數(shù)的函數(shù),目的就是將已經(jīng)生成的節(jié)點(diǎn)傳到下面的分析函數(shù)中去。
通過這次的編譯原理課程的學(xué)習(xí)和實(shí)踐,自己獲益良多。首先最基本的成果是完成了課程設(shè)計的任務(wù),實(shí)現(xiàn)了編譯器的詞法分析和語法分析階段的功能,詞法分析主要能過濾注釋、分析出語法分析階段需要的Token并滿足語法階段的所有要求,能夠判別詞法分析階段是否出錯和出錯類型和位置。語法分析主要能根據(jù)遞歸向下的分析思想和C-文法對詞法分析獲取的Token進(jìn)行語法分析,能夠構(gòu)造出語法樹,能夠判別語法分析過程中是否出錯以及出錯位置和錯誤類型。
由于在編寫程序過程中,涉及到了正則表達(dá)式、DFA、提取公共左因子、消除左遞歸、EBNF、求First集合和Follow集合、遞歸向下分析方法以及編程語言方面的知識,所以,通過本次的課程設(shè)計的實(shí)踐,使得自己對編譯原理這門課的許多知識點(diǎn)有了更加深刻和具體的理解,而不再只限制于做題。此外,對以前那些已掌握的知識有了溫習(xí)和動手鍛煉的機(jī)會。如:以前在編譯原理課上雖然知道First集合和Follow集合怎么求的,卻不知道First集合和Follow集合到底是干什么的,通過編寫程序自己明白了他們的實(shí)際作用,使得自己不僅知其然還知其所以然,從而使得自己加深了對知識點(diǎn)的理解和掌握。由于以前編寫代碼都是使用JAVA語言,所以C/C++很多內(nèi)容都忘記了,通過本次的實(shí)踐,自己又重新拾起了以前的知識。此外,由于在做報告的時候,需要描繪DFA和程序流程圖,使得自己初步掌握了使用visio和word畫圖的能力。此外,對于文檔的編寫和美化自己也獲得了許多有用的經(jīng)驗(yàn)。[
第三篇:編譯原理 學(xué)習(xí)心得
國際學(xué)院 0802 楊良燕 200819100227
《編譯原理》課程學(xué)習(xí)心得
《編譯原理》是計算機(jī)專業(yè)的一門重要課程,正如教材
第一章的引論所述,“編譯程序是現(xiàn)代計算機(jī)系統(tǒng)的基本組成部分之一”?!耙粋€編譯程序就是一個語言翻譯程序,語言翻譯程序把一種語言(源語言)書寫的程序翻譯成另一種語言(目標(biāo)語言)的等價程序”。
通過這一學(xué)期的學(xué)習(xí),我覺得編譯原理是一門理論性很強(qiáng)的課程,從文法和語言的概念到LL(1)文法和LR(0)文法的分析,幾乎都是對具體問題的抽象。因而,我們需要更多的時間來理解、掌握相關(guān)的知識,當(dāng)然在這一過程中也存在很多問題,比如我們后期學(xué)習(xí)具體文法的分析方法時,對于文法的概念不夠清晰,影響了上課的效率,知道老師再次給我們講解了文法等基礎(chǔ)的知識點(diǎn),我們才慢慢掌握后面所學(xué)的LL(1)文法等,也發(fā)現(xiàn)了知識點(diǎn)之間的關(guān)聯(lián)。此外,這門課程的課時被安排得很少,一周只有一次,這樣很不利于我們對這門重要課程的理解和掌握。但是我覺得我們很幸運(yùn),因?yàn)槔蠋熢谟邢薜恼n程中盡量將知識點(diǎn)以比較容易接受的方式給我們講解,教我們用簡單的方法理解記憶不同的知識,對于我們提出的問題,無論課上或是課外,老師一直是不厭其煩,甚至利用課余時間為我們講解重要的難題。
編譯原理這門課程不僅僅在于其本身的理論價值,更在于為我們解決問題提供的思維方式和方法。從LL(1)到LR(0),問題不斷被解決的同時,又有一個個新的問題提了出來。對計算機(jī)語言世界的知識積累,像滾雪球一樣越滾越大。這個逐漸遞進(jìn),逐漸解決問題的過程對我來說是收獲很大的。整個過程好像踏著前人研究編譯理論的路線,不斷感覺他們遇到的問題,更重要的是他們解決問題的思路。編譯原理的課程帶給我的不只是如何去編譯程序這樣的理論知識,相信更重要的是一種如何“自動計算”的思路。通過對相關(guān)編譯問題的具體分析,讓我體會最深的是一種“自動計算”的思想,同時完成編譯試驗(yàn)后,更是感到了一種“自動計算”的快樂?!比欢颐靼鬃约弘m然對編譯有了一定的了解,我懂得了文法的分析,學(xué)會了構(gòu)造確定和非確定有限自動機(jī),學(xué)會了LL(1)文法和LR(0)文法等,但是并沒有完全掌握,對于這些知識點(diǎn)的實(shí)質(zhì)性和其他方面,更是認(rèn)識不深。作為一名學(xué)習(xí)計算機(jī)科學(xué)與技術(shù)的學(xué)生,我明白編譯原理是軟件工程的基礎(chǔ),課程的結(jié)束并不意味著學(xué)習(xí)的結(jié)束,只有通過以后的學(xué)習(xí),才能更深入地了解編譯原理。
第四篇:編譯技術(shù)發(fā)展綜述
編譯技術(shù)發(fā)展綜述
計算機(jī)科學(xué)與軟件學(xué)院
計算機(jī)1302 蔡元昊 1311611517
引言:編譯程序構(gòu)造的原理和技術(shù)一直屬于最近公布的核心知識領(lǐng)域,已成為計算機(jī)科學(xué)必備的專業(yè)基礎(chǔ)知識。而且編譯程序的構(gòu)造是計算機(jī)科學(xué)中一個非常成功的分支,也是最早獲得成功的分支之一,他所建立的理論和技術(shù)方法值得人們深入研究和學(xué)習(xí)。
摘要:編譯程序是計算機(jī)的核心系統(tǒng)之一,是掌握計算機(jī)理論和軟件技術(shù)的關(guān)鍵知識,編譯原理合計數(shù)為人們理解計算機(jī)語言。創(chuàng)造優(yōu)秀的軟件奠定了理論基礎(chǔ)。擴(kuò)展了視野,開辟了捷徑。編譯原理和技術(shù)可以應(yīng)用在其他諸如軟件建模語言、硬件描述語言。腳本語言等的翻譯方面:在集成化軟件開發(fā)環(huán)境以及軟件安全一直有著廣泛的應(yīng)用。而且,編譯原理的研究有力的推動了計算機(jī)科學(xué)、計算機(jī)工程、軟件開發(fā)以及人機(jī)工程的研究和發(fā)展。編譯原理是計算機(jī)專業(yè)的一門重要專業(yè)課,旨在介紹編譯程序構(gòu)造的一般原理和基本方法。內(nèi)容包括語言和文法、詞法分析、語法分析、語法制導(dǎo)翻譯、中間代碼生成、存儲管理、代碼優(yōu)化和目標(biāo)代碼生成。
一、早期編譯技術(shù)的發(fā)展
編譯器是將一種語言翻譯為另一種語言的計算機(jī)程序。編譯器將源程序(source language)編寫的程序作為輸入,而產(chǎn)生用目標(biāo)語言(target language)編寫的等價程序。通常地,源程序?yàn)楦呒壵Z言(high-level language),如C或C + +,而目標(biāo)語言則是目標(biāo)機(jī)器的目標(biāo)代碼(object code,有時也稱作機(jī)器代碼(machine code)),也就是寫在計算機(jī)機(jī)器指令中的用于運(yùn)行的代碼。這一過程可以表示為: 源程序→編譯器 →目標(biāo)程序
在20世紀(jì)40年代,由于馮·諾伊曼在存儲-程序計算機(jī)方面的先鋒作用,編寫一串代碼或程序已成必要,這樣計算機(jī)就可以執(zhí)行所需的計算。開始時,這些程序都是用機(jī)器語言(machine language)編寫的。機(jī)器語言就是表示機(jī)器實(shí)際操作的數(shù)字代碼,例如: C7 06 0000 0002 表示在IBM PC 上使用的Intel 8x86處理器將數(shù)字2移至地址0 0 0 0(16進(jìn)制)的指令。
但編寫這樣的代碼是十分費(fèi)時和乏味的,這種代碼形式很快就被匯編語言(assembly language)代替了。在匯編語言中,都是以符號形式給出指令和存儲地址的。例如,匯編語言指令 MOV X,2 就與前面的機(jī)器指令等價(假設(shè)符號存儲地址X是0 0 0 0)。匯編程序(assembler)將匯編語言的符號代碼和存儲地址翻譯成與機(jī)器語言相對應(yīng)的數(shù)字代碼。
匯編語言大大提高了編程的速度和準(zhǔn)確度,人們至今仍在使用著它,在編碼需要極快的速度和極高的簡潔程度時尤為如此。但是,匯編語言也有許多缺點(diǎn):編寫起來也不容易,閱讀和理解很難;而且匯編語言的編寫嚴(yán)格依賴于特定的機(jī)器,所以為一臺計算機(jī)編寫的代碼在應(yīng)用于另一臺計算機(jī)時必須完全重寫。發(fā)展編程技術(shù)的下一個重要步驟就是以一個更類似于數(shù)學(xué)定義或自然語言的簡潔形式來編寫程序的操作,它應(yīng)與任何機(jī)器都無關(guān),而且也可由一個程序翻譯為可執(zhí)行的代碼。例如,前面的匯編語言代碼可以寫成一個簡潔的與機(jī)器無關(guān)的形式 x = 2
第一個編譯程序的出現(xiàn)是在20世紀(jì)50年代早期,多數(shù)早期的編譯工作是將算術(shù)公式翻譯成機(jī)器代碼。用現(xiàn)在的標(biāo)準(zhǔn)來衡量,當(dāng)時的編譯程序能完成的工作十分初步,如只允許簡單的單目運(yùn)算,數(shù)據(jù)元素的命名方式有很多限制。然而它們奠定了對高級語言編譯系統(tǒng)的研究和開發(fā)的基礎(chǔ)。20世紀(jì)50年代中期出現(xiàn)了FORTRAN等一批高級語言,相應(yīng)的一批編譯系統(tǒng)開發(fā)成功。隨著編譯技術(shù)的發(fā)展和社會對編譯程序需求的不斷增長,20世紀(jì)50年代末有人開始研究編譯程序的自動生成工具,提出并研制編譯程序的編譯程序。它的功能是以任一語言的詞法規(guī)則、語法規(guī)則和語義解釋出發(fā),自動產(chǎn)生該語言的編譯程序。目前很多自動生成工具已廣泛使用,如詞法分析程序的生成系統(tǒng)LEX,語法分析程序的生成系統(tǒng)YACC等。20世紀(jì)60年代起,不斷有人使用自展技術(shù)來構(gòu)造編譯程序。自展的主要特征是用被編譯的語言來書寫該語言自身的編譯程序。1971年,PASCAL的編譯程序用自展技術(shù)生成后,其影響就越來越大。隨著并行技術(shù)和并行語言的發(fā)展,處理并行語言的并行編譯技術(shù),將串行程序轉(zhuǎn)換成并行程序的自動并行編譯技術(shù)也正在深入研究之中。另外嵌入式應(yīng)用迅速增長的需求,推動了交叉編譯技術(shù)的發(fā)展.還有系統(tǒng)芯片設(shè)計方法和關(guān)鍵EDA技術(shù)的研究,也帶動了專用語言VHDL等及其編譯技術(shù)的不斷深化。在70年代后期和80年代早期,大量的項(xiàng)目都貫注于編譯器其它部分的生成自動化,這其中就包括了代碼生成。這些嘗試并未取得多少成功,這大概是因?yàn)椴僮魈珡?fù)雜而人們又對其不甚了解。編譯器設(shè)計最近的發(fā)展包括:首先,編譯器包括了更加復(fù)雜算法的應(yīng)用程序它用于推斷或簡化程序中的信息。其次,編譯器已越來越成為基于窗口的交互開發(fā)環(huán)境(Interactive Development Environment,IDE)的一部分,它包括了編輯器、連接程序、調(diào)試程序以及項(xiàng)目管理程序。
在九十年代,作為GNU項(xiàng)目或其它開放源代碼項(xiàng)目標(biāo)一部分,許多免費(fèi)編譯器和編譯器開發(fā)工具被開發(fā)出來。隨著芯片研制,國內(nèi)還有若干單位也在開展基于GCC生成面向特定芯片的編譯器工作。編譯器包括了更加復(fù)雜算法的應(yīng)用程序它用于推斷或簡化程序中的信息;這又與更為復(fù)雜的程序設(shè)計語言的發(fā)展結(jié)合在一起。其中典型的有用于函數(shù)語言編譯的Hindley-Milner類型檢查的統(tǒng)一算法。其次,編譯器已越來越成為基于窗口的交互開發(fā)環(huán)境(Interactive Development Environment,IDE)的一部分,它包括了編輯器、連接程序、調(diào)試程序以及項(xiàng)目管理程序。這樣的IDE標(biāo)準(zhǔn)并沒有多少,但是對標(biāo)準(zhǔn)的窗口環(huán)境進(jìn)行開發(fā)已成為方向。另一方面,盡管近年來在編譯原理領(lǐng)域進(jìn)行了大量的研究,但是基本的編譯器設(shè)計原理在近20年中都沒有多大的改變。
大約在1999年,SGI公布了他們的一個工業(yè)化的并行化優(yōu)化編譯器Pro64的源代碼,后被全世界多個編譯器研究小組用來做研究平臺,并命名為Open64。Open64的設(shè)計結(jié)構(gòu)好,分析優(yōu)化全面,是編譯器高級研究的理想平臺。3.編譯器的種類
編譯器可以生成用來在與編譯器本身所在的計算機(jī)和操作系統(tǒng)(平臺)相同的環(huán)境下運(yùn)行的目標(biāo)代碼,這種編譯器又叫做“本地”編譯器。另外,編譯器也可以生成用來在其它平臺上運(yùn)行的目標(biāo)代碼,這種編譯器又叫做交叉編譯器。交叉編譯器在生成新的硬件平臺時非常有用?!霸创a到源碼編譯器”是指用一種高階語言作為輸入,輸出也是高階語言的編譯器。例如: 自動并行化編譯器經(jīng)常采用一種高階語言作為輸入,轉(zhuǎn)換其中的代碼,并用并行代碼注釋對它進(jìn)行注釋(如OpenMP)或者用語言構(gòu)造進(jìn)行注釋(如FORTRAN的DOALL指令)。二.編譯工具
1.C語言對應(yīng)的編譯器——VS2008 C語言對應(yīng)的編譯器可以用VS2003、VS2005、VS2008、TC等,以最新版本的Visual Studio 2008為例
Microsoft? Visual Studio? 2008 使開發(fā)人員能夠快速創(chuàng)建高質(zhì)量、用戶體驗(yàn)豐富而又緊密聯(lián)系的應(yīng)用程序,充分展示了 Microsoft 開發(fā)智能客戶端應(yīng)用程序的構(gòu)想。借助 Visual Studio 2008,采集和分析信息將變得更為簡單便捷,業(yè)務(wù)決策也會因此變得更為有效。任何規(guī)模的組織都可以使用 Visual Studio 2008 快速創(chuàng)建能夠利用 Windows Vista? 和 2007 Office system 的更安全、更易于管理并且更可靠的應(yīng)用程序。
Visual Studio 2008 在三個方面為開發(fā)人員提供了關(guān)鍵改進(jìn): 1.快速的應(yīng)用程序開發(fā) 2.高效的團(tuán)隊協(xié)作 3.突破性的用戶體驗(yàn)
Visual Studio 2008 提供了高級開發(fā)工具、調(diào)試功能、數(shù)據(jù)庫功能和創(chuàng)新功能,幫助在各種平臺上快速創(chuàng)建當(dāng)前最先進(jìn)的應(yīng)用程序。2005 年,微軟發(fā)布了 Visual Studio 2005。.NET 字眼從各種語言的名字中被抹去,但是這個版本的 Visual Studio 仍然還是面向.NET 框架的(版本2.0)。它同時也能開發(fā)跨平臺的應(yīng)用程序,如開發(fā)使用微軟操作系統(tǒng)的手機(jī)的程序等。總體來說是一個非常龐大的軟件,甚至包含代碼測試功能。
Visual Studio 9 目前可以確定的是支持建立于 DHTML 基礎(chǔ)上的 AJax 技術(shù),這種微軟在
Visual InterDev 時代提出的基于異步的客戶端動態(tài)網(wǎng)頁技術(shù)在當(dāng)年并沒有像微軟預(yù)期中的那么流行起來,反而隨著 GMail 等應(yīng)用而東山再起,漸漸成為主流網(wǎng)絡(luò)應(yīng)用之一。同時 Visual Studio 9 會強(qiáng)化對于數(shù)據(jù)庫的支持以及微軟新的基于工作流(Workflow)的編程模型。預(yù)計為了保持與 Office 系列的統(tǒng)一,Visual Studio 9 的名稱為 Visual Studio 2008。
2.C++語言對應(yīng)的編譯器——Microsoft Visual C++ 6.0 Visual C++是一個集成環(huán)境的C++編譯器,功能很多。還有 Borland C++ Buider C++編譯器,比較小巧實(shí)用。C++ Buider 也是C++編譯器,是另一個公司的產(chǎn)品。
Microsoft Visual C++ 6.0功能特點(diǎn):
幾乎所有世界級的軟件,從業(yè)界領(lǐng)先的Web瀏覽器到面向任務(wù)的企業(yè)應(yīng)用,都是使用Microsoft Visual C++開發(fā)系統(tǒng)來開發(fā)的。要用C++來開發(fā)Windows和Web上的高性能應(yīng)用程序,Visual C++是效率最高的首選工具。Visual C++ 6.0在不犧牲靈活性、性能和控制力度的同時,給C++帶來更高水平的生產(chǎn)效率。除了IntelliSense Technology(智能感應(yīng)技術(shù))和Edit and Continue(即編即調(diào))等顯著縮短開發(fā)時間的新特性外,Visual C++ 6.0還為Web開發(fā)和企業(yè)開發(fā)提供更良好的支持。Microsoft Visual C++ 6.0專業(yè)版的健壯的構(gòu)件開發(fā)、強(qiáng)大的數(shù)據(jù)庫工具和完備的Internet支持將使您從中受益,創(chuàng)建出策略性的商務(wù)解決方案來。
有了這些顯著縮短開發(fā)時間的新特性,您可以享受到一種全新水平的工作效率。編碼所費(fèi)的時間減少了,編譯所費(fèi)的時間減少了,調(diào)試所費(fèi)的時間也減少了,一句話,創(chuàng)建應(yīng)用程序所費(fèi)的時間減少了,同時還可以享受到更多的構(gòu)件重用。獲得令人目眩的速度。本已是速度的標(biāo)準(zhǔn)的Visual C++如今更上一層樓,Visual C++ 6.0在多處進(jìn)行了最優(yōu)的調(diào)整,這樣的結(jié)果是:開發(fā)者可以創(chuàng)建出可能范圍內(nèi)的最小最快的構(gòu)件和應(yīng)用。3.JAVA語言對應(yīng)的編譯器——eclipse JCreater、JBuilder、eclipse、myeclipse、netbean這幾個是主流,eclipse和myeclipse(eclipse的擴(kuò)展功能更多)是主流中的主流。
JBudler Eclipse 屬于IDE,是集成開發(fā)環(huán)境(IDE)!IDE是集成了編譯,檢錯,自動查找錯誤,深度反檢查功能的輔助開發(fā)工具。就是說,只要屬于java的IDE,都會把sun的編譯器集成到它里面來。而JBudler與Eclipse 等這些開發(fā)工具更多的是體現(xiàn)在對不同層面java開發(fā)提供了不同的強(qiáng)大功能。比如:MyEclipse強(qiáng)勢在web開發(fā)的便捷。JBudler對GUI更強(qiáng)大。eclipse是一個非常著名的集成開發(fā)工具,其自身功能強(qiáng)大而易用。更為重要的是,軟件本
身是一個開放源代碼的項(xiàng)目,由一個國際組織進(jìn)行管理,很多大公司都是這個組織的成員,包括IBM和Borland等著名的軟件開發(fā)商,事實(shí)上,eclipse本來是IBM開發(fā)的工具,是由IBM將其貢獻(xiàn)給開放源代碼社區(qū)的。正因?yàn)槿绱?,任何人都可以免費(fèi)獲得eclipse開發(fā)環(huán)境,而不需要支付任何費(fèi)用。
eclipse的另一個非常重要的特點(diǎn)是其提供了非常靈活的擴(kuò)展能力,事實(shí)上,eclipse可以被稱作一個開發(fā)平臺,它提供了豐富的接口可以擴(kuò)展其本身。eclipse本身是使用Java開發(fā)的,開發(fā)人員可以簡單的按照其規(guī)范開發(fā)eclipse的插件,就可以在eclipse平臺上增加更多的功能。大量的開發(fā)人員基于eclipse開發(fā)了插件,比如C++開發(fā)、UML設(shè)計、J2EE開發(fā)等都有相應(yīng)的插件。事實(shí)上,包括IBM在內(nèi),很多大的軟件公司基于eclipse開發(fā)了其自己的軟件產(chǎn)品,這無疑得益于eclipse良好的結(jié)構(gòu)。
三、編譯原理的近期發(fā)展 隨著大規(guī)模集成電路、網(wǎng)絡(luò)通訊和其它數(shù)字信息技術(shù)的迅速發(fā)展,目前嵌入式系統(tǒng)己經(jīng)廣泛地滲透到科學(xué)研究、工程設(shè)計、軍事技術(shù)、各類產(chǎn)業(yè)和商業(yè)文化藝術(shù)等各方面,在人們?nèi)粘I钪械姆椒矫婷娴教幨乔度胧较到y(tǒng)設(shè)備的身影,如手機(jī)、PDA、智能家電以及汽車電子等。隨著國內(nèi)外各種嵌入式產(chǎn)品的進(jìn)一步開發(fā)和推廣,嵌入式技術(shù)和人們的生活結(jié)合越來越緊密,人們?nèi)粘5墓ぷ鳌W(xué)習(xí)和生活方式終將不可避免地逐步改變,嵌入式產(chǎn)品正在逐步形成時尚,在當(dāng)今的信息社會中扮演越來越重要的角色。
嵌入式系統(tǒng)一般指的是非PC系統(tǒng),它包括完全植入嵌入式硬件內(nèi)部的為特定應(yīng)用設(shè)計的專用計算機(jī)系統(tǒng),以及相應(yīng)的硬件。嵌入式系統(tǒng)以應(yīng)用為中心的,它的軟硬件可以根據(jù)需求進(jìn)行裁減,以此來適應(yīng)目標(biāo)系統(tǒng)對外形尺寸、功能、可靠性、成本、功耗、外部接口等方面的嚴(yán)格要求。簡單地說,嵌入式系統(tǒng)集操作系統(tǒng)、應(yīng)用軟件與硬件于一體,具有軟件代碼小、高度自動化、響應(yīng)速度快等特點(diǎn),因此特別適合要求實(shí)時和多任務(wù)的應(yīng)用。
由于嵌入式系統(tǒng)資源有限,一般無法提供編譯、匯編、鏈接等工具,同時也很難提供高級調(diào)試功能,因此嵌入式系統(tǒng)的應(yīng)用軟件一般不能直接在嵌入式系統(tǒng)平臺上進(jìn)行開發(fā),而需要在交叉編譯環(huán)境中開發(fā)。也就是說通常是在另外的開發(fā)平臺上開發(fā)的,一般這種開發(fā)平臺由通用的計算機(jī)系統(tǒng)和專用的嵌入式系統(tǒng)軟件開發(fā)工具組成。
編譯實(shí)現(xiàn)方式的發(fā)展主要分一下五類:手工、機(jī)器語言、匯編、系統(tǒng)程序設(shè)計語言、自動構(gòu)造工具lex yacc gcc。推動編譯技術(shù)發(fā)展的因素主要包括:語言范型(計算模式)、計算機(jī)體系結(jié)構(gòu)語言范型主要包括:命令式(imperative language)、應(yīng)用式(applicative)、基于規(guī)則的(rule-based)、面向?qū)ο蟮模╫bject-oriented)、并行計算(parallel computing)。體系結(jié)構(gòu)主要包括:萬諾曼機(jī)體系結(jié)構(gòu)、并行體系結(jié)構(gòu)、嵌入系統(tǒng)。編譯程序執(zhí)行環(huán)境主要包括:批處理、交互環(huán)境、嵌入系統(tǒng)環(huán)境、并行編譯技術(shù)、交叉編譯。編譯程序在一個機(jī)器(宿主機(jī))上運(yùn)行,產(chǎn)生另一個機(jī)器(目標(biāo)機(jī))的匯編語言。嵌入式系統(tǒng)中的應(yīng)用程序正是借助這樣的編譯程序生成。目標(biāo)處理器MIPSX是MIPS系列芯片的種,屬于RISC體系結(jié)構(gòu),來源于斯坦福大學(xué)的MIPS計劃。由于該系列CPU不是采用加州大學(xué)伯克利分校的RISC窗口技術(shù)而是采用消除流水線各級互鎖的微處理器MIPS(MicroprocessorWithout Interlocking Pipeline Stage)技術(shù),因此而得名。MIPS是將IBM公司對優(yōu)化編譯程序的研究和加州大學(xué)伯克利分校的大規(guī)模集成電路的思想結(jié)合起來的產(chǎn)品。
由于RISC指令集的簡單和整齊,為了達(dá)到更好地利用計算機(jī)的性能,MIPS系列芯片中很好地應(yīng)用了流水線策略。流水線是現(xiàn)代各類微處理器都采用的指令執(zhí)行技巧,即將若干條指令的取指、譯碼和執(zhí)行過程部分重疊在流水線中同時執(zhí)行。以前在CISC計算機(jī)中,由于指令多而復(fù)雜,處理每條指令的所需時間不固定,當(dāng)后面指令需要前條指令的結(jié)果時,往往造成指令互鎖,因此無法實(shí)現(xiàn)流水 線。而斯坦福大學(xué)的MIPS計劃就是在編譯的過程中,利用編譯程序優(yōu)化處理器的流水線以求提高處理器流水線的效率。由于采用了硬件連線控制來執(zhí)行數(shù)目不多的簡單指令,而且還能重組軟件流水線,這樣就減少了硬件復(fù)雜性。“編譯原理”課程分析編譯原理課程一般利用常用軟件如C,Pascal等來構(gòu)建編譯的各部分程序,編譯原理的構(gòu)成包括詞法分析,語法分析、語義分析、中間代碼生成、代碼優(yōu)化和目標(biāo)代碼生成等。編譯原理課程的學(xué)習(xí)可以對程序設(shè)計語言的設(shè)計和實(shí)現(xiàn)有深刻的理解,還可以有助于快速理解定位和解決在程序編譯、測試與運(yùn)行中出現(xiàn)的問題。編譯程序規(guī)模大。由于編譯原理是一個極其復(fù)雜的系統(tǒng),程序規(guī)模大,將它肢解開來一部分一部分地研究。理論知識抽象。要完整地構(gòu)造一個編譯系統(tǒng)并不是一件容易的事情,它不僅需要具有較完備的軟件知識,并需要掌握現(xiàn)有的軟件工具的使用,而且更重要的是要有豐富的實(shí)踐經(jīng)驗(yàn),了解硬件系統(tǒng)結(jié)構(gòu)和操作系統(tǒng)的功能。算法的理解和實(shí)現(xiàn)。編譯原理這門課包含許多理論知識和算法,這些理論的學(xué)習(xí)和理解都存在著一定的難度。其中理論知識包括:詞法分析器的構(gòu)造,語法中各種分析器(LR,LL,SLR,LALR等)實(shí)現(xiàn)與完成。
在編譯原理的不斷發(fā)展和完善過程中,一本本課程教材接踵而至,其中不乏非常優(yōu)秀的“名書”。編譯領(lǐng)域里程碑式的經(jīng)典著作——龍書,20年后終于出新版!這是一個延綿30年的故事,這是一部關(guān)于龍書的傳奇!最新版本,增添三章節(jié)內(nèi)容,使龍書地位更權(quán)威!1977年,Alfred V.Aho 和Jeffrey D.Ullman 出版《Principles of Compiler Design 》,封面是一名騎士和一只恐龍,因此第一次被人稱為龍書,但因?yàn)槟菞l龍是綠色的,所以稱為綠龍書。過了9年,1986年,原來的兩位作者加上Ravi Sethi, 升級了前一本書,書名改為《Compilers: Principles, Techniques and Tools》,封面依然沿用騎士和恐龍,那頭龍是紅色的,因此被叫做龍書二或者是紅龍書。又過了一個9年,又一個9年,編譯領(lǐng)域的巨無霸--龍書始終都沒有升級。終于在2006年年底,龍書升級了。作者又增加了Monica S.Lam,名字沿用《Compilers: Principles, Techniques and Tools》,封面依然保持恐龍和武士的設(shè)計,但這次的龍是紫色,因此叫做紫龍書。
本書全面、深入地探討了編譯器設(shè)計方面的重要主題,包括詞法分析、語法分析、語法制導(dǎo)定義和語法制導(dǎo)翻譯、運(yùn)行時刻環(huán)境、目標(biāo)代碼生成、代碼優(yōu)化技術(shù)、并行性檢測以及過程間分析技術(shù),并在相關(guān)章節(jié)中給出大量的實(shí)例。與上一版相比,本書進(jìn)行了全面的修訂,涵蓋了編譯器開發(fā)方面的最新進(jìn)展。每章中都提供了大量的系統(tǒng)及參考文獻(xiàn)。本書是編譯原理課程方面的經(jīng)典教材,內(nèi)容豐富,適合作為高等院校計算機(jī)及相關(guān)專業(yè)本科生及研究生的編譯原理課程的教材,也是廣大技術(shù)人員的極佳參考讀物。Alfred V.Aho是哥倫比亞大學(xué)的Lawrence Gussman計算機(jī)科學(xué)教授。Aho教授多次獲獎,其中包括哥倫比亞校友會頒發(fā)的2003Great Teacher獎和電子與電器工程師協(xié)會的Jonh von Neumann獎?wù)?。他是美國國家工程院院士,以及ACM和IEEE的會員。Monica S.Lam是斯坦福大學(xué)的計算機(jī)科學(xué)教授。她曾經(jīng)是Tensilica 的首席科學(xué)家,并且是moka5的創(chuàng)建者和首席執(zhí)行官。她領(lǐng)導(dǎo)了 SUIF項(xiàng)目。該項(xiàng)目開發(fā)了最流行的研究性編譯器之一,并首創(chuàng)了很多在工業(yè)界得到應(yīng)用的編譯技術(shù)。Jeffery D.Ullman是Gradiance公司的首席執(zhí)行官和Standford大學(xué)的StanfordcW.Ascherman計算機(jī)科學(xué)(名譽(yù)退休)教授他的研究興趣包括數(shù)據(jù)庫理論、數(shù)據(jù)庫集成、數(shù)據(jù)挖掘和利用信息基礎(chǔ)軟件的教育技術(shù).他是美國國家工程院的院士,ACM的會員,并且是 Karlstrom獎和Knuth獎的獲得者。
我對編譯技術(shù)發(fā)展的總結(jié):
編譯原理是門實(shí)用的科學(xué)性的學(xué)科,當(dāng)今世界發(fā)展離不開編譯的進(jìn)步,正是考慮到其重要性,中國乃至世界都應(yīng)該注重這方面人才的培養(yǎng),發(fā)展并不是一帆風(fēng)順,尤其是中國的核心技術(shù)缺乏,創(chuàng)新能力不足,不像美國,日本,甚至印度都很注重知識產(chǎn)權(quán)的重要性,都很注重自主創(chuàng)新的重要性,所以今后作為一個中國人,作為一個開發(fā)者應(yīng)該把國家的利益放在第一位,把自主創(chuàng)新放在第一位,希望中國編譯技術(shù)的發(fā)展越來越好!
第五篇:編譯原理論文
編譯原理心得體會
編譯原理是計算機(jī)專業(yè)的一門重要專業(yè)課,旨在介紹編譯程序構(gòu)造的一般原理和基本方法,在計算機(jī)本科教學(xué)中占有十分重要的地位。
該課程理論性與實(shí)踐性都很強(qiáng),我們在學(xué)習(xí)是普遍感到內(nèi)容非常抽象,不易理解,內(nèi)容多且繁瑣,難以完整、全面地掌握編譯原理的有關(guān)知識,更不用說靈活運(yùn)用編譯原理知識從事相關(guān)設(shè)計或應(yīng)用于其他領(lǐng)域。雖然只有少數(shù)人從事編譯方面的工作,但是這門課在理論、技術(shù)、方法上都對我們提供了系統(tǒng)而有效的訓(xùn)練,有利于提高軟件人員的素質(zhì)和能力。
在我們學(xué)習(xí)編譯原理以前,都認(rèn)為編譯原理只能應(yīng)用在寫程序語言的編譯器上,覺得用處不大,學(xué)習(xí)興趣不高。而在后來的學(xué)習(xí)中,我們逐漸認(rèn)識到計算機(jī)專業(yè)的學(xué)生,除了要會編寫程序語言之外,還應(yīng)該了解它是如何被計算機(jī)所識別,這才是真正并且透徹地學(xué)習(xí)軟件。另外,編譯器中每一個模塊的編寫,都能對我們的編程能力的提高有很大幫助。在今后若從事軟件工程,這門課程也能夠?qū)帉懗绦蛴兴鶐椭?/p>
為了能夠系統(tǒng)掌握這門專業(yè)課,我們把編譯原理分為以下幾個模塊:①語言和文法;②詞法分析;③語法分析;④語義分析和中間代碼生成;⑤代碼優(yōu)化和目標(biāo)代碼生成。
在學(xué)習(xí)的開始,我們需要掌握什么是編譯,編譯分為哪些階段,編譯程序和解釋程序的區(qū)別等等。在做好了這些方面的準(zhǔn)備后,開始了系統(tǒng)的學(xué)習(xí)。
語言和文法部分的知識包括文法基本概念及文法的二義性?;靖拍钣形姆ǘx、推導(dǎo)、句型、句子等等。二義性文法是通過畫語法樹的方法來證明。
詞法分析中的重點(diǎn)是有窮自動機(jī)DFA的生成以及DFA和正規(guī)式與正規(guī)文法的關(guān)系。還要熟練掌握NFA轉(zhuǎn)換為DFA的方法及DFA的化簡。
語法分析包括自上而下和自下而上分析。自上而下分析著重掌握LL(1)文法,自下而上分析重點(diǎn)掌握算符優(yōu)先文法和LR(0)、SLR(1)文法。
語義分析重點(diǎn)是其功能,中間代碼生成和語法制導(dǎo)翻譯定義與方法。
最后,優(yōu)化分為局部優(yōu)化和循環(huán)優(yōu)化,重點(diǎn)理解一些關(guān)鍵詞,如基本塊、流圖等,要學(xué)會自己畫出程序流圖。用DAG圖進(jìn)行局部優(yōu)化是重點(diǎn)。
在學(xué)習(xí)文法時,對文法的組成,用法都較為明了,而在真正做題時卻感到十分吃力。例如給出了一個語言,要求寫出它的上下文無關(guān)文法,就感到十分棘手,所以今后在這方面要加大練習(xí)量,以熟練掌握。
而在之后的詞法分析和語法分析中,我感到在看基本原理時十分困難,通常要長時間鉆研才能夠有所了解,而一旦掌握了基本原理,做題時就感到十分順暢了。例如,在剛接觸到LR(0)文法時,我用了大量的時間去學(xué)習(xí)它的原理,掌握之后,在列LR(0)分析表和寫分析過程時,只要思路清晰,就會比較順暢,而且不會犯錯。
下面是我認(rèn)為的比較有效的學(xué)習(xí)編譯原理的步驟:
1.先利用ANTLR之類的編譯器生成工具,做一個小程序(如上面提到的HTML文件轉(zhuǎn)化成純文本文件的程序),所需知識只是正則表達(dá)式的基本知識和生成工具本身的使用方法(可以看聯(lián)機(jī)幫助和網(wǎng)上教程(tutorial)來掌握).這樣做的好處是:
1)可以體會到編譯原理的實(shí)用性,提高學(xué)習(xí)興趣
2)入門容易,消除編譯原理學(xué)習(xí)的畏難情緒.3)獲得詞法分析器和語法分析器的感性認(rèn)識,有利于加深對理論的理解.4)獲得編譯器自動生成工具(compiler compiler)的使用經(jīng)驗(yàn),提高解決實(shí)際問題的能力.(實(shí)際工作很多都不是手編而是利用工具的)
2.象ANTLR之類的工具是開源(open source)的,可研究其源碼,以便必要時自己手編分析程序.3.回過頭來看編譯原理教材.這時大概會發(fā)現(xiàn),很多理論很容易懂,剩下的只有上面說的幾個難點(diǎn),多看幾遍,重點(diǎn)突破.4.結(jié)合教材所附源碼,進(jìn)一步加深對教材的理解。以上就是我對這門課的心得體會。