AI 요약
'let-go'는 Go 언어를 기반으로 구현된 Clojure 스타일의 언어로, 고성능 바이트코드 컴파일러와 VM(가상 머신)을 통해 클로저 생태계의 장점을 Go 환경에 이식한 프로젝트입니다. 이 언어는 JDK 기반의 기존 Clojure보다 30배, Babashka보다 7배나 작은 10MB의 바이너리 크기를 자랑하며, 단 7ms 만에 부팅이 완료되는 초고속 기동성을 핵심 경쟁력으로 내세웁니다. 사용자는 lg -b 명령어를 통해 소스코드를 단일 실행 파일로 컴파일하거나, lg -w를 통해 xterm.js 기반의 터미널 에뮬레이션이 포함된 WASM 웹 페이지로 변환할 수 있습니다. 특히 Go와의 강력한 상호 운용성(Interop)을 지원하여 Go 애플리케이션 내부에 임베딩하거나 Go의 구조체를 레코드로 매핑하는 것이 가능합니다. 이는 Clojure의 함수형 프로그래밍 스타일을 유지하면서도 Go의 가벼운 배포 환경을 활용하려는 개발자들에게 혁신적인 대안을 제공합니다.
핵심 인사이트
- 초경량/초고속 성능: 약 10MB 크기의 단일 바이너리로 구성되며, 콜드 스타트 시간은 7ms(WASM 기준 6ms)에 불과하여 서버리스 환경이나 CLI 도구에 최적화되어 있습니다.
- 높은 호환성:
jank-lang/clojure-test-suite를 기준으로 4,921개의 검증 항목 중 4,696개를 통과하여 95.4%라는 높은 Clojure 호환성을 입증했습니다. - 강력한 배포 옵션: 별도의 런타임 없이 실행 가능한 독립 실행 파일 생성 기능과 브라우저에서 즉시 실행되는 WASM 웹 앱 변환 기능을 기본 제공합니다.
- 풀스택 패키지: core.async, HTTP 서버/클라이언트, JSON, Transit, Babashka pods, nREPL 서버 등 현대적인 개발에 필요한 'Batteries included' 철학을 따릅니다.
주요 디테일
- 시스템 자원 효율성: 유휴 상태의 메모리 점유율이 14MB로 매우 낮아 리소스가 제한된 환경에서도 안정적으로 동작합니다.
- 기술적 호환 범위: clojure.core의 매크로, 구조 분해(Destructuring), 프로토콜, 레코드, 멀티메서드, 지연 시퀀스(Lazy seqs), Persistent 데이터 구조 및 BigInt를 지원합니다.
- Go 상호 운용성: let-go 내부에서 Go 함수를 호출하거나 반대로 Go 앱에서 let-go 기능을 임베딩하여 활용할 수 있는 양방향 Interop을 지원합니다.
- WASM 특화 기능: 브라우저 상에서 동작하는 VM에 Emacs나 Calva를 WebSocket을 통해 연결할 수 있는 WASM 기반 nREPL 서버 기능을 갖추고 있습니다.
- 제한 사항: 표준 Clojure의 모든 기능을 대체하는 것이 목적이 아니기에, 오버플로우 감지나 특정 BigDecimal 동작 등 일부 에지 케이스(Edge case)에서는 차이가 존재할 수 있습니다.
향후 전망
- Go 코드 변환: 장기적으로 let-go 바이트코드를 Go 소스코드로 직접 번역(Translation)하는 기능을 목표로 하고 있어 실행 성능이 더욱 향상될 것으로 기대됩니다.
- 엔터프라이즈 Go 환경 침투: Go가 주력인 개발 환경에서 Clojure의 생산성을 누릴 수 있게 함으로써 클라우드 네이티브 개발 언어의 선택 폭을 넓힐 것으로 보입니다.
출처:hackernews
