回答
我可以建議從http://www.nand2tetris.org/傑克編程語言?
它特別適合學習編譯器構造,因爲它是學術課程的一部分。
我在一篇博客文章中一系列中間上編寫編譯器爲這個語言,C#,用代碼生成到C.我已經在帖子在這裏:http://blogs.microsoft.co.il/blogs/sasha/archive/tags/Compiler/default.aspx
奧伯倫規格足夠小爲您的目的:http://www-vs.informatik.uni-ulm.de:81/projekte/Oberon-2.Report/
R5RS或它的一個純粹的功能子集也不是那麼大(如果你忽略數字塔)。
呵呵,我有一本Wirth的書,你可以爲Oberon的一個子集建立一個編譯器。它看起來完全適合這項任務。 – Skurmedel 2011-02-09 11:00:04
我會建議Wirth的PL/0。
爲什麼?
語法雖小,但仍然有足夠的那裏得到一個好味道開發編譯器:
program = block "." . block = [ "const" ident "=" number {"," ident "=" number} ";"] [ "var" ident {"," ident} ";"] { "procedure" ident ";" block ";" } statement . statement = [ ident ":=" expression | "call" ident | "begin" statement {";" statement } "end" | "if" condition "then" statement | "while" condition "do" statement ]. condition = "odd" expression | expression ("="|"#"|"<"|"<="|">"|">=") expression . expression = [ "+"|"-"] term { ("+"|"-") term} . term = factor {("*"|"/") factor} . factor = ident | number | "(" expression ")" .
您可以實現虛擬機編譯器PL/0用C大約1000行代碼。
- 大得足以成爲非平凡的,但足夠小以至於可行。
有與之相關的三本書:
維爾特,尼克勞斯(1975年),算法+數據結構=程序,ISBN 0-13-022418-9(原PL/0規範和實現(在Pascal中))編譯的一個非常溫柔的介紹。
Liffick,布萊斯·W·埃德(1979年),帕斯卡的字節書,ISBN 0-07-037823-1(作者開發PL/0的小超,在北極星基本爲 早期CP/M電腦)。
Wirth,Niklaus(1986),Compilerbau,B.G. Teubner,斯圖加特國際標準書號3-519-32338-9(PL/0的一個小超集,在Modula 2中實現,用德文)。
網絡充滿了例子。
- 我在C,C++,Pascal,Modula 2,Java和Ruby中找到了實現。我敢打賭還有更多。
有一個維基百科條目::-)
此外,一對夫婦有幫助的羣體,有很多人願意幫助回答您編寫編譯器問題:
此外,Usenet新聞組comp.compilers是個好地方獲取信息。
我想到了Kernighan和派克的Unix的編程環境第8章是優秀的。它涵蓋了Unix環境中的大部分編程,同時實現了一種編程語言。
第8章被稱爲程序開發。它討論了通過各個設計階段開發一個非平凡的程序。這個不重要的程序是高階計算器。有關更多細節,請參見http://en.wikipedia.org/wiki/Hoc_(programming_language)
這對使用標準工具yacc和lex實現簡單語言是一個很好的實踐介紹。 yacc和lex在這裏覆蓋的太多了,但通過遵循本書中的例子和練習,你將發展對它們的理解。
該開發持續不同階段;在第一階段,你甚至沒有語言中的變量。到第三階段,你有變量,定義常量(PI,E等),以及像sin()和log()這樣的內置函數。在最後一個階段,你有完全實施的語言。
現在,特別嘗試和實施最好的語言?我沒有線索,但我知道Unix編程環境是一本很好的書,可以與傳統的編譯器書籍並行讀取。當我開始閱讀Aho編譯器書籍(龍書)時,我重新閱讀了TUPE的第8章,並遵循了示例和練習。當然,任何人都可以從書中重新輸入代碼,但這些練習要求您對發生的事情有很好的理解。
最後,我不認爲你選擇做哪種語言並不重要,而是你在實施過程中遵循的過程。
- 1. 學習正確的編程語言?
- 2. 機器學習自然語言處理 - 自定義翻譯
- 3. 什麼是學習機器學習的最佳編程語言?
- 4. 學習編程語言
- 5. 學習一種新語言的簡單練習
- 6. 學習簡單的編程約定
- 7. 要學習元編程的語言
- 8. 單元測試有意義的簡單學習語言是什麼?
- 9. 學習C++語言
- 10. 24小時內學習最簡單的腳本語言?
- 11. 基於LLVM的編譯器的語言
- 12. 簡單的C語言解析器沒有編譯linux機器
- 13. 理想的學習新編程語言的方式
- 14. 學習HTML和學習編程語言有什麼區別?
- 15. 正在學習很多不同的編程語言嗎?
- 16. 需要學習哪種彙編語言
- 17. 學習彙編語言是否值得?
- 18. 學習編程語言概念
- 19. 學習編程語言的工作方式
- 20. 正式語言的堆棧翻譯器
- 21. 定義的數學語言在序言
- 22. 確定用於創建程序集的語言和編譯器?
- 23. 用於學習高級別的域級編譯器語言的最佳開源項目?
- 24. 用於學習字符串模式的機器學習技術
- 25. 小語言學習解析器
- 26. 學習Ontology網絡語言
- 27. 逆向工程編程語言或'無監督學習語言'
- 28. 將機器學習應用於分析混合語言
- 29. 學習一種新的編程語言取決於現有的熟悉語言是否是一種壞習慣?
- 30. 是否有任何「有趣」的方式來學習語言,語法,解析和編譯器?
你可以嘗試實現Pascal的一個子集;請查看[Pascal Implementation](http://homepages.cwi.nl/~steven/pascal/book/) – 2011-02-09 10:32:12