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


92

В поисках разницы я наткнулся на следующие определения:

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

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

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

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


Возможный дубликат Что такое абстракция?
GrumpyCrouton 05

Ответы:


142

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

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

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

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

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

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

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

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

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

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


9
«Некоторые примеры транспиляторов:» --- babel называет себя компилятором. Разделение между транспиляторами и компиляторами действительно искусственное.
zerkms 06

13
@zerkms Как я уже сказал, транспилеры - это подмножество компиляторов.
тапанананд

1
Хочу добавить одну вещь, здесь мы говорим о естественном языке. Таким образом, нечеткие определения ожидаются. Я ожидал, что "легкость чтения" вывода транспилятора будет аналогична тому, что было раньше, в то время как компилятор затрудняет чтение. Таким образом, Webpack / npm - это компилятор, вы не хотите читать его вывод. (По крайней мере, когда вы добавляете «Загрузчики», например, для файлов .vue.
Самуэль Ослунд

1
Мнение: Я полагаю, что определения должны быть: Компиляция: язык -> язык нижнего уровня. Транспиляция: язык -> язык того же уровня.
Деджи

3
@Deji Не обязательно тот же язык уровня, но язык с аналогичным уровнем абстракции.
тапанананд

33

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

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

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

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


1
Любопытно, откуда взялся этот список «уровней абстракции»?
zerkms 06

Просто случайные иллюстративные примеры, я знаю, что первые два довольно мягкие, но мне нужен более длинный список: P
Араймер

2
Мне это нравится, и было бы здорово, если бы это была такая «официальная» классификация. Ведь без него сложно отнести инструмент (переводчика) в ту или иную категорию. Например: есть javacкомпилятор или нет.
zerkms 06

2

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


определение

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

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


Примеры

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

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

фазит

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

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


2

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

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

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


Существует инструмент "компилятор машинописного текста" (или tsc), его название подразумевает, что TypeScript скомпилирован, а не транспилирован ... но инструмент преобразует TypeScript в Javascript, которые представляют собой тот же уровень абстракции по отношению к базовому оборудованию. TypeScript компилируется или транслируется?
Алекс Макмиллан,

@AlexMcMillan TypeScript Скомпилирован, потому что это надмножество javascript, и поэтому он компилируется в javascript.
Араймер

@Araymer Вы понимаете разницу между компиляцией и транспиляцией? Потому что TS не компилируется; и JS.
Алекс Макмиллан,

Да. И поскольку TS является расширенным набором JS, он считается более высоким уровнем абстракции и поэтому называется «скомпилированным». Скомпилированный JS затем интерпретируется как обычно. Следовательно, если вы посмотрите на TS, наиболее обсуждаемой темой будет его «компиляция». Но граница между транспиляцией и компиляцией не имеет официального количественного определения. Это становится довольно мягким, поэтому ваше мнение о том, что скомпилировано (в отличие от создателей, как таковое), остается только вашим мнением.
Араймер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.