주말 과제: Claude Code를 사용해 SQLite를 C에서 Zig로 모듈 단위로 포팅 중 — 102개 번역 단위 중 90개 완료, 9억 1,900만 토큰 사용, 매 단계마다 SQLite 자체 테스트 스위트로 검증
Weekend exercise: I've been using Claude Code to port SQLite from C to Zig, module by module — 90 of 102 translation units now run as Zig, ~919M tokens in, validated against SQLite's own test suite every step
핵심 요약
Claude Code를 활용해 SQLite를 Zig로 포팅하며 에이전트 기반 코딩 워크플로우의 가능성을 실험한 프로젝트입니다.
- 프로젝트 목표 — 에이전트 기반 코딩 워크플로우를 통한 시스템 코드 마이그레이션 검증
- 기술 스택 — C 언어의 SQLite 3.54.0을 Zig 언어로 점진적 포팅
- 검증 방식 — 매 모듈 포팅 후 SQLite 공식 테스트 스위트를 통과하는지 확인
- 토큰 사용량 — 총 9억 1,900만 토큰을 소모하며 16만 9천 줄의 Zig 코드 생성
Claude Code(Opus)를 써서 SQLite 3.54.0을 C에서 Zig로 점진적으로 포팅해 봤다.
난 30년 넘게 앱/웹/엔터프라이즈 시스템 개발자로 일해왔지만, 시스템 프로그래머는 아니다. C랑 Zig는 그냥 기본기 정도만 아는 수준임.
왜 하필 Zig냐고?
요즘 뜨고는 있는데 아직 v1.0도 안 나와서 바뀔 게 많은 언어를 써보고 싶었거든. 이 실험이 어디까지 갈지 궁금하기도 했고, 내가 잘 모르는 언어(예전에 몇 번 깔짝거린 거 빼고)로 해보고 싶었음.
사실 그게 이 실험의 핵심이야.
단순히 "이거 Zig로 다시 짜줘"라고 프롬프트 날리는 수준이 아니라, 빌드, 테스트, ABI 호환성, 반복 검증 같은 제약 조건이 빡빡하게 걸린 상황에서 에이전트 기반 코딩 워크플로우가 어디까지 통할지 보고 싶었거든.
이 프로젝트는 SQLite v3.54.0을 C에서 Zig로 한 단계씩 포팅하는 작업이다.
참고로 에이전트한테 가이드만 줬지 내가 직접 코드를 수정하진 않았음. 필터링 없이 날것 그대로 공유하는 거니까 알아둬.
그러니까 이걸 보고 'AI가 싼 똥'이라고 까는 건 의미가 없어. (레포 클론해서 직접 테스트해 보고 뭐가 터지는지 알려주면 모를까. 그럼 Claude Code로 고쳐보고 어디가 구멍인지 확인해 볼 테니까. 테스트가 허술한 거면 그것도 알려주고. 나 이거 하느라 몇 시간 갈아 넣었으니까, 무작정 까기 전에 전체 목표랑 의도가 뭔지 한번 봐주고 개선 좀 도와줘. 그냥 부탁하는 거임.)
그게 커뮤니티에도 훨씬 도움 될 거고, 이 서브레딧의 존재 이유도 살리는 길일 거다. 만약 이게 진짜 쓸모없는 짓이라면 그냥 지워버릴게.
이건 한 번에 다 갈아엎는 게 아님. 방식은 이래:
- .c 파일 하나를 .zig 파일 하나로 포팅
- Zig에서 똑같은 C ABI 심볼을 내보냄
- 포팅된 Zig랑 아직 포팅 안 된 C를 묶어서 하나의 바이너리로 빌드
- 매 단계마다 데이터베이스가 정상 작동하는지 확인
- 검증은 원래 SQLite 테스트 스위트를 통과하는 걸 기준으로 함
그래서 이 프로젝트는 마지막에만 작동하는 "거대한 리라이트 브랜치"가 아님. 매일매일 돌아가야 함.
지금까지 쓴 시간: 대략 25~32시간 정도.
지금까지의 규모
Claude Code 세션 로그에서 뽑은 수치임 (대충 짐작한 거 아님):
- 지금까지 API 사용량 약 9억 1,900만 토큰 (입력, 캐시, 출력 포함)
- 최근 세션 하나에서만 약 7억 8,000만 토큰 씀
- 전체 C 번역 단위 102개 중 90개 완료
- Zig 코드 약 169,000줄 생성
- 원본 C 코드 약 287,000줄 포팅 중
현재 리눅스 엔진은 아래 구간들이 전부 Zig로 돌아감:
Unix VFS → pager/WAL → btree → VDBE 바이트코드 인터프리터 → 토크나이저 → 쿼리 플래너 → 코드젠 → 퍼블릭 API
주요 확장 기능들도 포함됨:
- R*Tree
- session / changeset

