web-dev-qa-db-fra.com

Compiler vs Transpiler

En cherchant la différence, je suis tombé sur ces définitions:

Compilation est le terme général pour prendre le code source écrit dans un langage et le transformer dans un autre.

Transpiling est un terme spécifique pour prendre le code source écrit dans une langue et le transformer en une autre langue qui a un niveau d'abstraction similaire.

Je comprends ce qu'est l'abstraction.

Mais que signifie "niveau d'abstraction similaire" dans la définition ci-dessus? Et comment trouver le niveau d'abstraction dans une langue?

30
Nishi Mahto

La définition que vous avez citée ci-dessus est trop générale pour qu'un débutant puisse la comprendre complètement, alors laissez-moi simplement la simplifier en quelque chose que nous voyons pratiquement.

Compilateur: est un terme générique pour décrire un programme qui prend le code source écrit dans une langue et produit un (ou plusieurs) fichier de sortie dans une autre langue. Dans la pratique, nous utilisons principalement ce terme pour décrire un compilateur tel que gcc qui prend le code C en entrée et produit un exécutable binaire (code machine) en sortie.

Les transpilers sont également appelés compilateurs source-à-source. Donc, en substance, ils sont un sous-ensemble de compilateurs qui prennent un fichier de code source et le convertissent en un autre fichier de code source dans une autre langue ou une version différente de la même langue. La sortie est généralement compréhensible par un humain. Cette sortie doit encore passer par un compilateur ou un interprète pour pouvoir s'exécuter sur la machine.

Quelques exemples de transpilers:

  1. Emscripten : Transpile C/C++ vers JavaScript
  2. Babel : Transpile le code ES6 + vers ES5 (ES6 et ES5 sont différentes versions ou générations du langage JavaScript)

Maintenant, qu'est-ce qu'ils entendent par "niveau d'abstraction similaire": Comme je l'ai dit, il compile/transpile dans un fichier source, on peut affirmer que le langage d'assemblage est également un fichier source et donc gcc est également un transpilateur. Donc, cet argument est ce que ce niveau similaire d'abstraction vide.

La notion de catégorisation des langages en niveaux inférieur, moyen et supérieur est basée sur le niveau d'abstraction qu'ils fournissent du fonctionnement réel de la machine/architecture.

Les langages de niveau inférieur comme Assembly sont très proches de l'architecture du processeur, c'est-à-dire qu'ils ont des instructions différentes pour différents processeurs. En C/C++/Java/JavaScript, résumez tout cela en fournissant plus d'abstraction.

Ainsi, un transpilateur compile vers une langue qui est plus proche de la langue avec laquelle vous avez commencé en termes de cette abstraction (ou plus proche du niveau de cette langue dans l'échelle de langue de niveau inférieur-moyen-supérieur).

J'espère que cela t'aides!

49
tapananand

Voici une sorte de réponse descriptive

Si vous considérez les couches d'abstraction comme cet exemple:

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

Un compilateur passe à un niveau inférieur (nombre inférieur). Un transpilateur passe d'une langue (ou version d'une langue) à une autre au même numéro.

14
Araymer

Ex: TypeScript (un sur-ensemble Microsoft de JavaScript avec vérification sécurisée de type) transpile en code JavaScript qui peut s'exécuter sur différents types de navigateurs.

https://en.wikipedia.org/wiki/Microsoft_TypeScript "Microsoft TypeScript est un langage de programmation open source développé et maintenu par Microsoft. Il s'agit d'un sur-ensemble syntaxique strict de JavaScript et ajoute une saisie statique facultative à la langue.

TypeScript est conçu pour le développement de grandes applications et transcompile en JavaScript. [5] Comme TypeScript est un surensemble de JavaScript, les programmes JavaScript existants sont également des programmes TypeScript valides. TypeScript peut être utilisé pour développer des applications JavaScript pour l'exécution côté client et côté serveur (Node.js). "

0
Burak

Je suis principalement d'accord avec la réponse de tapananand, mais ...


définition

Les mots sont "faits", donc ils servent un but. Et cela change aussi avec le temps.

Nous avons maintenant tendance à utiliser transpiler pour spécifier un compilateur qui traduit le code en un autre code "plus similaire" au code source, ce que pourrait faire un compilateur. Et est utilisé pour différencier les deux la plupart du temps lorsque les deux sont mentionnés dans le même contexte (ce qui implique encore une fois qu'un langage transpile devra être compilé au moins une fois de plus)


exemples

Tout est donc très subjectif. Au moment d'écrire ces lignes:

  • Venant du monde Java Java, je pourrais appeler des transpilateurs CoffeeScript/TypeScript pour montrer que le code résultant n'est pas plus efficace que l'original.
  • CoffeScript documentation dit que c'est un compilateur, et babel est un transpilateur. Le besoin de dire que CoffeeScript, bien que très similaire, n'est pas Javascript. Du moins pas une version, car c'est ce que Babel produit.
  • Babel s'appelle lui-même un compilateur.

fazit

Donc transpile est à ce moment très rarement utilisé, et seulement pour distinguer deux compilateurs.

Il disparaîtra probablement en tant que concept, car la compilation est beaucoup plus compliquée que cela (même langue/version supérieure/inférieure, version, etc.) et le mot ne semble plus être utile (les "transpilers" sont désormais omniprésents)

0
estani