Question

Je travaille sur un compilateur pour ma propre langue personnalisée. Comme je lisais un article sur l'optimisation du code, j'ai remarqué qu'il avait supposé que la représentation intermédiaire du code avait déjà été formée. Bien que je n'ai pas encore commencé à écrire la section d'optimisation de mon compilateur, je l'ai traversé dans ma tête et qu'il semble préférable d'avoir l'optimiseur fonctionner sur l'arbre de syntaxe avant de convertir la représentation intermédiaire.

Y a-t-il une raison de préférer une approche à l'autre ou est principalement une question de goût personnel?

Par exemple, supposons que j'ai un bloc if comme

if ( some_expression ) {
    do_stuff
}

Si cela pourrait être reconnu par le compilateur que some_expression évaluera toujours comme vrai et qu'il n'y a pas d'effets secondaires, je pourrais alors retirer son calcul simplement en éliminant l'arborescence.

Toutefois, si j'avais déjà converti l'arbre en une représentation intermédiaire, telle qu'une liste d'assemblage-ish d'instructions simples, les processus de reconnaissance et de résolution du scénario seraient (dans mon imagination depuis que je n'ai pas encore tenté de mis en œuvre) beaucoup plus compliqué.

Était-ce utile?

La solution

Ces jours-ci, la tendance est d'optimiser avec la représentation intermédiaire. Découvrez LLVM par exemple:

Les bibliothèques principales LLVM fournissent un optimiseur moderne et indépendant de la cible, ainsi qu'un support de génération de code pour de nombreux processeurs populaires (ainsi que certains moins courants!) Ces bibliothèques sont construites autour d'une représentation de code bien spécifiée appelée Représentation intermédiaire LLVM ("LLVM IR"). Les bibliothèques principales LLVM sont bien documentées et sont particulièrement faciles à inventer votre propre langue (ou portez un compilateur existant) pour utiliser LLVM comme optimiseur et générateur de code.

LLVM peut fournir un optimiseur indépendant de la source car il est effectué que son optimisation passe sur le code uniquement après sa représentation dans LLVM IR.

Pourquoi pourrait-il être beaucoup plus compliqué de faire cela? Cela dépend de votre représentation intermédiaire. L'un des objectifs de conception de la représentation intermédiaire serait de faciliter diverses optimisations plutôt que de les rendre inutilement compliquées. Voir toutes les optimisations que LLVM peut réaliser travailler sur le LLVM IR, par exemple, dans ce liste d'analyse et de transformation passe.

Licencié sous: CC-BY-SA avec attribution
Non affilié à cs.stackexchange
scroll top