Y’a-t’il une différence entre compilation et transpilation ?
La compilation et la transpilation sont deux procédés qui transforment un code source, mais n’ont ni le même fonctionnement, ni le même but !
Article publié le 09/10/2023, dernière mise à jour le 17/10/2023
Le terme “compilation” est très largement utilisé en programmation depuis l’invention des premiers compilateur en 1952 pour l’Autocode (Alick Glennie) et l’A-0 (Grace Hopper).
Mais avec l’arrivée (et la montée en popularité) des langages interprété (par opposition à compilé), on parle de plus en plus de transpilation.
Mais quelles sont les différences exactement ?
Compilation vs Transpilation
La première chose à noter, c’est que les deux termes sont très souvent utilisés comme des synonymes (à tord ou à raison), parfois pour de simples considérations marketing…
C’est un peu le même problème que dans notre article bibliothèque vs framework !
Mais notre objectif ici est de donner la réponse théorique la plus objective possible, en essayant de trouver la sémantique pertinente de chaque terme.
Qu’est-ce que la compilation ?
Si l’on prend l’exemple des compilateurs cités au début de l’article, l’objectif d’un compilateur est de prendre en entrée un code source écrit dans un langage compréhensible par un humain, pour le transformer en instructions logiques exécutables par une machine.
En général, une compilation se découpe en plusieurs étapes :
- Analyse lexicale (détection des erreurs de grammaire)
- Pré-traitement (suppression des commentaire,…)
- Analyse syntaxique (construction d’un arbre syntaxique et détection des erreurs de syntaxe)
- Analyse sémantique (détection des erreurs de logique)
- Optimisation du code
- Création de l’exécutable (Linking)
Si l’on schématise, on part d’un langage haut-niveau, pour aller vers un langage “machine” (bas-niveau), avec une phase de vérification et d’optimisation.
On dit également qu’on descend dans les couches d’abstraction.
Qu’est-ce que la transpilation ?
Le terme “transpilation” est directement dérivé du terme anglais “translate” qui signifie “traduire”.
En linguistique, on a tendance à dire qu’il n’y a pas un langage haut dessus de l’autre, et que l’on peut exprimer les mêmes concepts avec les différents langages.
C’est donc plutôt de cette idée que l’on parle avec le terme transpilation : traduire un code d’un langage vers un autre, sans forcément changer de niveau d’abstraction.
C’est d’ailleurs l’une des différences fondamentales entre ces deux principes, car un transpilateur ne va pas forcément optimiser le code d’origine, il va simplement le traduire.
Un exemple de transpilation de TypeScript vers JavaScript :
// Je suis un commentaire
const obj: any = null;
console.log(obj ? obj?.text : null)
"use strict";
// Je suis un commentaire
const obj = null;
console.log(obj ? obj === null || obj === void 0 ? void 0 : obj.text : null);
Ici on voit bien que le code n’a pas été optimisé :
- Le commentaire est toujours là
- Les noms des variables/fonctions n’ont pas été raccourcis
- Le code n’a pas été optimisé (le ternaire d’origine est redondant avec la syntaxe “obj?”)
Pour finir, contrairement à la compilation, la transpilation prend un code source en entrée, et ressort un code source, et non pas un code machine ou un exécutable.
L’une des utilités majeure de la transpilation, est de passer d’une version d’un langage source vers une autre version d’une même langage : c’est le cas en JavaScript ou en Python par exemple.
Conclusion
Pour faire simple, la compilation part d’un code source pour arriver à un code machine optimisé, tandis que la transpilation permet de traduire un code source d’un langage vers un autre, sans forcément changer de niveau d’abstraction !
Aucun commentaire pour l'instant