编译与透明

Nis*_*hto 41 compiler-construction abstraction transpiler

在搜索差异时,我发现了这些定义:

编译是获取用一种语言编写的源代码并转换为另一种语言的通用术语.

Transpiling是一个特定的术语,用于获取用一种语言编写的源代码,并转换为另一种具有相似抽象级别的语言.

我理解抽象是什么.

但是,在上述定义中,"相似的抽象级别"是什么意思呢?我们如何找到语言中的抽象级别?

tap*_*and 65

你上面引用的定义对于初学者完全理解来说太笼统了,所以让我把它简化为我们实际看到的东西.

编译器:用于描述一个程序的总称,该程序采用一种语言编写的源代码,并以其他语言生成(或许多)输出文件.在实践中,我们主要使用这个术语来描述诸如gcc之类的编译器,它将C代码作为输入并产生二进制可执行文件(机器代码)作为输出.

Transpilers也被称为源到源编译器.因此,实质上它们是编译器的子集,它们接收源代码文件并将其转换为其他语言的另一个源代码文件或同一语言的不同版本.输出通常是人类可以理解的.此输出仍然必须通过编译器或解释器才能在计算机上运行.

转发器的一些例子:

  1. Emscripten:将C/C++透明化为JavaScript
  2. Babel:将ES6 +代码透明到ES5(ES6和ES5是JavaScript语言的不同版本或代)

现在,它们的意思是"相似的抽象级别":正如我所说它编译/转换为源文件,可以说汇编语言也是源文件,因此gcc也是一个转换器.所以,这个论点就是这个类似的抽象层次无效.

将语言分类为较低,中等和较高级别的概念基于它们从机器/体系结构的实际工作中提供的抽象级别.

像汇编这样的低级语言非常接近处理器架构,即对不同的处理器有不同的指令.在C/C++/Java/JavaScript中,抽象所有这些提供了更多的抽象.

因此,一个转换器编译成一种语言,这种语言更接近你在这个抽象方面开始的语言(或者更接近于中低级语言阶梯中该语言的级别).

希望这可以帮助!

  • @Deji不一定是同一级别的语言,而是具有相似抽象级别的语言。 (4认同)
  • “一些编译器示例:” --- babel称自己为编译器。编译器和编译器之间的分离实际上是人为的。 (3认同)
  • 我想补充一件事,我们这里讨论的是自然语言。因此,模糊定义是预料之中的。我希望转译器的输出“易于阅读”与以前相似,而编译器则使内容更难以阅读。因此 Webpack/npm 是一个编译器,你不想读取它的输出。(至少当您为 .vue 文件添加“加载器”时。 (3认同)
  • @zerkms如我所说,编译器是编译器的子集。 (2认同)
  • 意见:我认为定义应该是:编译:语言 -> 较低级语言。翻译:语言 -> 同级语言。 (2认同)

Ara*_*mer 18

这是一种描述性的答案

如果您将抽象层视为此示例:

(1) CPU-level (actual logic gates on the CPU)
(2)machine code
(3)assembly code
(4)[C/C++, JVM/bytecode]
(5)[JavaScript, Python]
Run Code Online (Sandbox Code Playgroud)

编译器进入较低级别(较低数量)。编译器以相同的编号从一种语言(或一种语言的版本)切换到另一种语言。

  • 很好奇,“抽象级别”列表来自哪里? (4认同)
  • 只是随机的说明性示例,我知道前两个有点糊涂,但我想要一个更长的列表:P (4认同)
  • `C/C++, JVM/bytecode` 没有任何意义,4 应该只是字节码,C/C++ 应该在 5 中。JVM 是一个运行时环境,而不是代码。 (3认同)
  • 我喜欢它,如果它是这样的“官方”分类,那就太酷了。因为没有它就很难将工具(翻译器)归入一个或另一个类别。例如:`javac` 是否是编译器。 (2认同)

小智 8

例如:TypeScript(具有类型安全检查的 Microsoft JavaScript 超集)转换为可以在不同类型的浏览器上运行的 JavaScript 代码。

https://en.wikipedia.org/wiki/Microsoft_TypeScript “Microsoft TypeScript 是一种由 Microsoft 开发和维护的开源编程语言。它是 JavaScript 的严格语法超集,并向该语言添加了可选的静态类型。

TypeScript 设计用于开发大型应用程序并转编译为 JavaScript。 [5] 由于 TypeScript 是 JavaScript 的超集,因此现有的 JavaScript 程序也是有效的 TypeScript 程序。TypeScript 可用于开发用于客户端和服务器端 (Node.js) 执行的 JavaScript 应用程序。”

  • 微软写道,TypeScript 编译器将 TypeScript 源代码转换为 JavaScript:https://code.visualstudio.com/docs/typescript/typescript-compiling#_transpile-typescript-into-javascript (2认同)