【发布时间】:2010-03-04 06:24:37
【问题描述】:
解释器/编译器如何工作?解释器和编译器有什么区别。
【问题讨论】:
标签: compiler-construction interpreter
解释器/编译器如何工作?解释器和编译器有什么区别。
【问题讨论】:
标签: compiler-construction interpreter
编译器
编译器是第一类 要编写的翻译程序。这 想法很简单:你编写程序, 然后将其交给编译器 翻译它。然后你运行 结果。
口译员
解释器也是一个程序 将高级语言翻译成 一个低级的,但它在 程序运行的那一刻。你写 使用文本编辑器的程序或 类似的东西,然后指示 解释器来运行程序。它 接受程序,一次一行, 并在之前翻译每一行 运行它:它翻译第一个 行并运行它,然后翻译 第二行并运行它等等。
编译器特性:
解释器特点:
【讨论】:
S -> T 翻译器接受以源语言 S 表达的代码,并将其翻译成以另一种(目标)语言 T 表达的等效代码。
翻译示例:
S 解释器 接受用语言 S 表达的代码,并立即执行该代码。它通过一次获取、分析和执行一条指令来工作。
当用户以交互方式输入指令(想想 Python)并希望在输入下一条指令之前获得输出时非常棒。当程序只执行一次或需要可移植时也很有用。
行为
编译器将源代码转换为机器代码,但不执行源代码或目标代码。
解释器一次执行一条指令源代码,但不翻译源代码。
性能
解释性编译器
解释性编译器是编译器和解释器之间的良好折衷。它将源程序翻译成虚拟机代码,然后进行解释。
解释性编译器将快速翻译与适度快速执行相结合,前提是:
示例:JDK 为 Java 提供了解释性编译器。
【讨论】:
【讨论】:
解释器和编译器有什么区别?
编译器首先扫描整个程序,然后将其翻译成机器代码,由计算机处理器执行。
解释器将一条语句翻译成机器语言,执行它,然后继续下一条语句。
例如:编译器会立即给出几乎所有的错误,但解释器会一直运行到你写错的指令为止
解释器/编译器如何工作?
【讨论】:
区别与它们的工作方式
问: 什么是编译器和解释器?
答:大多数程序都是用高级语言(c#、java...)编写的。高级语言包含可理解的单词和短语。另一方面,计算机(在我写这篇文章的时候)理解机器码,它是 0 和 1 唯一的二进制/机器码。因此,我们需要将高级代码转换为源代码,即(机器代码/二进制)。因此,转换这个词。
因此我们得出结论,编译器/解释器的工作是将高级代码翻译成机器代码。
但两者都有不同的“翻译”代码的方式
区别:
编译器:
将源代码转换为某种中间形式。对于静态语言,编译器通常将源代码转换为汇编,通常不会存储到磁盘,然后调用汇编器将汇编转换为二进制代码,通常存储为目标文件(.o 或 .obj 后缀)通常),然后调用链接器将目标文件链接到二进制可执行文件。此外,通常将编译、组装、链接的整个过程称为编译。所以你可以称gcc为编译器,但它实际上调用的是cc1,即编译器,即汇编器,ld是链接器。
翻译:
具有中间所谓字节码形式的语言,首先将源代码转换为字节码,这个过程可以称为编译,以javac为例。 字节码不能在宿主机上运行,它需要一个程序,从操作系统的角度来看,实际上就是进程,把字节码解释给宿主机,这个程序叫做解释器,想想java。某些语言,例如 python,使用单个语言完成编译和解释工作
比较
翻译
- 分析源代码所需的时间更少,但总体执行时间更慢。
- 不生成中间目标代码,因此内存高效。
- 继续翻译程序,直到遇到第一个错误,在这种情况下它会停止。因此调试很容易。
编译器
- 分析源代码需要大量时间,但总体执行时间相对较快。
- 生成进一步需要链接的中间目标代码,因此需要更多内存。
- 仅在扫描整个程序后才会生成错误消息。因此调试比较困难。
——来自:https://www.programiz.com/article/difference-compiler-interpreter
语言示例
解释
编译
【讨论】:
编译器 - 编译器将源语言翻译成目标语言。然后目标语言接受输入并给出输出。
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
然后编译器生成的机器语言目标程序在将输入映射到输出时比解释器快得多。然而,由于解释器逐行执行源程序,它提供了比编译器更好的错误诊断。
【讨论】:
解释器和编译器有什么区别。
直接直观地说:
编译器将人类可读的源代码翻译成计算机可以读取和执行的机器代码。
解释器是伪装或模拟计算机直接读取和执行源代码。
【讨论】:
看看 PLAI 书,这是我发现的关于动态语言实现的最佳介绍:
编程语言:应用和解释 (c) Shriram Krishnamurthi
本书以Scheme (dr.Racket)中动态语言编写解释器为中心,使用它你可以为任何语言编写自己的解释器,并添加一些关于OOP的技巧
以及 SmallTalk 和 SOM:简单对象机:
所有现代解释器都包含编译器:将高级元素编译成低级但可移植的字节码,或使用 JIT 将机器码编译成 RAM。 p>
PS:如果有人想用 Python 写 SmallTalk 系统,请注意我。
【讨论】: