어딘가에서 Clojure가 컴파일되었습니다. 자이 썬이나 JRuby처럼 해석되지 않고 자바 나 스칼라처럼 실제로 컴파일 되었습니까?Clojure가 컴파일되거나 해석됩니까?
답변
Clojure는 항상 컴파일입니다.
Clojure 컴파일러는 Java 바이트 코드를 생성합니다. Java 바이트 코드는 일반적으로 JVM에서 JIT 컴파일하여 JVM에서 원시 코드로 컴파일합니다.
혼란 스러울 수있는 것은 Clojure의 동적 인 대화 형 특성으로 런타임에 컴파일러를 호출 할 수 있다는 것을 의미합니다. 이것은 모두 Lisp "코드는 데이터"전통의 일부입니다.
예를 들어, 형태 (+ 1 2)
컴파일하고 실행하는 런타임에서 Clojure의 컴파일러를 호출하는 다음 :
(eval '(+ 1 2))
=> 3
실행시 컴파일러를 호출 할 수있는 기능은 매우 유용합니다 - 예를 들어 그것을 REPL을 사용하여 실행중인 Clojure 응용 프로그램의 중간에서 새 코드를 컴파일하고 실행할 수 있습니다. 그러나이 "대화식"개발 스타일을 "해석 된"것으로 혼동하지 않는 것이 중요합니다. Clojure 개발은 대화식이지만 여전히 항상 컴파일됩니다.
양쪽 모두! (이 바이트 코드를 생성하는 때)
Clojure를는 온 - fly- 흐름을 갖는다 느낌과 해석 된 언어의 흐름을 갖는 JVM 바이트 코드로 compiled at code load time 및 JVM 바이트 코드로 ahead-of-time compiled, 컴파일 된 언어의. 둘 다 Clojure가 속도에 의존하는 동적 최적화를 처리하는 Java Hotspot 컴파일러에 의해 기계 코드로으로 JIT 컴파일됩니다. 재미있는 "로드/평가 된"코드를 런타임에 즉시 컴파일 할 수있게하고 AOT 컴파일 된 코드는 런타임에 소스를로드하고 평가할 수 있습니다.
- "해석"을 원하면 repl에서
(load "/my/file.clj")
을 입력 할 수 있습니다. - Ahead-Of-Time 컴파일을 원한다면 leiningen clojure 프로젝트 관리 도구를 사용할 것을 제안 할 수 있습니다.
이 경우 컴파일과 해석을 언급 할 때 나는 JVM 바이트 코드로 변환한다는 것을 분명히해야한다. 모든 JVM 언어는 compiled by the JVM at runtime이므로 구별이별로 흥미롭지 않습니다.
둘 다! 틀린 것은 해석 된 언어의 흐름 만이 결코 해석되지 않습니다. – nickik
우리는 순수한 정의와 명확한 간결한 답변 사이에서 논쟁을 벌이고 있습니다. 마지막 단락에서. JVM 바이트 코드를 만드는 과정에 대해 이야기하고 있습니다. –
그 distinctin 더 명확하게하기 위해 편집, 감사합니다 kickik –
Clojure는 컴파일 된 JVM 언어입니다. 이것은 새로운 프로그램에 직면했을 때 JVM 바이트 코드로 컴파일하는 첫 걸음을 의미합니다.
OpenJDK 또는 그 파생 코드를 사용하는 경우 일부 JVM 바이트 코드가 나중에 HotSpot에 의해 컴퓨터 코드로 컴파일 될 수 있습니다.
고급 언어로서 Clojure는 "완전히 동적 인"구가 말하는 동적 유형 지정 형식을 가지고 있습니다.
JFGI. 프로젝트 홈 페이지를보십시오. – Marcin
@Marcin 나는 그렇게했지만 혼란 스럽다. donwvote와 함께 aswer를 제공 할 수 있습니까? – OscarRyz
"Clojure는 컴파일 된 언어로 JVM 바이트 코드로 직접 컴파일되지만 완전히 동적입니다." 충분히 맑은가요? – Marcin