构建口译员需要学习什么?

时间:2013-10-27 16:02:24

标签: programming-languages interpreter interpreted-language

对于我的AQA A2级计算项目,我决定创建一个基本的解释性编程语言,输出到Console。我不知道如何建立一个翻译。我有purple dragon book的副本,这是关于编译器设计的,因为user166390在对this question的回答中说,构建编译器的初始步骤与构建解释器的步骤相同。我的问题是:这是真的吗?

我可以使用龙书中描述的技术来编写翻译吗?如果是这样,我需要使用哪些步骤并学习如何使用?

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

我是否可以编写一个基本的解析器来读取源代码的每一行,解析它并立即执行指令,或者这是一个众所周知的坏主意?

2 个答案:

答案 0 :(得分:1)

  

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

你可以,但是你会这么做。

  

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

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

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

答案 1 :(得分:1)

是的,你可以使用龙书中描述的技术来编写翻译。

无论如何,你需要一个词法分析器和一个解析器。

正如其他人所指出的那样,你需要编写代码来进行实际执行 - 但是对于一个简单的解释器,这可能与龙书中描述的syntax-directed translation基本相同。

其他一切都是可选的。


如果您想直接从解析器跳转到执行,您可以。这将为您提供一种非常简单的语言,既可以是好的也可以是坏的 - 请查看Tcl以获取此类语言的示例。

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

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

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


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

如何处理名称是一项重大的设计决策,对您的语言的可用性和可实现性有重大影响。实现的最简单选择是使用单个全局哈希映射来实现单个全局命名空间 - 但请注意,此选择具有众所周知的可用性问题...