好吧,伙计们,我想我应该记下我以前的 CS 笔记,并进一步研究一下编译器理论。我不得不说,我一生都记不起所有这些东西是如何工作的,但我确实有一个大学时代的很好的示例应用程序,它可以帮助我理解一些事情。

该示例应用程序采用构建的语言并将其编译为类似语言的中间汇编代码。然后有一个简单的 VM 实现,它采用这种中间语言并执行语句。

我无法理解的是,如果我这是一个直接解释器而不是编译器,它是否仍然会在内存中构建这些中间命令以在最后执行。或者解释器是否实际上一次“执行”代码块的离散部分?

有帮助吗?

解决方案

解析器不编译。翻译程序时实际上涉及很多步骤(从像C ++这样的高级语言到机器代码)。如果它一次执行或多次通过输入后,它取决于设计。你能让你的问题更具体一些吗?同时,无论你多讨厌它,看看这里 - 特别是前端和后端部分

其他提示

这取决于语言。大多数现代解释语言(Perl,Python和Ruby,仅举几例)将源代码预编译为一些中间形式,以便在最后执行(引用)。

我编写或使用过解释器,这些解释器直接作用于解析输入中的标记,直接作用于由解析器构建的抽象语法树(AST),并将 AST 转换为专为高效执行而设计的形式。所以答案是, 这取决于.

  • 如果你的目标机器有 8K RAM,直接解析解释器将是一个明智的选择(想一想)。
  • 如果您使用解释器来教授或学习编程语言的结构和语义,构建和解释 AST 是一个不错的选择。
  • 如果您使用解释器来实现可移植性并且希望快速执行,那么编译为基于寄存器的虚拟机是一个不错的选择。(David Gregg 和其他人已经证明,基于寄存器的虚拟机(例如 卢阿 VM 与基于堆栈的 VM(如 Java VM)相比。)

大多数现代解释器将程序解析为中间代码,后者将被解释。有些人明确地存储了这个中间代码(例如Python的 .pyc )。例如,有例外,shell脚本被直接解释,而不是解析为中间格式。

一些更高级的“口译员”实际上不解释,但做JIT(即时)编译(例如Java或.NET)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top