Kompilieren vs Transpilieren

92

Bei der Suche nach dem Unterschied bin ich auf folgende Definitionen gestoßen:

Kompilieren ist der allgemeine Begriff für das Aufnehmen von in einer Sprache geschriebenem Quellcode und dessen Umwandlung in eine andere.

Transpiling ist ein spezifischer Begriff für die Verwendung von in einer Sprache geschriebenem Quellcode und die Umwandlung in eine andere Sprache mit einem ähnlichen Abstraktionsgrad.

Ich verstehe, was Abstraktion ist.

Aber was bedeutet "ähnliche Abstraktionsebene" in der obigen Definition? Und wie finden wir die Abstraktionsebene in einer Sprache?

Nishi Mahto
quelle
Mögliches Duplikat von Was ist Abstraktion?
GrumpyCrouton

Antworten:

143

Die Definition, die Sie oben zitiert haben, ist zu allgemein, als dass ein Anfänger sie vollständig verstehen könnte. Lassen Sie mich sie daher einfach auf etwas vereinfachen, das wir praktisch sehen.

Compiler: ist ein Überbegriff für ein Programm, das Quellcode in einer Sprache verwendet und eine (oder mehrere) Ausgabedateien in einer anderen Sprache erstellt. In der Praxis verwenden wir diesen Begriff meistens, um einen Compiler wie gcc zu beschreiben, der C-Code als Eingabe verwendet und eine binäre ausführbare Datei (Maschinencode) als Ausgabe erzeugt.

Transpiler werden auch als Source-to-Source-Compiler bezeichnet. Im Wesentlichen handelt es sich also um eine Teilmenge von Compilern, die eine Quellcodedatei aufnehmen und in eine andere Quellcodedatei in einer anderen Sprache oder einer anderen Version derselben Sprache konvertieren . Die Ausgabe ist für einen Menschen allgemein verständlich. Diese Ausgabe muss noch einen Compiler oder Interpreter durchlaufen, um auf dem Computer ausgeführt werden zu können.

Einige Beispiele für Transpiler:

  1. Emscripten : Transpiliert C / C ++ in JavaScript
  2. Babel : Transpiliert ES6 + -Code in ES5 (ES6 und ES5 sind verschiedene Versionen oder Generationen der JavaScript-Sprache)

Was meinen sie nun mit "ähnlicher Abstraktionsebene": Wie ich bereits sagte, wird eine Quelldatei kompiliert / transpiliert, man kann argumentieren, dass Assemblersprache auch eine Quelldatei ist und gcc somit auch ein Transpiler. Dieses Argument ist es also, was diese ähnliche Abstraktionsebene ungültig macht.

Der Begriff der Kategorisierung von Sprachen in niedrigere, mittlere und höhere Ebenen basiert auf der Abstraktionsebene, die sie von der tatsächlichen Arbeitsweise der Maschine / Architektur bieten.

Untergeordnete Sprachen wie Assembly sind der Prozessorarchitektur sehr nahe, dh sie haben unterschiedliche Anweisungen für verschiedene Prozessoren. Während C / C ++ / Java / JavaScript, abstrahieren Sie all dies weg und sorgen Sie für mehr Abstraktion.

Ein Transpiler kompiliert also zu einer Sprache, die näher an der Sprache liegt, mit der Sie in Bezug auf diese Abstraktion begonnen haben (oder näher an der Ebene dieser Sprache in der Sprachleiter der unteren, mittleren und höheren Ebene).

Hoffe das hilft!

