【问题标题】:Compiling vs Transpiling编译与转译
【发布时间】:2017-12-09 10:22:31
【问题描述】:

在搜索差异时,我发现了以下定义:

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

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

我明白什么是抽象。

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

【问题讨论】:

标签: compiler-construction abstraction transpiler


【解决方案1】:

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

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

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

转译器的一些例子:

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

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

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

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

因此,转译器编译成的语言在此抽象方面更接近您开始使用的语言(或者更接近中低级语言阶梯中该语言的级别)。

【讨论】:

  • "转译器的一些例子:" --- babel 称自己为编译器。转译器和编译器之间的分离确实是人为的。
  • @zerkms 正如我所说,转译器是编译器的一个子集。
  • 我想补充一点,我们在这里讨论的是自然语言。因此模糊定义是预期的。我希望转译器的输出“易于阅读”与以前的输出相似,而编译器会使事情更难阅读。因此 Webpack/npm 是一个编译器,你不想阅读它的输出。 (至少当您为 .vue 文件添加“加载器”时。
  • 意见:我认为定义应该是:编译:语言->低级语言。转译:语言 -> 同级语言。
  • @Deji 不一定是同一级别的语言,而是类似抽象级别的语言。
【解决方案2】:

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

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

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

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

【讨论】:

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

例如: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 编译器”(或 tsc)工具,它的命名暗示 TypeScript 是编译而不是transpiled...然而该工具将 TypeScript 转换为 Javascript,这是与底层硬件相同的抽象级别。 TypeScript 是编译还是转译?
  • @AlexMcMillan TypeScript 已编译,因为它是 javascript 的超集,因此被编译为 javascript。
  • @Araymer 你了解编译和转译的区别吗?因为TS没有编译; JS也不是。
  • 是的,我愿意。并且因为TS是JS的超集,所以被认为是更高层次的抽象,因此被称为“编译”。编译后的 JS 然后被解释为正常。因此,如果您查找 TS,为什么讨论最多的话题是它的“编译”。但是,转译和编译之间的界限并没有官方的量化定义。它变得非常糊状,因此您对编译内容的看法(实际上与创作者不同)只是您的看法。
【解决方案4】:

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


定义

词是“造”出来的,所以它们是有目的的。而这也会随着时间而改变。

我们现在倾向于使用转译器来指定一个编译器,它将代码转换为与源代码“更相似”的其他代码,即编译器可能会做的事情。并且主要用于在同一上下文中同时提及它们时区分两者(再次主要暗示转译语言必须至少再次编译一次)


例子

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

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

fazit

所以 transpile 在这个时候已经很少使用了,只是为了区分两个编译器。

它可能会作为概念消失,因为编译比这复杂得多(相同/更高/更低的语言、版本等),而且这个词似乎不再有用(“转译器”现在无处不在)

【讨论】:

    【解决方案5】:

    “类似抽象级别”的含义

    高级语言比低级语言更抽象。抽象是指更容易理解。

    高级语言(高度抽象)----相似级别 -----> 高级另一种语言(高度抽象)
    (TypeScript Source code to JavaScript Source code)

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

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

    【讨论】:

      【解决方案6】:

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

      人们需要编程语言:人类并不擅长阅读/理解数十万行的“1”和“0”......但我们可以受过理解人类语言的训练:例如:classbreak

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

      【讨论】:

        【解决方案7】:

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

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

        【讨论】:

          猜你喜欢
          • 2013-12-18
          • 2014-01-13
          • 2015-09-25
          • 2010-10-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多