Я пишу компилятор для небольшого императивного языка. Целевым языком является байт-код Java, а компилятор реализован на Haskell.
Я написал интерфейс для этого языка, т.е. у меня есть лексер, синтаксический анализатор и проверка типов. Мне сложно понять, как создавать код.
Я храню структуру данных, представляющую стек локальных переменных. Я могу запросить эту структуру по имени локальной переменной и получить ее позицию в стеке. Эта структура данных передается, когда я прохожу по синтаксическому дереву, а переменные извлекаются и выталкиваются, когда я вхожу в новые области видимости и выхожу из них.
У меня возникли проблемы с тем, чтобы понять, как испустить байт-код. Вывод строк на терминалах и объединение их на более высоких уровнях кажется плохим решением как с точки зрения ясности, так и с точки зрения производительности.
tl; dr Как мне передать байт-код при обходе синтаксического дерева?