2013-09-10 4 views
0

나는 Clojure를 배우는 C++ 프로그래머이고 자바에 대한 경험이 부족하다. 지금, 나는 도서관에서 하나의 기능을 참조 Clojure의 프로그램이 있습니다 사용되지 않는 기능을 제거합니다 C/C++ 링커에서Clojure (JVM) : 라이브러리 링크하기 (참조)

(ns app.main 
    (:gen-class) 
    (:require [clojure.string :refer [join])) 

... 
;; Code using join 
... 

을, 그래서 라이브러리에서 단일 함수를 참조 할 상당한 오버 헤드가 없다. JVM/Clojure 세계에서는 어떤 일이 발생합니까? 그것은 Clojure 컴파일러 특정 또는 JVM 일반 있습니까? 결과 바이너리는 clojure.string의 모든 기능을 포함합니까, 아니면 방금 사용 했습니까?

+0

결과 바이너리가 없습니다. 각 네임 스페이스에 대해 생성 된 클래스 파일이 있습니다. 램에 네임 스페이스를로드하는 모듈성은 클래스 파일 수준 (ns가 필요할 때로드 됨)에 있다고 생각합니다. – noisesmith

답변

1

JVM 랜드에는 링커가 없습니다. JVM은로드 및 링크를 처리합니다. Java의 모든 것 | Clojure는 공유 객체이므로 데드 코드 제거는 불가능합니다. 당신은 당신을로드하는 코드가 무엇을 사용할 지 결코 알지 못한다.

clojure에서 모든 함수는 고유 한 .class 파일 (JVM에서 가장 작은 'binary'파일)을 가져옵니다. 이것들은 표준 배포 단위 인 JAR 파일로 압축됩니다 (이것은 .dll 또는 .so에 해당합니다). 따라서 사용하는 함수 만로드됩니다. 그러나 배포 크기가 걱정되면 운이 없거나 올바른 클래스 파일을 찾기 위해 수동으로 JAR 파일을 추출해야합니다.

+0

감사합니다. 완전한 대답입니다. 나는 함수가 클래스라는 것을 몰랐다. 그것은'IFn' 구현 일 가능성이 있습니다. – demi

+1

@ demi http://clojure.org/compilation 필자는 compliation이 어떻게 작동하는지에 대한 최고의 참고 자료를 찾을 수 있습니다. – stonemetal

관련 문제