導航:首頁 > 源碼編譯 > 中文編譯原理

中文編譯原理

發布時間:2022-09-10 05:13:56

1. 編譯原理中文法的產生式的左部符號一定是一個非終結符號嘛這話對不

不對的,上下文無關文法和正規式滿足這個條件,上下文有關文法和短語文法不滿足這個條件。

2. 為什麼要學習編譯原理(轉)

大學課程為什麼要開設編譯原理呢?這門課程關注的是編譯器方面的產生原理和技術問題,似乎和計算機的基礎領域不沾邊,可是編譯原理卻一直作為大學本科的必修課程,同時也成為了研究生入學考試的必考內容。編譯原理及技術從本質上來講就是一個演算法問題而已,當然由於這個問題十分復雜,其解決演算法也相對復雜。我們學的數據結構與演算法分析也是講演算法的,不過講的基礎演算法,換句話說講的是演算法導論,而編譯原理這門課程講的就是比較專註解決一種的演算法了。在20世紀50年代,編譯器的編寫一直被認為是十分困難的事情,第一Fortran的編譯器據說花了18年的時間才完成。在人們嘗試編寫編譯器的同時,誕生了許多跟編譯相關的理論和技術,而這些理論和技術比一個實際的編譯器本身價值更大。就猶如數學家們在解決著名的哥德巴赫猜想一樣,雖然沒有最終解決問題,但是其間誕生不少名著的相關數論。 推薦參考書 雖然編譯理論發展到今天,已經有了比較成熟的部分,但是作為一個大學生來說,要自己寫出一個像TurbocC,Java那樣的編譯器來說還是太難了。不僅寫編譯器困難,學習編譯原理這門課程也比較困難。 第一本書的原名叫《CompilersPrinciples,Techniques,andTools》,另外一個響亮的名字就是龍書。原因是這本書的封面上有條紅色的龍,也因為獗臼樵詒嘁朐?砘?嘴域確實?忻?所以很多國外的學者都直接取名為龍書。最近機械工業出版社已經出版了此書的中文版,名字就叫《編譯原理》。該書出的比較早,大概是在85或86年編寫完成的,作者之一還是著名的貝爾實驗室的科學家。裡面講解的核心編譯原理至今都沒有變過,所以一直到今天,它的價值都非凡。這本書最大的特點就是一開始就通過一個實際的小例子,把編譯原理的大致內容羅列出來,讓很多編譯原理的初學者很快心裡有了個底,也知道為什麼會有這些理論,怎麼運用這些理論。而這一點是我感覺國內的教材缺乏的東西,所以國內的教材都不是寫給願意自學的讀者,總之讓人看了半天,卻不知道裡面的東西有什麼用。 第二本書的原名叫《ModernCompilerDesign》,中文名字叫做《現代編譯程序設計》。該書由人民郵電出版社所出。此書比較關注的是編譯原理的實踐,書中給出了不少的實際程序代碼,還有很多實際的編譯技術問題等等。此書另外一個特點就是其現代而字。在傳統的編譯原理教材中,你是不可能看到如同Java中的垃圾回收等演算法的。因為Java這樣的解釋執行語言是在近幾年才流行起來的東西。如果你想深入學習編譯原理的理論知識,那麼你肯定得看前面那本龍書,如果你想自己動手做一個先進的編譯器,那麼你得看這本《現代編譯程序設計》。 第三本書就是很多國內的編譯原理學者都推薦的那本《編譯原理及實踐》。或許是這本書引入國內比較早吧,我記得我是在高中就買了這本書,不過也是在前段時間才把整本書看完。此書作為入門教程也的確是個不錯的選擇。書中給出的編譯原理講解也相當細致,雖然不如前面的龍書那麼深入,但是很多地方都是點到為止,作為大學本科教學已經是十分深入了。該書的特點就是注重實踐,不過感覺還不如前面那本《現代編譯程序設計》的實踐味道更重。此書的重點還是在原理上的實踐,而非前面那本那樣的技術實踐。《編譯原理及實踐》在講解編譯原理的各個部分的同時,也在逐步實踐一個現代的編譯器TinyC.等你把整本書看完,差不多自己也可以寫一個TinyC了。作者還對Lex和Yacc這兩個常用的編譯相關的工具進行了很詳細的說明,這一點也是很難在國內的教材中看到的。 推薦了這三本教材,都有英文版和中文版的。很多英文好的同學只喜歡看原版的書,不我的感覺是這三本書的翻譯都很不錯,沒有必要特別去買英文版的。理解理論的實質比理解表面的文字更為重要。 編譯原理的實質 幾乎每本編譯原理的教材都是分成詞法分析,語法分析(LL演算法,遞歸下降演算法,LR演算法),語義分析,運行時環境,中間代碼,代碼生成,代碼優化這些部分。其實現在很多編譯原理的教材都是按照85,86出版的那本龍書來安排教學內容的,所以那本龍書的內容格式幾乎成了現在編譯原理教材的定式,包括國內的教材也是如此。一般來說,大學裡面的本科教學是不可能把上面的所有部分都認真講完的,而是比較偏重於前面幾個部分。像代碼優化那部分東西,就像個無底洞一樣,如果要認真講,就是單獨開一個學期的課也不可能講得清楚。所以,一般對於本科生,對詞法分析和語法分析掌握要求就相對要高一點了。 詞法分析相對來說比較簡單。可能是詞法分析程序本身實現起來很簡單吧,很多沒有學過編譯原理的人也同樣可以寫出各種各樣的詞法分析程序。不過編譯原理在講解詞法分析的時候,重點把正則表達式和自動機原理加了進來,然後以一種十分標準的方式來講解詞法分析程序的產生。這樣的做法道理很明顯,就是要讓詞法分析從程序上升到理論的地步。 語法分析部分就比較麻煩一點了。現在一般有兩種語法分析演算法,LL自頂向下演算法和LR自底向上演算法。LL演算法還好說,到了LR演算法的時候,困難就來了。很多自學編譯原理的都是遇到LR演算法的理解成問題後就放棄了自學。其實這些東西都是只要大家理解就可以了,又不是像詞法分析那樣非得自己寫出來才算真正的會。像LR演算法的語法分析器,一般都是用工具Yacc來生成,實踐中完全沒有比較自己來實現。對於LL演算法中特殊的遞歸下降演算法,因為其實踐十分簡單,那麼就應該要求每個學生都能自己寫。當然,現在也有不少好的LL演算法的語法分析器,不過要是換在非C平台,比如Java,Delphi,你不能運用YACC工具了,那麼你就只有自己來寫語法分析器。 等學到詞法分析和語法分析時候,你可能會出現這樣的疑問:詞法分析和語法分析到底有什麼?就從編譯器的角度來講,編譯器需要把程序員寫的源程序轉換成一種方便處理的數據結構(抽象語法樹或語法樹),那麼這個轉換的過程就是通過詞法分析和語法分析的。其實詞法分析並非一開始就被列入編譯器的必備部分,只是我們為了簡化語法分析的過程,就把詞法分析這種繁瑣的工作單獨提取出來,就成了現在的詞法分析部分。除了編譯器部分,在其它地方,詞法分析和語法分析也是有用的。比如我們在DOS,Unix,Linux下輸入命令的時候,程序如何分析你輸入的命令形式,這也是簡單的應用。總之,這兩部分的工作就是把不規則的文本信息轉換成一種比較好分析好處理的數據結構。那麼為什麼編譯原理的教程都最終把要分析的源分析轉換成樹這種數據結構呢?數據結構中有Stack,Line,List這么多數據結構,各自都有各自的特點。但是Tree這種結構有很強的遞歸性,也就是說我們可以把Tree的任何結點Node提取出來後,它依舊是一顆完整的Tree。這一點符合我們現在編譯原理分析的形式語言,比如我們在函數裡面使用函樹,循環中使用循環,條件中使用條件等等,那麼就可以很直觀地表示在Tree這種數據結構上。同樣,我們在執行形式語言的程序的時候也是如此的遞歸性。在編譯原理後面的代碼生成的部分,就會介紹一種堆棧式的中間代碼,我們可以根據分析出來的抽象語法樹,很容易,很機械地運用遞歸遍歷抽象語法樹就可以生成這種指令代碼。而這種代碼其實也被廣泛運用在其它的解釋型語言中。像現在流行的Java,.NET,其底層的位元組碼bytecode,可以說就是這中基於堆棧的指令代碼的。 關於語義分析,語法制導翻譯,類型檢查等等部分,其實都是一種完善前面得到的抽象語法樹的過程。比如說,我們寫C語言程序的時候,都知道,如果把一個浮點數直接賦值給一個整數,就會出現類型不匹配,那麼C語言的編譯器是怎麼知道的呢?就是通過這一步的類型檢查。像C++語言這中支持多態函數的語言,這部分要處理的問題就更多更復雜了。大部編譯原理的教材在這部分都是講解一些比較好的處理策略而已。因為新的問題總是在發生,舊的辦法不見得足夠解決。 本來說,作為一個編譯器,起作用的部分就是用戶輸入的源程序到最終的代碼生成。但是在講解最終代碼生成的時候,又不得不講解機器運行環境等內容。因為如果你不知道機器是怎麼執行最終代碼的,那麼你當然無法知道如何生成合適的最終代碼。這部分內容我自我感覺其意義甚至超過了編譯原理本身。因為它會把一個計算機的程序的運行過程都通通排在你面前,你將來可能不會從事編譯器的開發工作,但是只要是和計算機軟體開發相關的領域,都會涉及到程序的執行過程。運行時環境的講解會讓你更清楚一個計算機程序是怎麼存儲,怎麼裝載,怎麼執行的。關於部分的內容,我強烈建議大家看看龍書上的講解,作者從最基本的存儲組織,存儲分配策略,非局部名字的訪問,參數傳遞,符號表到動態存儲分配(malloc,new)都作了十分詳細的說明。這些東西都是我們編寫平常程序的時候經常要做的事情,但是我們卻少去探求其內部是如何完成。 關於中間代碼生成,代碼生成,代碼優化部分的內容就實在不好說了。國內很多教材到了這部分都會很簡單地走馬觀花講過去,學生聽了也只是作為了解,不知道如何運用。不過這部分內容的東西如果要認真講,單獨開一學期的課程都講不完。在《編譯原理及實踐》的書上,對於這部分的講解就恰到好處。作者主要講解的還是一種以堆棧為基礎的指令代碼,十分通俗易懂,讓人看了後,很容易模仿,自己下來後就可以寫自己的代碼生成。當然,對於其它代碼生成技術,代碼優化技術的講解就十分簡單了。如果要仔細研究代碼生成技術,其實另外還有本叫做《》,那本書現在由機械工業出版社引進的,十分厚重,而且是英文原版。不過這本書我沒有把它列為推薦書給大家,畢竟能把龍書的內容搞清楚,在中國已經就算很不錯的高手了,到那個時候再看這本《》也不遲。代碼優化部分在大學本科教學中還是一個不太重要的部分,就是算是實踐過程中,相信大家也不太運用得到。畢竟,自己做的編譯器能正確生成執行代碼已經很不錯了,還談什麼優化呢? 編譯原理的課程畢竟還只是講解原理的課程,不是專門的編譯技術課程。這兩門課程是有很大的區別的。編譯技術更關注實際的編寫編譯器過程中運用到的技術,而原理的課

