굿바이, Clojure
- 약 7년간 Clojure를 사용해 왔으나 CLI 앱의 "느린 시작 속도" 문제 때문에 더 이상 만족스럽지 않았음
- babashka 같은 프로젝트가 있었지만 GraalVM의 native-image 등으로도 느린 시작 속도를 해결하기 어려웠음
- "단독 실행 파일의 빠른 시작 속도"가 필수 요구사항이 되었고, Clojure가 이를 만족하지 못한다고 판단
새로운 Lisp 찾기
- 새로운 Lisp 언어를 찾기 위해 여러 언어를 조사. 기존 프로젝트에서 겪었던 문제를 해결할 수 있는 언어를 모색
- "명시적인 요구 사항"은 없었지만, 결과적으로 다음과 같은 기준을 정리함
- "독립 실행 가능하고 빠르게 시작되는 실행 파일"을 합리적인 툴체인으로 생성할 수 있어야 함 (Clojure에서의 주요 불만 해결)
- Emacs를 사용하지 못하므로, Vim에서 사용 가능해야함
- Windows와 Mac 지원이 필수이며, Linux/POSIX 운영 체제만 지원해서는 안 됨
- Clojure와 Java처럼 다른 대규모 커뮤니티 언어와의 플러그인 가능성이 있으면 좋음
- 런타임 속도가 충분히 빠를 것 (Clojure 수준 이상 선호)
- 멀티스레딩 지원이 강력해야 하며, 가능하다면 GIL(Global Interpreter Lock)같은게 없어야 함
- 강력한 커뮤니티가 필수
- 풍부한 생태계를 가져야 하며, 최소한 다음 라이브러리들이 구현되어야 함:
- JSON 파싱 및 직렬화
- Sqlite3 지원
- HTTP 리퀘스트 라이브러리
- Clojure와 같은 함수형 데이터 구조 지원 (다만, 이 부분은 덜 중요)
- 조사한 언어들
- Scheme : r6rs와 r7rs로 표준 문제로 커뮤니티가 분열된 상태로 마음이 끌리지 않았고, 생태계가 작아 필요를 충족하지 못함
- Racket : 학창 시절 사용했지만 런타임이 느리고 무겁게 느껴져 선호하지 않음
- Common Lisp : lisp-lang.org에서 발견. 커뮤니티와 자료가 인상적이었으며, 시도해보기로 결정
Magic Happens Here
- Common Lisp 학습 여정에 대한 전체 이야기는 생략, 그러나 학습 과정은 험난했음
- 시작은 잘못되었음. 크리스마스에 CLtLv2 책을 받아 이를 읽으며 시작
- 이후 HyperSpec을 발견하고 읽기 시작하며 더 나은 방향으로 학습 진행
- Common Lisp의 독특한 특징이 있었음
- 표준화된 언어로 Java보다는 C와 유사
- 여러 컴파일러, 인터프리터, 런타임이 표준을 구현
- 다양한 구현체를 설치하고 관리할 수 있는 Roswell 같은 도구 존재
- 커뮤니티에서 가장 인기 있는 구현체는 SBCL로 평가됨
- 탐색을 시작할때 만약 Janet을 알았다면?
- Janet은 다음과 같은 특징이 있어서 Common Lisp 학습 전 만족했을 가능성 있음
- 간결한 문법, 빠르고 작은 실행 파일, C FFI 지원
-
재미있는 입문서 존재
- 개인적으로 중요하게 여긴 모든 요구사항을 충족
- 그러나 Common Lisp을 선택한 이유
- 나중에 알게된 CLOS와 Condition System 같은 고급 기능을 놓쳤을 것
- Common Lisp은 더 강력한 언어임
Requirements Met
Common Lisp가 요구 사항을 충족하는 언어임을 확인한 후, 이를 다음 Lisp 언어로 선택하고 현재까지 사용 중. 주요 발견 사항은 다음과 같음:
- 독립 실행 파일:
- Common Lisp에서 독립 실행 파일을 만드는 방법이 다양함
- 실행 파일을 압축 여부에 따라 시작 시간이 짧게는 몇 초의 일부에서 거의 즉시 실행 가능
- 이 기능은 부가적인 옵션이 아니라 Lisp 프로그램 배포의 주요 방법으로 설계됨
- Vim 워크플로:
- 여러 훌륭한 옵션이 있지만, 개인적으로 Vim 워크플로를 직접 구성하여 사용
- 또한 VS Code가 Common Lisp IDE로서 사용하기에 충분히 괜찮음을 확인
- Windows/Mac/Linux 지원:
- 대규모 명령형 생태계와의 통합:
- 대부분의 구현체가 C 언어와의 통합을 잘 지원하며 CFFI를 통해 활용 가능
- 런타임 속도:
- 멀티스레딩:
- Common Lisp 표준은 멀티스레딩에 대한 명시적 지원을 포함하지 않지만 주요 구현체들이 이를 지원
- Bordeaux-Threads라는 라이브러리로 다양한 구현체 간의 차이를 줄임
- lparallel, cl-async, blackbird 같은 라이브러리로 멀티스레딩 및 비동기 프로그래밍 가능
- 강력한 커뮤니티:
- 커뮤니티 활동을 발견하며 참여
- 2024년 커뮤니티 설문조사 결과와 European Lisp Symposium에서 Common Lisp 커뮤니티의 활발한 활동 확인
- 블로그 네트워크와 subreddit에서도 커뮤니티 지원이 강력함
- 생태계:
- 대부분 Quicklisp를 사용하지만, 개인적으로 OCICL로 패키지를 관리
- Common Lisp Cookbook, CLiki, Awesome CL 등에서 라이브러리와 기술 정보 탐색 가능
- 특정 라이브러리 지원:
- JSON: jzon
- Sqlite3: cl-sqlite
- HTTP 요청: dexador
- 함수형 데이터 구조: FSet, cl-hamt
새로운 분들을 위한 참고사항
- Common Lisp Discord에 초보자들이 늘어남에 따라, 본인이 Common Lisp를 선택하고 적응한 과정 공유를 위해 작성했음
- 이 글이 Common Lisp에 관심을 가지는 분들에게 도움이 되길 바라는 마음임