1/ Les optimisations se font par transformation d'arbre (ou de DAG d'ailleurs), pas par comparaison. La génération de code peut s'effectuer par recouvrement d'arbres partiel -- mais on est dans quelque chose de bien plus compliqué d'une égalité structurelle telle que tu l'envisages.
2/ Dans un système de calcul formel, on va plutôt chercher si les expressions sont équivalentes, s'évaluent toujours -- ou sous condition (il faut bien profiter que l'overflow des entiers c'est un comportement indéfini par exemple!) -- à la même valeur. On a à nouveau quelque chose de bien plus compliqué que l'égalité structurelle.
3/ On peut aussi chercher un isomorphisme entre les arbres -- par exemple pour unifier des paramètres. On a à nouveau quelque chose de plus compliqué que l'égalité structurelle et on va avoir un résultat aussi plus conséquent d'un simple booléen.
Dans tout les cas -- optimisation ou calcul formel -- on n'a pas une relation d'égalité de valeur: parce qu'on ne va vraisemblablement pas pouvoir substituer une expression par l'autre dans tous les contextes -- si on veut que les informations de debug ou les messages d'erreur aient un sens par exemple, il faut aussi garder trace de la position des expressions dans le fichier d'entrée. Je n'utiliserais donc certainement pas l'opérateur == pour ces opérations (qui sont d'ailleurs différentes, je vais essayer de leur donner des noms plus explicites).
Partager