
Code-Garage #79 - Compilation vs Transpilation
Durée: 6m17s
Date de sortie: 30/10/2023
Niveau de langage, abstraction, optimisation,... Telle est la question !
Salut et bienvenue dans ce nouvel épisode du podcast de Code Garage,
je m'appelle Nicolas Brondin-Bernard et aujourd'hui on va parler de compilations et de transpilations.
Alors le terme compilations, il est très largement utilisé en programmation depuis l'invention des
premiers compilateurs en 1952 pour l'autocode écrit par Alic Glény et la 0 écrit par Grace Hopper.
Alors avec l'arrivée et la montée en popularité des langages interprétés par opposition justement
à compilé, on parle de plus en plus de transpilations. Mais c'est quoi les différences exactement ?
Alors la première chose à noter c'est que les deux termes sont très souvent utilisés comme des
synonymes, à tort ou à raison d'ailleurs, parfois pour de simples considérations de marketing.
C'est un peu le même problème que j'avais expliqué dans le précédent podcast Bibliothèque versus
Framework, sauf que notre objectif ici ça va être de donner la réponse théorique la plus
objective possible en essayant de trouver la sémantique pertinente derrière chaque terme.
Alors qu'est-ce que la compilation exactement ? Si on prend l'exemple des compilateurs que j'ai
cité au début de l'épisode, l'objectif d'un compilateur c'est de prendre en entrée un code
source écrit dans un langage compréhensible par un humain entre très gros guillemets pour le transformer
en instructions logiques exécutables par une machine. En général un compilateur il se découpe en
plusieurs étapes. D'abord il y a l'analyse lexicale, c'est là qu'on va détecter les erreurs de grammaire,
ensuite il y a du prétraitement, la suppression de commentaires, des choses comme ça. L'analyse
syntaxique, là c'est la construction d'un arbre syntaxique et la détection des erreurs de syntaxe.
Ensuite il y a l'analyse sémantique, la détection des erreurs de logique, l'optimisation du code et
la création de l'exécutable, on parle aussi de linking. Alors si 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 en général qu'on descend dans les couches d'abstraction puisqu'on
va du haut niveau vers le bas niveau. Et la transpilation alors ? Le terme transpilation il est
directement dérivé du terme anglais translate qui signifie traduire. En linguistique on a tendance
à dire qu'il n'y a pas de langage au dessus d'un autre et qu'on peut exprimer les mêmes concepts
avec différents langages. Donc on part plutôt de cette idée quand on parle du terme transpilation,
c'est 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. Alors un des exemples
les plus classiques de transpilation c'est de type script vers JavaScript. Si on prend un code type
script classique, on a un commentaire, une création de variable et ensuite un petit console log avec
juste une condition ternaire pour afficher oui ou non l'intérieur de l'objet avec justement un
opérateur optionnel, le point d'interrogation. Donc un truc très très très simple et si on le
transpile justement vers JavaScript avec on va dire un compilateur type script, on parle de
compilateur type script quand même vous l'avez vu, mais par améliorer on va dire de base, et bien on
va se retrouver avec un script JavaScript qui va faire un use strict au début, qui va nous remettre
notre commentaire, je suis un commentaire, qui va nous remettre notre objet tel quel et puis dans le
console log comme on avait mis un opérateur optionnel, il va faire un petit peu de magie à l'intérieur,
en fait il va nous, au lieu de nous retourner simplement quelque chose, il va nous retourner une
ternaire de cet objet et donc on va voir une espèce de ternaire imbriqué puisqu'on avait déjà
une ternaire dans notre console log. Alors l'idée c'est pas forcément que vous représentiez le code
mentalement mais c'est juste pour vous donner un exemple et vous dire qu'ici on voit bien que le
code pour le coup il n'a pas du tout été optimisé, le commentaire il est toujours là alors que
dans un code compilé vous n'aurez jamais de commentaire, le nom des variables et des fonctions
eux ils n'ont pas été raccourcis, pas été changés, ce sont les mêmes et pour le coup le code il n'a
pas été optimisé du tout, d'ailleurs dans notre code d'origine et bien en réalité l'opérateur
optionnel il était un petit peu redondant puisqu'on avait déjà un ternaire pour vérifier que l'objet
n'était pas nul et bien le ternaire d'origine il est encore là et donc il devient complètement
redondant pour le coup là on le voit très bien dans le code JavaScript de sortie. Alors pour finir
contrairement à la compilation la transpilation prend un code source en entrée et ressort
pardon un code source et donc pas un code machine ou un executable. Alors l'une des utilités majeures
de la transpilation c'est de passer d'une version d'un langage source vers une autre version d'un
même langage c'est le cas en JavaScript donc par exemple quand on veut passer on veut écrire un
code en nez 6 et on veut qu'il soit exécutat par des vieux navigateurs et donc un nez 4,
nez 2015 peu importe et c'est le cas en Python aussi par exemple quand on écrit du Python 3 et
qu'on veut que ça compile en 2.7 et bien on peut éventuellement le transpiler en général quand
on passe justement d'un langage d'une version plus élevée vers un langage d'une version moins
élevée et bien le code va justement s'agrandir puisque eh bien il y a plein d'optimisation
qui était possible dans la nouvelle version de langage qui n'était pas possible avant et donc
il va falloir trouver des moyens détournés pour arriver à faire ce qu'on voulait. En conclusion
pour faire simple la compilation ça parle d'un code source pour arriver à un code machine
optimisé. La transpilation ça permet de traduire un code source d'un langage vers un autre sans
forcément changer niveau d'abstraction. J'espère que cet épisode vous aurez été utile,
que vous aurez appris quelque chose et moi je vous donne rendez-vous la semaine prochaine pour
un prochain épisode du podcast ou directement sur code-garage.fr pour retrouver tous nos
articles, tous nos podcasts et évidemment toutes nos formations complètes pour continuer à vous
former et à progresser dans votre carrière. Salut !
Les infos glanées
Code-Garage
Découvrons ensemble des sujets passionnants autour du métier de dev et de la programmation en général !
Tags
Code-Garage #80 - Quels secrets renferme le user-agent d'un navigateur ?