CJIT: 향상된 사용성을 갖춘 Just‑In‑Time 시대의 C

CJIT, 혹은 C Just in Time은 작고 휴대 가능한 컴파일러와 인터프리터를 제공함으로써 C 개발 워크플로를 간소화하려는 매력적인 프로젝트로 등장합니다. Terry Davis의 HolyC 원칙에서 영감을 얻고 Fabrice Bellard의 TinyCC라는 견고한 기반 위에 구축된 CJIT은 C를 빠른 프로토타이핑과 즉각적인 배포를 위해 다양한 플랫폼에서 더 쉽게 접근할 수 있게 만들고자 합니다. Jaromil과 Dyne.org 팀이 진행하는 이 이니셔티브는 C 개발에서 흔히 겪는 마찰점을 해소하고, 전통적인 빌드 환경의 오버헤드 없이 빠른 실험과 실행을 위한 도구로 자리매김합니다.

이 글에서는 CJIT의 핵심 기능, 선행 프로젝트와의 차별점, 그리고 커뮤니티의 반응과 인사이트를 살펴보며, 스크립팅 및 빠른 애플리케이션 개발을 위한 C와의 상호작용 방식을 혁신할 잠재력을 강조합니다.

CJIT란?

CJIT은 단일 바이너리 C 컴파일러이자 인터프리터로, 최대한의 휴대성과 사용 편의성을 목표로 설계되었습니다. TinyCC 컴파일러와 필요한 헤더, 표준 라이브러리를 2 MB 미만의 작은 패키지에 담아 제공합니다. 이 설계 철학은 복잡한 설치, 경로 설정, 전용 IDE가 필요 없게 하여, 빠른 설정이 중요한 환경에 이상적인 후보가 됩니다.

HolyC, 즉 TempleOS 운영체제에서 사용되는 C‑유사 언어에서 영감을 받은 만큼, 단순함과 코드와의 직접적인 상호작용에 중점을 둔 것으로 보입니다. HolyC의 보다 난해한 측면이 직접적으로 반영되었다고 명시되지는 않지만, 고도로 통합된 즉시 코딩 경험이라는 정신이 주요 동력으로 작용한 듯합니다.

주요 기능 및 사용성 향상

CJIT은 C 개발에서 흔히 겪는 불편함을 해소하는 여러 사용자 경험 개선을 통해 차별화됩니다:

  • Instant Deployment: 단일 실행 파일 형태이므로 시스템 전체에 설치하거나 EULA에 서명하거나 IDE를 설정할 필요가 없습니다. "one file <2MB big" 접근 방식은 즉시 사용 가능함을 보장합니다.
  • Cross‑Platform Compatibility: MS/Windows, Apple/OSX, GNU/Linux를 지원해 다양한 운영체제에서 작업하는 개발자에게 다재다능한 도구가 됩니다.
  • Multi‑File Execution: 일반 컴파일러 호출과 달리 CJIT은 와일드카드를 받아 여러 C 소스 파일, 사전 컴파일된 오브젝트, 혹은 공유 라이브러리를 하나의 실행으로 결합할 수 있습니다. 각 파일이 내보낸 심볼은 동일 실행 컨텍스트 내에서 모두에게 보입니다.
  • Automatic Library Discovery: CJIT은 각 대상 플랫폼에 맞는 일반 시스템 라이브러리를 자동으로 찾아주어, 개발자가 라이브러리 경로나 설정을 일일이 지정할 필요가 없습니다.
  • Dynamic Library Calling: 동적 라이브러리에서 발견되는 모든 공유 함수를 사용할 수 있어 기존 시스템 기능과의 통합이 용이합니다.
  • Rapid Prototyping: 이러한 기능들의 결합으로 개발자는 전례 없는 속도로 C 애플리케이션을 작성·실행할 수 있어, 빠른 프로토타이핑 워크플로를 촉진합니다.

CJIT vs. TinyCC: 깊이 있는 비교

CJIT이 TinyCC 위에 구축되었지만, tcc -run을 단순히 사용하는 것과의 차이점에 대한 질문이 자주 제기됩니다. Hacker News의 한 댓글이 차이점을 명확히 정리했습니다:

