# Langage intermédiaire

En informatique, un langage intermédiaire (parfois abrégé en IL, de l'anglais Intermediate Language) est le langage d'une machine abstraite conçu pour l'analyse d'un programme informatique. Le terme vient de son utilisation dans les compilateurs, où un compilateur transcrit d'abord le code source d'un programme en une forme plus adaptée pour les transformations d'amélioration de code, comme un état intermédiaire avant de générer du code objet ou du langage machine pour une machine cible, c’est-à-dire la machine sur laquelle sera exécutée le programme. La conception d'un langage intermédiaire diffère typiquement de celle du langage machine de trois manières fondamentales :
* Chaque instruction représente exactement une opération fondamentale ; par exemple les modes d'adressage « shift-add » communs dans les microprocesseurs n'y sont pas présents.
* Les informations de structures de contrôle peuvent ne pas être incluses dans l'ensemble d'instructions.
* Le nombre de registres peut être large, voire illimité.
Un format populaire pour les langages intermédiaires est le code à trois adresses.
Une variation du sens de langage intermédiaire désigne les langages utilisés comme un langage intermédiaire par un langage de haut niveau qui ne génère pas du code objet ou du code machine, mais génère seulement le langage intermédiaire, pour le soumettre à un compilateur qui émet du code objet ou du code machine. Le but est d'obtenir une optimisation ou de la portabilité comme décrit ci-dessus mais en utilisant un langage intermédiaire qui a des compilateurs pour beaucoup de processeurs et de systèmes d'exploitation, tel que le C. Les langages utilisés à cette fin ont une complexité intermédiaire entre les langages de haut niveau et les langages de bas niveau, tels que les langages assembleur.

## Représentation intermédiaire

En compilation, la représentation intermédiaire (ou code intermédiaire) d'un programme informatique est une structure de donnée représentant le programme à l'intérieur du compilateur. Il s'agit d'une étape intermédiaire entre le code source et le code binaire. La représentation intermédiaire est générée à partir de l'arbre syntaxique abstrait. Elle est utilisée pour la phase d'optimisation avec l'analyse du flot de données et des réorganisations du code avant la génération de code.
La représentation intermédiaire peut être abrégée en IR (de l'anglais intermediate representation). Son nom implique que la plupart de l'information présente dans le code source est retenue par la représentation intermédiaire avec des données supplémentaires ou des possibilités d'accès rapides aux informations.

## Langages

De nombreux langages de programmation utilisent le C comme langage intermédiaire. Parmi eux : Eiffel, Sather, et Esterel. On a conçu des variantes de C comme des langages assembleur portable dont plusieurs langages appelés C--, le C Intermediate Language le Low Level Virtual Machine
Le Java Virtual Machine Language est un langage intermédiaire utilisé par tous les compilateurs ciblant la machine virtuelle Java, avant la compilation à la volée en code machine. De même le Common Intermediate Language de Microsoft est un langage intermédiaire conçu pour être partagé par tous les compilateurs du Framework .NET, avant la compilation statique ou dynamique en code machine.
Le GNU Compiler Collection (gcc) utilise de manière interne différents langages intermédiaires pour simplifier la portabilité et la compilation croisée. Parmi ces langages :
* L'historique Register Transfer Language (RTL).
* Le langage GENERIC, à base d'arbres.
* GIMPLE à base de SSA.

## Autres

D'autres outils d'analyse de code utilisent une représentation intermédiaire.
Par exemple, radare2 est un outil d'analyse et de rétroingénierie de fichiers binaires qui utilise les langages intermédiaires ESIL et REIL pour analyser les fichiers binaires.