【问题标题】:How does an interpreter/compiler work解释器/编译器如何工作
【发布时间】:2010-03-04 06:24:37
【问题描述】:

解释器/编译器如何工作?解释器和编译器有什么区别。

【问题讨论】:

    标签: compiler-construction interpreter


    【解决方案1】:

    编译器

    编译器是第一类 要编写的翻译程序。这 想法很简单:你编写程序, 然后将其交给编译器 翻译它。然后你运行 结果。

    口译员

    解释器也是一个程序 将高级语言翻译成 一个低级的,但它在 程序运行的那一刻。你写 使用文本编辑器的程序或 类似的东西,然后指示 解释器来运行程序。它 接受程序,一次一行, 并在之前翻译每一行 运行它:它翻译第一个 行并运行它,然后翻译 第二行并运行它等等。

    编译器特性:

    • 花费大量时间分析和 处理程序
    • 生成的可执行文件是某种形式 机器特定的二进制代码
    • 计算机硬件解释 (执行)生成的代码
    • 程序执行速度很快

    解释器特点:

    • 花费的时间相对较少 分析和处理程序
    • 生成的代码是某种 中间代码
    • 结果代码被解释为 另一个程序
    • 程序执行比较慢

    【讨论】:

    • 所以c#同时使用编译器和解释器?
    • 这不正确。两种语言都可以编译和解释。
    • @Matt H:是的,如果您也计算运行时间,那将是正确的;因为运行时解释编译的程序集。从C#的角度来看,它是先编译后执行的。
    • @Aniket 不,没有对目标代码进行解释。如果您将程序编译成机器可以理解的东西,那么您就不需要解释器。此外,问题的关键在于编译器生成的目标代码与例如由 Java 编译器生成的中间代码(例如:字节码)之间的区别,然后在每次运行时由真正的解释器解释。
    • 口译员通常不会逐行工作。绝大多数口译员没有。解释器生成低级代码也不是普遍正确的:有执行 AST(不生成代码)的解释器、生成字节码然后解释该字节码的解释器以及 JIT 编译为机器码的解释器。
    【解决方案2】:

    什么是翻译?

    S -> T 翻译器接受以源语言 S 表达的代码,并将其翻译成以另一种(目标)语言 T 表达的等效代码。

    翻译示例:

    • 编译器 - 将高级代码转换为低级代码,例如Java -> JVM
    • 汇编程序 - 将汇编语言代码转换为机器代码,例如x86as -> x86
    • 高级翻译器 - 将代码从一个 PL 翻译到另一个,例如Java -> C
    • 反编译器 - 将低级代码转换为高级代码,例如Java JVM 字节码 -> Java

    什么是口译员?

    S 解释器 接受用语言 S 表达的代码,并立即执行该代码。它通过一次获取、分析和执行一条指令来工作。

    当用户以交互方式输入指令(想想 Python)并希望在输入下一条指令之前获得输出时非常棒。当程序只执行一次或需要可移植时也很有用。

    • 解释程序比执行本机机器代码慢得多
    • 解释高级语言的速度要慢约 100 倍
    • 解释中间级别(例如 JVM 字节码)语言的速度要慢约 10 倍
    • 如果一条指令被重复调用,就会被重复分析——很费时间!
    • 无需编译代码

    区别

    行为

    • 编译器将源代码转换为机器代码,但不执行源代码或目标代码。

    • 解释器一次执行一条指令源代码,但不翻译源代码。

    性能

    • 编译器需要相当长的时间将源程序翻译成本机机器码,但后续执行速度很快
    • 解释器立即开始执行源程序,但执行速度很慢

    解释性编译器

    解释性编译器是编译器和解释器之间的良好折衷。它将源程序翻译成虚拟机代码,然后进行解释。

    解释性编译器将快速翻译与适度快速执行相结合,前提是:

    • VM 代码低于源语言,但高于本机机器代码
    • VM 指令格式简单(解释器可以快速分析)

    示例:JDK 为 Java 提供了解释性编译器。

    【讨论】:

    • “解释器一次执行一条指令的源代码,但不翻译源代码”(取自差异标题)我认为解释器一次翻译并执行两个动作,但不只是执行为你解释了。除了这个解释是清晰和完美的+1。
    【解决方案3】:

    Compiler,将一种计算机语言的源代码转换为另一种计算机语言。

    Interpreter,直接执行源代码(通常在自己的虚拟机内)。


    (来源:answers.com

    通常解释器的性能成本很高。

    【讨论】:

    • 几乎所有解释器都执行编译后的字节码,有些(模拟器)执行编译后的机器码。如果被解释的指令与获取开销相比简单,那么解释只会“代价高昂”。
    • C# 和 VB 怎么样?它们属于您的图表中的哪个部分?
    【解决方案4】:

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

    编译器首先扫描整个程序,然后将其翻译成机器代码,由计算机处理器执行。

    解释器将一条语句翻译成机器语言,执行它,然后继续下一条语句。

    例如:编译器会立即给出几乎所有的错误,但解释器会一直运行到你写错的指令为止

    解释器/编译器如何工作?

    • 与提前翻译成机器语言的编译语言不同(右)。
    • 解释的语言在运行时被翻译。
    • dBASE 和 BASIC interpreters(中)翻译原始源代码。
    • Java 和 Visual Basic(左)解释器翻译 字节码,这是一种从原始源代码编译而来的中间语言。

    Source

    【讨论】:

    • “一次一行”不正确。大多数解释器将代码预编译为 p-code,然后一次执行一条 p-code 指令。
    • 解释器不会“翻译字节码”。他们执行它。有执行字节码的基本实现,而不是源代码。
    【解决方案5】:

    区别与它们的工作方式

    问: 什么是编译器和解释器?

    答:大多数程序都是用高级语言(c#、java...)编写的。高级语言包含可理解的单词和短语。另一方面,计算机(在我写这篇文章的时候)理解机器码,它是 0 和 1 唯一的二进制/机器码。因此,我们需要将高级代码转换为源代码,即(机器代码/二进制)。因此,转换这个词。

    因此我们得出结论,编译器/解释器的工作是将高级代码翻译成机器代码。

    但两者都有不同的“翻译”代码的方式

    区别:

    编译器:

    将源代码转换为某种中间形式。对于静态语言,编译器通常将源代码转换为汇编,通常不会存储到磁盘,然后调用汇编器将汇编转换为二进制代码,通常存储为目标文件(.o 或 .obj 后缀)通常),然后调用链接器将目标文件链接到二进制可执行文件。此外,通常将编译、组装、链接的整个过程称为编译。所以你可以称gcc为编译器,但它实际上调用的是cc1,即编译器,即汇编器,ld是链接器。

    翻译:

    具有中间所谓字节码形式的语言,首先将源代码转换为字节码,这个过程可以称为编译,以javac为例。 字节码不能在宿主机上运行,​​它需要一个程序,从操作系统的角度来看,实际上就是进程,把字节码解释给宿主机,这个程序叫做解释器,想想java。某些语言,例如 python,使用单个语言完成编译和解释工作

    ——都来自:https://www.quora.com/What-are-the-differences-between-a-compiler-an-interpreter-and-an-assembler-Provide-examples

    比较

    翻译

    • 分析源代码所需的时间更少,但总体执行时间更慢。
    • 不生成中间目标代码,因此内存高效。
    • 继续翻译程序,直到遇到第一个错误,在这种情况下它会停止。因此调试很容易。

    编译器

    • 分析源代码需要大量时间,但总体执行时间相对较快。
    • 生成进一步需要链接的中间目标代码,因此需要更多内存。
    • 仅在扫描整个程序后才会生成错误消息。因此调试比较困难。

    ——来自:https://www.programiz.com/article/difference-compiler-interpreter

    语言示例

    解释

    • Python
    • 红宝石
    • PHP
    • JAVA(全能)
    • Perl
    • R
    • Powershell

    编译

    • C
    • C++
    • C#
    • Objective-C
    • 斯威夫特
    • Fortran

    【讨论】:

    • 大多数编译器不生成汇编语言。链接并不意味着更多的内存。存在源代码解释器。 C# 是解释的,或者实际上 Java 和 C# 都是编译和解释的。C 和 C++ 存在于解释版本中,Fortran 也是如此。
    【解决方案6】:

    编译器 - 编译器将源语言翻译成目标语言。然后目标语言接受输入并给出输出。

    Compiler produces a target code by compiling source code

    then target code then takes input and gives output

    解释器 - 解释器似乎直接将输入与源代码一起接收并提供输出,而不是生成目标代码。

    Interpreter maps input to output using the source program

    然后编译器生成的机器语言目标程序在将输入映射到输出时比解释器快得多。然而,由于解释器逐行执行源程序,它提供了比编译器更好的错误诊断。

    参考-Compilers: Principles, Techniques, and Tools by Aho又名龙书

    【讨论】:

      【解决方案7】:

      解释器和编译器有什么区别。

      直接直观地说:

      • 编译器将人类可读的源代码翻译成计算机可以读取和执行的机器代码。

      • 解释器是伪装或模拟计算机直接读取和执行源代码。

      【讨论】:

        【解决方案8】:

        看看 PLAI 书,这是我发现的关于动态语言实现的最佳介绍:

        编程语言:应用和解释 (c) Shriram Krishnamurthi

        本书以Scheme (dr.Racket)中动态语言编写解释器为中心,使用它你可以为任何语言编写自己的解释器,并添加一些关于OOP的技巧

        以及 SmallTalk 和 SOM:简单对象机:

        所有现代解释器都包含编译器:将高级元素编译成低级但可移植的字节码,或使用 JIT 将机器码编译成 RAM。 p>

        PS:如果有人想用 Python 写 SmallTalk 系统,请注意我。

        【讨论】:

        • 这个答案的 90% 只是广告。
        猜你喜欢
        • 2011-03-11
        • 1970-01-01
        • 1970-01-01
        • 2011-01-11
        • 1970-01-01
        • 1970-01-01
        • 2011-07-01
        • 1970-01-01
        • 2018-10-02
        相关资源
        最近更新 更多