Является ли Babel компилятором или транспилером?

Я уже некоторое время использую Babel, и у меня всегда создалось впечатление, что Babel был транспилером для преобразования моего ES6 и ES7 JavaScript в JavaScript ES5, поскольку я был в предположении, что вы можете технически относиться к ES5 и ES6 как два разных языка.

Однако я не мог не заметить, что название сайта Babel описывает его как компилятор, который, я считаю, очень отличается от транспилятора.

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

Является ли Babel транспилером или компилятором или, возможно, предлагает оба варианта? Или название сайта просто неверно?

Раскрытие: Я знаю, что это звучит как очень педантичный вопрос, но я пишу документацию, касающуюся Вавилона, и я хочу, чтобы мое описание было точным

Ответ 1

Определения "транспилер" и "компилятор" размыты. Оба они переводят программу с одного языка на другой, сохраняя при этом поведение.

Обычно мы называем его "компилятором", когда он создает исполняемый двоичный файл. Однако двоичный код - это просто другой язык, который может быть интерпретирован процессором. Каждая программа является "исполняемой" на соответствующей машине.

Мы обычно называем его "компилятором", когда он производит вывод более низкого уровня, чем вход, например. C к ассемблеру. Или байт-код Java-Java. Или ES8 до ES5. Подождите... это действительно другой уровень?

Обычно мы называем его "транспилером", когда его выход находится на том же уровне, что и вход, например. Python для JavaScript или наоборот. Тем не менее, всегда будут части, которые используют абстракцию, доступную на одном языке, которая должна быть "скомпилирована" для реализации более низкого уровня на другом языке.

Итак, чтобы ответить на ваши вопросы:

Я считаю, что компилятор очень отличается от транспилятора.

Нет.

Является ли Babel транспилером или компилятором или, возможно, предлагает оба варианта?

Да.

Или название веб-сайта "Babel - компилятор для написания JavaScript следующего поколения" просто неверно?

Нет. В этом названии основное внимание уделяется функциям следующего поколения, то есть абстракциям более высокого уровня, которые действительно необходимо скомпилировать в совершенно другой выход. Несмотря на то, что выход по-прежнему является обычным, в основном, для человека, читаемым, JavaScript.

Я пишу документацию, относящуюся к Babel, и я хочу, чтобы мое описание было точным.

В этом случае я бы использовал свою собственную терминологию с официального сайта. Если вы хотите сравнить инструмент с другими, выберите свое описание.

Ответ 2

Transpilers или исходные компиляторы - это инструменты, которые читают исходный код, написанный на одном языке программирования, и создают эквивалентный код на другом языке.

Вавилон - это транспилер и компилятор, поскольку слова могут использоваться взаимозаменяемо.

Ответ 3

Babel является transpiler, который является особым типом compiler, поэтому оба термина являются технически правильными. Вы можете использовать либо по своему усмотрению.

Это неопровержимо, что Babel является исходным компилятором (aka transpiler), поскольку его исходный и целевой языки оба являются одним из JavaScript:

Компилятор источника-источника, transcompiler или transpiler - это тип компилятора, который принимает исходный код программы, написанной на одном языке программирования, в качестве своего ввода и создает эквивалентный исходный код в другом языка программирования.

Однако не все согласны с тем, что различие между терминами полезно, поэтому некоторые люди предпочитают просто "компилятор".

Мне лично нравится различие, потому что для меня это подразумевает что-то о различии в уровне абстракции от машинного langauge между исходными (входными) и целевыми (выходными) языками. То есть типичные "компиляторы" переводится с языков более высокого уровня, "декомпиляторы" переводят языки с более низкого уровня, а "транспиляторы" переводят языки на аналогичных уровнях абстракции.