Claude AI가 만든 C 컴파일러 vs GCC: 성능 벤치마크 비교

Claude가 만든 C 컴파일러, 실제로 어떨까?

Anthropic이 최근 Claude Opus 4.6으로 완전히 작성한 C 컴파일러(CCC)를 공개하며 "Linux 커널을 컴파일할 수 있다"고 주장했습니다. 100% AI가 작성한 코드로 Rust로 구현되었으며, x86-64, i686, AArch64, RISC-V 64를 지원합니다. 과연 실제 성능은 어떨까요?

벤치마크 환경

공정한 비교를 위해 동일한 하드웨어(6 vCPU, 16GB RAM Debian VM)에서 GCC 14.2.0과 CCC를 테스트했습니다. SQLite 3.46과 Linux 커널 6.9을 컴파일 대상으로 선택했습니다.

주요 결과 요약

Linux 커널 컴파일

성공 여부: GCC는 성공, CCC는 링커 단계에서 실패 (40,784개 오류)

컴파일 시간: GCC 73.2분 vs CCC 42.5분 (C 파일만)

메모리 사용: GCC 831MB vs CCC 1,952MB (2.3배)

CCC는 커널의 모든 C 소스 파일(2,844개)을 컴파일 오류 없이 처리했지만, __jump_table과 __ksymtab 재배치 항목이 잘못되어 링킹에 실패했습니다.

SQLite 벤치마크

컴파일 시간: GCC -O0 64.6초 vs CCC 87초 (1.3배 느림)

바이너리 크기: GCC 1.55MB vs CCC 4.27MB (2.7배)

실행 속도: GCC -O0 10.3초 vs CCC 2시간 6분 (737배 느림)

메모리 사용: 컴파일러가 272MB vs 1,616MB (5.9배)

왜 이렇게 느릴까?

1. 레지스터 스필링(Register Spilling)

CCC의 가장 큰 성능 문제는 과도한 레지스터 스필링입니다. CPU 레지스터를 효율적으로 사용하지 못하고 모든 변수를 스택에 저장해 메모리 접근이 급증합니다. SQLite의 핵심 함수 sqlite3VdbeExec의 경우:

GCC: 383줄의 어셈블리 코드, 레지스터 직접 사용

CCC: 1,189줄 (3.1배 더 많음), 모든 연산이 스택 → rax → 스택 패턴

2. 최적화 플래그 무시

CCC는 -O0, -O2, -O3 모두 동일한 바이너리를 생성합니다. 최적화 옵션이 실제로 아무 역할도 하지 않습니다.

3. 코드 크기 팽창

CCC가 생성한 바이너리는 GCC보다 2.78배 크며, 이로 인해 명령어 캐시 미스가 증가하고 성능이 더욱 저하됩니다.

서브쿼리가 158,000배 느린 이유

NOT IN (subquery) 패턴은 SQLite가 중첩 루프를 실행하게 만듭니다. 외부 테이블 100,000행 × 내부 테이블 10,000행 = 약 10억 번의 반복입니다. CCC의 4배 반복당 오버헤드와 2.78배 큰 바이너리로 인한 캐시 압력이 복합적으로 작용해 158,000배 느려졌습니다.

CCC의 성과와 한계

성공한 부분

정확성: 커널의 모든 C 파일을 컴파일하고 SQLite의 모든 쿼리에서 올바른 결과 출력

안정성: 모든 테스트에서 크래시나 segfault 없음

호환성: GCC 명령줄 플래그를 수용하는 드롭인 대체

한계

실행 성능: 복잡한 연산에서 737~158,000배 느림

링커 호환성: 커널의 특수 섹션에 대한 잘못된 재배치 생성

최적화: 최적화 플래그가 실제로 작동하지 않음

디버깅: DWARF 데이터 누락, 손상된 프레임 포인터

결론

Claude의 C 컴파일러는 AI가 복잡한 소프트웨어를 구축할 수 있다는 것을 입증한 놀라운 성과입니다. 하지만 실제 사용에는 아직 멀었습니다. 효율적으로 실행되는 코드를 원한다면 GCC나 Clang 같은 프로덕션 컴파일러가 여전히 유일한 선택지입니다.

이 벤치마크는 AI가 "작동하는" 소프트웨어를 만들 수 있지만, "효율적인" 소프트웨어를 만드는 것은 여전히 수십 년의 인간 전문 지식이 필요하다는 것을 보여줍니다.