Clojure를 좋아하는 개발자들이 입을 모아 말하는 아쉬움이 하나 있어요. 바로 JVM 시작 시간이에요. 언어 자체는 정말 좋은데, 터미널에서 명령 하나 실행하려고 하면 JVM이 뜨는 데만 1초 넘게 걸리니 CLI 도구나 짧은 스크립트용으로는 쓰기 어렵다는 거죠. 오늘 소개할 Jolt는 이 문제에 대한 꽤 흥미로운 접근이에요. Clojure 컴파일러를 Chez Scheme이라는 처리계 위에 구현해서, JVM 없이 Clojure를 돌리겠다는 프로젝트거든요.
등장인물 소개: Clojure와 Chez Scheme
먼저 Clojure가 뭐냐면, JVM 위에서 도는 Lisp 계열 함수형 언어예요. 괄호로 가득한 문법에 처음엔 당황하지만, 불변 자료구조와 강력한 매크로 덕분에 열성 팬이 많은 언어죠. JVM 위에서 돈다는 건 큰 장점이기도 해요. 자바로 만들어진 수십만 개의 라이브러리를 그대로 가져다 쓸 수 있으니까요. 문제는 그 대가로 JVM의 무거운 시작 시간을 함께 짊어져야 한다는 거예요. 오래 도는 서버라면 시작할 때 1~2초쯤은 아무 문제가 아니지만, 명령 한 번 치고 끝나는 CLI 도구나 서버리스 함수처럼 켰다 껐다가 잦은 환경에서는 치명적이죠.
그럼 Chez Scheme은 뭘까요? Scheme이라는 또 다른 Lisp 계열 언어의 구현체 중 하나인데, 세상에서 가장 빠른 Scheme 구현으로 자주 꼽히는 물건이에요. 원래는 수십 년간 상용으로 팔리던 컴파일러였다가 2016년에 오픈소스로 풀렸고요. 함수를 정의하는 즉시 기계어로 컴파일하는 인크리멘털 네이티브 컴파일러라서, 인터프리터의 유연함과 컴파일 언어의 속도를 같이 가져가요. 실력 검증도 확실해요. Racket이라는 유명한 언어가 자체 런타임을 버리고 Chez를 백엔드로 갈아탔을 정도거든요.
왜 하필 Scheme 위에 올렸을까
Jolt의 아이디어가 재밌는 지점이 여기예요. Clojure를 JVM 밖으로 꺼내려는 시도는 많았지만, 대부분 JavaScript(ClojureScript)나 C++(jank)처럼 Lisp이 아닌 언어로 번역하는 방식이었어요. 그런데 Scheme은 같은 Lisp 가족이라 의미론적 거리가 훨씬 가까워요. 일급 함수, 클로저, 심볼, 꼬리 호출 최적화 같은 것들이 Chez에 이미 네이티브로 들어 있으니, 번역할 때 억지로 끼워 맞출 부분이 적다는 거죠. 비유하자면 소설을 한국어에서 영어로 옮기는 것과 일본어로 옮기는 것의 차이랄까요. 가까운 언어끼리는 뉘앙스 손실이 적잖아요. 물론 Clojure 고유의 퍼시스턴트 자료구조(값을 수정할 때마다 새 버전을 만들되 내부 구조를 공유해서 효율을 챙기는 자료구조)나 프로토콜, 멀티메서드 같은 건 따로 구현해야 하지만, 언어의 뼈대가 공짜로 주어진다는 건 큰 이점이에요.
이미 있는 시도들과 뭐가 다를까
Clojure의 시작 시간 문제를 푸는 시도는 이미 여럿 있어요. 가장 유명한 건 Babashka인데, GraalVM native-image로 미리 구워 둔 Clojure 인터프리터라서 수 밀리초 만에 떠요. 셸 스크립트 대용으로는 사실상 표준이 됐죠. 다만 인터프리터 방식이라 계산이 무거운 작업에서는 성능 한계가 있어요. GraalVM native-image로 애플리케이션을 직접 굽는 방법도 있지만, 빌드가 오래 걸리고 리플렉션 설정 때문에 고생하는 경우가 많고요. 네이티브 성능과 C++ 생태계 연동을 노리는 jank, Flutter를 겨냥한 ClojureDart도 있어요. 이 흐름의 공통 주제는 하나예요. 'Clojure라는 언어'와 'JVM이라는 호스트'를 분리하려는 시도라는 것. Jolt는 그중에서 성숙한 네이티브 Lisp 컴파일러를 통째로 빌려 오자는 노선인 셈이에요.
냉정하게 볼 부분과 시사점
물론 트레이드오프는 분명해요. Clojure의 힘 절반은 자바 생태계 상호운용에서 나오는데, JVM을 떠나는 순간 그걸 포기해야 하거든요. 데이터베이스 드라이버부터 HTTP 서버까지 전부 다시 마련해야 하는 문제죠. 아직 초기 프로젝트라 성숙도도 지켜봐야 하고요. 그래서 당장 프로덕션에 쓸 물건은 아니에요. 다만 이런 관점에서 볼 가치는 충분해요. 첫째, 빠르게 뜨는 Clojure CLI 도구가 필요하다면 지금은 Babashka를 쓰되, 이런 대안이 자라고 있다는 걸 알아두면 좋아요. 둘째, 언어 구현을 공부하고 싶은 분에게는 훌륭한 교재예요. Lisp을 Lisp으로 컴파일하는 코드는 구조가 비교적 깔끔해서 컴파일러 공부용으로 읽어볼 만하거든요. 셋째, 언어와 런타임의 분리라는 주제는 Kotlin 멀티플랫폼이나 WASM이 부상하는 요즘 점점 더 중요해지는 감각이라, 한 번쯤 곱씹어 볼 만해요.
한 줄로 정리하면, Jolt는 'JVM 없는 Clojure'라는 오랜 꿈을 가장 Lisp다운 방법으로 시도하는 프로젝트예요. 여러분이라면 어떤 선택을 하시겠어요? 거대한 생태계를 가진 무거운 런타임과, 생태계는 작지만 가볍고 빠른 런타임 사이에서요.
🔗 출처: Hacker News
TTJ 코딩클래스 정규반
월급 외 수입,
코딩으로 만들 수 있습니다
17가지 수익 모델을 직접 실습하고, 1,300만원 상당의 자동화 도구와 소스코드를 받아가세요.
"비전공 직장인인데 반년 만에 수익 파이프라인을 여러 개 만들었습니다"
실제 수강생 후기- 비전공자도 6개월이면 첫 수익
- 20년 경력 개발자 직강
- 자동화 프로그램 + 소스코드 제공