我发现自己加入了一个将解释器整合到现有应用程序中的项目。要解释的语言是 Lisp 的衍生语言,具有特定于应用程序的内置函数。单个“程序”将在应用程序中以批处理方式运行。
令我惊讶的是,这些年来我编写了几个编译器和几个数据语言翻译器/解析器,但我以前从未真正编写过解释器。原型很长,在 C++ 中实现为语法树遍历器。我可能会影响原型之外的架构,但不能影响实现语言(C++)。所以,约束:
- 实现将在 C++ 中
- 解析可能会使用 yacc/bison 语法处理(现在是)
- 像 NekoVM 和 LLVM 这样的完整 VM/Interpreter 生态系统的建议对于这个项目可能并不实用。独立的更好,即使这听起来像 NIH。
我真正想要的是阅读有关实现解释器的基础知识的材料。我浏览了 SO 和另一个名为Lambda the Ultimate 的网站,尽管它们更倾向于编程语言理论。
到目前为止我收集的一些花絮:
Lisp in Small Pieces,克里斯蒂安·奎内克(Christian Queinnec)。推荐它的人说它“从琐碎的解释器转向更高级的技术,并完成了字节码和‘Scheme to C’编译器的呈现。”
内科虚拟机。正如我上面提到的,我怀疑我们是否被允许合并一个完整的 VM 框架来支持这个项目。
计算机程序的结构和解释。最初我建议这可能是矫枉过正,但经过一个健康的块,我同意@JBF。信息量大,思路开阔。
保罗格雷厄姆在 Lisp上。我读过这篇文章,虽然它是对 Lisp 原则的信息性介绍,但不足以快速开始构建解释器。
鹦鹉实施。这似乎是一个有趣的阅读。不确定它是否会为我提供基础知识。
从零开始的计划。Peter Michaux 正在攻击 Scheme 的各种实现,从用 C 编写的快速而肮脏的 Scheme 解释器(在以后的项目中用作引导程序)到编译的 Scheme 代码。到目前为止非常有趣。
Language Implementation Patterns: Create Your Own Domain-Specific and General Programming Languages ,在Books On Creating Interpreted Languages的评论线程中推荐。这本书包含两章专门介绍构建解释器的实践,所以我将它添加到我的阅读队列中。
- New (and yet Old , ie 1979): Writing Interactive Compilers and Interpreters by PJ Brown。这本书早已绝版,但有趣的是提供了与基本解释器的实现相关的各种任务的大纲。我看到这个的评论褒贬不一,但因为它很便宜(我订购它时使用了大约 3.50 美元),我会试一试。
那么怎么样呢?有没有一本好书可以帮助新手并展示如何在 C/C++ 中为类似 Lisp 的语言构建解释器?你喜欢语法树遍历器还是字节码解释器?
回答@JBF:
当前的原型是一个解释器,这对我来说很有意义,因为我们接受了任意代码文件的路径并在我们的应用程序环境中执行它。内置函数用于影响我们的内存数据表示。
它不应该慢得可怕。当前的树行者似乎可以接受。
该语言基于Lisp,但不是 Lisp,因此不需要符合标准。
- 如上所述,我们不太可能被允许添加一个完整的外部 VM/解释器项目来解决这个问题。
对于其他海报,我也会查看您的引文。谢谢大家!