Я бы также порекомендовал ASM, но посмотрите на Jasmin , я использовал (или: должен был использовать) для университетского проекта, и он работает довольно хорошо, я написал лексер / Комбинация синтаксический анализ / анализатор / оптимизатор / генератор для языка программирования, использующего java и jasmin, таким образом генерирует код JVM. Я загрузил код здесь , интересной частью должен быть сам исходный код . В папке «bytecode / InsanelyFastByteCodeCreator.java» вы найдете кусок кода, который преобразует дерево AST во входной формат ассемблера jasmin. Совершенно прямо вперед.
Исходный язык (который был преобразован в AST с помощью Lexer + Parser + Analyzer) является подмножеством Java, называемым MiniJava. В нем отсутствуют некоторые «сложные» функции, такие как Наследование, Конструкторы, статические методы, частные поля / методы. Ни одну из этих функций сложно реализовать, но была другая задача - написать серверную часть X86 (так, чтобы сгенерировать машинный ассемблер), и эти вещи, как правило, становятся сложными, если у вас нет JVM, которая обрабатывает некоторые вещи.
В случае, если вас интересует странное имя класса: задача университетского проекта состояла в том, чтобы преобразовать AST в SSA график (то есть график, представляющий входной код), а затем оптимизировать график, а затем превратить график в байт-код Java. Это было около 3/4 работы над проектом, а InsanlyFastByteCodeCreator был всего лишь ярлыком для тестирования всего.
Взгляните на книгу "Виртуальная машина Java" Джона Мейера и Троя Даунинга. В этой книге много говорится о Jasmin-Assembler, она очень полезна для понимания внутренних функций JVM.