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


92

Шукаючи різницю, я натрапив на такі визначення:

Компіляція - загальний термін прийняття вихідного коду, написаного однією мовою, і перетворення на іншу.

Транспіляція - це специфічний термін для прийняття вихідного коду, написаного однією мовою, та перетворення на іншу мову, яка має подібний рівень абстракції.

Я розумію, що таке абстракція.

Але що означає "подібний рівень абстракції" у наведеному вище визначенні? І як ми знаходимо рівень абстракції в мові?



Відповіді:


143

Визначення, яке ви цитували вище, є надто загальним, щоб новачок не міг його повністю зрозуміти, і тому дозвольте мені просто спростити його до того, що ми бачимо практично.

Компілятор: загальний термін, що описує програму, яка бере вихідний код, написаний однією мовою, і створює (або багато) вихідний файл якоюсь іншою мовою. На практиці ми в основному використовуємо цей термін для опису компілятора, такого як gcc, який приймає код С як вхідний сигнал і створює двійковий виконуваний файл (машинний код) як вихід.

Транспілятори також відомі як компілятори від джерела до джерела. Отже, по суті вони є підмножиною компіляторів, які беруть файл вихідного коду і перетворюють його в інший файл вихідного коду якоюсь іншою мовою або іншою версією тієї ж мови. Витік загалом зрозумілий людині. Цей результат все одно повинен пройти через компілятор або інтерпретатор, щоб мати можливість працювати на машині.

Кілька прикладів перекладачів:

  1. Emscripten : Транспілює C / C ++ у JavaScript
  2. Babel : Транспілює код ES6 + у ES5 (ES6 та ES5 - це різні версії або покоління мови JavaScript)

Тепер, що вони мають на увазі під "подібним рівнем абстракції": Як я вже говорив, він компілює / транспілює до вихідного файлу, можна стверджувати, що мова асемблер - це також вихідний файл, і, отже, gcc також є транслятором. Отже, цей аргумент і є тим, що втрачає цей подібний рівень абстракції.

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

Мови нижчого рівня, такі як складання, дуже близькі до архітектури процесора, тобто мають різні інструкції для різних процесорів. Хоча C / C ++ / Java / JavaScript, абстрагуйте все це, надаючи більше абстракції.

Отже, компілятор компілює до мови, яка ближча до мови, з якої ви починали в умовах цієї абстракції (або ближче до рівня цієї мови в мовній драбині нижчого-середнього та вищого рівнів).

Сподіваюся, це допомагає!


10
"Деякі приклади транпіляторів:" --- babel називає себе компілятором. Розділення між компіляторами та компіляторами є справді штучним.
zerkms

14
@zerkms Як я вже говорив, транспілятори - це підмножина компіляторів.
tapananand

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

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

3
@Deji Не обов'язково однаковий рівень мови, але мова на подібному рівні абстракції.
tapananand

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

Тільки випадкові наочні приклади, я знаю, що перші два
трохи м’які тбх

2
Мені це подобається, і було б дуже здорово, якби це була якась "офіційна" класифікація. Оскільки без нього важко віднести інструмент (перекладач) до тієї чи іншої категорії. Наприклад: javacкомпілятор чи ні.
zerkms

2

Я здебільшого погоджуюсь з тапананом та відповіддю, але ...


визначення

Слова «зроблені», тому вони служать певній цілі. І це також змінюється з часом.

Зараз ми схильні використовувати transpiler, щоб вказати компілятор, який переводить код в інший код, "більш схожий" на вихідний, що може робити компілятор. І використовується для диференціації обох здебільшого, коли обидва з них згадуються в одному контексті (знову ж здебільшого маючи на увазі, що мову транпіляції доведеться компілювати хоча б ще раз)


приклади

Тож все дуже суб’єктивно. На момент написання цієї статті:

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

фазит

Отже, зараз transpile використовується дуже рідко, і лише для того, щоб відрізняти двох компіляторів.

Це, мабуть, зникне як концепція, оскільки компіляція набагато складніша за цю (та сама / вища / нижча мова, версія тощо), і слово, здається, вже не є корисним ("транпілятори" зараз всюдисущі)


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) інструменту, його іменування означає , що машинопис буде складена НЕ transpiled ... поки інструмент перетворює машинопис в JavaScript, які на той же рівень абстракції WRT базового обладнання. Складений або переведений TypeScript?
Алекс Макміллан,

@AlexMcMillan TypeScript СКІДАНО, оскільки він є надмножиною javascript, і як такий компілюється до javascript.
Араймер

@Araymer Чи розумієте ви різницю між компіляцією та транпіляцією? Оскільки TS не складено; також не є JS.
Алекс Макміллан,

Так. І оскільки TS є надмножиною JS, він вважається вищим рівнем абстракції, і тому називається "складеним". Потім складений JS трактується як звичайний. Отже, якщо ви шукаєте TS, то однією з найбільш обговорюваних тем є її "компіляція". Але межа між транпіляцією та компіляцією не має офіційного кількісного визначення. Це стає досить м'яким, тому ваша думка щодо того, що складено (відрізняється від творців, як це є) - це лише ваша думка.
Араймер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.