Inhaltsverzeichnis:
Definition - Was bedeutet Registerzuordnung?
Die Zuweisung von Registern bezieht sich auf die Praxis der Zuweisung von Variablen zu Registern sowie der Übertragung von Daten in und aus Registern. Registerzuordnung kann auftreten:- In einem Basisblock, der als lokale Registerzuweisung bezeichnet wird
- Über eine gesamte Funktion oder Prozedur, die als globale Registerzuweisung bezeichnet wird
- Über Funktionsgrenzen hinweg, die mit Hilfe eines Aufrufgraphen, der als prozedurale Registerzuweisung bezeichnet wird, überschritten werden
Techopedia erklärt die Registerzuordnung
Während der Kompilierung sollte der Compiler festlegen, wie Variablen einem kleinen, spezifischen Bereich von Registern zugeordnet werden. Einige der Variablen werden möglicherweise nicht verwendet oder sollen gleichzeitig "live" sein. Dies führt dazu, dass einige Register mehreren Variablen zugewiesen werden. Nichtsdestotrotz können keine zwei gleichzeitig aktiven Variablen genau demselben Register zugeordnet werden, ohne den Wert zu verfälschen.
Variablen, die einigen Registern nicht zugeordnet werden können, müssen im RAM gespeichert werden und sollten bei jedem Lese- bzw. Schreibvorgang (Spilling) ein- und ausgelesen werden. Der Zugriff auf Register ist viel schneller als der Zugriff auf RAM. Außerdem wird die Ausführungszeit des kompilierten Programms verkürzt. Daher zielen effiziente Compiler darauf ab, den Registern so viele Variablen wie möglich zuzuweisen.
Im Allgemeinen weisen die meisten Registerzuordner jede Variable dem Hauptspeicher oder einem Zentraleinheitsregister (CPU-Register) zu. Geschwindigkeit ist der entscheidende Vorteil bei der Verwendung eines Registers. Computer verfügen über einen begrenzten Bereich von Registern, was bedeutet, dass nicht alle verfügbaren Variablen Registern zugeordnet werden können. Der Vorgang des Verschiebens einer Variablen von einem Register in den Speicher wird als Verschütten bezeichnet, während der umgekehrte Vorgang des Verschiebens einer Variablen aus dem Speicher in ein Register als Füllen bezeichnet wird. Eine intelligente Registerzuordnung ist für jeden Compiler ein entscheidender Schritt.
Es gibt zwei Arten der Registerzuweisung:
- Lokale Registerzuweisung: Dies ist ein Prozess zum Zuweisen eines Basisblocks (oder Hyperblocks oder Superblocks) zu einem Zeitpunkt. Die Zuweisung lokaler Register erhöht die Geschwindigkeit.
- Globale Registerzuordnung: Wenn die Registerauslastung bei Verwendung der lokalen Zuordnung schlecht ist, ist es wichtig, die globale Registerzuordnung zu verwenden. Bei der einfachen globalen Registerzuweisung werden die aktivsten Werte in jeder inneren Schleife zugewiesen. Die vollständige Zuweisung von globalen Registern verwendet eine Prozedur, um aktive Bereiche in einem Kontrollflussdiagramm zu identifizieren, aktive Bereiche zuzuweisen und Bereiche nach Bedarf zu teilen.