1. 如何編寫簡單的java編譯器(用java語言),比如說能翻譯諸如"public static void main" 的就行。
看看《編譯原理》或許對你有幫助。
要編譯一門語言,你要知道它的語法 syntax 和語義 semantics,語法是用來檢查所謂的「語法錯誤」,語義是讓語句變得有意義,對計算機程序語言來說,就是把它翻譯成計算機能執行的指令。
你需要了解最基本的一些概念諸如正則表達式,上下文無關語言,上下文相關語言,等等。
《編譯原理》是很通用的基礎書籍,裡面我記得有介紹了 yacc 的用法,這是 GNU 里的一款編譯器的編譯器,對應有一個 Java 的 Project 叫 yacc for Java,你可以去 google 找一下。
如果你能寫出一個檢查語法錯誤的程序就已經很不錯了,你可以考慮改做一個編輯器之類的軟體(只需要找錯,不需要編譯)。如果你真要做編譯器,工程量巨大不說,你首先需要對至少兩種語言都熟悉,你需要對計算機的指令和它的執行方式有深刻理解,尤其是 Java 這種動態的高級語言,有類啊對象啊什麼的,要把它翻譯成機器指令實屬不易,至今除了 Sun 的 javac 都沒有很成功的編譯器,那個 GCJ(把 Java 編譯成本地代碼)的嘗試也只成功了一半,以前還被 MingW 包含在工具箱里(和 GCC 什麼的一起),但是有很多特性不支持,而且已經很久不更新了,新版本的 MingW 里都沒有了。想一個人從零開始設計一款 Java 的編譯器,即使是專家都做不到啊。
2. 正在做一個小型編譯器,請問如何把中間表達式如何生成C語言
你的意思不是很明白。
我就簡單說下一個我當時寫一個簡單編譯器的流程吧
首先你得確定文法,然後再開始寫編譯器
1. 用flex寫詞法分析程序,具體的網上有很多資料。
2. 用yacc寫語法分析程序,可以分幾步來寫
先寫一個語法樹生成程序,列印出語法樹,可以進行簡單的類型檢查;
再使用語法制導的翻譯方案,寫一個中間代碼生成程序。
3. 將中間代碼翻譯成匯編語言,優化就不做了太麻煩。
推薦龍書
3. 匯編語言編譯器是怎麼編寫的
編譯器自舉!搜索這個關鍵字
程序都是編譯器編譯的。這個是肯定的
至於第一款X語言編譯器是不是直接1010101010自己寫的那就不知道啦
一般開發編譯器的話。有兩條路選擇
1.利用yacc(或者其變種)&lex(詞法分析)-等工具自己生成語法模板
詞法語法都可以使用這些工具自己生成
然後自己編寫生成的中間碼和生成的機器碼就可以了
一般做編譯原理類似試驗都是如此的。許多編譯器也的確是這樣
2.自己寫詞法分析和語法分析。可以參考一些開源的編譯器
lcc-這個是ANSI C99標準的編譯器是開源的
或者nasm,watcom等編譯器到www.sf.net上不少開源的編譯器
總的來說。高級語言編譯器比較難寫
如果想快速寫出一個的話
可以採用第一種做法。利用工具生成語法詞法模板
先寫一個簡單的匯編編譯器比較簡單
開源的有nasm,jwasm(支持masm語法開源的編譯器)
http://www.japheth.de/JWasm.html
fasm(這款編譯器是自舉的.就是自己可以編譯自己),
http://flatassembler.net/
剩下的就是自己做好語言規則關鍵字map
引用高手的話。語言map做好了你的編譯器也做好一半了
剩下的都是機械性的工作了。
生成x86或者arm指令。
優化工作這個很難解釋.根據你所需要的做吧
畢竟可以做出一個無錯,又XX的編譯器已經很難得
你可以選擇使用現有的編譯器開發自己的編譯器
然後等到你的編譯器支持相當數量指令和成熟度的時候
使用自己的語法重新寫一遍編譯器.
這樣你就可以用自己的編譯器開發自己的編譯器了(是不是很邪惡?)
另外舉幾個例子
Delphi的編譯器是C++ Builder開發的。
而C++ Builder的IDE是Delphi開發的
C++ Builder的編譯器是C++ Builder開發的-這個就是編譯器自舉了。。Delphi和C++ Builder共享一個後端化優化器。
Delphi 早期的版本的編譯器是tasm直接編譯的。可見Anders的匯編功力多強悍(Anders也就是後來VJ++,C#,.NET工程的核心架構師.最關鍵的靈魂級人物)
VC++的編譯器是VC++開發的。很明顯這都說明了編譯器自舉
自己開發自己。如果一個編譯器可以做到自己編譯自己。那基本上就可以實現任何功能了。
關於編譯器開發的書籍可以看一下
龍書《編譯原理(第二版)》
虎書《現代編譯原理-C語言描述》
鯨書《高級編譯器設計與實現》
建議從鯨書看起。然後是龍書
再來是虎書--虎書裡面描述了許多現代編譯器(正如其名)技術
例如面向對象啦,優化,垃圾回收等等.
鯨書看完基本上就可以實現一個簡單的Tiny C編譯器了
然後在龍書鞏固,讀一下語言規范,自己看一些開源的匯編編譯器代碼
自己就可以嘗試做一個匯編語言編譯器了.等到技術提高了
在嘗試做一些高級語法識別,參考LCC代碼做一下ANSI C99的
C語言編譯器。再來就看你自己的興趣和領悟度拉
如果想支持C++的話就得要對編譯器做許多方便的研究
類似Java那種跨平台或者Ruby,Python等動態語言
虎書中也有描述。當然看自己功力了
4. YACC用的是哪種翻譯程序,是匯編程序、編譯程序還是解釋程序
YACC的輸入文件稱為YACC 源文件,它包含一組以BNF書寫的形式文法規則以及對每條規則進行語義處理的C語言語句。輸出的是基於表驅動的編譯器,包含輸入的語法規約的處理代碼部分。在生成LALR分析表的過程中發現沖突時,YACC解決沖突的基本思想是:對各個重寫規則和各個終結符號給一個優先順序。並且指明終結符號具有左結合性還是右結合性,而且還允許對於不具有結合性的運算符指明不可結合性。文法連同優先順序與結合性等信息在YACC說明書中給出,它由YACC編譯器翻譯為識別程序源程序,再由C編譯器編譯連接成可執行的識別程序。因此,YACC說明書也稱為YACC源程序。
5. 如何利用yacc自動生成工具得到語法語義分析程序
通常是作為編譯器或解釋器的組件出現的,它的作用是進行語法檢查、並構建由輸入的單片語成的數據結構(一般是語法分析樹、抽象語法樹等層次化的數據結構)。
語法分析器通常使用一個獨立的詞法分析器從輸入字元流中分離出一個個的「單詞」,並將單詞流作為其輸入。實際開發中,語法分析器可以手工編寫,也可以使用工具(半)自動生成。
6. 很奇怪為什麼國內沒有任何組織或個人開發最底層的中文編譯器呢
這是一個技術問題,你如果沒讀過編譯原理(龍書)的話,你是看不懂下面的回答的。因為中國技術不足,沒人能寫出支持中文的lex和yacc。首先詞法分析生成器lex,就對中文不友好,它只支持ascii字母,不支持中文。這意味著你編譯器里的詞彙只能是英文單詞,不能是中文詞彙。其次就是語法分析生成器yacc了,也不支持中文,只支持用英文寫的語法規則,不能用中文書寫。這意味著最最基本的語法規則是全英文的,這算哪門子中文編程語言。非常遺憾,中國目前沒有牛人造出支持中文的lex和yacc來,否則全中文編譯器一定會滿天飛的,多到爛大街。為什麼說多到爛大街?一個全中文的編譯器其實僅僅需要修改編譯器的前端詞法分析器和語法分析器(語法分析器甚至無需大改動),後端直接對接開源代碼即可,開源英文編譯器已經爛大街了,把它們的後端移植過來就行了。但關鍵就是沒有支持中文的自動化工具lex和yacc。
自動化這條路走不通,純手寫總可以吧。我猜測易語言就是前端純手寫的全中文編譯器。你可以使用易語言,絕對可以達到你的要求。但是從技術的角度來講,lex和yacc的技術高度遠高於易語言,畢竟lex和yacc號稱編譯器的編譯器,編譯器之母。
7. 如何用Yacc實現一個Python的編譯器
理論上是可以的,關鍵點在於您要在Lexer和Parser之間要多加一層,用於分析哪些地方是進入縮進,哪些地方是退出縮進。然後匹配到縮進的時候插入INDENT和DEDENT這樣的Token。至於分析的方法,您可以先建一個Stack來存放每一層縮進塊的Token,然後根據Lexer送來的Token中的行號、列號等信息來和Stack棧頂的數據進行對比,判斷下來是該進入縮進的就push一個INDENT,並這個INDENT插入到輸出的Token流中。發現是Stack中舊的Token匹配的,就把之前的縮進塊pop出來,並在輸出的Token流中插入DEDENT。然後在Paser層面處理語句塊的時候可以這樣處理(我只寫大概意思的偽碼,具體您自己看著辦)block ::= INDENT NLS statements NLS DEDENTif ::= IF LPAREN expression RPAREN COLON block
8. 怎樣去寫一個編譯器(用C語言寫C語言編譯器),需要哪些知識做鋪墊,可以給一下相關網站和書籍的推薦嗎
寫編譯器重點就是設計並實現一些數據結構和演算法,語言特點太多的話,代碼寫起來不容易,建議你找一個小語言嘗試下,不要一開始就去嘗試成熟語言。否則你會在寫完語法分析程序以後,遭遇到很大的困難。多數人都是在寫語義分析程序的時候,突然發現自己設計的數據結構很爛,後邊越寫越要命。
如果你想入門編譯器的話,那麼可以看《編譯原理與實踐》,整本書先將編譯器理論,然後後邊教你一步步實現c-miuns(c的子集)的編譯器,包括lex,yacc,都在幾千行代碼左右。這本書講的比較簡單易懂一點
也可以學學斯坦福大學的編譯器設計公開課(aiken設計了一個叫cool的語言,專門用來教人寫編譯器),課程地址上面有人給了:Compilers。這門課以前有個實驗環境(據說已經給了,我以前寫的時候還是用的網上一個不完整的實驗環境),把和編譯器知識無關的內容都給你寫好了,你只需要在固定的地方填上你的內容就可以寫出你的編譯器(不要覺得很簡單哦,人家的代碼寫的很精巧的,讀完就發現寫個好編譯器還是很費腦子的),另外,這個實驗環境有個特點,就是在每一步都提供標准程序做對比,你可以在寫完一部分以後就同標准程序對比,及時發現錯誤。這種方式為寫編譯器又提供了很多幫助
先找個小的,慢慢研究,弄懂了整體的結構再說
9. 請問學x86匯編語言用什麼編譯器
編譯器自舉!搜索這個關鍵字
程序都是編譯器編譯的。這個是肯定的
至於第一款X語言編譯器是不是直接1010101010自己寫的那就不知道啦
一般開發編譯器的話。有兩條路選擇
1.利用yacc(或者其變種)&lex(詞法分析)-等工具自己生成語法模板
詞法語法都可以使用這些工具自己生成
然後自己編寫生成的中間碼和生成的機器碼就可以了
一般做編譯原理類似試驗都是如此的。許多編譯器也的確是這樣
2.自己寫詞法分析和語法分析。可以參考一些開源的編譯器
lcc-這個是ANSI C99標準的編譯器是開源的
或者nasm,watcom等編譯器到上不少開源的編譯器
總的來說。高級語言編譯器比較難寫
如果想快速寫出一個的話
可以採用第一種做法。利用工具生成語法詞法模板
先寫一個簡單的匯編編譯器比較簡單
開源的有nasm,jwasm(支持masm語法開源的編譯器)
fasm(這款編譯器是自舉的.就是自己可以編譯自己),
剩下的就是自己做好語言規則關鍵字map
引用高手的話。語言map做好了你的編譯器也做好一半了
剩下的都是機械性的工作了。
生成x86或者arm指令。
優化工作這個很難解釋.根據你所需要的做吧
畢竟可以做出一個無錯,又XX的編譯器已經很難得
你可以選擇使用現有的編譯器開發自己的編譯器
然後等到你的編譯器支持相當數量指令和成熟度的時候
使用自己的語法重新寫一遍編譯器.
這樣你就可以用自己的編譯器開發自己的編譯器了(是不是很邪惡?)
另外舉幾個例子
Delphi的編譯器是C++ Builder開發的。
而C++ Builder的IDE是Delphi開發的
C++ Builder的編譯器是C++ Builder開發的-這個就是編譯器自舉了。。Delphi和C++ Builder共享一個後端化優化器。
Delphi 早期的版本的編譯器是tasm直接編譯的。可見Anders的匯編功力多強悍(Anders也就是後來VJ++,C#,.NET工程的核心架構師.最關鍵的靈魂級人物)
VC++的編譯器是VC++開發的。很明顯這都說明了編譯器自舉
自己開發自己。如果一個編譯器可以做到自己編譯自己。那基本上就可以實現任何功能了。
關於編譯器開發的書籍可以看一下
龍書《編譯原理(第二版)》
虎書《現代編譯原理-C語言描述》
鯨書《高級編譯器設計與實現》
建議從鯨書看起。然後是龍書
再來是虎書--虎書裡面描述了許多現代編譯器(正如其名)技術
例如面向對象啦,優化,垃圾回收等等.
鯨書看完基本上就可以實現一個簡單的Tiny C編譯器了
然後在龍書鞏固,讀一下語言規范,自己看一些開源的匯編編譯器代碼
自己就可以嘗試做一個匯編語言編譯器了.等到技術提高了
在嘗試做一些高級語法識別,參考LCC代碼做一下ANSI C99的
C語言編譯器。再來就看你自己的興趣和領悟度拉
如果想支持C++的話就得要對編譯器做許多方便的研究
類似Java那種跨平台或者Ruby,Python等動態語言
虎書中也有描述。當然看自己功力了