3. 編譯原理中文法變換的特殊方法有哪些

說明方法
常見的說明方法
常見的說明方法有舉事例、分類別、列數據、作比較、畫圖表、下定義、作詮釋、打比方、摹狀貌、引資料等10種。寫說明文要根據說明對象的特點及寫作目的,選用最佳方法。下面分別加以說明。

(1)舉例子。舉出實際事例來說明事物,使所要說明的事物具體化,以便讀者理解,這種說明方法叫舉例法。如:

一般人總以為,年齡稍大,記憶能力就一定要差,其實不然,請看實驗結果:國際語言學會曾對9至18歲的青年與35歲以上的成年人學習世界語作過一個比較,發現前者就不如後者的記憶力好。這是因為成年人的知識、經驗比較豐富,容易在已有的知識基礎上,建立廣泛的聯系。這種聯系,心理學上稱為「聯想」。人的記憶就是以聯想為基礎的,知識經驗越豐富,越容易建立聯想,記憶力就會相應提高。馬克思五十多歲時開始學俄文,六個月後,他就能津津有味地閱讀著名詩人與作家普希金、果戈里和謝德林等人的原文著作了。這是由於語言知識豐富,能夠通曉很多現代和古代的語言的緣故。

這段文章要說明的是:年齡稍大,記憶力不一定就差。為了說明這一點,作者先提供了實驗結果,又分析了原因。到此為止,未嘗不可,但不夠具體,也缺乏說服力,於是,又舉出了一個實例:馬克思在五十多歲的時候,只用六個月時間便精通了俄語。這樣一來,內容具體了,說服力增強了。

