Babel是编译器还是转译器?

50
我已经使用Babel有一段时间了,我一直以为Babel是一个转换器,可以将我的ES6和ES7 JavaScript转换成ES5 JavaScript。因为我认为ES5和ES6在技术上可以被视为两种不同的语言。然而,我注意到Babel网站的标题描述它为一个编译器,我相信这与转换器是非常不同的东西。

Babel website title - 'Babel - The compiler for writing next generation JavaScript

Babel是一个转译器还是编译器,或者两者都提供?或者网站标题只是错误的?披露一下:我知道这听起来像是一个非常迂腐的问题,但我正在撰写与Babel相关的文档,我想确保我的描述准确无误。

3
一个 transpiler 是一个编译器。 - Oliver Charlesworth
1
哦,我以为编译器将源代码转换为可执行代码,而转译器将代码转换为另一种语言。那么,转译器就是一种编译器,对吗? - Adam McKenna
1
它是一个转译器,因为编译器将高级语言转换为低级语言。但有时候转译器也被称为源到源编译器,所以你可以说Babel是一个编译器,因为转译器是编译器的一种类型。 - Ayush Seth
编译器的标准定义是一种在不同语言之间进行翻译的工具(尽管通常用于指目标语言为汇编或字节码等情况)。因此,这也包括了转译器作为其中的一个子集。 - Oliver Charlesworth
啊,我明白了,感谢您的回复。两个答案都足以回答我的问题,如果你们中任何一个想提交答案。 - Adam McKenna
4个回答

60

"转译器"和"编译器"的定义有些模糊。它们都translate将程序从一种语言翻译成另一种语言,同时保持其行为。

当它产生可执行二进制文件时,我们通常称之为"编译器"。然而,二进制文件只是另一种语言,可以被CPU解释。每个程序在相应的机器上都是"可执行的"。

当它产生低于输入级别的输出时,例如C到汇编语言,或Java到Java字节码,或ES8到ES5时,我们通常称之为"编译器"。等等...这真的是不同的级别吗?

当其输出与输入处于类似级别时,例如Python到JavaScript或反之,则通常称之为"转译器"。然而,总会有使用一种语言中可用的抽象部分的部分需要在另一种语言中进行"编译"以实现更低级别的实现。

因此,回答您的问题:

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

不是这样的。

Babel是一个转译器还是编译器,或者两者都提供?

是的。

或者说,网站的标题“Babel-编译器,用于编写下一代JavaScript”,是不是完全不准确?

不是。该标题侧重于下一代功能,即需要被编译成非常不同的输出的更高级抽象。尽管输出仍然是普通的,大多数人可读的JavaScript。

我正在撰写与Babel相关的文档,我想确保我的描述准确无误。

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


12
我和大多数Babel团队成员认为,将其称为“转译器”与“编译器”之间的区别并不值得一提,因此我只说编译器。 - loganfsmyth

15

Babel是一种转译器,这是一种特殊类型的编译器,所以两个术语在技术上都是正确的。您可以根据自己的喜好使用其中任一个。

毋庸置疑,Babel是一种源代码到源代码的编译器(又称转译器),因为它的源语言和目标语言都是某种JavaScript的变体:

源代码到源代码的编译器、转换器或转译器是一种编译器,它将一个程序的源代码作为输入,然后生成另一种编程语言的等效源代码。

但是,并不是每个人都认为这些术语之间的区别有帮助,所以有些人更喜欢简单地使用“编译器”。

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


将用编程语言编写的程序的源代码作为输入,并产生等效的源代码,使用相同或不同的编程语言。 - Ahmad ghoneim

1

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

Babel是一个转译器和编译器,这两个词可以互换使用。


0
只是提供信息,'compiler' 的定义如下:
编译器是一种将指令转换为机器代码或低级别形式的程序,以便计算机可以读取和执行。
所以我个人不同意 Babel 是一种编译器,但如果其他人将它们混用,我并不在意。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接