我正在寻找一种简单的,正式定义的语言,可以在学习编译器构造时使用。实施第一遍应该很简单,然后可以进一步优化工作。
随意指出我对lisps的方向,但我也特别寻找其他选择。
答案 0 :(得分:5)
我可以从http://www.nand2tetris.org/建议使用Jack编程语言吗?
它特别适合学习编译器构建,因为它是学术课程的一部分。
我正在编写一篇关于为C语言编写这种语言编译器的博客文章系列,代码生成为C.我已经在这里发帖:http://blogs.microsoft.co.il/blogs/sasha/archive/tags/Compiler/default.aspx
答案 1 :(得分:3)
我认为Kernighan和Pike的 Unix编程环境的第8章非常出色。它涵盖了Unix环境中的大部分编程,同时实现了编程语言。
第8章称为程序开发。它讨论了通过各个设计阶段开发一个非平凡的程序。这个非平凡的计划是高阶计算器。有关hoc的更多详细信息,请参阅http://en.wikipedia.org/wiki/Hoc_(programming_language)
使用标准工具yacc和lex实现简单语言是一个很好的实用介绍。 yacc和lex太多了,无法覆盖这里,但是通过遵循本书中的示例并进行练习,您将了解它们。
发展持续不同阶段;在第一阶段,你甚至没有语言变量。在第三阶段,您有变量,定义常量(PI,E等),以及内置函数,如sin()和log()。到最后阶段,您将拥有完全实现的语言。
现在,is hoc是尝试和实施的最佳语言吗?我不知道,但我知道 Unix编程环境是一本很好的书,可以与传统的编译器书同时阅读。当我开始阅读Aho编辑书(龙书)时,我重读了TUPE的第8章,并按照例子和练习进行了阅读。当然,任何人都可以从书中重新输入代码,但练习要求您对正在发生的事情有充分的了解。
最后,我认为您选择使用哪种语言并不重要,但是在实施时您遵循的过程非常重要。
答案 2 :(得分:2)
我建议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 ")" .
您可以在C中以大约1000行代码实现PL / 0的虚拟机编译器。
有三本书与之相关:
Wirth,Niklaus(1975),算法+数据结构=程序,ISBN 0-13-022418-9(最初的PL / 0规范和实现(在Pascal中))非常温和的编译介绍。 / p>
Liffick,Blaise W.,Ed(1979),The Paste Book of Pascal,ISBN 0-07-037823-1(作者在Northstar Basic中开发PL / 0的次要超集 早期的CP / M计算机。)
Wirth,Niklaus(1986),Compilerbau,B.G。 Teubner,Stuttgart ISBN 3-519-32338-9(PL / 0的次要超集,在Modula 2中实现。在德语中)。
网上有很多例子。
有一个维基百科条目:: - )
此外,还有一些有用的小组,很多人愿意帮助回答你的编译问题:
此外,Usenet新闻组comp.compilers是获取信息的好地方。
答案 3 :(得分:1)
Oberon规范足够小,可用于您的目的:http://www-vs.informatik.uni-ulm.de:81/projekte/Oberon-2.Report/
R5RS或它的纯功能子集也不是那么大(如果忽略数字塔)。