Компиляторы для начинающих

В рамках группового проекта я пишу компилятор для упрощенного языка. В качестве одной из дополнительных функций я подумал, что я бы добавил оптимизатор глазка, чтобы просмотреть выходной код сборки Intel и оптимизировать его.

Наш компилятор сделан на Java, и похоже, что будет много работы по созданию этого оптимизатора глазка с использованием Java, который я изучил до сих пор. Есть ли какой-то инструмент, который я должен использовать, чтобы сделать это возможным, так как сопоставление с образцом не похоже на хороший подход в Java.

Спасибо

3 ответа

Оптимизация глазка должна выполняться на двоичном представлении дерева разбора, а не на тексте, предназначенном для ввода в ассемблер.

Трудно сказать, не глядя на дизайн вашего компилятора, но обычно у вас есть промежуточный шаг между генерацией кода и его генерацией. Например, вы могли бы подумать о том, чтобы выходные данные фазы генерации кода были, например, связным списком команд, где каждый объект инструкции хранит тип инструкции, любые аргументы, назначения меток / ветвей и так далее. Затем каждый шаблон будет проверять текущий узел и его непосредственных преемников (например, if (curr.isMov() && curr.next.isPush() && ...) и измените список соответствующим образом. Затем ваш оптимизатор глазка начинает с вывода кодагена, запускает каждый шаблон на нем и делает это снова и снова, пока список не перестанет меняться. Затем у вас есть отдельная фаза, которая просто берет этот список инструкций и выводит фактическую сборку.

Я определенно не буду использовать строки для этого. Вы можете посмотреть на lex/yacc, и тому подобное (например, Джек один для Java, хотя я не использовал его) для генерации AST сборки, затем запустить оптимизацию на AST и снова записать сборку... но вы понимаете, что это сложно что делать, верно?:-)

Другие вопросы по тегам