핵심 요약
- 커먼 리스프 환경에서 자바 바이트코드를 직접 변환 및 네이티브 컴파일해 실행하는 JIT 런타임 'OpenLDK'가 공개되었습니다.
- 자바와 코틀린, 클로저 등 7개 언어를 한 코드 안에서 섞어 쓸 수 있고, 스프링 부트 앱을 리스프 이미지로 저장해 84밀리초 만에 기동할 수 있습니다.
- 과거 gcj 개발자가 시작한 프로젝트로, Emacs를 연결해 실행 중인 자바/스프링 객체를 실시간 조작하거나 멍키 패치하는 것까지 지원합니다.
요약 과거 GNU의 자바 컴파일러 및 런타임 프로젝트인 gcj 작업에 참여했던 한 개발자가 커먼 리스프(Common Lisp) 환경에서 자바 바이트코드를 직접 구동할 수 있는 신규 JIT 컴파일러 및 런타임 'OpenLDK'를 공개했습니다.
개발자는 2024년 말 SBCL(Steel Bank Common Lisp) 환경에서 자바 라이브러리를 연동해 쓰려다 적절한 방식을 찾지 못하자, 리스프 프로세스 내부에서 바이트코드를 처리하는 독자 프로젝트를 직접 작성하기 시작했습니다. OpenLDK는 자바 바이트코드를 읽어 리스프 코드로 변환한 뒤, 이를 SBCL을 통해 네이티브 머신 코드로 컴파일하는 구조입니다. 이로써 자바 객체와 리스프 애플리케이션이 동일한 프로세스 및 힙 메모리를 공유하게 됩니다.
이 시스템에서는 자바 클래스가 CLOS(Common Lisp Object System) 클래스로 변환되며, 메서드를 처음 호출할 때 컴파일이 일어나는 지연 컴파일 방식을 채택해 불필요한 전체 라이브러리 컴파일 부담을 덜었습니다. 또한 JDK 25 및 OpenJDK 런타임 라이브러리를 기반으로 동작하며, 컴파일된 메서드는 영구 코드 캐시에 저장되어 재실행 시 빠르게 재사용됩니다.
가장 흥미로운 점은 JVM 기반 언어들과의 유기적인 결합입니다. 리스프 코드 내부에 코틀린, 스칼라, 그루비, 클로저 등의 소스 코드를 문자열 직렬화 없이 직접 중첩해 작성할 수 있으며, 클로저 함수를 리스프의 funcall로 호출하거나 리스프 함수를 콜백으로 넘기는 것도 가능합니다. 실제로 클로저, 그루비, 카와, JScheme, 스칼라, 코틀린, ABCL 등 7개 JVM 언어가 하나의 표현식 안에서 순차적으로 연산 결과를 주고받는 폴리글랏 예제도 시연되었습니다. 심지어 스프링 부트(Spring Boot) 애플리케이션을 초기화한 뒤 리스프 이미지로 저장해 두면 약 84밀리초 만에 즉시 기동할 수 있고, Emacs와 SLY를 연결해 구동 중인 스프링 부트 객체를 검사하거나 멍키 패치할 수 있는 독특한 개발 환경을 제공합니다.
Sponsored · 광고