The main difference is in usability. CJIT improves three main UX aspects for now: It works as a single executable file which embeds the TinyCC compiler, all its headers and its standard library. This way there is no need to install anything system wide, check paths and setup build folders. It supports adding multiple files into one execution: can accept wildcards to ingest anything that is a C source, a pre‑compiled object or a shared library. The symbols exported by each file will be visible to all during the same execution. It finds automatically common system libraries for each target platform, avoiding the need to repeat these settings and look for the right paths.

이 설명은 CJIT이 C 컴파일 자체를 근본적으로 재구상한 것이 아니라, TinyCC 주변의 개발자 경험을 크게 향상시킨 도구임을 보여줍니다. 편의성과 보일러플레이트 감소에 초점을 맞추었습니다.

커뮤니티 피드백 및 고려 사항

Hacker News 토론에서는 커뮤니티의 여러 흥미로운 의견과 질문이 드러났습니다:

휴대성 및 의존성

CJIT이 휴대성을 목표로 하지만, 일부 사용자는 특정 의존성 문제를 겪었습니다. 예를 들어, cjit‑x86_64‑ubuntu‑24.04 릴리스가 Arch Linux에서는 libgcc_s.so.1이 없어 dlopen 오류가 발생한다는 보고가 있었습니다. 이는 Linux 생태계에서 진정한 범용 바이너리를 만들기 위한 지속적인 도전 과제를 보여줍니다.

자체 호스팅 가능성

CJIT이 스스로를 컴파일할 수 있는가에 대한 질문도 제기되었습니다. 이는 GCC나 LLVM 같은 컴파일러의 일반적인 벤치마크이지만, 프로젝트 FAQ에서는 명시적으로 다루지 않아 커뮤니티가 앞으로 탐구할 흥미로운 영역으로 남아 있습니다.

스크립팅 언어로서의 잠재력

CJIT을 Fil‑C(스크립팅용 C 인터프리터)와 결합해 C를 "진정한 스크립팅 언어"로 활용한다는 아이디어가 제시되었습니다. 이는 C의 성능을 보다 동적인 스크립트‑같은 컨텍스트에서 활용하려는 폭넓은 관심을 반영합니다.

대안 및 영감

맞춤형 JIT 도구와 C 컴파일러를 제공하는 Mir 프로젝트가 유사한 기능을 찾는 사람들에게 대안으로 언급되었습니다. HolyC에서 영감을 받았다는 점도 사용자들의 호기심을 자극했으며, 구체적으로 어떤 방식으로 CJIT에 영향을 미쳤는지에 대한 질문이 이어졌습니다.

사소한 관찰

일부 사용자는 문서의 "hello, world" 예제에서 printf 대신 fprintf(stderr, …)를 사용한 점을 지적했습니다. 또 다른 의견으로는 웹사이트 디자인이 "압축된" 느낌이거나 AI‑생성 미학과 유사하다는 평가가 있었습니다.

SDL을 활용한 그래픽 애플리케이션

CJIT은 SDL(Simple DirectMedia Layer)과의 통합을 통해 그래픽 C 애플리케이션 영역도 포괄합니다. 프로젝트 문서에서는 1998년부터 이어온 SDL의 오랜 역사를 강조하며, 개발자들을 이 흥미로운 분야로 초대합니다. 이러한 "배터리 포함" 접근 방식은 명령줄 도구를 넘어 빠른 프로토타이핑을 위한 그래픽 개발에도 CJIT의 매력을 크게 높입니다.

결론

CJIT은 휴대성, 간편한 배포, 지능형 의존성 관리 등을 통해 사용자 경험을 크게 향상시킨 C 개발 도구의 사려 깊은 진화라 할 수 있습니다. TinyCC 위에 구축되고 HolyC에서 영감을 받은 CJIT은 빠르고 민첩한 Just‑In‑Time 방식으로 C의 성능과 제어력을 활용하려는 개발자에게 매력적인 솔루션을 제공합니다. 범용 바이너리 호환성 같은 과제가 남아 있긴 하지만, 빠른 프로토타이핑과 스크립팅을 위한 C 개발을 더 빠르고 접근하기 쉽게 만든다는 핵심 가치 제안은 여전히 강력합니다. 다양한 애플리케이션에 대한 가능성을 탐색해 보길 권합니다.

Sources