【问题标题】:Is Babel a compiler or transpiler?Babel 是编译器还是转译器?
【发布时间】:2017-10-13 14:30:23
【问题描述】:

我已经使用Babel 有一段时间了,我一直认为 Babel 是一个 transpiler,用于将我的 ES6 和 ES7 JavaScript 转换为 ES5 JavaScript,因为我假设您可以在技术上将 ES5 和 ES6 视为两种不同的语言。

但是,我不禁注意到 Babel 的网站标题将其描述为 compiler,我认为这与 transpiler 非常不同。

Babel 是 transpiler 还是 compiler,或者可能同时提供这两种选择?还是网站的标题完全不正确?

披露:我知道这听起来像是一个非常迂腐的问题,但我正在编写与 Babel 相关的文档,并且我想确保我的描述是准确的

【问题讨论】:

  • 转译器编译器。
  • 哦,我以为编译器将源代码转换为可执行代码,而转译器将代码转换为另一种语言。那么转译器是编译器的一种形式,那么呢?
  • 它是一个转译器,因为编译器将 HLL 更改为 LLL。但是转译器有时也称为source-to-source compiler,因此您可能会争辩说 babel 是编译器,因为转译器是编译器的 type
  • 编译器的标准定义是在语言之间翻译的东西(尽管通常用它来表示目标语言是 ASM 或字节码之类的情况)。所以这包括转译器作为一个子集。
  • 啊,我明白了,谢谢您的意见。如果你们中的任何一个想提交答案,这两个答案都足以回答我的问题。

标签: javascript ecmascript-6 babeljs


【解决方案1】:

Babel 是一个transpiler,它是compiler 的一种特殊类型,所以这两个术语在技术上都是正确的。您可以根据自己的喜好使用任何一种。

Babel 是 source-to-source compiler (aka transpiler) 是无可辩驳的,因为它的源语言和目标语言都是某种 JavaScript 风格:

源到源编译器、转译器或转译器是一种编译器,它将以一种编程语言编写的程序的源代码作为其输入,并以另一种编程语言生成等效的源代码编程语言。

然而,并不是每个人都同意这些术语之间的区别是有帮助的,所以有些人更喜欢简单的“编译器”。

我个人喜欢这种区别,因为对我而言,它暗示了源(输入)语言和目标(输出)语言之间的抽象级别与机器语言的差异。也就是说,典型的“编译器”从高级语言翻译到低级语言,“反编译器”从低级语言翻译到高级语言,“转译器”在相似抽象级别的语言之间进行翻译。

【讨论】:

    【解决方案2】:

    “转译器”和“编译器”的定义很模糊。他们俩都在保持行为的同时将translate 程序从一种语言转换为另一种语言。

    当它生成可执行二进制文件时,我们通常将其命名为“编译器”。但是,二进制只是另一种语言,可以由 CPU 解释。每个程序在各自的机器上都是“可执行的”。

    当它产生比输入更低级别的输出时,我们通常将其命名为“编译器”,例如C 到汇编程序。或 Java 到 Java 字节码。或者 ES8 到 ES5。等等……这真的是一个不同的层次吗?

    当其输出与输入处于相似级别时,我们通常将其命名为“转译器”,例如Python 到 JavaScript 或相反。但是,总会有一些部分使用一种语言中可用的抽象,需要“编译”为另一种语言的较低级别的实现。

    所以回答你的问题:

    我认为编译器与转译器非常不同。

    没有。

    Babel 是转译器还是编译器,或者可能同时提供这两种选择?

    是的。

    还是网站标题“Babel - 编写下一代 JavaScript 的编译器”完全不正确?

    没有。该标题侧重于下一代功能,即真正需要编译到非常不同的输出的更高级别的抽象。尽管输出仍然是普通的,大部分是人类可读的 JavaScript。

    我正在编写与 Babel 相关的文档,并且我想确保我的描述是准确的

    在这种情况下,我会使用他们自己的官方网站术语。如果您想将该工具与其他工具进行比较,请选择您自己的描述。

    【讨论】:

    • 我和 Babel 团队中的大多数 AFAIK 都认为将其称为 transpilercompiler 并不值得区分,所以我只说编译器。
    【解决方案3】:

    转译器或源到源编译器是读取以一种编程语言编写的源代码并以另一种语言生成等效代码的工具。

    Babel 既是转译器又是编译器,因为这两个词可以互换使用。

    【讨论】:

      猜你喜欢
      • 2011-07-01
      • 2021-09-27
      • 2020-10-27
      • 2012-08-28
      • 1970-01-01
      • 2023-03-28
      • 2016-09-28
      • 2010-10-16
      • 1970-01-01
      相关资源
      最近更新 更多