实现编译器和解释器有什么区别?

我最近阅读了整本Dragon Book(只是为了好玩,我实际上并没有计划实现一个实际的编译器),而且我留下了一个悬而未决的大问题。

实现编译器和解释器有什么不同?

对我来说编译器由以下部分组成:

  • 词法分析器
  • 解析器(构建语法树)
  • 生成中间代码(如3个地址代码)
  • 做所有这些疯狂的事情来优化,如果你想:-)
  • 从3地址代码生成“汇编”或“本机代码”。
  • 现在,显然,解释器也具有与编译器相同的词法分析器和解析器。
    但是之后它做了什么?

  • 它是否“读取”语法树并直接执行? (有点像有一个指向指向树中当前节点的指令指针,并且执行是一次大树遍历加上调用堆栈的内存管理)(如果是这样,它是如何做的?我希望执行比一个巨大的switch语句更好,它检查它是什么类型的节点)

  • 它是否生成3个地址代码并解释它? (如果是这样,它是如何做到的?再次,我正在寻找比一英里长的开关语句更优雅的东西)

  • 它是否生成真正的本地代码,将其加载到内存中并使其运行? (在这一点上,我猜它不再是解释器了,而更像是一个JIT编译器)
  • 此外,“虚拟机”的概念在哪一点切入? 你在一种语言中使用什么虚拟机? (要明确我的无知程度,对我来说虚拟机是VMWare,我不知道VM的概念如何适用于编程语言/执行程序)。

    正如你所看到的,我的问题非常广泛。 我主要不仅在寻找使用哪种方法,而且主要是为了首先理解大概念,然后深入了解它的工作原理。 我想要丑陋的原始细节。 显然,这更多的是对事物的引用,而不是期待你在这里回答所有这些细节。

    谢谢!
    丹尼尔


    编辑:谢谢你迄今为止的答案。 我意识到我的标题是误导性的。 我理解编译器和解释器之间的“功能”差异。
    我在寻找的是关于如何实现解释器与编译器的区别。
    我现在明白编译器是如何实现的,问题是解释器与此不同。

    例如:VB6显然既是编译器又是解释器。 我现在明白了编译器的一部分。 但是,我无法理解,在IDE内部运行时,它可以让我在任意点停止该程序,更改代码并使用新代码恢复执行。 这只是一个小例子,它不是我要找的答案。 正如我在下面解释的那样,我试图理解什么是在我拥有一个分析树之后发生的事情。 编译器会以“目标”语言从它生成新的代码。 口译员做什么?

    感谢您的帮助!


    简短的回答:

  • 编译器将源代码转换为可执行格式供以后执行
  • 解释器会评估源代码以便立即执行
  • 在实施方面有很大的余地。 解释器可以生成本地机器代码,然后执行它,而虚拟机的编译器可能会生成p代码而不是机器代码。 像Forth这样的线程解释语言在字典中查找关键字并立即执行其关联的本地代码功能。

    编译器通常可以更好地进行优化,因为他们有更多时间研究代码并生成一个文件供以后执行; 口译员没有时间进行优化,因为他们倾向于在第一眼看到“按原样”执行代码

    一个在后台优化的解释器,学习更好的代码执行方式也是可能的

    总结:差异真的归结为'准备稍后执行的代码'或'立即执行代码'


    编译器是一种将一种编程语言中的程序翻译为另一种编程语言中的程序的程序。 就是这样 - 简单明了。

    解释器将编程语言翻译成语义。

    x86芯片是x86机器语言的解释器。

    Javac是用于Java到Java虚拟机的编译器。 Java,可执行应用程序,是jvm的解释器。

    一些口译员分享一些编译元素,因为他们可以将一种语言翻译成另一种更容易解释的内部语言。

    口译员通常(但并非总是)具有读取评估打印循环。


    程序是对你想完成的工作的描述。

    编译器将高级描述转换为更简单的描述。

    口译员阅读关于做什么和做什么的描述。

  • 一些解释器(例如Unix shell)一次只读一小段描述,并在他们看到它时对每一段进行操作; 一些(例如Perl,Python)读取整个描述,在内部将其转换为更简单的表单,然后对其进行处理。
  • 一些解释器(例如Java的JVM或Pentium 4芯片)只能理解一种非常简单的描述语言,这种描述语言对于人类直接使用来说太单调乏味,因此人们使用编译器将其高级描述转换为该语言。
  • 编译器从不做这项工作。 口译员一直在做这项工作。

    链接地址: http://www.djcxy.com/p/52551.html

    上一篇: What is the difference between implementing a compiler and an interpreter?

    下一篇: What does a just