La structure du compilateur en trois étapes
Un compilateur moderne est généralement structuré en trois étapes : le front-end, le middle-end et le back-end. Le front-end analyse le code source, vérifie son exactitude et construit une représentation intermédiaire (RI). Le middle-end optimise cette RI. Le back-end traduit ensuite la RI optimisée en code machine cible pour une architecture CPU spécifique.
Cette conception modulaire en trois étapes assure une séparation cruciale des préoccupations. Le front-end est dépendant du langage, mais indépendant de la machine ; il comprend la syntaxe et la sémantique d'un langage spécifique comme C++ ou Rust. Sa sortie, la représentation intermédiaire (RI), est une structure de données abstraite et indépendante de la machine, comme un arbre de syntaxe abstrait (AST) ou un code à trois adresses. Cela dissocie le langage source de la machine cible.
Le middle end est largement indépendant du langage et de la machine. Il utilise l'IR et applique une série de passes d'optimisation, telles que l'élimination du code mort, le repliement des constantes et l'optimisation des boucles. Comme il fonctionne sur l'IR générique, ces optimisations complexes peuvent être écrites une seule fois et appliquées à tout langage compilable dans cet IR.
Enfin, le back-end est dépendant de la machine, mais indépendant du langage. Il utilise l'IR optimisé et effectue la sélection des instructions, l'allocation des registres et l'ordonnancement des instructions afin de générer du code machine performant pour une architecture cible spécifique, comme x86-64 ou ARM. Cette structure permet de construire des compilateurs prenant en charge M langages et N cibles en écrivant M front-ends et N back-ends, plutôt que M*N compilateurs individuels. Ce principe est illustré par les infrastructures de compilateurs modernes comme GCC et LLVM.
UNESCO Nomenclature: 1203
- Informatique
Perturbation
Fondamentaux
Usage
Utilisation généralisée
Précurseurs
- premières conceptions de compilateurs monolithiques
- concept d'abstraction en génie logiciel
- développement de langages intermédiaires dans les premiers systèmes
- recherche sur les logiciels portables (par exemple, le système p-code)
Applications
- compilateurs reciblables (par exemple, GCC, llvm)
- compilation croisée pour différentes plates-formes matérielles
- cadres d'optimisation indépendants du langage
- développement de nouveaux langages de programmation en créant simplement un nouveau front-end
- outils d'analyse statique fonctionnant sur une représentation intermédiaire
Idées d'innovations potentielles
En raison du trafic généré par les robots de scraping, actuellement supérieur à 40 000 par jour, ce contenu est réservé aux membres de la communauté.
> Connexion < ou > Registre < (100% gratuit) pour y accéder, ainsi qu'à tous les autres contenus et outils à accès restreint.
En rapport avec : conception de compilateurs, front-end, middle-end, back-end, représentation intermédiaire, ir, optimisation, génération de code, modularité, GCC, llvm.