解释器语义:阐明解释器所做的步骤

时间:2012-04-27 18:37:04

标签: interpreter semantics bytecode

这个问题是关于定义,语义。

我理解解释的一般概念,将源代码实时转换为机器代码,或者转换为中间缓存,后来实时或在运行时间之前“编译”等。

源>之间是否存在语义区别字节代码翻译步骤,字节代码>机器代码翻译步骤?人们通常将第一部分称为“解释”,将第二部分称为“编译”。请不要误解,我不是要求动态语言范围之外的编译定义。这是另一个话题。

此外,由于大量的解释器实现了许多不同的技术,因此在这两个步骤之间进行语义区分是徒劳的吗?

2 个答案:

答案 0 :(得分:2)

通常,解释意味着由解释器以任意形式(普通源代码,抽象语法树(AST),字节码......)执行程序。

一些虚拟机大量使用JIT(只是在时间编译器中),它将程序的中间表示转换(编译)为本机机器代码。这绝对是一种编译形式。

此外,一些虚拟机会进行多个编译阶段:首先,将AST编译为字节码,稍后可以将其编译为机器代码。

我想说,编译基本上意味着将一个中间表示转换为下一个表示。

答案 1 :(得分:1)

解释器所执行的步骤通常在类似于以下的循环中编程:

get next instruction
parse and interpret its components
dispatch its translation

语言的定义和语义仅在解释器中实现,但在其他地方定义。

您的问题的答案在于语言的正式,操作和公理语义定义,无论是解释还是编译。在这两种情况下,无论采用何种实现技术,都必须保留形式语言定义的语义,并对任何解释或编译保持一致。

语言(如解释器和编译器)的实现针对测试套件进行测试,测试套件根据其正式的语义定义测试语言中每种语言结构的实现。

语言设计者以符号形式(如指称语义)生成语言的正式定义。从数学的角度来看,这个定义非常抽象。

编译器或解释器实现者对语言的操作语义定义更感兴趣,该定义与构建在目标机器上运行的编译器或解释器更直接相关。

该语言的用户对语言的公理定义更感兴趣,该语言通知程序员如何使用该语言的结构来创建程序。