내가 Common Lisp을 선택한 이유

7 hours ago 2

굿바이, 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 지원:
    • SBCL은 주요 운영 체제를 잘 지원
  • 대규모 명령형 생태계와의 통합:
    • 대부분의 구현체가 C 언어와의 통합을 잘 지원하며 CFFI를 통해 활용 가능
  • 런타임 속도:
    • SBCL은 런타임 속도가 매우 빠름
  • 멀티스레딩:
    • 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에 관심을 가지는 분들에게 도움이 되길 바라는 마음임

Read Entire Article