說明文中的舉事例的說明方法和議論文中的例證法,都可以起到使內容具體、加強說服力的作用。但二者又有區別。議論文中的事例,是用來證明觀點的,說明文的事例,是用來介紹知識的。

運用舉事例的說明方法說明事物或事理,一要注意例子的代表性,二要注意例子的適量性。

(2)分類別。將被說明的對象,按照一定的標准劃分成不同的類別,一類一類地加以說明,這種說明方法,叫分類別。

分類別是將復雜的事物說清楚的重要方法。

運用分類別方法要注意分類的標准,一次分類只能用同一個標准,以免產生重疊交叉的現象。例如:「圖書館的藏書有中國的、古典的、外國的、科技的、文學的、現代的以及政治經濟方面的等。」這里用了不只一個標准,所以表達不清。正確的說法應該是:

圖書館的藏書,按國別分,有中國的、外國的;按時代分,有古典的、現代的;按性質分,有科技的、文學的以及政治經濟方面的等。

這樣,每次分類只用一個標准,就眉目清楚了。

有的事物的特徵、本質需要分成幾點或幾個方面來說,也屬於分類別。

注意,運用分類別方法,所列舉的種類不能有遺漏。

(3)列數據。為了使所要說明的事物具體化,還可以採用列數據的方法,以便讀者理解。需要注意的是,引用的數字,一定要准確無誤,不準確的數字絕對不能用,即使是估計的數字,也要有可靠的根據,並力求近似。

