Compilation vs transpilage

92

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

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

Transpiling est un terme spécifique pour prendre du code source écrit dans un langage et le transformer en un autre langage 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?

Nishi Mahto
la source
Reproduction possible de Qu'est-ce que l'abstraction?
GrumpyCrouton

Réponses:

142

La définition que vous avez citée ci-dessus est trop générale pour qu'un débutant la comprenne complètement et permettez-moi donc de la simplifier à quelque chose que nous voyons pratiquement.

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

Les transpilers sont également connus sous le nom de compilateurs source-à-source. Donc, essentiellement, 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éteur pour pouvoir s'exécuter sur la machine.

Quelques exemples de transpileurs:

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

Maintenant, que veulent-ils dire par «niveau d'abstraction similaire»: comme je l'ai dit, il compile / transpile vers un fichier source, on peut affirmer que le langage d'assemblage est aussi 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 à partir du fonctionnement réel de la machine / architecture.

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

Ainsi, un transpilateur compile dans une langue qui est plus proche de la langue avec laquelle vous avez commencé dans les termes de cette abstraction (ou est 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!

tapananand
la source
9
"Quelques exemples de transpileurs:" --- babel s'appelle un compilateur. La séparation entre transpileurs et compilateurs est vraiment artificielle.
zerkms
13
@zerkms Comme je l'ai dit, les transpileurs sont un sous-ensemble de compilateurs.
tapananand
1
Je voudrais ajouter une chose, nous parlons ici de langage naturel. On s'attend donc à des définitions floues. Je m'attendrais à ce que la "facilité de lecture" de la sortie d'un transpilateur soit similaire à ce qu'elle était auparavant alors qu'un compilateur rend les choses plus difficiles à lire. Ainsi Webpack / npm est un compilateur, vous ne voulez pas lire sa sortie. (Au moins lorsque vous ajoutez les "chargeurs" pour les fichiers .vue par exemple.
Samuel Åslund
1
Opinion: Je postule que les définitions devraient être: Compilation: langue -> langue de niveau inférieur. Transpilation: langue -> langue de même niveau.
Deji le
3
@Deji Pas nécessairement le même niveau-langage, mais un langage à un niveau d'abstraction similaire.
tapananand le
33

Voici une sorte de manière descriptive de répondre

Si vous pensez aux 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.

Araymer
la source
1
Curieux, d'où vient cette liste de "niveaux d'abstraction"?
zerkms
Juste des exemples illustratifs aléatoires, je sais que les deux premiers sont un peu baveux, mais je voulais une liste plus longue: P
Araymer
2
J'aime ça et ce serait vraiment cool si c'était un classement "officiel" comme ça. Car sans cela, il est difficile de mettre un outil (un traducteur) dans l'une ou l'autre catégorie. Par exemple: est javacun compilateur ou non.
zerkms
2

Je suis généralement d'accord avec la réponse tapananand, mais ...


définition

Les mots sont «faits», ils servent donc un but. Et cela change également 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 principalement lorsque les deux sont mentionnés dans le même contexte (encore une fois, ce qui implique principalement qu'un langage transpile devra être compilé au moins une fois de plus)


exemples

Donc tout est très subjectif. Au moment d'écrire ces lignes:

  • Venant du monde Java, je pourrais appeler des transpileurs CoffeeScript / TypeScript pour décrire que le code résultant n'est pas plus efficace que l'original.
  • La documentation de CoffeScript dit que c'est un compilateur et Babel est un transpilateur. On veut dire que CoffeeScript, bien que très similaire, n'est pas Javascript. Du moins pas une version, car c'est ce que produit Babel.
  • Babel s'appelle 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 supérieure / inférieure, version, etc.), et le mot ne semble plus être utile (les «transpileurs» sont désormais omniprésents)

estani
la source
2

Ex: TypeScript (un sur-ensemble Microsoft de JavaScript avec vérification de type sécurisé) 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 un typage statique facultatif au langage.

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

Burak
la source
Il y a l'outil "compilateur typographique" (ou tsc), sa dénomination implique que TypeScript est compilé et non transpilé ... pourtant l'outil convertit TypeScript en Javascript, qui sont du même niveau d'abstraction avec le matériel sous-jacent. TypeScript est-il compilé ou transpilé?
Alex McMillan
@AlexMcMillan TypeScript est COMPILÉ, car il s'agit d'un sur-ensemble de javascript, et en tant que tel, il est compilé en javascript.
Araymer
@Araymer Comprenez-vous la différence entre compilation et transpilation? Parce que TS n'est pas compilé; ni JS.
Alex McMillan
Oui. Et comme TS est un sur-ensemble de JS, il est considéré comme un niveau d'abstraction plus élevé et est donc appelé "compilé". Le JS compilé est alors interprété comme normal. Par conséquent, si vous recherchez TS, le sujet le plus discuté est sa "compilation". Mais la ligne entre transpilation et compilation n'a pas de définition quantitative officielle. Cela devient assez mou, donc votre opinion sur ce qui est compilé (qui diffère de celle des créateurs) n'est que votre opinion.
Araymer