Fable을 사용하여 65kLoC를 Rust로 재작성했습니다. 비용은 $400이 들었습니다.
요약
본 글은 Fable이라는 도구를 활용하여 65kLoC의 코드를 Rust로 재작성한 경험을 공유합니다. 핵심 아이디어는 복잡한 리팩토링 과정을 중간 표현(intermediate representation)으로 추상화하는 것입니다. 이 방법을 통해 LLM이 코드 구조를 그래프, 온톨로지 등 다양한 형태로 추출하고 연산하여 다른 언어로 다시 코딩할 수 있음을 보여줍니다.
핵심 포인트
- Fable을 이용해 65kLoC 규모의 대규모 코드 재작성이 가능했습니다.
- 복잡한 리팩토링은 중간 표현(IR)으로 추상화하여 접근하는 것이 핵심입니다.
- LLM에게 코드를 그래프, 온톨로지 등 구조적 형태로 추출하도록 요청할 수 있습니다.
- 이 과정을 통해 한 언어에서 다른 언어로의 자율적인 코드 재작성이 가능합니다.
Fable을 사용하여 65kLoC를 Rust로 재작성했습니다. 비용은 $400이 들었습니다.

목차
데이터 표현 추출 → 데이터 표현에 대한 조작 → 데이터 표현을 코드로 다시 삽입의 세 단계
비밀 병기(The secret sauce)
저는 오랫동안 Rust를 배울 것이라고 농담해왔지만, C++ 돈으로는 괜찮은 퍼슈트(fursuit)조차 살 수 없었습니다. 게다가 저는 대머리라 머리를 파란색으로 염색할 수도 없습니다.
하지만 그때 두 가지 일이 동시에 일어났습니다.
첫째, Matt Pocock의 /teach 스킬 1을 사용하여 Rust를 배우려고 했고, 무릎을 탁 쳤습니다: “C++ 프로그래머에게 관용적인(idiomatic) Rust를 가르치되, 구문이나 헬로월드 같은 것은 건너뛰고 주요 차이점에만 집중하세요.”
이 스킬은 개인 트레이너와 같습니다. 즐거운 도전 과제를 극복하는 과정이 저를 몰입하게 유지해주고, 동시에 자료가 압도적이지 않게 만듭니다. 시도해 보시는 것을 추천합니다.
거의 같은 시기에 “Rewriting Bun in Rust” 2라는 글을 접했고, 그 방식에 호기심을 느꼈습니다:
각 동적 워크플로우는 다음과 같은 루프였습니다 – Zig 패턴 및 타입을 Rust 패턴 및 타입으로 매핑하는 포팅 가이드를 생성하는 워크플로우:
- 모든
.zig파일을.rs파일로 기계적으로 포팅하고, PORTING.md와 LIFETIMES.tsv를 일치시킴 - 각 크레이트(crate)의 컴파일러 오류를 수정함
bun test나bun build같은 하위 명령어가 작동하도록 함 – Bun 전체 테스트 스위트의 모든 테스트가 통과하도록 만듦- 여러 번의 대규모 리팩토링 및 정리 패스
이 프로젝트 비용은 535,496 라인에 $165,000이었습니다.
저는 중간 표현(intermediate representation)을 사용하면 훨씬 저렴하게 재작성이 가능하다는 아이디어를 얻었습니다.
흐름도만 보여주고 표는 감추세요. 그러면 저는 계속해서 미스터리해질 것입니다. 표만 보여주세요. 그러면 저는 보통 흐름도가 필요하지 않을 겁니다. 그것들은 명백할 테니까요. --- Fred Brooks
이것은 모든 LLM에 적용되지만, Fable 5는 믿을 수 없을 정도로 정밀하게 데이터 흐름을 추적합니다. 만약 문제를 데이터 문제로 재구성할 수 있다면, 복잡한 리팩토링을 자율적으로 수행하고, 한 언어에서 다른 언어로 재작성하며, 서비스를 추출하거나 병합하는 등 – 즉, 근본적인 변화를 줄 수 있습니다.
세 단계
1. 데이터 표현 추출
LLM에게 코드를 다음 조합 중 어떤 형태로든 표현하도록 요청하세요:
- 그래프 (graphs)
- 온톨로지 (ontologies)
- 계층적 상태 기계 (hierarchical state machines)
- UML 프로세스 차트 (UML process charts)
- 제약 조건 (constraints)
- 수학 공식 (math formulae)
2. 표현에 연산 수행
이 시점에서, 상태 수를 줄여 상태 기계를 단순화하도록 요청하거나, 숨겨진 통신 채널(예: 공유 테이블을 사용하거나 RAM에서 주소를 공유하는 방식)을 제거하도록 요청할 수 있습니다.
3. 표현을 코드로 다시 넣기
이제 코드 자체를 요청하세요—심지어 다른 프로그래밍 언어로도요.
핵심 비결 (The secret sauce)
오랫동안 에이전트들은 도구 사용에 탁월했으며, 심지어 다른 에이전트를 도구 호출처럼 다룰 수 있게 되었습니다. --- Anthropic의 게시물
3
실제적으로 이것이 의미하는 바는 Fable에게 읽기/쓰기 코드를 금지하고 대신 서브 에이전트들을 오케스트레이션(orchestrate)하도록 지시하는 것입니다. 이런 방식으로 Fable은 수십 시간 동안 실행되는 과정에서 컨텍스트 윈도우를 아낄 수 있고, 토큰 비용 또한 합리적일 것입니다.
Fable의 프롬프트에 다음 내용을 추가할 수 있습니다:
avoid extensive `Glob`/`Grep`/`WebSearch`/`Bash` - use `Explore` agents instead
avoid extensive `Edit`/`Bash` - use `general-purpose` sonnet or haiku subagents instead
use `Read` sparingly, to verify critical claims yourself
Glob, Grep, 및 WebSearch는 Claude Code에 내장된 도구 이름입니다.
도움이 되었으면 좋겠습니다. 즐거운 코딩 되세요.
P.S. 65kLoC는 rune이라는 프로그램인데, 이는 LLM 시대를 위한 터미널 에디터입니다:
- Obsidian × VSCode를 터미널에서 사용하며,
**⌘ -**키 스트로크가 있습니다. 주요 초점은 마크다운과 구문 강조이며, 언어 서버와 디버거는 에이전트를 위한 것입니다. - 마크다운 테이블
[[wikilinks]]가 있는 Obsidian 볼트
- [x] 우유 사기
작업 목록(tasks)
- 자동 병합, 충돌 데이터 복구 등 훨씬 더 많은 기능...
사진 제공: Laura Rivera (Unsplash)
이 글이 마음에 드셨나요? RSS 피드를 받아 알림을 받으세요.
AI 자동 생성 콘텐츠
본 콘텐츠는 HN Claude Code Search의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기