Podczas studiów licencjackich wziąłem kurs na kompilatory, w którym napisaliśmy kompilator, który kompiluje programy źródłowe w zabawnym języku podobnym do języka Java z językiem montażu zabawek (dla którego mieliśmy tłumacza). W projekcie przyjęliśmy pewne założenia dotyczące maszyny docelowej ściśle związane z „prawdziwymi” natywnymi plikami wykonywalnymi, w tym:
- stos czasu wykonywania, śledzony przez rejestr dedykowanego wskaźnika stosu („SP”)
- sterta do dynamicznego przydzielania obiektów, śledzona przez dedykowany rejestr wskaźnika sterty („HP”)
- dedykowany rejestr licznika programów („PC”)
- maszyna docelowa ma 16 rejestrów
- operacje na danych (w przeciwieństwie do np. skoków) są operacjami typu rejestr-rejestr
Kiedy dotarliśmy do jednostki, wykorzystującej przydział rejestrów jako optymalizację, zastanawiałem się: jaka jest teoretyczna minimalna liczba rejestrów dla takiej maszyny? Z naszych założeń widać, że w naszym kompilatorze wykorzystaliśmy pięć rejestrów (SP, HP, PC oraz dwa do wykorzystania jako pamięć do operacji binarnych). Podczas gdy optymalizacje, takie jak alokacja rejestrów, z pewnością mogą korzystać z większej liczby rejestrów, czy istnieje sposób na uzyskanie mniejszej liczby przy jednoczesnym zachowaniu struktur takich jak stos i stos? Przypuszczam, że przy adresowaniu rejestrów (operacje rejestr-rejestr) potrzebujemy co najmniej dwóch rejestrów, ale czy potrzebujemy więcej niż dwóch?