编译器vs解释器(基于构造和设计)
在查看了大量关于编译器和解释器之间差异的文章后,我仍然无法弄清楚它们的构造和内部机制的不同。
我读到的最常见的区别是,编译器生成一个可执行的目标程序(意味着机器代码作为它的输出),它可以在系统上运行并且不会被输入。 而解释器只是逐行运行输入(这里发生了什么?)并生成输出。
我主要怀疑的是:
1)编译器由词法分析器,解析器,中间代码生成器和代码生成器组成,但是解释器的组成部分是什么?
2)谁给解释型语言提供运行时支持,是指谁管理堆和递归函数栈?
3)这是针对Python语言的:
Python由编译器阶段和解释器阶段组成,编译器产生一些字节码,而且这个字节码由其虚拟机解释。
如果我只为Python设计编译器(Python - >字节码)
a)我将不得不管理内存{编写代码来管理堆栈和堆}吗?
b)这个编译器与传统编译器或解释器有什么不同?
我知道这里有很多要问,但我真的很想了解这些细节。
我指的是Alfred V. Aho的编译器
根据反馈和一些进一步的研究,我认为我应该修改我的问题
编译器不需要产生机器代码作为其输出
但是有一个问题仍然在困扰着我说让我想设计一个(Python->字节码)编译器,然后字节码将被虚拟机解释。(纠正我,如果我错了)。
然后,我必须为Python编写一个词法分析器,然后编写一个解析器,它将生成某种抽象语法树。在这之后,我必须生成一些中间代码(龙书中提到的3个地址代码)或直接字节码指令(我想这将在VM的文档中给出)?
我是否还需要编写处理堆栈的代码以提供对递归和范围的支持?
首先,“编译” 并不意味着“输出机器代码”。 您可以从任何语言编译为任何其他语言,无论是高级编程语言,某种中间格式,虚拟机代码(字节码)还是物理机器代码(机器代码)。
像编译器一样,解释器需要阅读和理解它实现的语言。 因此,你有相同的前端代码(尽管今天的解释器通常使用更简单的语言 - 仅字节码;因此这些解释器只需要一个非常简单的前端)。 与编译器不同,解释器的后端不会生成代码,而是执行它。 显然,这是完全不同的问题,因此解释器看起来与编译器有很大不同。 它模拟一台计算机(通常是比现实生活中的计算机高得多的计算机),而不是生成等效程序的表示。
假设今天的虚拟机比较高级,这就是解释器的工作 - 除了别的以外,还有专门的指令来调用函数和创建对象,并且垃圾收集会被放入虚拟机中。 当你定位到更低级别的机器(比如x86指令集)时,许多这样的细节需要被烘焙到生成的代码中,无论是直接(系统调用还是其他),或者通过调用C标准库实现。
3。
a)可能不会,因为专用于Python的VM不需要它。 由于它允许手动内存管理,因此很容易搞砸,不必要的和可以说与Python语义不兼容的东西。 另一方面,如果您想要定位像LLVM这样的低级别应用程序,则必须特别注意 - 细节取决于目标语言。 这是为什么没有人这样做的一部分。
b)它将是一个非常好的编译器,显然不是解释器。 你可能比一个针对机器代码的编译器有一个更简单的后端,并且由于输入语言的本质,你不会有太多的分析和优化工作,但是没有根本的区别。
上一篇: compiler vs interpreter ( on basis of construction and design )