(4)作比較。說明某些抽象的或者是人們比較陌生的事物,可以用具體的或者大家已經熟悉的事物和它比較,使讀者通過比較得到具體而鮮明的印象。事物的特徵也往往在比較中顯現出來。

在作比較的時候,可以是同類相比,也可以是異類相比,可以對事物進行「橫比」,也可以對事物進行「縱比」。

(5)畫圖表。為了把復雜的事物說清楚,還可以採用圖表法,來彌補單用文字表達的缺欠,對有些事物解說更直接、更具體。

(6)下定義。用簡明的語言對某一概念的本質特徵作規定性的說明叫下定義。下定義能准確揭示事物的本質,是科技說明文常用的方法。

下定義的時候,可以根據說明的目的需要,從不同的角度考慮。有的著重說明特性,如關於「人」的定義;有的著重說明作用,如關於「肥料」的定義;有的既說明特性又說明作用,如關於「統籌方法」和「應用科學」的定義。

①人是能製造工具並使用工具進行勞動的高級動物。

②肥料是能供給養分使植物生長的物質。

③統籌方法,是一種安排工作進程的數學方法。

④工程技術的科學叫做應用科學,它是應用自然科學的基礎理論來解決生產實踐中出現的問題的學問。

無論從什麼角度考慮,無論採用什麼方式,只要是下定義,就必須揭示事物的本質,只有這樣的定義才是科學的。比如,有人說:「人是兩足直立的動物。」這個定義就是不科學的,因為它沒能揭示事物的本質。「人是能製造工具並使用工具進行勞動的高級動物。」這才是科學的定義,因為它揭示了人的本質。

(7)作詮釋。從一個側面,就事物的某一個特點做些解釋,這種方法叫詮釋法。

定義法和詮釋法常採用「某某是什麼」的語言形式。形式相同,如何區分呢?一般來說,「是」字兩邊的話能夠互換,就是定義;如果不能互換,就是詮釋。

例如,「人是能製造工具並使用工具進行勞動的高級動物」這句話,改成「能製造工具並使用工具進行勞動的高級動物是人」,意思不變。「雪是在雲中形成的一種固態降水物」這句話,如果改為「雲中形成的固態降水物是雪」就不成。由此可以辨別,前一句是定義說明,後一句是詮釋說明。

