Přidělování registrů

Přidělování registrů je jednou z úloh překladačů, které vytváří ze zdrojového kódu strojový kód nebo jazyk symbolických adres, který bude následně na strojový kód převeden.

Podstata úlohy vychází z typické situace, kdy počítačový program využívá více proměnných, než kolik je na cílovém procesoru k disposici registrů, nelze tedy každé proměnné přiřadit její registr. Mít všechny proměnné pouze v operační paměti by bylo značně neefektivní, protože operační paměť je ve srovnání s registry velmi pomalá, a navíc řada strojových instrukcí vyžaduje, aby byl některý z jejích operandů v registrech. Úlohou je najít optimální využití registrů pro reprezentaci vždy těch proměnných, s kterými je pracováno, tedy typicky zejména minimalizovat přístup do operační paměti.

V praxi je úloha ještě složitější tím, že některé instrukce upřednostňují nebo vyžadují pro svou práci konkrétní registry, na některých platformách se některé registry částečně překrývají (například EAX, AX, AH, AL na architektuře x86), je vhodné vzít v úvahu vliv keše a podobně. Také je obvykle třeba vzít v úvahu volací konvence, neboť při předávání dat podprogramu (a i předávání návratové hodnoty) jsou rovněž užívány registry, ať už jsou daná data předávána hodnotou nebo odkazem.

Průlomovým výsledkem ohledně přidělování registrů je práce Gregoryho Chaitina, který v roce 1982 publikoval s kolegy článek, v němž navrhli převést úlohu na úlohu barvení grafu a také ukázali její NP-úplnost.

Reference

V tomto článku byly použity překlady textů z článků Registerzuteilung na německé Wikipedii a Register allocation na anglické Wikipedii.