2014-02-08 2 views
7

Какая библиотека/api использует компилятор Clojure (который является только приложением jar/java) для создания байт-кода JVM? Мне любопытно, что байт-код генерируется во время выполнения java, а не javac, поэтому его java-программа, которая выводит байт-код jvm.Как компилятор Clojure генерирует байт-код JVM?

ответ

6

Clojure использует библиотеку Java под названием ASM для генерации байт-кода. Вилка части lib встроена в проект clojure: https://github.com/clojure/clojure/tree/master/src/jvm/clojure/asm

+1

Это на самом деле подмножество ASM. В рамках Clojure 1.6 подмножество было недавно обновлено до ASM 4.1 в мастер-версии. –

+0

обновлено, спасибо – noisesmith

4

Как компилятор Clojure генерирует байт-код JVM?

Это просто программирование на Java (если только они не загрузили свой генератор кода в Clojure ... что кажется маловероятным). В качестве грубого упрощения открывает файл, выписывая код в формате «classfile», как указано спецификацией JVM, а затем закрывает файл. (Или писать код к ByteArrayOutputStream или эквивалент.)

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


1 - Если вы хотите знать, как генераторы кода в общей работе, читать учебник по написанию компиляторов. Для всех подробностей о том, как Clojure делает это, посмотрите исходный код ...

+0

Единственное исключение, которое я знаю о генерации байт-кода Clojure и Java, - это очистка локальных сетей Clojure, у которой нет Java-аналога iirc. – noisesmith

+0

Существует проект CinC (Clojure in Clojure), который будет генерировать байтовый код Clojure без использования какого-либо Java-кода, но он еще не созрел. – noisesmith

Смежные вопросы