(8)打比方。利用兩種不同事物之間的相似之處作比較,以突出事物的性狀特點,增強說明的形象性和生動性的說明方法叫做打比方。

說明文中的打比方的說明方法,同修辭格上的比喻是一致的。不同的是,比喻修辭有明喻、暗喻、和借喻,而說明多用明喻和暗喻,借喻則不宜使用。

(9)摹狀貌。為了使被說明對象更形象、具體,可以進行狀貌摹寫,這種說明方法叫摹狀貌。

(10)引資料。為了使說明的內容更充實具體,可以引資料說明。引資料的范圍很廣,可以是經典著作,名家名言,公式定律,典故諺語等。

一篇說明文單用一種說明方法很少,往往綜合運用多種說明方法。採用什麼說明方法,一方面服從內容的需要,另一方面作者有選擇的自由。是採用一種說明方法,還是採用多種說明方法,是採用這種說明方法,還是那種說明方法,可以靈活,不是一成不變的。
參考資料:http://ke..com/view/118461.html

4. 很奇怪為什麼國內沒有任何組織或個人開發最底層的中文編譯器呢

這是一個技術問題,你如果沒讀過編譯原理(龍書)的話,你是看不懂下面的回答的。因為中國技術不足,沒人能寫出支持中文的lex和yacc。首先詞法分析生成器lex,就對中文不友好,它只支持ascii字母,不支持中文。這意味著你編譯器里的詞彙只能是英文單詞,不能是中文詞彙。其次就是語法分析生成器yacc了,也不支持中文,只支持用英文寫的語法規則,不能用中文書寫。這意味著最最基本的語法規則是全英文的,這算哪門子中文編程語言。非常遺憾,中國目前沒有牛人造出支持中文的lex和yacc來,否則全中文編譯器一定會滿天飛的,多到爛大街。為什麼說多到爛大街?一個全中文的編譯器其實僅僅需要修改編譯器的前端詞法分析器和語法分析器(語法分析器甚至無需大改動),後端直接對接開源代碼即可,開源英文編譯器已經爛大街了,把它們的後端移植過來就行了。但關鍵就是沒有支持中文的自動化工具lex和yacc。
自動化這條路走不通,純手寫總可以吧。我猜測易語言就是前端純手寫的全中文編譯器。你可以使用易語言,絕對可以達到你的要求。但是從技術的角度來講,lex和yacc的技術高度遠高於易語言,畢竟lex和yacc號稱編譯器的編譯器,編譯器之母。

5. 易語言的編譯原理和中間代碼是什麼

基本特點
易語言是一個自主開發,適合國情,不同層次不同專業的人員易學易用的漢語編程語言。易語言降低了廣大電腦用戶編程的門檻,尤其是根本不懂英文或者英文了解很少的用戶,可以通過使用本語言極其快速地進入Windows程序編寫的大門。易語言漢語編程環境是一個支持基於漢語字、詞編程的、全可視化的、跨主流操作系統平台的編程工具環境;擁有簡、繁漢語以及英語、日語等多語種版本;能與常用的編程語言互相調用;具有充分利用API,COM、DLL、OCX組件,各種主流資料庫,各種實用程序等多種資源的介面和支撐工具。易語言有自主開發的高質量編譯器,中文源代碼被直接編譯為CPU指令,運行效率高,安全可信性高;擁有自己的資料庫系統,且支持訪問現有所有資料庫;內置專用輸入法,支持中文語句快速錄入,完全解決了中文輸入慢的問題;易語言除了支持界面設計的可視化,還支持程序流程的即時可視化;除了語句的中文化之外,易語言中還專門提供了適合中國國情的命令,如中文格式日期和時間處理、漢字發音處理、全半形字元處理、人民幣金額的處理等;易語言綜合採用了結構化、面向對象、組件、構架、集成化等多種先進技術,並在運行效率、性能價格比、全可視化支持、適應本地化需要、面向對象以及提供Windows,Linux上的運行平台等具有特色;現有各種支持庫多達40多個,用戶可以使用她來滿足幾乎所有的Windows編程需求,多媒體功能支持強大,完善的網路、埠通訊和互聯網功能支持,網上與論壇上的學習資源眾多。在易語言及其編譯器的設計與實現、可視化漢語編程的構建、提供多種語言版本等方面具有創新。目前易語言已取得國家級鑒定,鑒定會專家一致認為:易語言在技術上居於國內領先地位,達到了當前同類產品的國際先進水平。
支持庫
易語言支持庫類似於普通的程序的DLL文件。
這個支持庫是易語言專用的,別的程序調用不了的,擴展名有fnr、fne、npk三種。
fnr、fne都是製作好的DLL文件,例如系統核心支持庫、應用介面支持庫。該類支持庫一般由用戶使用C++或Delphi製作,具體可以看易語言支持庫開發手冊。
npk屬於易語言COM包裝支持庫,該支持庫是引用COM包裝庫生成的,例如WebBrowser、Windows媒體播放器。該擴展名格式支持庫可用記事本、寫字板打開。該支持庫可以由用戶製作,製作方法:在易語言上點擊工具--「類型庫或OCX組件→支持庫」命令。

