Programming languages 我需要学习什么来构建一个解释器?

Programming languages 我需要学习什么来构建一个解释器?,programming-languages,interpreter,interpreted-language,Programming Languages,Interpreter,Interpreted Language,对于我的AQAA2级计算项目,我决定创建一种基本的解释编程语言,输出到控制台。我不知道如何建立一个口译员。我有一个关于编译器设计的副本,正如user166390在回答构建编译器的初始步骤与构建解释器相同时所说的。我的问题是:这是真的吗 我可以使用龙书中描述的技巧来编写一个解释器吗?如果是,我需要使用哪些步骤并学习如何使用 例如,我是否需要编写词法分析器、语法分析器、语义分析器和中间代码生成器 我是否可以编写一个基本的解析器来读取每一行源代码,对其进行解析,然后直接执行指令,或者这是一个众所周知的

对于我的AQAA2级计算项目,我决定创建一种基本的解释编程语言,输出到控制台。我不知道如何建立一个口译员。我有一个关于编译器设计的副本,正如user166390在回答构建编译器的初始步骤与构建解释器相同时所说的。我的问题是:这是真的吗

我可以使用龙书中描述的技巧来编写一个解释器吗?如果是,我需要使用哪些步骤并学习如何使用

例如,我是否需要编写词法分析器、语法分析器、语义分析器和中间代码生成器

我是否可以编写一个基本的解析器来读取每一行源代码,对其进行解析,然后直接执行指令,或者这是一个众所周知的坏主意

我可以编写一个基本的解析器来读取源代码并直接执行这些步骤吗

你可以,但你会很难做到的

例如,我是否需要编写词法分析器、语法分析器、语义分析器和中间代码生成器

您可以跳过中间代码生成,除非您想编写基于VM的解释器。例如Perl,用于直接执行其解析图;这与Java或Python形成对比,后者生成中间字节代码


基于VM的语言的解释器部分通常比必须理解解析图的解释器更简单(因此系统中的每个组件都更简单),但是当您不需要定义中间字节码语言时,整个解释器堆栈的复杂性通常更简单。所以,选择你的毒药。

是的,你可以使用《龙之书》中描述的技巧编写解释器

不管怎样,您都需要一个词法分析器和解析器

正如其他人所指出的,您确实需要编写代码来执行实际的执行——但是对于一个简单的解释器,这基本上可以与《龙之书》中描述的相同

其他一切都是可选的


如果您想直接从解析器跳到执行,您可以。这将给您留下一种非常简单的语言,它可以是好的也可以是坏的——请看一个这样一种语言的例子

如果您想在解析每一行时解释它,您也可以这样做;这是大多数命令行解释器(Unix shell脚本、Microsoft的cmd.com和PowerShell)以及Python和Ruby等语言的交互式“REPL”(Read-Eval-Print-Loops)所做的

“语义分析器”对我来说似乎很模糊,但听起来它应该包括大多数类型的加载时间一致性检查。这也是可选的,但解释器有一些优点,它不会接受任何旧的垃圾并尝试将其作为程序执行

“中间代码”也有点模糊,但可以说是可选的。如果您不是直接从程序字符串执行(如在Tcl中),那么在读入代码后,您需要某种内部表示来存储代码。一种流行的选择是从内部树结构执行,或多或少地基于您的解析树,这与生成“中间代码”是不同的。另一方面,如果您的“中间代码”或多或少可以直接从内部树结构中写出,那么您也可以将内部结构计算为“中间代码”


有些重要问题你还没有解决;一个突出的问题是:你想如何处理名字?您可能希望程序员能够定义和使用自己的名称(例如,变量、函数等),因此您需要为此实现某种机制


如何准确地处理名称是一个重大的设计决策,它对语言的可用性和可实现性具有重大影响。实现的最简单选项是使用单个全局哈希映射来实现单个全局名称空间——但请注意,这种选择存在众所周知的可用性问题……

编译器和解释器之间的区别是模糊的。可能最简单的方法是将编译器从源语言构建到虚拟机的字节码中,该虚拟机的设计同时考虑了编译的易用性和运行时性能。有很多关于虚拟机设计的文献。大多数现代口译员(如CPython、Perl6等)都是以这种方式实现的。编译器中可以省略的是复杂的优化和本机代码生成(即编译中最复杂的部分)。给我的印象是,编译器设计比解释器设计复杂得多-鉴于本项目的范围和时间有限,我想选择更简单的路线。另外,有人告诉我,口译员更容易调试,其主要目的是为非程序员开发一种简单易用的语言。如果调试更容易,那就更好。@SK logic指出,编译器和解释器之间的区别并不明确。与其说是编译器还是解释器,不如告诉我们您需要从代码执行器获得哪些功能,而这些功能如果您只是编写一个普通的编译器,是无法获得的。然后,我们可以告诉您需要做哪些更改才能合并这些功能。事实上,解释器比编译器更复杂。使用一个特别的解释器,您必须为您的高级语言实现完整的操作语义,这可能是非常不平凡的语言。即使是像词法范围界定这样简单的事情,对口译员来说也很棘手。编译是不同的——它是关于转换树的,一次一个简单的步骤,从一种复杂的语言转换成一种更简单的语言。然后你可以很容易地解释你的简单语言(例如,抽象机器的扁平字节码)