Tapananand
quelle
10
"Einige Beispiele für Transpiler:" --- babel nennt sich selbst einen Compiler. Die Trennung zwischen Transpilern und Compilern ist wirklich künstlich.
Zerkms
14
@zerkms Wie gesagt, Transpiler sind eine Teilmenge von Compilern.
Tapananand
1
Ich möchte eines hinzufügen: Wir sprechen hier über natürliche Sprache. Daher werden unscharfe Definitionen erwartet. Ich würde erwarten, dass die "Leichtigkeit des Lesens" der Ausgabe eines Transpilers ähnlich ist wie zuvor, während ein Compiler das Lesen erschwert. Somit ist Webpack / npm ein Compiler, Sie möchten seine Ausgabe nicht lesen. (Zumindest wenn Sie die "Loader" für z. B. .vue-Dateien hinzufügen.
Samuel Åslund
1
Meinung: Ich gehe davon aus, dass die Definitionen lauten sollten: Zusammenstellung: Sprache -> Sprache der unteren Ebene. Transpilation: Sprache -> Sprache der gleichen Ebene.
Deji
3
@Deji Nicht unbedingt die gleiche Sprache, aber eine Sprache auf einer ähnlichen Abstraktionsebene.
Tapananand
33

Hier ist eine Art beschreibende Antwort

Wenn Sie sich Abstraktionsebenen als dieses Beispiel vorstellen:

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

Ein Compiler geht auf eine niedrigere Ebene (niedrigere Nummer). Ein Transpiler wechselt von einer Sprache (oder Version einer Sprache) zu einer anderen unter derselben Nummer.

Araymer
quelle
1
Neugierig, woher diese Liste der "Abstraktionsebenen" kam?
Zerkms
Nur zufällige illustrative Beispiele, ich weiß, dass die ersten beiden etwas matschig sind, aber ich wollte eine längere Liste: P
Araymer
2
Ich mag es und es wäre wirklich cool, wenn es eine solche "offizielle" Klassifizierung wäre. Denn ohne es ist es schwierig, ein Werkzeug (einen Übersetzer) in die eine oder andere Kategorie einzuteilen. ZB: ist javacein Compiler oder nicht.
Zerkms
2

Ich stimme größtenteils der Antwort von tapananand zu, aber ...


Definition

Worte werden "gemacht", also dienen sie einem Zweck. Und das ändert sich auch mit der Zeit.

Wir tendieren jetzt dazu, Transpiler zu verwenden, um einen Compiler anzugeben, der Code in einen anderen Code übersetzt, der dem Quellcode "ähnlicher" ist, als dies ein Compiler tun könnte. Und wird verwendet, um beide meistens zu unterscheiden, wenn beide im selben Kontext erwähnt werden (was wiederum meistens impliziert, dass eine transpile Sprache mindestens noch einmal kompiliert werden muss).


Beispiele

Also ist alles sehr subjektiv. Zum Zeitpunkt dieses Schreibens:

  • Aus der Java-Welt kommend könnte ich CoffeeScript / TypeScript-Transpiler nennen, um darzustellen, dass der resultierende Code nicht effizienter ist als der ursprüngliche.
  • In der CoffeScript- Dokumentation heißt es, es sei ein Compiler, und Babel sei ein Transpiler. Die wollen sagen, dass CoffeeScript, obwohl sehr ähnlich, nicht Javascript ist. Zumindest keine Version davon, denn das ist es, was Babel produziert.
  • Babel nennt sich selbst einen Compiler.

fazit

Daher wird Transpile derzeit nur noch sehr selten verwendet, um nur zwei Compiler voneinander zu unterscheiden.

Es wird wahrscheinlich als Konzept verschwinden, da die Kompilierung viel komplizierter ist (gleiche / höhere / niedrigere Sprache, Version usw.) und das Wort nicht mehr nützlich zu sein scheint ("Transpiler" sind jetzt allgegenwärtig).

estani
quelle
2

Beispiel: TypeScript (eine Microsoft-Obermenge von JavaScript mit typsicherer Prüfung) wird in JavaScript-Code transpiliert, der auf verschiedenen Browsertypen ausgeführt werden kann.

https://en.wikipedia.org/wiki/Microsoft_TypeScript "Microsoft TypeScript ist eine Open-Source-Programmiersprache, die von Microsoft entwickelt und verwaltet wird. Es handelt sich um eine strikte syntaktische Obermenge von JavaScript und fügt der Sprache eine optionale statische Typisierung hinzu.

TypeScript wurde für die Entwicklung großer Anwendungen entwickelt und kompiliert zu JavaScript. [5] Da TypeScript eine Obermenge von JavaScript ist, sind vorhandene JavaScript-Programme auch gültige TypeScript-Programme. TypeScript kann verwendet werden, um JavaScript-Anwendungen für die clientseitige und serverseitige Ausführung (Node.js) zu entwickeln. "

Burak
quelle
Es gibt das Tool "typescript compiler" (oder tsc), dessen Benennung impliziert, dass TypeScript kompiliert und nicht transpiliert wird. Das Tool konvertiert jedoch TypeScript in Javascript, das die gleiche Abstraktionsebene wie die zugrunde liegende Hardware aufweist. Ist TypeScript kompiliert oder transpiliert?
Alex McMillan
@AlexMcMillan TypeScript wird KOMPILIERT, da es sich um eine Obermenge von Javascript handelt und als solches zu Javascript kompiliert wird.
Araymer
@Araymer Verstehst du den Unterschied zwischen Kompilierung und Transpilation? Weil TS nicht kompiliert wird; noch ist JS.
Alex McMillan
Ja, ich will. Und da TS eine Obermenge von JS ist, wird es als höhere Abstraktionsebene angesehen und daher als "kompiliert" bezeichnet. Das kompilierte JS wird dann als normal interpretiert. Wenn Sie also nach TS suchen, ist das am meisten diskutierte Thema die "Zusammenstellung". Die Grenze zwischen Transpilation und Compilation hat jedoch keine offizielle quantitative Definition. Es wird ziemlich matschig, also ist Ihre Meinung zu dem, was zusammengestellt wurde (anders als die Schöpfer, wie es ist), nur Ihre Meinung.
Araymer