Компиляция против транспиляции

При поиске разницы я столкнулся с этими определениями:

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

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

Я понимаю, что такое Абстракция.

Но что означает "аналогичный уровень абстракции" в приведенном выше определении? И как мы находим уровень абстракции на языке?

Ответ 1

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

Компилятор: это общий термин для описания программы, которая берет исходный код, написанный на одном языке, и создает (или много) выходной файл на каком-то другом языке. На практике мы в основном используем этот термин для описания компилятора, такого как gcc, который принимает код C в качестве входных данных и создает двоичный исполняемый файл (машинный код) в качестве выходных данных.

Транспортеры также известны как компиляторы исходного кода. По сути, они представляют собой подмножество компиляторов, которые принимают файл исходного кода и преобразовывают его в другой файл исходного кода на каком-либо другом языке или в другую версию того же языка. Результат обычно понятен человеку. Этот вывод все еще должен проходить через компилятор или интерпретатор, чтобы иметь возможность работать на машине.

Некоторые примеры транспортеров:

  1. Emscripten: переносит C/C++ в JavaScript
  2. Babel: переносит код ES6+ в ES5 (ES6 и ES5 - это разные версии или поколения языка JavaScript)

Теперь, что они имеют в виду под "подобным уровнем абстракции": как я уже сказал, он компилируется/переносится в исходный файл, можно утверждать, что язык ассемблера также является исходным файлом и, следовательно, gcc также является транспортером. Таким образом, этот аргумент является тем, что этот подобный уровень абстракции аннулирует.

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

Языки более низкого уровня, такие как ассемблер, очень близки к архитектуре процессора, т.е. имеют разные инструкции для разных процессоров. Пока C/C++/Java/JavaScript, абстрагируйся от всего этого, предоставляя больше абстракции.

Таким образом, транспортер компилируется в язык, который ближе к языку, с которого вы начали в терминах этой абстракции (или ближе к уровню этого языка в языковой лестнице ниже среднего среднего уровня).

Надеюсь это поможет!

Ответ 2

Вот своего рода описательный способ ответа

Если вы думаете о слоях абстракции в этом примере:

(1) CPU-level (actual logic gates on the CPU)
(2)machine code
(3)assembly code
(4)[C/C++, JVM/bytecode]
(5)[JavaScript, Python]

Компилятор переходит на более низкий уровень (меньшее число). Транспилер переключается с одного языка (или версии языка) на другой с тем же номером.

Ответ 3

Добавление к другим ответам на примере Angular.

Angular 2 построен с использованием TypeScript. TypeScript прекрасно поддерживает стандарт ECMAScript 6. Стандарт языка JavaScript официально называется ECMAScript. За последние несколько лет было выпущено много версий ECMAScript, начиная с ECMAScript версии 1 вплоть до ECMAScript версии 7.

Большинство современных браузеров, доступных сегодня, поддерживают ECMAScript 5. Поддержка браузером ECMAScript 6 все еще не завершена. Однако, используя Процесс под названием Transpilation, ECMAScript 6 может быть преобразован в ECMAScript 5, который поддерживается всеми современными браузерами.

Ответ 4

Я в основном согласен с тапанан и ответом, но...


определение

Слова "сделаны", поэтому они служат цели. И это также меняется со временем.

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


Примеры

Так что все очень субъективно. На момент написания статьи:

  • Исходя из мира Java, я мог бы вызывать транспортеры CoffeeScript/TypeScript, чтобы показать, что полученный код не более эффективен, чем исходный.
  • Документация CoffeScript говорит, что это компилятор, а babel - это транспайлер. Хочется сказать, что CoffeeScript, хотя и очень похож, не является Javascript. По крайней мере, не версия этого, поскольку это - то, что производит babel.
  • Бабель называет себя компилятором.

Fazit

Так что в настоящее время Transpile очень редко используется, и только для разделения двух компиляторов.

Вероятно, это исчезнет как концепция, так как компиляция намного сложнее, чем это (тот же/более высокий/более низкий язык, версия и т.д.), И слово больше не кажется полезным ("транспиляторы" теперь вездесущи)

Ответ 5

Пример: TypeScript (расширенный набор JavaScript от Microsoft с проверкой безопасности типов) переносится в код JavaScript, который может работать в различных типах браузеров.

https://en.wikipedia.org/wiki/Microsoft_TypeScript "Microsoft TypeScript - это язык программирования с открытым исходным кодом, разработанный и поддерживаемый Microsoft. Он представляет собой строгий синтаксический расширенный набор JavaScript и добавляет в язык необязательную статическую типизацию.

TypeScript предназначен для разработки больших приложений и транскомпилируется в JavaScript. [5] Поскольку TypeScript - это расширенный набор JavaScript, существующие программы JavaScript также являются допустимыми программами TypeScript. TypeScript может использоваться для разработки приложений JavaScript как для выполнения на стороне клиента, так и на стороне сервера (Node.js). "