Любое руководство по созданию байт-кода Java?
Мы пишем какой-то компилятор из Pascal в JVM Bytecode. И мы уже реализовали генерацию дерева выражений, поэтому следующим шагом должно стать создание .class
файл. Можете ли вы предложить какое-либо руководство / учебник о том, как генерировать какие-либо .class
файл хотя бы из каких-то статических данных? Потому что я уже 2 часа гуглю и читаю спецификацию JVM, но мне действительно нужен какой-то даже самый простой пример, чтобы начать разработку всего материала.
4 ответа
На самом деле есть файл примера в папке ASM, который вы загружаете. Он называется Helloworld и находится в examples
вложенная папка. Он показывает, как скомпилировать (создать с нуля) .class
файл, который соответствует простому приложению hello world. Это также показывает, как получить дату от .class
файлы, но это другая история.
Возможно, это не лучший способ, но когда вам нужно начать с генерации Java-байтового кода и вам нужно несколько базовых примеров, неплохо было бы взглянуть на ASM и примеры, которые объединены в стандартный пакет.
Более того, Groovy использует ASM для генерации своего кода:)
Кто-то уже написал широко используемую библиотеку генерации байт-кода: CGLIB.
Вы бы его сбили, если бы могли выяснить, как получить свой AST в CGLIB.
Я не знаю, знаете ли вы, но есть бэкэнд для FPC, который генерирует байт-код, совместимый с JDK 1.5. Развитие выглядит довольно недавно (ноябрь 2011 года). Вы должны взглянуть на это.
Есть несколько широко используемых проектов генерации байт-кода.
ASM и CGLib, вероятно, два лучших примера.
Вы, вероятно, не хотите создавать для себя библиотеку генерации с нуля - это большая работа, которую трудно понять правильно и, вероятно, она не предлагает вам много возможностей по сравнению с существующим проектом.
ASM широко используется не-Java языками в JVM, имеет документацию по ОК и не так уж плох для начала.
Я не так часто использовал CGLib, но мне было не так легко начать работу.
В качестве конечной точки данных команда Java 8 создает прототип некоторых новых функций Java (включая лямбда-выражения) с помощью ASM.