这个问题是关于定义、语义的。
我理解解释的一般概念,将源代码实时转换为机器代码,或转换为稍后实时“编译”或在运行时之前“编译”的中间缓存等。
源 > 字节码翻译步骤和字节码 > 机器码翻译步骤之间是否存在语义区别?人们通常将第一部分称为“解释”,将第二部分称为“编译”。请不要误会,我不是要求在动态语言范围之外定义编译。那是另一个话题。
此外,由于大量解释器实现了如此多不同的技术,因此在这两个步骤之间进行语义区分是徒劳的吗?
这个问题是关于定义、语义的。
我理解解释的一般概念,将源代码实时转换为机器代码,或转换为稍后实时“编译”或在运行时之前“编译”的中间缓存等。
源 > 字节码翻译步骤和字节码 > 机器码翻译步骤之间是否存在语义区别?人们通常将第一部分称为“解释”,将第二部分称为“编译”。请不要误会,我不是要求在动态语言范围之外定义编译。那是另一个话题。
此外,由于大量解释器实现了如此多不同的技术,因此在这两个步骤之间进行语义区分是徒劳的吗?
通常,解释意味着解释器以任意形式(纯源代码、抽象语法树(AST)、字节码……)执行程序。
一些虚拟机大量使用 JIT(即时编译器),将程序的中间表示翻译(编译)为本机机器代码。这绝对是一种汇编形式。
此外,一些 VM 会进行多个编译阶段:首先,将 AST 编译为字节码,然后再将其编译为机器码。
我想说,编译基本上意味着将一个中间表示转换为下一个表示。
解释器执行的步骤通常在类似于以下的循环中编程:
get next instruction
parse and interpret its components
dispatch its translation
语言的定义和语义仅在解释器中实现,但在其他地方定义。
您的问题的答案在于被解释或编译的语言的形式、操作和公理语义定义。在这两种情况下,无论采用何种实现技术,形式语言定义的语义都必须保留并保持一致,以用于任何解释或编译。
诸如解释器和编译器之类的语言的实现是针对测试套件进行测试的,该测试套件根据其形式语义定义测试该语言中每种语言结构的实现。
语言设计者以符号形式(例如指称语义)生成语言的正式定义。从数学的角度来看,这个定义非常抽象。
编译器或解释器实现者对语言的操作语义定义更感兴趣,这与构建编译器或解释器以在目标机器上运行更直接相关。
语言的用户对语言的公理化定义更感兴趣,它告诉程序员如何使用语言的结构来创建程序。