假设我想为功能语言实现解释器。我想了解这样做所涉及的问题以及可用的合适文献。这是一种处于早期设计阶段的新语言,这就是为什么这个问题的范围很广。
出于本次讨论的目的,我们可以假设语言的目的并不重要,并且如果它对编写解释器的易用性产生显着影响,它的功能特性可以被改变(甚至是巨大的)。
麻省理工学院网站有计算机程序的结构和解释的在线副本以及使用 Scheme 的 MIT 6.001 讲座的视频,这些视频是 1986 年在惠普录制的。这些是对语言设计的很好的介绍。
假设我想为功能语言实现解释器。我想了解这样做所涉及的问题以及可用的合适文献。这是一种处于早期设计阶段的新语言,这就是为什么这个问题的范围很广。
出于本次讨论的目的,我们可以假设语言的目的并不重要,并且如果它对编写解释器的易用性产生显着影响,它的功能特性可以被改变(甚至是巨大的)。
麻省理工学院网站有计算机程序的结构和解释的在线副本以及使用 Scheme 的 MIT 6.001 讲座的视频,这些视频是 1986 年在惠普录制的。这些是对语言设计的很好的介绍。
我强烈推荐计算机程序的结构和解释(SICP)作为起点。这本书将介绍编写解释器(和编译器)的意义,通常是任何设计语言的人的必读之书。
为功能语言实现解释器与为任何其他通用语言实现解释器不太可能有太大不同。有词法分析、解析、AST 构造、语义分析,以及执行(对于纯解释器)或代码生成和优化(对于编译器,甚至编译为像 Java/Perl/Python 这样的字节码)。SICP 将介绍“应用顺序”和“正常顺序”评估之间的区别,这在纯函数上下文中可能对您很重要。
我认为,对于几乎任何语言解释器或编译器,主要问题都是相同的。
您需要确定语言的某些基本特征(语义,而不是语法),并且事物的大部分设计都由此而来。
例如,你的语言有类型系统吗?如果有,它有哪些类型?它会是静态类型、动态类型、鸭子类型吗?
你打算支持什么样的表达方式?您需要定义操作顺序吗?你还会有运营商吗?
您将使用什么作为程序的运行时表示?您会将文本转换为字节码表示、AST 还是源文本的标记化形式?
有一些工具包可以帮助从文本的实际解析中消除一些乏味(ANTLR 和 Bison,仅举两个例子),但我不知道有什么可以帮助完成任务的实际解释部分。我相信有人会提出一些建议。
主要问题是你正在实现的语言有一个语义——这样,实现就变得简单了。否则,这个问题非常广泛且难以回答。
我会推荐 Essentials of Programming Languages 作为 SICP 的一个很好的补充,特别是如果你对解释器感兴趣:EOPL 官方网站。您可能想查看第三版——该网站尚未更新。
编辑:垃圾邮件预防让我在链接之间进行选择,所以官方页面现在没有加热。不过,它很容易通过 Google 搜索。