Javascript 巴贝尔是编译器还是传输器?

Javascript 巴贝尔是编译器还是传输器?,javascript,ecmascript-6,babeljs,Javascript,Ecmascript 6,Babeljs,我现在已经使用了一段时间,我一直认为巴贝尔是一个将我的ES6和ES7 JavaScript转换为ES5 JavaScript的传输者,因为我假设您可以从技术上将ES5和ES6视为两种不同的语言 然而,我忍不住注意到,Babel的网站标题将其描述为一个编译器,我相信这与transpiler有很大不同 Babel是一个transpiler还是一个编译器,或者可能同时提供这两个选项?还是网站的标题根本不正确 披露:我知道这听起来像是一个非常迂腐的问题,但我正在编写有关Babel的文档,我想确保我的描

我现在已经使用了一段时间,我一直认为巴贝尔是一个将我的ES6和ES7 JavaScript转换为ES5 JavaScript的传输者,因为我假设您可以从技术上将ES5和ES6视为两种不同的语言

然而,我忍不住注意到,Babel的网站标题将其描述为一个编译器,我相信这与transpiler有很大不同

Babel是一个transpiler还是一个编译器,或者可能同时提供这两个选项?还是网站的标题根本不正确


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

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

Babel既是一个transpiler,也是一个编译器,因为单词可以互换使用

对“transpiler”和“compiler”的定义很模糊。他们两人都在保持行为的同时,将程序从一种语言转换到另一种语言

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

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

当它的输出与输入处于类似的级别时,我们通常将其命名为“transpiler”,例如从Python到JavaScript,或者反过来。然而,总会有使用一种语言中可用的抽象的部分需要“编译”到另一种语言中较低级别的实现

因此,要回答您的问题:

我相信编译器与transpiler是完全不同的

没有

Babel是一个transpiler还是一个编译器,或者可能同时提供这两个选项

或者该网站的标题“Babel——编写下一代JavaScript的编译器”根本不正确

不。这个标题主要关注下一代特性,即真正需要编译成完全不同输出的更高层抽象。尽管输出仍然是普通的,大部分是人类可读的JavaScript

我正在写有关巴贝尔的文档,我想确保我的描述是准确的

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

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

毫无疑问,Babel是一种新的语言,因为它的源语言和目标语言都是某种JavaScript风格:

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

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


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

transpiler就是编译器。哦,我以为编译器会将源代码转换为可执行代码,而transpiler将代码转换成另一种语言。那么,transpiler是编译器的一种形式,它是transpiler,因为编译器将HLL更改为LLL。但是transpiler有时也被称为编译器,所以你可以说babel是一个编译器,因为transpiler是一种编译器。编译器的标准定义是在不同语言之间进行翻译的东西(尽管在通常的说法中,它通常用于表示目标语言类似于ASM或字节码的情况)。这包括了transpilers作为一个子集。啊,我明白了,谢谢你的输入。这两个答案都充分回答了我的问题,如果你们中的任何一个想提交答案的话。我和巴贝尔团队的大多数AFAIK成员都认为称之为
transpiler
编译器
是不值得区别的,所以我只说编译器。