关于python:编译器与解释器(基于构造和设计)

compiler vs interpreter ( on basis of construction and design )

在查看了很多关于编译器和解释器之间差异的帖子后,我仍然无法弄清楚它们的构造和内部机制的区别。

我读到的最常见的区别是编译器生成一个可执行的目标程序{意味着机器代码作为其输出},它可以在系统上运行而不是输入。
而解释器只是逐行运行输入{这里到底发生了什么?}并产生输出。

我的主要疑虑是:

1)编译器由词法分析器,解析器,中间代码生成器和代码生成器组成,但是解释器的哪些部分?

2)谁给出了解释语言的运行时支持,我的意思是谁管理堆和递归函数的堆栈?

3)这是Python语言特有的:
Python包含编译器阶段和解释器阶段
编译器生成一些字节代码,并且该字节代码由其虚拟机解释。
如果我只设计Python的编译器(Python - >字节码)

a)我是否必须为它管理内存{编写代码以管理堆栈和堆}?

b)这个编译器将如何与传统编译器或解释器不同?

我知道这里要问的很多,但我真的很想了解这些细节。

我指的是Alfred V. Aho的编译器书

根据反馈和一些进一步的研究,我认为我应该修改我的问题

编译器不需要仅生成机器代码作为其输出

但有一个问题仍然困扰着我
假设我想设计一个(Python->字节码)编译器,然后字节码将被虚拟机解释..(如果我错了,请纠正我)。
然后我将为Python编写一个词法分析器,然后编写一个解析器,它将生成某种抽象语法树..在此之后,我必须生成一些中间代码(龙书中提到的3个地址代码)或直接字节码指令(我想在VM的文档中给出)?

我是否必须编写用于处理堆栈的代码以提供对递归和范围的支持?


首先,"编译器"并不意味着"输出机器代码"。您可以从任何语言编译为任何其他语言,无论是高级编程语言,某种中间格式,虚拟机代码(字节码)还是物理机器代码(机器代码)。

  • 与编译器一样,解释器需要阅读并理解它实现的语言。因此,你有相同的前端代码(虽然今天的解释器通常实现更简单的语言 - 仅字节码;因此这些解释器只需要一个非常简单的前端)。与编译器不同,解释器的后端不会生成代码,而是执行代码。显然,这完全是一个不同的问题,因此解释器看起来与编译器有很大不同。它模拟计算机(通常是比现实生活机器高得多的计算机),而不是生成等效程序的表示。

  • 假设今天有点高级别的虚拟机,这是解释器的工作 - 除了其他之外,还有调用函数和创建对象的专用指令,垃圾收集被烘焙到VM中。当您定位较低级别的计算机(例如x86指令集)时,需要将许多此类详细信息烘焙到生成的代码中,无论是直接(系统调用还是其他)或通过调用C标准库实现。

  • 3。

    • a)可能不是,因为专用于Python的VM不需要它。因为它允许手动内存管理,所以很容易搞砸,不必要且可以说与Python语义不兼容。另一方面,如果你要针对像LLVM这样的低级目标,你必须特别小心 - 细节取决于目标语言。这是为什么没有人这样做的部分原因。

    • b)这将是一个非常好的编译器,显然不是解释器。您可能拥有比编译器目标机器代码更简单的后端,并且由于输入语言的性质,您不需要进行太多的分析和优化,但没有根本区别。