Ich habe in meinem Grundstudium einen Kurs über Compiler besucht, in dem wir einen Compiler geschrieben haben, der Quellprogramme in einer Spielzeug-Java-ähnlichen Sprache zu einer Spielzeug-Assemblersprache kompiliert (für die wir einen Dolmetscher hatten). Im Projekt haben wir einige Annahmen über den Zielcomputer getroffen, die eng mit "echten" nativen ausführbaren Dateien zusammenhängen, darunter:
- ein Laufzeitstapel, der von einem dedizierten Stapelzeigerregister ("SP") verfolgt wird
- Ein Heap für die dynamische Objektzuweisung, der von einem dedizierten Heap-Zeigerregister ("HP") verfolgt wird
- ein dediziertes Programmzählerregister ("PC")
- Der Zielcomputer verfügt über 16 Register
- Operationen an Daten (im Gegensatz zu z. B. Sprüngen) sind Register-zu-Register-Operationen
Als wir zur Einheit kamen, um die Registerzuordnung als Optimierung zu verwenden, fragte ich mich: Was ist die theoretische Mindestanzahl von Registern für eine solche Maschine? Sie können an unseren Annahmen erkennen, dass wir in unserem Compiler fünf Register (SP, HP, PC plus zwei zur Verwendung als Speicher für binäre Operationen) verwendet haben. Während Optimierungen wie die Registerzuweisung sicherlich mehr Register verwenden können, gibt es eine Möglichkeit, mit weniger auszukommen, während Strukturen wie der Stapel und der Heap beibehalten werden? Ich nehme an, dass wir bei der Registeradressierung (Register-zu-Register-Operationen) mindestens zwei Register benötigen, aber brauchen wir mehr als zwei?