Я взяв курс на компілятори в моєму бакалаврському навчанні, в якому ми написали компілятор, який збирає вихідні програми на іграшці, схожі на мову Ява, на мову складання іграшок (для якої у нас був перекладач). У проекті ми зробили кілька припущень щодо цільової машини, тісно пов’язаної з "справжніми" власними виконуваними файлами, включаючи:
- стек часу виконання, відстежуваний за допомогою спеціального реєстру вказівника стека ("SP")
- купа для динамічного розподілу об'єктів, відстежена за допомогою спеціалізованого реєстру вказівника купи ("HP")
- спеціальний реєстр лічильників програм ("ПК")
- цільова машина має 16 регістрів
- Операції над даними (на відміну від, наприклад, стрибків) - це операції "реєстрація до реєстрації"
Коли ми потрапили до підрозділу з використання розподілу реєстру в якості оптимізації, я змусив мене задуматися: Яка теоретична мінімальна кількість регістрів для такої машини? Ви можете переконатися, що в нашому компіляторі ми використовували п'ять регістрів (SP, HP, PC, плюс два для використання як сховище для бінарних операцій). Хоча для оптимізацій, таких як розподіл реєстрів, звичайно, можна використовувати більше регістрів, чи існує спосіб подолати меншу кількість, зберігаючи структури, такі як стек і купа? Я вважаю, що для адресації реєстру (операцій з реєстрацією в реєстрацію) нам потрібно принаймні два регістри, але чи потрібно нам більше двох?