Un compilateur est un programme informatique qui convertit le code d’un langage de programmation (le langage source) vers un autre langage de programmation (le langage cible).
Les compilateurs sont utilisés pour transformer le code source de haut niveau en code cible de bas niveau (comme le langage assembleur, le code objet ou le code machine), tout en préservant les fonctionnalités du programme.
Outil essentiel pour la programmation informatique moderne et pratique, les compilateurs permettent aux programmeurs de travailler dans un code de haut niveau lisible par l'homme, puis de convertir leur code source en code cible exécutable. Les compilateurs aident également les développeurs de logiciels à créer des programmes exécutables efficaces, avec de meilleures performances en matière de sécurité, de stabilité et de portabilité. En effet, les compilateurs facilitent l'identification et la correction des erreurs, créant ainsi des applications exécutables portables.
Si tous les compilateurs convertissent le code de haut niveau en code de bas niveau exécutable, le choix du compilateur dépendra du langage de programmation et de l’application. Par exemple, les compilateurs croisés permettent de produire le code d’une unité centrale de traitement ou d’un système d’exploitation autres que ceux sur lesquels il s’exécute.
Si le compilateur idéal n’est pas disponible ou n’a pas encore été créé, un compilateur Bootstrap temporaire permet de compiler un compilateur plus permanent et mieux adapté pour compiler un langage de programmation donné.
Voici une brève liste des logiciels connexes :
Newsletter sectorielle
Restez au fait des tendances les plus étonnantes du secteur dans le domaine de l’IA, de l’automatisation, des données et bien d’autres avec la newsletter Think. Consultez la Déclaration de confidentialité d’IBM.
Vous recevrez votre abonnement en anglais. Vous trouverez un lien de désabonnement dans chaque newsletter. Vous pouvez gérer vos abonnements ou vous désabonner ici. Consultez la Déclaration de confidentialité d’IBM pour plus d’informations.
En pratique, pour utiliser un compilateur, il suffit de saisir une commande sur la ligne de commande d’un système Linux (ou équivalent), en spécifiant le fichier exécutable du compilateur et les fichiers sources à compiler. Cette commande demande au système de traiter le code source afin de le compiler dans un code machine cible et d’obtenir les fichiers objets nécessaires à la production d’un programme exécutable.
Des compilateurs open source comme GNU Compiler Collection (GCC) (un ensemble de compilateurs C robustes, couramment utilisés pour compiler le code C en programmes C) ou Clang sont disponibles dans des référentiels tels que GitHub. D’autres compilateurs peuvent être installés librement, ou achetés auprès d’un large éventail de distributeurs. Ils peuvent également être intégrés dans les environnements de développement intégrés (IDE) les plus connus, qui regroupent divers utilitaires pour le développement logiciel (par exemple, éditeurs de texte, documentation API et outils de débogage).
Quel que soit le compilateur utilisé, le processus de compilation consiste à soumettre le code source à différents niveaux d’analyse, d’optimisation et, pour finir, de production. Le code source est soumis aux différentes couches analytiques de manière séquentielle pour être évalué à chaque étape du processus.
Si le compilateur détecte un problème lié au code source, il renvoie un message d’erreur invitant les développeurs à corriger les erreurs identifiées avant de poursuivre la compilation. En général, les compilateurs suivent les étapes suivantes :
Tous les compilateurs ne respectent pas strictement la structure précédente. Si certains compilateurs contiennent plus ou moins d’étapes, toutes les phases de compilation peuvent être attribuées à l’une des trois étapes suivantes : un front-end, un middle-end et un back-end.
Cette structure en trois étapes permet aux compilateurs d’adopter une approche modulaire. Elle permet de combiner plusieurs front-ends pour différents langages avec des back-ends pour différentes unités centrales de traitement, tout en partageant les capacités d’optimisation des différents middle-ends applicables.
Les trois étapes du compilateur impliquent la distribution suivante :
Si, en théorie, les compilateurs ne sont pas indispensables pour produire un code exploitable, la diversité et la complexité des langages de programmation et des environnements machines les rendent en pratique nécessaires pour créer des logiciels exécutables. Voici les quatre principaux avantages qu’offrent les compilateurs logiciels.
Les langages de programmation de haut niveau utilisent une syntaxe et des mots-clés plus proches du langage naturel, ce qui les rend beaucoup plus faciles à utiliser par les développeurs. Les compilateurs convertissent ce code lisible par l’homme en code machine. Plus complexe, ce dernier est nécessaire pour exécuter les applications logicielles optimisées.
Voici quelques exemples de langages de haut niveau :
Les compilateurs contribuent à améliorer l’efficacité en convertissant le code de haut niveau en code machine exécutable. La sortie du compilateur est stockée une extension de fichier .exe, qui est ensuite directement exécutée par l’ordinateur. Grâce au compilateur, l’écriture du programme exécutable devient une tâche ponctuelle.
Une fois terminé, le code compilé peut être exécuté autant de fois que nécessaire. Ce processus permet généralement aux programmes de s’exécuter plus rapidement et plus efficacement, car certaines applications ou parties d’applications peuvent être exécutées séparément des tâches logicielles d’exécution.
Tous les systèmes ne permettent pas d’exécuter tout type de code. Le compilateur convertit le type de code que le développeur préfère utiliser afin d’obtenir le code nécessaire au système pour fonctionner. Pour améliorer la portabilité des programmes, les compilateurs convertissent donc les logiciels en divers langages compatibles faciles à stocker, à transférer et à exécuter sur un large éventail de systèmes d’exploitation et d’architectures matérielles.
Pendant le processus de compilation, les compilateurs peuvent être utilisés pour identifier et corriger les erreurs et les défauts des logiciels, afin d’obtenir des programmes plus stables et optimisés. Les compilateurs permettent également de renforcer la sécurité des logiciels en prévenant le risque d’erreur de mémoire, comme le débordement de mémoire tampon, et en générant des avertissements dès lors qu’un problème de mémoire est détecté.
Alors que le compilateur permet de convertir le code source en code machine exécutable, l’interpréteur est un type de programme qui propose des fonctionnalités similaires par le biais d’un mécanisme différent.
Au lieu de convertir le code source, les interpréteurs l’exécutent directement ou utilisent un code intermédiaire appelé « bytecode », une représentation de bas niveau du code source, indépendante de la plateforme. Le bytecode sert d’intermédiaire entre le code source lisible par l’homme et le code machine, conçu pour être exécuté par une machine virtuelle (VM) et non directement sur le matériel de l’ordinateur.
En théorie, tout langage de programmation peut être exécuté à l’aide d’un compilateur ou d’un interprète. Chaque langage de programmation est toutefois particulièrement adapté soit à la compilation, soit à l’interprétation.
En pratique, la distinction entre un langage de compilation et un langage d’interprétation peut parfois être floue, tout comme celle entre un compilateur et un interprète, car les fonctionnalités de ces deux types de programmes peuvent se chevaucher. Si certains langages sont généralement compilés, et d’autres interprétés, il est possible d’écrire un compilateur pour un langage couramment interprété, et inversement.
Les langages de haut niveau sont généralement créés en tenant compte de l’un des types de conversion (compilation ou interprétation), mais il s’agit davantage de suggestions que de limitations strictes. Par exemple, on considère que BASIC est un langage interprété et C, un langage compilé, mais il existe des compilateurs pour BASIC tout comme il y a des interpréteurs C.
La principale différence entre les interprètes et les compilateurs réside dans le timing et l’optimisation. Les deux types de programmes visent à convertir le code source en code cible, qui est d’abord fonctionnel puis optimisé.
Le choix du code, à savoir compilé ou interprété, dépendra de l’environnement d’exploitation (capacité matérielle, mémoire et stockage). Selon les contraintes du programme, de l’application ou du matériel, on peut choisir la compilation, l’interprétation, ou les deux.
En tant que telle, l’interprétation ne peut pas se substituer entièrement à la compilation, mais elle peut déplacer les tâches de compilation en l’arrière-plan grâce à un processus de conversion progressif. Les compilateurs suivent une stratégie de conversion anticipée (AOT), qui consiste à convertir entièrement le code source en code cible avant de créer un fichier exécutable.
Les interpréteurs, quant à eux, exécutent le code directement lorsqu’une application l’exige, ou utilisent le bytecode comme intermédiaire pour produire le code source exécutable de la machine virtuelle. Si les interprètes assurent un certain niveau d’accélération ou de flexibilité, un jeu d’instructions machine exécutées directement doit toutefois être fourni vers la fin de la pile d’exécution.
Dans certains cas, lorsque la légèreté est une priorité, les interprètes spéciaux sont préférés aux compilateurs pour leur capacité à effectuer une conversion juste à temps (JIT). La stratégie JIT consiste à compiler des éléments du code source en code cible dans un tampon de mémoire pour une exécution immédiate. L’interprétation JIT compile le code à la demande, alliant l’efficacité des compilateurs traditionnels, qui assurent une compilation ponctuelle, à la liberté d’exécuter le code de manière répétée, souvent plus rapidement qu’un interpréteur bytecode classique.
Cependant, à mesure que les tendances modernes vers la compilation JIT se développent parallèlement à l'interprétation du bytecode en fonction de la situation, de nombreux compilateurs sont conçus pour offrir à la fois des fonctionnalités de compilation et d'interprétation. Ce phénomène brouille davantage les frontières entre ces deux catégories.
IBM Cloud Infrastructure Center est une plateforme logicielle compatible avec OpenStack pour gérer l’infrastructure de clouds privés sur IBM zSystems et IBM LinuxONE.
Découvrez des serveurs, des solutions de stockage et des logiciels conçus pour votre stratégie d’entreprise en matière de cloud hybride et d’IA.
Trouvez la solution d’infrastructure cloud adaptée aux besoins de votre entreprise et ajustez les ressources en fonction de la demande.