Babel是编译器还是编译器?

Ada*_*iff 27 javascript babel ecmascript-6

我一直在使用巴贝尔有一段时间了,而我一直的印象是,巴贝尔是下transpiler转换器ES6我和ES7的JavaScript到ES5的JavaScript,因为我的假设是,你可以在技术上治疗ES5和ES6作为两种不同的语言.

然而,我不禁注意到,巴贝尔的网站标题描述它作为一个编译器,我相信这是东西从一个非常不同的transpiler.

Babel网站标题 - 'Babel  - 编写下一代JavaScript的编译器

Babel是一个转换还是编译器,或者可能提供两种选择?或者网站的标题是不正确的?

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

Ber*_*rgi 42

"transpiler"和"compiler"的定义很模糊.他们都程序从一种语言翻译成另一种语言,同时保持行为.

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

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

我们通常将它命名为"transpiler",当它的输出与输入类似时,例如Python到JavaScript或反过来.但是,总会有一些部分使用一种语言中的抽象,这种抽象需要"编译"到另一种语言的低级实现.

那么回答你的问题:

我相信编译器与转换器有很大的不同.

没有.

Babel是一个转换器还是编译器,或者可能提供两种选择?

是.

或者网站的标题' Babel - 编写下一代JavaScript的编译器 '根本不正确?

不.该标题侧重于下一代功能,即真正需要编译成非常不同的输出的更高级别的抽象.即使输出仍然是普通的,主要是人类可读的JavaScript.

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

在那种情况下,我会从官方网站上使用他们自己的术语.如果要将该工具与其他工具进行比较,请选择您自己的说明.

  • 我和大多数Babel团队的AFAIK认为把它称为"转换器"和"编译器"并不值得区分,所以我只说编译器. (8认同)

mae*_*ics 6

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

无可辩驳的是,Babel 是一个源到源编译器(又名转译器),因为它的源语言和目标语言都是 JavaScript 的某种风格:

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

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

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