好吧,在我寻找编写编译器所需的东西的过程中,我遇到了一些障碍。似乎我发现的每一项技术或工具都有一些反对的地方。
我现在使用 Bison 和 Flex,但我感觉这种方法已经过时了。这是真的?这是继续编写成熟的编程语言的良好前向兼容方式吗?
在大量不同的概念和工具(ANTLR、LL(k)、GLR、LALR、LLVM、Flex、Bison)中,编写编译器的当前趋势和最佳实践是什么?龙书过时了吗?
除非您想编写一个真正简单的编译器,否则您的重点是错误的。
编写编译器只是编写解析器的一小部分。拥有一个解析器就像
当问题是攀登珠穆朗玛峰时,攀登喜马拉雅山的山麓。当你到达山顶并抬头仰望时……只剩下 20,000 英尺了,而你只完成了真正容易的部分。您会注意到,到达山顶所需的技术比走完其余路程所需的技术要容易得多。
(仅供参考:目前最好的解析技术是GLR http://en.wikipedia.org/wiki/GLR_parser,这很容易
接受不明确的语法而不破坏语法。 GLR甚至可以轻松解析C++,
这违反了 C++ 难以解析的民间定理。民间定理
来自尝试使用 YACC 和 ANTLR 解析它的人)。
要构建编译器,您需要大量机器:
- AST大楼
- 符号表构建
- 控制流分析
- 数据流分析
- 程序代码本质上表示为数据流计算(SSA 或三元组)
- 目标机器的型号
- 将程序代码映射到机器指令的方法
- 寄存器分配
- 优化:恒定传播、循环展开……
我们甚至还没有接近全局流分析、全局优化或特殊处理
适用于涉及 SIMD 指令或缓存优化的现代指令集。
...
这样的例子不胜枚举。 Dragon 书对基本主题进行了很好的介绍,但没有涉及任何高级主题。您需要库珀的“工程编译器”和穆奇尼克的“高级编译器设计”作为参考,如果您在开始之前仔细浏览一下它们,那就太好了。
构建一个现代编译器是一项工程壮举。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)