① 匯編語言編譯器是怎麼編寫的
編譯器自舉!搜索這個關鍵字
程序都是編譯器編譯的。這個是肯定的
至於第一款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等動態語言
虎書中也有描述。當然看自己功力了
② 怎樣去寫一個編譯器(用C語言寫C語言編譯器),需要哪些知識做鋪墊,可以給一下相關網站和書籍的推薦嗎
寫編譯器重點就是設計並實現一些數據結構和演算法,語言特點太多的話,代碼寫起來不容易,建議你找一個小語言嘗試下,不要一開始就去嘗試成熟語言。否則你會在寫完語法分析程序以後,遭遇到很大的困難。多數人都是在寫語義分析程序的時候,突然發現自己設計的數據結構很爛,後邊越寫越要命。
如果你想入門編譯器的話,那麼可以看《編譯原理與實踐》,整本書先將編譯器理論,然後後邊教你一步步實現c-miuns(c的子集)的編譯器,包括lex,yacc,都在幾千行代碼左右。這本書講的比較簡單易懂一點
也可以學學斯坦福大學的編譯器設計公開課(aiken設計了一個叫cool的語言,專門用來教人寫編譯器),課程地址上面有人給了:Compilers。這門課以前有個實驗環境(據說已經給了,我以前寫的時候還是用的網上一個不完整的實驗環境),把和編譯器知識無關的內容都給你寫好了,你只需要在固定的地方填上你的內容就可以寫出你的編譯器(不要覺得很簡單哦,人家的代碼寫的很精巧的,讀完就發現寫個好編譯器還是很費腦子的),另外,這個實驗環境有個特點,就是在每一步都提供標准程序做對比,你可以在寫完一部分以後就同標准程序對比,及時發現錯誤。這種方式為寫編譯器又提供了很多幫助
先找個小的,慢慢研究,弄懂了整體的結構再說
③ 我想用JAVA做個簡易編譯器,說說思路,或者有沒有現成的代碼JAVAC的代碼有嗎
要寫編譯器?自己開發語言?很牛X,先贊一個!
自己寫編譯器,原理其實不難,就那麼點東西。找一個編譯原理看明白就OK了,詞法、語法、語義、語境。
這些東西用一些自動機,圖靈機,範式,正規之類的就可以搞定。分析嘛,什麼逆波蘭,樹形,一共也沒幾種的。
但最難做的是優化,還有機器代碼生成這二部分。
優化怎麼做?你的中間代碼放哪?先優化還是先生成中間代碼?
機器代碼怎麼搞?用匯編?還是直接和機器特性相關?
反正這二點我是暈,雖然原理還是那點東西,但真搞起來,我一點思路都沒有。。。
國內寫編譯器的有,但都不是很牛X。
想要寫好,還得多看E文資料。
加油吧。
④ 如何編寫簡單的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 的編譯器,即使是專家都做不到啊。
⑤ 製作一個簡單的編譯器
還能編譯匯編。。。
我暈。。。
我想這個不是一般人可以做到的,祝你好運!
如果你僅僅針對文本編輯器的話就好辦了。
⑥ 如何用basic語言實現一個最簡單的解釋器/編譯器
首先Basic語言是解釋型的語言,而C語言是編譯型的語言。什麼意思呢,就是你編寫的Basic語言程序運行的時候需要一個解釋器將高級語言代碼轉為機器碼然後才可以執行。C語言程序一般經過編譯和聯接後直接生成目標代碼。目標代碼本身就是機器碼所以可以直接運行。
從語法來看,C語言是面向過程的語言。Basic語言嚴格意義上只是一個腳本語言,語法相對來講非常簡單。
另外,C語言是最接近匯編語言的一種語言,功能非常強大,但是要求開發人員對硬體,操作系統等底層的東西要有很深的了解,開發程序相對來講麻煩一些,但是程序性能非常好。Basic語言相封裝了很多底層的東西,所以不要求開發人員有很深的計算機專業背景,開發簡單,但是不要指望用Basic語言開發真正的商業程序。
由於以上的區別,造成這兩種語言的用途不一樣。Basic語言常用來寫一些腳本,或者在真正開發之前作一個軟體模型。實際開發用C語言以確保運行速度和較小的內存需求等其他性能。
顯然,這兩種語言還有其他區別,但上面應該是最重要的區別吧
⑦ 如何寫一個簡單的編譯器
因為我這里都只寫了 Parser ,所以就只談談第一次寫 Parser 的建議。
1. 扔掉龍書虎書鯨魚書。這些書都有一個問題,就是在自己手寫完一個自己的 Parser 之前,書上寫的那些鬼東西完全都不知道該怎麼用,用在哪裡。
2. 大膽地擼。不要在意性能啊,擴展性,復用啊這些鬼東西,先把東西做出來再說。
3. 記住代碼只不過是格式化文本。不要覺得代碼是什麼復雜的東西,它跟 Json / XML 這些東西沒啥太大區別。Parser 的意義就是把人能看懂的格式化數據編程計算機能看懂的格式數據。