好吧,伙计们,我想我会带上我的旧 CS 笔记并多看一下编译器理论。我不得不说我无法记住所有这些东西是如何工作的,但我确实有一个很好的大学时代的示例应用程序,可以帮助我理解一些事情。
此示例应用程序采用组合语言并将其编译为中间汇编代码,如语言。然后有一个简单的 VM 实现,它采用这种中间语言并执行语句。
我无法理解的是,如果我这是一个直截了当的解释器而不是编译器,它是否仍会在内存中构建这些中间命令以在最后执行。还是解释器实际上一次“执行”代码块的隐藏部分?
好吧,伙计们,我想我会带上我的旧 CS 笔记并多看一下编译器理论。我不得不说我无法记住所有这些东西是如何工作的,但我确实有一个很好的大学时代的示例应用程序,可以帮助我理解一些事情。
此示例应用程序采用组合语言并将其编译为中间汇编代码,如语言。然后有一个简单的 VM 实现,它采用这种中间语言并执行语句。
我无法理解的是,如果我这是一个直截了当的解释器而不是编译器,它是否仍会在内存中构建这些中间命令以在最后执行。还是解释器实际上一次“执行”代码块的隐藏部分?
这取决于语言。大多数现代解释语言(Perl、Python 和 Ruby,仅举几例)将源代码预编译成某种中间形式,以便在最后执行(引用)。
我编写或使用过解释器,这些解释器直接作用于解析输入中的标记,直接作用于解析器构建的抽象语法树 (AST),并将 AST 转换为为高效执行而设计的形式。所以答案是,这取决于。
解析器不编译。翻译程序时实际上涉及很多步骤(从 C++ 等高级语言到机器代码)。它取决于设计是一次性执行还是在多次通过输入后执行。你能把你的问题说得更具体一点吗?同时,不管你多么讨厌它,看看这里——特别是前端和后端部分。
大多数现代解释器将程序解析为中间代码,然后再进行解释。有些显式存储此中间代码(例如 Python 的.pyc
)。也有例外,例如,shell 脚本被直接解释,而不是被解析为中间格式。
一些更高级的“解释器”实际上并不解释,而是进行 JIT(即时)编译(例如 Java 或 .NET)。