2010-06-24 21 views
13

Wygląda na to, że aby zainstalować Clojure w każdym nowym IDE, muszę go całkowicie ponownie zainstalować i utworzyć jego kopię. Uruchamianie REPL wydaje się być uruchomione w programie Java.W jaki sposób programy/kompilatory/interpretery clojure faktycznie "działają"?

Pochodzę z tła Ruby, gdzie programy Ruby są uruchamiane przez ruby program.rb, a ruby ​​jest programem uruchamianym z jednego miejsca, na plik (jestem świadom tego, że jest podobny do tego, jak działa dla java, python itp.).

Czy "tłumacz" clojure jest po prostu skompilowanym plikiem Javy, który pobiera jako argument plik .clj i czy do niego pasuje?

Odpowiedz

29

Po pierwsze, Clojure nie ma tłumacza. Cały kod Clojure jest kompilowany do kodu bajtowego JVM podczas jego ładowania. Podkreślam tę kwestię, ponieważ tak właśnie się zaczęła historia doskonałych osiągnięć Clojure.

Po drugie, tak naprawdę nie "instalujesz" Clojure w tym sensie, że robisz Ruby. Clojure przychodzi jako plik jar, który jest po prostu garstką klas Java; jeśli umieścisz plik jar w ścieżce klas, możesz uruchomić metody tych klas. Spośród tych klas, clojure.main zapewnia metodę uruchamiania REPL i "skryptów". Tak więc uruchamianie REPL rzeczywiście uruchamia program Java (czyli JVM); i uruchamianie pliku clj jest równoznaczne z pytaniem, czy clojure.main załadować i uruchomić (faktyczna praca jest przekazywana innym klasom w implementacji Clojure, ale clojure.main jest punktem wejścia). BTW, to jest dokładnie to samo, co z JRuby.

Każdy program JVM jest ostatecznie "tylko skompilowanym plikiem Java" lub może być zbiorem takich plików. Aby go uruchomić, musisz załadować instancję JVM i uruchomić odpowiednią metodę main. Zauważ, że programy w języku C (takie jak ruby -the-command) różnią się tylko tym, że system operacyjny wie, jak znaleźć swoje funkcje main (cóż, odpowiednik ścieżki klas Java działa również całkiem inaczej, ale główne pojęcia są takie same). W programach JVM należy użyć pliku wykonywalnego przyjaznego dla systemu operacyjnego (java/java.exe), aby kopać rzeczy.

+0

Po załadowaniu pliku .clj do pliku 'clojure.main', co dzieje się z rzeczywistym plikiem? Wspomniałeś, że jest "skompilowany" do kodu bajtowego JVM ... czy jest to punkt, w którym ten kod JVM jest wyprowadzany jako dodatkowy plik, i który plik jest uruchamiany przez samą JVM? –

+0

Zwykle nie są tworzone rzeczywiste pliki '.class', ale możesz je poprosić, jeśli chcesz (zobacz' (doc compile) 'i' (doc * compile-files *) '). Nie ma powodu, aby martwić się o to przez większość czasu. Zauważ, że ten tryb działania w ogóle nie jest właściwy dla Clojure; Python robi to samo, kompilując pliki '.py' do kodu bajtowego Python, a następnie uruchamiając go. Jedna różnica polega na tym, że Python domyślnie generuje skompilowane moduły jako pliki ".pyc", ale nie zawsze jest to możliwe (np. Z powodu problemów z uprawnieniami) i nie ma wpływu na sposób wykonywania kodu. –

+0

Jeśli utworzę plik '.class' i wręczy go Bobowi, czy będzie on w stanie uruchomić go bez instalacji clojure? –

Powiązane problemy