LLVM : Tout savoir ce qu’il faut savoir sur ce compilateur

-
3
 m de lecture
-

S’il est courant pour les développeurs de réaliser des programmes dans un langage de « haut niveau », comme Python ou Java, ces mêmes programmes doivent être « compilés » afin d’exploiter de façon directe les capacités du microprocesseur. LLVM a fortement innové en la matière en favorisant des aspects tels que la modularité ou la compilation en temps réel.

Les développeurs le savent… L’écriture d’une suite d’instructions dans un langage tel que Python, Java ou C++ n’est qu’une étape dans le processus devant mener jusqu’à un programme exécutable. Le processus qui transforme le « code source » (ce que le développeur écrit) en un code exploitable par le microprocesseur s’appelle la compilation.

Les langages comme Python ou Java sont appelés des langages de haut niveau. Ils proposent des instructions aisément compréhensibles par un humain tel que le célèbre IF qui sert à tester une condition et se retrouve dans la plupart des langages. Développer un programme en code machine est extrêmement ardu et c’est donc la compilation qui convertit les instructions écrites dans un langage de haut niveau en code machine.

Conçu par l’informaticien Chris Lattner vers 2002, à l’Université de l’Illinois, dans le cadre de sa thèse de doctorat, LLVM a été conçu dans l’optique de renouveler l’approche de la compilation et d’optimiser son usage.

Optimiser le processus de compilation

Ce souci d’optimiser les compilateurs n’est pas nouveau.  Le compilateur GCC – partie intégrante du système d’exploitation GNU (pour Linux) lancé par Richard Stallman en 1984, a intégré au fil du temps de nombreuses options d’optimisation en vue d’améliorer l’efficacité du code généré. 

LLVM est apparu pour sa part au début des années 2000, à une époque où les architectures de microprocesseurs multi-cœurs sont devenues courantes, mais aussi les GPUs ou processeurs graphiques des ordinateurs.

LLVM est l’abréviation de Low Level Virtual Machine, et ce nom résume en partie ce qu’il accomplit : la création de machines virtuelles (à même d’émuler le comportement de processeurs donnés) à un bas niveau (et donc, proche du processeur).

L’approche novatrice de LLVM

LLVM a ainsi proposé diverses approches novatrices :

  • une architecture modulaire ;
  • la compilation JIT ;
  • une Représentation Intermédiaire IR ;
  • tout un écosystème d’outils réutilisables.

Nous allons passer en revue ces divers points.

Architecture modulaire

Traditionnellement, la plupart des compilateurs consistaient en un seul et même programme, ce qui rendait difficile leur optimisation ou l’extension de leurs capacités.

L’un des principaux objectifs pour LLVM a été de créer une architecture de compilation modulaire, en d’autres termes d’amener différents composants à travailler ensemble harmonieusement. Il en a résulté de nombreux bénéfices.

  • Le développement du compilateur peut être confié à diverses équipes, chacune ayant pour charge de réaliser un ou plusieurs modules précis. Le temps de développement en sort réduit, tandis que l’efficacité globale est renforcée. Le code produit par une équipe est habituellement plus propre, plus facile à appréhender par ceux qui seraient en charge de sa maintenance.
  • Lorsqu’un compilateur se présente sous la forme d’une série de modules, il est possible d’optimiser l’un d’entre eux de façon séparée. Et comme la maintenance peut être effectuée sur ce module isolé. Il en résulte une plus grande flexibilité.
  • S’il s’avère au fil des mois qu’une fonction majeure serait manquante au compilateur, il est possible de l’ajouter, que ce soit en intervenant sur l’un des modules existants ou en créant un nouveau module. La structure modulaire favorise ainsi l’expérimentation et l’implémentation de nouvelles capacités.
  • L’architecture modulaire facilite l’intégration d’outils externes.

La compilation JIT ou “à la volée”

Dans le processus de compilation traditionnelle, la  conversion est produite intégralement avant l’exécution du programme et produit donc un code machine définitif, non retouchable.

Avec la compilation JIT (de l’anglais « Just-In-Time ») de LLVM, le code source écrit par le développeur est converti en un code machine exécutable au moment même de son exécution.

La compilation JIT opère juste avant l’exécution d’une séquence de code machine. On parle ainsi de « compilation sélective ». L’optimisation a lieu de façon dynamique (en temps réel), en fonction du comportement du programme.

LLVM n’est pas le seul outil à utiliser la compilation JIT. Il en est de même pour .Net (Microsoft) et pour de nombreuses implémentations de Java.

IR ou représentation intermédiaire

Nous l’avons vu pus haut, LLVM signifie « machines virtuelles de bas niveau ». Et nous avons là une autre clé de LLVM : il ne génère pas un code adapté à un microprocesseur particulier mais un code intermédiaire, proche du langage machine mais indépendant d’une unité de calcul donnée. Cette « représentation intermédiaire » (IR) peut être adaptée à toutes sortes de processeurs, qu’il s’agisse d’unités de calcul ou de processeurs graphiques. Cette approche, là encore, a de nombreux avantages :

  • L’IR peut être optimisée de façon indépendante au code final, propre à un processeur.
  • Il est plus aisé d’analyser ou débugger le code de l’IR que le langage machine.
  • A la sortie d’un nouveau processeur, il est aisé d’amener le compilateur à intégrer le type de langage machine correspondant.

Un riche écosystème

LLVM bénéficie par ailleurs d’un vaste écosystème d’outils ou extensions à même d’étendre ses capacités. Cette situation est dûe en partie à la présence de communautés d’utilisateurs de qualité. A titre d’exemple, le compilateur Clang (qui repose sur LLVM pour des langage comme C, C++ et Objective-C) est activement soutenu par des employés de Google, Apple, Mozilla ou ARM. De même, des langages récents et très performants tels que Rust et Swift, pareillement basés sur LLVM, disposent de communautés importantes et enclines à la participation.

Facebook
Twitter
LinkedIn

DataScientest News

Inscrivez-vous à notre Newsletter pour recevoir nos guides, tutoriels, et les dernières actualités data directement dans votre boîte mail.

Vous souhaitez être alerté des nouveaux contenus en data science et intelligence artificielle ?

Laissez-nous votre e-mail, pour que nous puissions vous envoyer vos nouveaux articles au moment de leur publication !

Newsletter icone
icon newsletter

DataNews

Vous souhaitez recevoir notre
newsletter Data hebdomadaire ?