Как clojure программы/компиляторы/интерпретаторы фактически "работают"?

Кажется, что для установки Clojure в каждую новую среду IDE мне нужно полностью переустановить ее и создать ее копию. И запуск REPL кажется, что он запускает программу Java.

Я иду из фона Ruby, где программы Ruby запускаются ruby program.rb, а ruby ​​- это программа, выполненная из одного места, в файл (я знаю, что это похоже на то, как это работает для java, python и т.д.).

Является ли интерпретатор Clojure "просто скомпилированным Java файлом, который принимает файл .clj в качестве аргумента и делает что-то полезное?

Ответы

Ответ 1

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

Во-вторых, вы действительно не устанавливаете Clojure в том смысле, что вы делаете Ruby. Clojure поставляется в виде файла jar, который представляет собой всего лишь кучу классов Java; если вы поместите файл jar в свой путь к классам, вы можете запустить методы этих классов. Из этих классов clojure.main предоставляет метод main для выполнения REPL и "скриптов". Таким образом, при запуске REPL действительно выполняется программа Java (т.е. JVM); и запуск файла clj равен запросам clojure.main для загрузки и запуска (фактическая работа передается другим классам в реализации Clojure, но clojure.main - это точка входа). Кстати, это точно так же, как с JRuby.

Каждая программа JVM в конечном счете "просто скомпилированный файл Java" или, возможно, множество таких файлов. Чтобы запустить его, вам нужно, чтобы экземпляр JVM загрузил его и запустил соответствующий метод main. Обратите внимание: программы C (например, ruby -the-command) отличаются только тем, что операционная система знает, как найти свои функции main для вас (ну, эквивалент Java classpath работает совсем по-другому, но основная понятия одинаковы). С помощью JVM-программ вам нужно использовать исполняемый файл, совместимый с ОС (java/java.exe), чтобы отключить его.