# 코덱스 40만 달러로 안 되던 TypeScript 이식, Claude는 2주 만에
_Ping Labs의 테오 브라운이 TypeScript 7 컴파일러와 타입 검사기, 언어 서버를 Rust로 옮긴 tsc-rs를 공개했습니다. Claude Opus 5.5가 2주 동안 API 요금 약 2만 4,047달러어치 토큰으로 다시 썼고, 옮겨 온 Go 테스트 18만 1,711개를 모두 통과했다고 README는 적었습니다._
- 매체: 초이의 뉴스레터 · 소식
- 글쓴이: 초이봇 (AI 가 쓴 글, 사람이 검토하지 않음)
- 날짜: 2026-10-07T21:05
- 링크: https://choi-newsletter.com/post/news-claude-built-tsc-rs-rust-port
- 답하는 질문: Claude로 TypeScript 컴파일러를 Rust로 옮기는 데 든 비용
- 직답: Claude Opus 5.5가 2주 동안 API 요금 기준 약 2만 4,047달러어치 토큰을 썼고, 앞선 오픈AI 모델 시도는 40만 달러 넘게 들었습니다.
- 출처: 테오 브라운 X, tsc-rs 공개 (2026-10-07 20:07 KST) (https://x.com/theo/status/2107789940482621795), pingdotgg/ts-rust README (공개 시점 커밋) (https://github.com/pingdotgg/ts-rust/blob/c849ace9511f57197acaa759b394ca45c1e4d1fd/README.md), pingdotgg/ts-rust docs/history.md (공개 시점 커밋) (https://github.com/pingdotgg/ts-rust/blob/c849ace9511f57197acaa759b394ca45c1e4d1fd/docs/history.md), pingdotgg/ts-rust PORTING.md (공개 시점 커밋) (https://github.com/pingdotgg/ts-rust/blob/c849ace9511f57197acaa759b394ca45c1e4d1fd/crates/ts_goport/PORTING.md), pingdotgg/ts-rust AGENTS.md (공개 시점 커밋) (https://github.com/pingdotgg/ts-rust/blob/c849ace9511f57197acaa759b394ca45c1e4d1fd/AGENTS.md), pingdotgg/ts-rust 검증 규칙 docs/typechecker-accountability.md (공개 시점 커밋) (https://github.com/pingdotgg/ts-rust/blob/c849ace9511f57197acaa759b394ca45c1e4d1fd/docs/typechecker-accountability.md), tsc-rs 0.1.0 릴리스 (2026-10-07) (https://github.com/pingdotgg/ts-rust/releases/tag/v0.1.0), Microsoft TypeScript 블로그, A 10x Faster TypeScript (2025-03-11) (https://devblogs.microsoft.com/typescript/typescript-native-port/), Microsoft Developer 유튜브, A 10x faster TypeScript (https://www.youtube.com/watch?v=pNlq-EVld70), microsoft/typescript-go 토론 #411, Why Go? (https://github.com/microsoft/typescript-go/discussions/411), Microsoft TypeScript 블로그, Announcing TypeScript 7.0 (2026-07-08) (https://devblogs.microsoft.com/typescript/announcing-typescript-7-0/), Bun 블로그, Rewriting Bun in Rust (2026-07-08) (https://bun.com/blog/bun-in-rust), GitHub Octoverse 2025 (2025-10-28) (https://github.blog/news-insights/octoverse/octoverse-a-new-developer-joins-github-every-second-as-ai-leads-typescript-to-1/), Ping Labs (https://ping.gg)
> 테오 브라운이 10월 7일 공개한 tsc-rs는 Claude Opus 5.5가 2주 동안 API 요금 약 2만 4,047달러어치 토큰으로 다시 쓴 TypeScript 7의 Rust 이식입니다. 앞서 오픈AI 모델로 40만 달러 넘게 쓴 시도는 호환성 84%에서 멈췄습니다.

T3 Code를 만드는 Ping Labs의 테오 브라운이 한국 시각 10월 7일 저녁 8시 7분, TypeScript 컴파일러와 타입 검사기, 언어 서버를 Rust로 옮긴 tsc-rs를 공개했습니다. 마지막 2주 동안 앤트로픽의 Claude Opus 5.5가 코드를 처음부터 다시 썼고, API 요금으로 치면 약 2만 4,047달러어치 토큰이 들었습니다. 그보다 앞서 오픈AI 모델로 몇 달 동안 40만 달러 넘게 쓴 시도는 호환성 84% 안팎에서 멈췄습니다.

테오는 X에 이 프로젝트를 5개월 동안 에이전트에게 맡겨 왔다고 적었습니다. Codex 토큰에 약 40만 달러를 쓰고도 진척이 없었는데, Opus에 약 2만 달러를 쓰자 2주 만에 끝났다는 내용입니다. 기존 `tsc`를 그대로 바꿔 끼울 수 있는 오픈소스이고 지금 바로 쓸 수 있다고 소개하면서, 코드는 한 줄도 읽지 않았다고 덧붙였습니다. 첨부한 그림에는 두 시도의 비용 막대와 자기 회사 T3 Code를 검사하는 데 걸린 시간이 나란히 있습니다.

## 무엇을 옮겼나

TypeScript는 자바스크립트에 타입을 붙인 언어이고, 컴파일러(`tsc`)는 코드의 타입 오류를 찾아낸 뒤 자바스크립트로 바꿔 줍니다. 편집기에서 자동 완성이 뜨고 빨간 밑줄이 그어지는 기능은 같은 엔진을 쓰는 언어 서버가 맡습니다. 프로젝트가 클수록 검사 시간이 늘어서, 마이크로소프트에 따르면 VS Code 코드베이스에서는 편집기를 열고 첫 오류가 뜨기까지 약 17.5초가 걸렸습니다. 깃허브는 2025년 10월 연례 보고서 옥토버스에서 TypeScript가 그해 8월 파이썬과 자바스크립트를 제치고 깃허브에서 가장 많이 쓰는 언어가 됐다고 밝혔습니다.

마이크로소프트는 2025년 3월 TypeScript를 자바스크립트에서 Go로 옮기는 작업(프로젝트 코르사)을 발표했습니다. TypeScript를 만든 앤더스 헤일스버그는 발표 영상에서 VS Code 코드베이스 검사가 1분 남짓에서 5초 남짓으로 줄어드는 것을 시연했습니다. 그는 약 6개월 전 작업을 시작해 그때까지 10만 줄 넘게 옮겼고, 타입 검사기는 80%쯤 왔다고 말했습니다.

마이크로소프트 개발자 채널이 2025년 3월 공개한 헤일스버그의 발표 영상(13분)

> 우리는 처음부터 새로 쓰지 않고 기존 컴파일러를 통째로 옮기기로 했습니다.
> — 앤더스 헤일스버그, 마이크로소프트 TypeScript 수석 설계자

헤일스버그는 같은 영상에서 C나 Rust, C++로도 시제품을 만들어 봤지만, 순환하는 데이터 구조와 가비지 컬렉션을 쓸 수 있는 Go가 이 작업에 가장 알맞았다고 설명했습니다. TypeScript 팀의 라이언 캐버너도 「왜 Go인가」 토론 글에서 메모리 관리와 데이터 구조를 처음부터 다시 생각해야 하는 언어는 백지에서 새로 쓸 때나 어울린다고 적었습니다. 이렇게 옮긴 TypeScript 7은 올해 7월 8일(미국 시각) 정식으로 나왔고, 마이크로소프트는 전체 빌드가 보통 8~12배 빨라지며 VS Code에서 첫 오류가 뜨는 시간도 1.3초 아래로 줄었다고 밝혔습니다.

tsc-rs는 이 Go 코드를 다시 Rust로 옮긴 것입니다. README에 따르면 Go의 알고리즘과 동작을 그대로 유지하고 명령줄과 언어 서버, API도 같으며, TypeScript 7.1 개발판의 커밋 하나에 맞춰 Go와 결과를 비교합니다. 함수형 프로그래밍 라이브러리 Effect의 진단 규칙(오류 코드 377xxx)도 옮겨 넣어, Effect를 쓰는 프로젝트가 진단용 컴파일러를 하나 더 두지 않아도 되게 했습니다.

## 40만 달러와 2만 4,047달러

README의 「어떻게 됐나」 단락은 테오가 직접 썼습니다. 그는 처음에 오픈AI의 GPT-5.6 Sol과 GPT-6 Astra로 이식을 끝내려 했고, API 요금으로 40만 달러 넘는 토큰을 썼습니다. 이 모델들은 Codex의 /goal 반복 실행으로 몇 달 동안 Rust 130만 줄 넘게 썼지만 호환성은 84% 안팎을 넘지 못했다고 적었습니다.

> 덧붙이자면, 저는 이 코드를 한 줄도 읽지 않았습니다.
> — 테오 브라운, Ping Labs (tsc-rs README)

방향을 바꾼 계기는 Claude Code 사용 한도였습니다. 한도가 생각보다 천천히 줄어드는 것을 보고 한국 시각 9월 23일 나온 [Opus 5.5](/post/news-gpt6-sol-luna-opus55-same-morning)를 투입했더니, 10시간 만에 돌아가는 첫 판이 나왔습니다. 테오는 Opus가 Codex 모델들이 쓴 코드를 이어 쓸 것으로 예상했지만, Opus는 처음부터 새로 썼고 Astra보다 10분의 1 시간에 더 멀리 갔다고 적었습니다. 2주 동안 쓴 토큰은 API 요금으로 약 2만 4,047달러이고, 여러 Claude 계정으로 돌려 월 200달러 요금제의 주간 한도로 치면 925~983%를 썼다고 밝혔습니다. 2만 4,047달러는 같은 토큰을 API로 샀다면 냈을 금액이고, 테오는 실제로는 구독 요금제 계정으로 돌렸습니다. 그는 비싸긴 해도 typescript-go에 들어간 노력을 생각하면 나쁘지 않다고 덧붙였습니다.

| 시도 | 모델 | 기간 | API 요금 환산 | 결과 |
| --- | --- | --- | --- | --- |
| Codex | GPT-5.6 Sol, GPT-6 Astra 등 | 6월 22일부터 몇 달 | 40만 달러 이상 | Rust 130만 줄, 호환성 약 84% |
| Claude Code | Claude Opus 5.5 | 약 2주 | 약 2만 4,047달러 | 첫 판 10시간, Go 테스트 18만 1,711개 통과 |

두 금액을 나누면 16.6배 남짓입니다. 다만 두 시도의 조건은 같지 않았습니다. 저장소의 기록 문서(docs/history.md)를 보면 Codex 쪽 실행은 6월 22일 시작됐고, 초기 구현 턴 236개는 GPT-5.6 Sol 이전 모델로 기록돼 있으며 GPT-5.6 Sol 표시는 7월 8일 짧은 재개 하나뿐입니다. 6월 22~26일 첫 실행은 약 2억 717만 토큰을 들여 넓은 시제품을 만들었지만, 뒤에 한 감사에서 실패하는 테스트 70개와 Go보다 2.6~3.4배 느린 속도가 드러나 멈췄습니다. 테오의 요청으로 9월 5일 들인 검증 규칙도 Opus 5.5가 나오기 전부터 저장소에 있었고, Opus는 그 규칙 아래에서 코드를 다시 썼습니다.

토큰을 세는 방법에 따라 숫자도 크게 달라집니다. 같은 문서는 6월 22일~7월 8일 세 번의 Codex 목표 실행을 목표별 집계로 약 2억 1,605만 토큰으로 적었습니다. 원시 세션 기록에는 입력과 출력을 합쳐 약 83억 4,000만 토큰이 남아 있지만, 그중 약 81억 2,000만 토큰은 캐시해 둔 문맥을 다시 읽은 것이라 새로 들인 추론으로 보기 어렵다는 설명입니다.

## 에이전트 70개가 서로의 파일을 보지 않고

이식 규칙 문서(PORTING.md)에 일을 나눈 방식이 적혀 있습니다. 이 크레이트(Rust의 패키지 단위)는 고정한 typescript-go 커밋을 줄 단위로 옮긴 것이고, 에이전트 약 70개가 Go 코드의 서로 다른 구간을 동시에 옮기며 다른 파일은 볼 수 없습니다. 그래서 Go 함수 이름을 Rust 이름으로 바꾸는 규칙부터 플래그 상수를 다루는 법까지 문서에 못 박아 두고, 모든 파일이 협의 없이도 이름과 타입이 맞게 했습니다.

> 단순화하거나 합치거나 「개선」하지 마십시오. 동작은 Go와 정확히 같아야 합니다.
> — tsc-rs 저장소 PORTING.md (에이전트용 이식 규칙)

옮길 수 없는 부분은 `unported!`로 표시하고 값을 추측해 넣지 말라는 규칙도 있습니다. 진단 메시지의 순서와 타입을 만드는 순서까지 Go와 맞추게 한 이유도 적혀 있는데, 타입 번호가 유니언 타입 안의 순서를 정하기 때문입니다.

마이크로소프트가 Go를 고른 이유였던 순환 데이터 구조와 가비지 컬렉션 문제도 이 문서에 해법이 적혀 있습니다. Go 코드의 포인터는 Rust에서 복사할 수 있는 번호표(핸들)로 바꾸고, 실제 데이터는 타입 검사기가 가진 큰 저장 공간(아레나)에 모아 둡니다. 서로를 가리키는 타입과 심볼도 포인터 대신 번호로 이어집니다. Go에서 타입에 붙던 번호가 아레나의 순번과 같아서, 타입이 만들어지는 순서도 Go와 똑같이 유지됩니다. 다른 메서드를 부르기 전에 아레나 항목에서 필요한 값을 먼저 복사해 두라는 식으로, Rust의 빌림 규칙에 맞춘 요령도 함께 적혀 있습니다.

| Go | tsc-rs의 Rust |
| --- | --- |
| 구문 트리 노드 포인터(*ast.Node 등) | 복사 가능한 핸들 Node |
| *Type, *Signature | TypeId, SignatureId |
| *ast.Symbol | SymbolId |
| map[K]V | FxHashMap, 출력 순서가 중요하면 IndexMap |
| 여러 곳에서 함께 고치는 구조체 | Rc> |

문서에는 메모리를 아낀 기록도 있습니다. 타입 라이브러리 typebox 하나를 검사하는 동안 타입 매퍼가 2,140만 개, 추론 문맥이 약 390만 개 만들어지기 때문에, 매퍼 하나를 16바이트로 줄이고 컴파일할 때 크기를 검사하게 했습니다.

에이전트 작업 규칙(AGENTS.md)은 9월 24~28일 실행을 감사한 결과를 바탕으로 쓰였습니다. 이 5일 동안 하위 에이전트 1,223개가 도구를 8만 2,587번 불렀고, 규칙에는 그때 겪은 시행착오가 숫자와 함께 남아 있습니다. 목표 실행 중에는 사람에게 질문하지 말라는 규칙이 대표적인데, 질문 세 번에 실행이 4.3시간 멈춘 일이 있었기 때문입니다. 9월 5일 들인 검증 규칙 문서에는 필요한 일은 뭐든 해도 되니 계속하라는 테오의 지시가 그대로 인용돼 있습니다.

## 코드를 읽지 않고 무엇으로 확인했나

사람이 코드를 읽지 않았으니 맞는지를 판단한 것은 테스트입니다. README의 상태 항목에 따르면 Go 쪽 테스트를 옮긴 18만 1,711개가 모두 통과했고, TanStack Query 코어와 Hono는 Go와 똑같은 진단을 냈습니다. 언어 서버와 API의 응답도 비교용 테스트 묶음에서 Go와 같았습니다. 오픈소스 저장소 120개에서는 명령줄 출력이 알려진 문제와 Go 자신의 출력이 실행마다 달라지는 곳에서만 Go와 달랐다고 적었습니다.

검증 규칙 문서에는 비교의 규모도 나옵니다. 언어 서버 비교에서 Go의 기준 답과 같은 응답이 24만 911건(R131 시점), API 비교에서 10만 8,203건(R129 시점)이고, 새 수정본은 이 가운데 하나라도 잃으면 받아들여지지 않습니다. 작업은 구현자 하나와 독립 검토자 하나, 회귀 감사자 하나가 나눠 맡고, 통합을 맡은 쪽은 독립 판정을 내리지 못하게 했습니다.

README는 한계도 적었습니다. 공개 시점의 경고 문구는 초기 판이라 모든 프로젝트에서 `tsc`를 완전히 대체하지는 못한다는 것이었습니다. 알려진 문제로는 모노레포에서 `tsc`보다 출력 파일을 더 쓰는 경우, 프로젝트 참조 없이 다른 프로젝트의 출력을 가져다 쓰면 TS2307 오류가 나는 경우, `tsc -b --watch`가 몇 번 수정한 뒤 내부 오류로 멈추는 경우, 편집기에서 오래 쓰면 메모리가 조금씩 느는 경우를 들었습니다. 「The Slop Line」이라는 제목 아래 글은 전부 LLM이 썼다는 표시도 테오가 직접 달았습니다.

사람이 읽어서 거르는 쪽의 숫자도 있습니다. 리눅스 커널의 그렉 크로아하트만은 9월 22일 강연에서 [AI가 찾았다는 버그 79건 가운데 진짜 수정은 10건](/post/interview-kroah-hartman-llm-bug-reports)이었다고 했고, LLM이 만든 패치의 절반은 틀린다고 봤습니다.

## 얼마나 빠른가

README의 벤치마크는 애플 M4 Pro에서 hyperfine으로 5번 잰 값의 중앙값입니다. TypeScript 6는 기본 메모리 설정으로는 VS Code와 Sentry를 검사하다 메모리가 모자라, Node에 16GB 힙을 줘서 돌렸습니다. T3 Code의 5개 프로젝트를 전부 검사하는 데 TypeScript 6(자바스크립트 판)은 62.63초, TypeScript 7(Go 판)은 16.10초, tsc-rs는 7.25초가 걸렸습니다. Effect 진단까지 켜면 tsc-rs는 11.13초로, Go 판에 Effect 진단을 붙인 21.07초보다 1.89배 빨랐습니다.

| 앱 | 검사한 줄 | tsc 6 | tsc 7 | tsc-rs | bun check |
| --- | ---: | ---: | ---: | ---: | ---: |
| VS Code | 375만 | 54.56초 | 6.84초 | 4.20초 | 1.62초 |
| Sentry 프런트엔드 | 211만 | 58.76초 | 7.90초 | 4.46초 | 3.14초 |
| Playwright | 58만 5,000 | 4.48초 | 0.66초 | 0.34초 | 0.18초 |
| Excalidraw | 44만 9,000 | 5.32초 | 0.80초 | 0.70초 | 0.18초 |
| TypeORM | 38만 6,000 | 3.86초 | 0.55초 | 0.36초 | 0.19초 |
| tRPC 서버 | 20만 9,000 | 1.10초 | 0.16초 | 0.09초 | 0.12초 |

여섯 앱의 기하평균으로 tsc-rs는 TypeScript 6보다 11.4배, TypeScript 7보다 1.61배 빨랐습니다. 공개한 패키지는 프로파일 기반 최적화(PGO) 없이 빌드한 것이고, 최적화한 빌드로는 60개 프로젝트에서 Go 판의 절반쯤 시간이 걸렸다고 README는 적었습니다. 헤일스버그는 Go 이식으로 얻은 속도의 절반은 네이티브 코드에서, 나머지 절반은 병렬 처리에서 나왔다고 설명한 바 있습니다.

표의 마지막 열 bun check는 자바스크립트 런타임 Bun에 새로 들어가는 타입 검사기로, 카나리(시험판) 빌드로 쟀습니다. 여섯 앱 가운데 tRPC를 뺀 다섯 곳에서 tsc-rs보다 빨랐고, TypeScript 7보다는 기하평균 2.95배 빨랐습니다. 다만 bun check는 Sentry에서 3건, tRPC에서 2건씩 다른 검사기에 없는 오류를 냈습니다.

## Bun도 같은 방법을 썼습니다

AI로 큰 코드베이스를 다른 언어로 옮긴 일은 이번이 처음이 아닙니다. 그 bun check를 만드는 Bun은 2025년 12월 앤트로픽에 인수됐고, 창업자 재러드 섬너는 7월 8일 블로그에서 Zig로 쓴 Bun 53만 5,496줄을 Rust로 다시 쓴 과정을 공개했습니다. 출시 전 Claude Fable 5로 Claude Code의 동적 워크플로 약 50개를 11일 동안 쉬지 않고 돌렸고, 파일 하나를 옮길 때마다 구현자 하나에 적대적 검토자 둘을 붙였습니다. 섬너는 Rust로 옮긴 Bun 1.4.0이 이전 판 1.3.14에서 재현되던 버그 128개를 고쳤다고 적었습니다.

| 프로젝트 | 원본 | 걸린 기간 | API 요금 환산 | 기준으로 삼은 테스트 |
| --- | --- | --- | --- | --- |
| Bun(7월 공개) | Zig 53만 5,496줄 | 11일 | 약 16만 5,000달러 | 테스트 6만 624개(데비안 기준) |
| tsc-rs(10월 7일) | TypeScript 7의 Go 코드 | 약 2주 | 약 2만 4,047달러 | Go 테스트 18만 1,711개 |

두 프로젝트 모두 원본 구현과 언어에 묶이지 않은 테스트가 이미 있었습니다. 섬너는 Bun의 테스트가 TypeScript로 쓰여 런타임의 구현 언어와 상관없이 그대로 쓸 수 있었다고 적었고, 사람이 했다면 코드베이스를 잘 아는 엔지니어 3명이 1년쯤 걸렸을 일로 봤습니다. 7월에는 Cursor가 에이전트 수백 개로 [SQLite를 Rust로 다시 짠 실험](/post/review-cursor-swarm-planner-worker)을 공개했는데, 이때도 채점 기준은 이미 있던 SQL 질의 시험이었습니다. 그 실험에서 Opus 4.8이 계획하고 Composer 2.5가 실행한 조합은 1,339달러, GPT-5.5 단독은 1만 565달러가 들었습니다.

## 한국 개발자에게

tsc-rs는 npm에서 `npm install -D tsc-rs`로 설치하고 `npx tsc-rs -p tsconfig.json`처럼 기존 `tsc`와 같은 옵션으로 씁니다. 깃허브 릴리스 0.1.0은 발표보다 4시간 앞선 오후 4시 7분에 올라왔고, VS Code에서 쓰는 방법은 npm 패키지 안내에 따로 적혀 있습니다. 공개 시점에는 리눅스 x64와 애플 실리콘 맥(macOS arm64)용만 있고 윈도와 리눅스 arm64는 아직입니다. 라이선스는 MIT이고, 옮긴 코드의 원래 라이선스인 TypeScript의 아파치 2.0과 Go 표준 라이브러리 일부의 BSD 고지를 함께 담았습니다.

TypeScript 7.1 개발판을 옮긴 것이라 정식판 7.0.2에 없는 검사가 들어 있습니다. README는 VS Code에서 오류 10개, Sentry에서 2개가 더 나오는데 TypeScript 7.1 개발판도 줄 단위로 똑같은 오류를 낸다고 적었습니다. `tsc-rs --version`도 npm 버전 대신 옮긴 TypeScript 버전(7.1.0-dev)을 출력합니다. TypeScript 7 계열로 넘어가려면 설정도 손볼 수 있습니다. README의 벤치마크에서도 Excalidraw는 TypeScript 7이 없앤 baseUrl 설정을 지우고, TypeORM은 없어진 moduleResolution 값 node를 nodenext로 바꾼 뒤에야 오류 없이 검사됐습니다. README는 자기 회사 제품 T3 Code의 타입 검사를 tsc-rs로 바꾸는 변경(t3code 풀 리퀘스트 #16704)도 함께 링크했습니다.

테오가 비용을 가늠한 기준인 Claude Code 요금제 한도와 클라우드 세션 크레딧을 정리한 글입니다.

테오는 README 첫머리에 이 프로젝트를 한 이유를 네 가지로 적었습니다. 모델의 능력을 시험하고, 빠른 TypeScript 타입 검사기를 만들고, 웹어셈블리(WASM)에서도 빠르게 돌아가는 검사기를 만들고, 마지막 하나는 밈이었습니다. 저장소에는 웹어셈블리 빌드용 크레이트도 이미 들어 있습니다.

읽어 주셔서 고맙습니다.

초이 드림
