编译与转译

Compiling vs Transpiling

在搜索差异时,我遇到了这些定义:

编译是将用一种语言编写的源代码转换成另一种语言的总称。

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

我明白什么是抽象。

但是上面定义中的"similar level of abstraction"是什么意思呢?我们如何找到语言的抽象级别?

这是一种描述性的回答方式

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

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

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

您上面引用的定义过于笼统,初学者无法完全理解,所以让我将其简化为我们实际看到的东西。

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

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

转译器的一些示例:

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

现在,“类似的抽象级别”是什么意思: 正如我对源文件所说 compiles/transpiles ,可以争辩说汇编语言也是源文件,因此 gcc 也是转译器。所以,这个论点就是这个类似的抽象层次的空洞。

将语言分为低级、中级和高级的概念是基于它们从 machine/architecture 的实际工作中提供的抽象级别。

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

因此,转译器编译成一种语言,在这个抽象的术语中更接近于您开始使用的语言(或者更接近于低-中-高级别语言阶梯中该语言的级别)。

我基本同意 tapananand 的回答,但是...


定义

文字是 "made",所以它们是有目的的。而且这也会随着时间而改变。

我们现在倾向于使用 transpiler 来指定将代码转换为其他代码的编译器 "more similar" 到源代码,即编译器可能执行的操作。并且用于区分两者,主要是在同一上下文中提到它们时(再次主要暗示转换语言必须至少再编译一次)


例子

所以一切都是非常主观的。在撰写本文时:

  • 来自 Java 世界,我可以调用 CoffeeScript/TypeScript 转译器来描述生成的代码并不比原始代码更有效。
  • CoffeScript documentation 说是编译器,babel 是转译器。确实要说 CoffeeScript 虽然非常相似,但不是 Javascript。至少不是它的一个版本,因为那是 babel 产生的。
  • Babel 自称为编译器。

法兹特

所以 transpile 目前很少使用,只是为了区分两个编译器。

它可能会作为概念消失,因为编译比那个复杂得多(same/higher/lower语言,版本等),而且这个词似乎不再有用("transpilers"现在无处不在)

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

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

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

“类似抽象级别”的含义

高级语言比低级语言更抽象。抽象的意思是更容易理解。

高级语言(高度抽象)----相似级别-----> 高级另一种语言(高度抽象抽象)
(TypeScript 源代码到 JavaScript 源代码)

中级语言(抽象性差)---- 相似水平-----> 中级语言(抽象性差)

高级语言(高度抽象)---- 不相似的抽象级别----> 中级另一种语言(抽象不佳)

编译器 用于将用一种语言编写的源代码编译成另一种语言。编译器通常会使用与输入语言相同的语法,但它也可能是为某些其他类型的输入而设计的,例如字节码。

Transpilers 是不同的,因为它们将代码从一种编程语言翻译成另一种编程语言。原始程序可能是用 JavaScript 编写的,但转译器将其转换为 HTML.

计算机只理解 1 和 0: 您可以将计算机想象成一个盒子,里面塞满了开关 - 有点像电灯开关:它们可以“打开”或“关闭”——它们可以是“1”或“0”。您可以使用一系列“1”和“0”来指示计算机打开或关闭。

人们需要编程语言:人类不太擅长reading/understanding成百上千行的“1”和“0”...... ...但我们可以接受训练来理解人类的单词:例如:classbreak.

编程语言让我们可以编写计算机指令,这些指令可以翻译成1和0(编译),也可以翻译成其他编程语言。例如:如果您有 elm 代码,您可以轻松地将其转换为 javascript (transpiling).