À retenir
- C'est une transformation du code générique en code spécifique.
- Elle se produit durant la phase de compilation.
- Elle favorise la vitesse (exécution rapide) au détriment de la taille du programme.
La monomorphisation est une technique utilisée par certains compilateurs pour transformer une fonction « générique » (qui peut accepter plusieurs types de données) en plusieurs versions spécifiques et uniques. C'est un peu comme si, au lieu d'avoir un robot multifonction qui doit s'adapter à chaque tâche, on fabriquait un robot dédié pour chaque outil précis : un pour visser, un pour percer et un pour poncer, afin d'être plus efficace.
Étymologie
Le mot vient du grec monos (« seul », « unique ») et morphē (« forme »). En informatique, cela désigne l'action de donner une forme unique et concrète à un code qui était auparavant abstrait ou polyvalent.
Exemples d'usage
- En C++, l'utilisation des
templatesdéclenche la monomorphisation : le compilateur génère du code machine spécifique pour chaque type (int, float, etc.) utilisé avec le template. - En Rust, les fonctions génériques sont monomorphisées par défaut, ce qui permet d'obtenir des performances optimales (Zero-cost abstractions).
Cas d'usage
Ce concept intervient principalement dans les langages compilés qui cherchent à maximiser la vitesse d'exécution. On l'utilise lors de la création de bibliothèques mathématiques ou de structures de données (listes, piles) qui doivent fonctionner avec n'importe quel type de contenu sans ralentir le processeur.
Bonnes pratiques
Bien que performante, la monomorphisation peut augmenter la taille du fichier final (exécutable) car elle duplique le code pour chaque type utilisé. Il faut veiller à ne pas en abuser dans des environnements où la mémoire est très limitée, comme l'informatique embarquée, ou utiliser des alternatives comme l'effacement de type si la taille du binaire devient problématique.
Synonymes
Antonymes
Conseil
Si vous débutez, retenez simplement que la monomorphisation est le secret de la rapidité de langages comme Rust ou C++ : ils créent des versions sur-mesure de votre code pour chaque situation, évitant ainsi au programme de 'réfléchir' inutilement au moment de son exécution.
Questions fréquentes
Pourquoi monomorphiser au lieu d'utiliser une seule fonction ?
Parce que cela permet au processeur de ne pas avoir à deviner le type de donnée pendant que le programme tourne. Tout est déjà prêt et optimisé, ce qui supprime les délais de décision.
Est-ce que tous les langages font cela ?
Non. Par exemple, Java utilise souvent l'effacement de type (type erasure) qui garde une seule version de la fonction, alors que Rust ou C++ préfèrent la monomorphisation pour la performance.