- Ladybird 브라우저 프로젝트가 C++을 대체할 메모리 안전 언어로 Rust를 채택하고, 전환 과정에 AI 도구를 활용함
- 기존에 Swift를 검토했으나 C++ 상호운용성과 플랫폼 제약으로 한계를 느껴 Rust로 방향을 전환함
- 첫 번째 포팅 대상은 JavaScript 엔진 LibJS로, Claude Code와 Codex를 이용해 수백 개의 프롬프트로 수동 지휘된 번역을 수행함
- 약 2주 만에 2만5천 줄의 Rust 코드를 완성했으며, 출력·성능 모두 C++ 버전과 완전히 동일함을 검증함
- 프로젝트는 당분간 C++과 Rust 병행 개발 체제를 유지하며, 장기적으로 안전성과 유지보수성을 강화할 계획임
Rust 채택 배경
- Ladybird는 C++을 대체할 메모리 안전 언어를 찾기 위해 여러 언어를 검토함
- Swift는 C++과의 상호운용성 부족 및 Apple 생태계 외 플랫폼 지원 한계로 제외됨
- Rust는 시스템 프로그래밍 생태계가 성숙하고, 기여자 다수가 이미 익숙한 언어로 평가됨
- 2024년에는 Rust의 C++식 OOP 부적합성으로 채택을 보류했으나, 이후 안전성과 생태계 성숙도를 이유로 재도입 결정
- Firefox와 Chromium이 이미 Rust를 도입한 사례를 참고해 Ladybird에도 적합하다고 판단함
LibJS 포팅 과정
- 첫 번째 전환 대상은 Ladybird의 JavaScript 엔진 LibJS
-
lexer, parser, AST, bytecode generator 등 독립적 구성요소와 test262 기반 테스트 커버리지로 시작점으로 적합함
- 포팅에는 Claude Code와 OpenAI Codex를 사용
- 자동 생성이 아닌 인간 주도형 번역으로, 포팅 순서와 코드 구조를 직접 결정
- 수백 개의 프롬프트로 세밀히 지시하며, 이후 다양한 모델을 통한 코드 검증 및 오류 탐지 수행
결과 및 검증
- 목표는 C++과 Rust 파이프라인의 출력이 바이트 단위로 동일한 결과를 내는 것
- 약 25,000줄의 Rust 코드를 2주 만에 완성, 수개월 걸릴 작업을 단축함
-
AST와 바이트코드가 완전히 동일하며, 테스트 및 JS 벤치마크에서 성능 저하 없음
-
C++과 Rust 파이프라인을 동시에 실행하는 lockstep 테스트로 웹 탐색 중 결과 일치 여부를 검증함
- 현재 코드는 C++에서 번역된 형태를 유지하며, 레지스터 할당 패턴까지 동일하게 모방
- 이는 C++ 파이프라인과의 호환성 확보가 최우선이기 때문
- 향후 C++ 파이프라인을 폐기할 시점에 Rust 코드의 단순화 및 정리 예정
향후 계획
- Rust 전환은 프로젝트의 주력 개발 방향이 아닌 병행 작업으로 진행
-
C++과 Rust 코드가 공존하며, 명확한 상호운용 경계를 유지함
- 포팅 순서와 범위는 핵심 팀이 관리, 외부 기여자는 사전 조율 필요
- 장기적으로 안전성과 유지보수성 향상을 목표로 점진적 전환 추진
- 결정이 논란이 될 수 있음을 인정하면서도, Ladybird의 미래를 위한 올바른 선택으로 평가함