模塊
大型軟體項目的實施一般是分工協作開發,為了支持這一點,易語言提供了模塊化開發支持。易語言中的模塊稱為易模塊。通過使用易模塊,用戶可以將常用的代碼封裝起來重復使用到其它程序,或提供給第三方使用,或用作開發大型軟體項目中的某個部分,然後在軟體項目的封裝階段將所有這些模塊組織編譯成為一個完整程序,易模塊的擴展名為.ec。同時易語言支持大量非官方擴展模塊,用戶可自行編譯模塊,易語言5.11靜態編譯版本發布!很多易語言本身不存在的功能,私人開發的模塊基本會有,更多私人開發出具有特色功能出來,模塊的使用使得易語言突顯「易」字,大大增加了易語言的用戶人群。

6. 求《 現代編譯原理JAVA中文版》pdf,誰有給我一份wk794834392 @163.com

見附件。

7. 推薦幾本經典的編譯原理書,什麼出版社,作者(越厚越好)

看外文,樓主好強!

編譯原理當然是龍、虎、鯨三本經典了。

1.龍書(Dragon book)
書名是Compilers: Principles,Techniques,and Tools
作者是:Alfred V.Aho,Ravi Sethi,Jeffrey D.Ullman
國內所有的編譯原理教材都是抄的它的,而且只是抄了最簡單的前端的一些內容。

2.鯨書(Whale book)
書名是:Advanced Compiler Design and Implementation
作者是:Steven S.Muchnick
也就是高級編譯原理,象什麼陳疑雲之類的估計也就是這個水平不錯了

3.虎書(Tiger book)
書名是:Modern Compiler Implementation in Java/C++/ML,Second Edition
作者是:Andrew W.Appel,with Jens Palsberg
這本書是3本書中最薄的一本,也是最最牛的一本!

龍書機械出版社有原版,中文是李建中教授翻譯的;
虎書是電子工業出版社出的,有中文版,沒看到原版;
鯨書貌似中英文版國內都沒有

8. 求 編譯原理 龍書 中文版第二版 習題答案&

中英文答案均可~~~ 但是一定要第二版的~~~ 最好是全的答案,實在沒有有編譯器是將一種語言翻譯為另一種語言的計算機程序。編譯器將源程序(source

閱讀全文

與中文編譯原理相關的資料

熱點內容
卡爾曼濾波演算法書籍 瀏覽:766
安卓手機怎麼用愛思助手傳文件進蘋果手機上 瀏覽:841
安卓怎麼下載60秒生存 瀏覽:800
外向式文件夾 瀏覽:233
dospdf 瀏覽:428
怎麼修改騰訊雲伺服器ip 瀏覽:385
pdftoeps 瀏覽:490
為什麼鴻蒙那麼像安卓 瀏覽:733
安卓手機怎麼拍自媒體視頻 瀏覽:183
單片機各個中斷的初始化 瀏覽:721
python怎麼集合元素 瀏覽:478
python逐條解讀 瀏覽:830
基於單片機的濕度控制 瀏覽:496
ios如何使用安卓的帳號 瀏覽:880
程序員公園采訪 瀏覽:809
程序員實戰教程要多長時間 瀏覽:972
企業數據加密技巧 瀏覽:132
租雲伺服器開發 瀏覽:811
程序員告白媽媽不同意 瀏覽:333
攻城掠地怎麼查看伺服器 瀏覽:600