32

어딘가에서 Clojure가 컴파일되었습니다. 자이 썬이나 JRuby처럼 해석되지 않고 자바 나 스칼라처럼 실제로 컴파일 되었습니까?Clojure가 컴파일되거나 해석됩니까?

+1

JFGI. 프로젝트 홈 페이지를보십시오. – Marcin

+1

@Marcin 나는 그렇게했지만 혼란 스럽다. donwvote와 함께 aswer를 제공 할 수 있습니까? – OscarRyz

+1

"Clojure는 컴파일 된 언어로 JVM 바이트 코드로 직접 컴파일되지만 완전히 동적입니다." 충분히 맑은가요? – Marcin

답변

44

Clojure는 항상 컴파일입니다.

Clojure 컴파일러는 Java 바이트 코드를 생성합니다. Java 바이트 코드는 일반적으로 JVM에서 JIT 컴파일하여 JVM에서 원시 코드로 컴파일합니다.

혼란 스러울 수있는 것은 Clojure의 동적 인 대화 형 특성으로 런타임에 컴파일러를 호출 할 수 있다는 것을 의미합니다. 이것은 모두 Lisp "코드는 데이터"전통의 일부입니다.

예를 들어, 형태 (+ 1 2) 컴파일하고 실행하는 런타임에서 Clojure의 컴파일러를 호출하는 다음 :

(eval '(+ 1 2)) 
=> 3 

실행시 컴파일러를 호출 할 수있는 기능은 매우 유용합니다 - 예를 들어 그것을 REPL을 사용하여 실행중인 Clojure 응용 프로그램의 중간에서 새 코드를 컴파일하고 실행할 수 있습니다. 그러나이 "대화식"개발 스타일을 "해석 된"것으로 혼동하지 않는 것이 중요합니다. Clojure 개발은 대화식이지만 여전히 항상 컴파일됩니다.

15

양쪽 모두! (이 바이트 코드를 생성하는 때)

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이므로 구별이별로 흥미롭지 않습니다.

+1

둘 다! 틀린 것은 해석 된 언어의 흐름 만이 결코 해석되지 않습니다. – nickik

+3

우리는 순수한 정의와 명확한 간결한 답변 사이에서 논쟁을 벌이고 있습니다. 마지막 단락에서. JVM 바이트 코드를 만드는 과정에 대해 이야기하고 있습니다. –

+0

그 distinctin 더 명확하게하기 위해 편집, 감사합니다 kickik –

4

Clojure는 컴파일 된 JVM 언어입니다. 이것은 새로운 프로그램에 직면했을 때 JVM 바이트 코드로 컴파일하는 첫 걸음을 의미합니다.

OpenJDK 또는 그 파생 코드를 사용하는 경우 일부 JVM 바이트 코드가 나중에 HotSpot에 의해 컴퓨터 코드로 컴파일 될 수 있습니다.

고급 언어로서 Clojure는 "완전히 동적 인"구가 말하는 동적 유형 지정 형식을 가지고 있습니다.