16 compiler-construction interpreter programming-languages scripting-language
您可以为想要编写编程或脚本语言的人提供哪些提示?我并不担心如何编程或设计编译器,而是如何使用工具和代码生成器快速开发编译器.
上次我尝试用c ++编写它,状态和语法几乎和写实际逻辑一样长.我知道以下工具会有所帮助.
我以为我可以生成c ++代码并使用gcc编译.使用上面的工具,您估计编写程序或脚本语言需要多长时间?
早在学习编写编译器时就已反复询问过这个问题的变化.以下是该主题的SO资源的不完整列表.
Gre*_*ill 18
估计这样的事情可能需要多长时间取决于许多不同的因素.例如,经验丰富的程序员可以通过单元测试在几个小时内轻松淘汰一个简单的算术表达式求值程序.但是,新手程序员可能必须学习解析技术,递归下降,表达式树的抽象表示,树行走策略等等.这可能很容易花费数周或更长时间,仅用于算术表达式.
但是,不要让那些劝阻你.正如Jeff和Joel在最近的Stack Overflow播客中与Eric Sink讨论的那样,编写编译器是了解编程的许多不同方面的绝佳方法.我已经构建了一些编译器,它们是我最难忘的编程项目之一.
一些关于构建编译器的经典书籍是:
Dave Hanson和Chris Fraser花了10年的时间建立了世界上最精心设计的编译器之一,他告诉我,他从经验中学到的主要内容之一就是不要尝试用C或C++编写编译器.
如果你想快速开发一些东西,不要生成本机代码; 定位现有的虚拟机,例如CLR,JVM或Lua虚拟机.使用最大munch生成代码.
如果您正在编写解释器,另一个好的选择就是使用内存管理和底层编程语言的其他工具.解析为AST,然后通过AST的树步行解释.这将让你快速起步.性能不是最好的,但它是可以接受的.(使用这种技术,我曾经在Modula-3中编写了一个PostScript解释器.第一次实现需要一周的时间,虽然它后来经历了一些性能调整,主要是在词法分析器中,它从来不需要被替换.)
避免使用LALR解析器生成器; 使用节省时间的东西,比如ANTLR或Elkhound GLR解析器生成器.