J'ai suivi un cours sur les compilateurs dans mes études de premier cycle dans lequel nous avons écrit un compilateur qui compile les programmes source dans un langage Java similaire à un langage d'assemblage de jouets (pour lequel nous avions un interprète). Dans le projet, nous avons fait quelques hypothèses sur la machine cible étroitement liées aux "vrais" exécutables natifs, notamment:
- une pile d'exécution, suivie par un registre de pointeur de pile dédié ("SP")
- un tas pour l'allocation dynamique d'objets, suivi par un registre de pointeur de tas dédié ("HP")
- un registre de compteur de programme dédié ("PC")
- la machine cible a 16 registres
- les opérations sur les données (par opposition aux sauts, par exemple) sont des opérations de registre à registre
Lorsque nous sommes arrivés à l'unité sur l'utilisation de l'allocation des registres comme optimisation, je me suis demandé: quel est le nombre minimum théorique de registres pour une telle machine? Vous pouvez voir par nos hypothèses que nous avons utilisé cinq registres (SP, HP, PC, plus deux pour utilisation comme stockage pour les opérations binaires) dans notre compilateur. Bien que les optimisations telles que l'allocation de registres puissent certainement utiliser plus de registres, existe-t-il un moyen de s'en sortir avec moins tout en conservant des structures comme la pile et le tas? Je suppose qu'avec l'adressage des registres (opérations de registre à registre), nous avons besoin d' au moins deux registres, mais en avons-nous besoin de plus de deux?