Какая библиотека/api использует компилятор Clojure (который является только приложением jar/java) для создания байт-кода JVM? Мне любопытно, что байт-код генерируется во время выполнения java, а не javac, поэтому его java-программа, которая выводит байт-код jvm.Как компилятор Clojure генерирует байт-код JVM?
ответ
Clojure использует библиотеку Java под названием ASM для генерации байт-кода. Вилка части lib встроена в проект clojure: https://github.com/clojure/clojure/tree/master/src/jvm/clojure/asm
Как компилятор Clojure генерирует байт-код JVM?
Это просто программирование на Java (если только они не загрузили свой генератор кода в Clojure ... что кажется маловероятным). В качестве грубого упрощения открывает файл, выписывая код в формате «classfile», как указано спецификацией JVM, а затем закрывает файл. (Или писать код к ByteArrayOutputStream или эквивалент.)
Для записи, нет ничего качественно отличается от того, что компилятор Clojure делает и компилятор Java может делать, если вы называете его во время выполнения. Но, очевидно, будут различия в деталях детализации, из-за различий в языках и разных идей и приоритетов для соответствующих разработчиков.
1 - Если вы хотите знать, как генераторы кода в общей работе, читать учебник по написанию компиляторов. Для всех подробностей о том, как Clojure делает это, посмотрите исходный код ...
Единственное исключение, которое я знаю о генерации байт-кода Clojure и Java, - это очистка локальных сетей Clojure, у которой нет Java-аналога iirc. – noisesmith
Существует проект CinC (Clojure in Clojure), который будет генерировать байтовый код Clojure без использования какого-либо Java-кода, но он еще не созрел. – noisesmith
- 1. Улучшения Clojure JVM 7/8
- 2. Daemon with Clojure/JVM
- 3. Почему jvm генерирует serialVersionUID?
- 4. Lua to JVM компилятор?
- 5. Почему компилятор генерирует ошибку?
- 6. Затмение/Javac разный байткод
- 7. JVM Gotchas, особенно для Clojure
- 8. Как работает реализация Protcols JVM Clojure?
- 9. Зачем компилятор генерирует эту сборку?
- 10. Clojure doseq генерирует огромный код?
- 11. Почему компилятор генерирует этот код?
- 12. Как компилятор генерирует код обработчика событий?
- 13. Как компилятор генерирует определения класса шаблонов?
- 14. Java байткод iconst_0 iadd последовательность
- 15. Если JVM генерирует машинный код, то где файлы кода?
- 16. Как несколько списков параметров в Scala получить закодированы в JVM байткод
- 17. Как работает JVM с учетом компьютерной организации?
- 18. Локальные переменные в Java байткод
- 19. Какой самый простой способ создать компилятор F #, который работает на JVM и генерирует байт-код Java?
- 20. Каковы условия, в которых JVM генерирует notserializableexception?
- 21. cucumber-jvm java не генерирует скелеты шага
- 22. java.exe = JVM и Javac .exe = компилятор
- 23. Почему компилятор Rust генерирует огромные исполняемые файлы?
- 24. которые создают файл класса JVM или компилятор в java?
- 25. Clojure (JVM): Связывание (ссылка) с библиотекой
- 26. Настройки памяти GC Clojure/Java/JVM
- 27. GWT 2.7 компилятор не генерирует cache.html файлы
- 28. Компилятор C не генерирует корректный выход сборки?
- 29. Почему компилятор C# генерирует ошибку компиляции?
- 30. Почему компилятор генерирует пару команд push/pop?
Это на самом деле подмножество ASM. В рамках Clojure 1.6 подмножество было недавно обновлено до ASM 4.1 в мастер-версии. –
обновлено, спасибо – noisesmith