
라우팅 인프라 만드는 곳에서 왜 새 언어를 만들었을까
인터넷의 핵심 인프라를 묵묵히 만들어온 네덜란드 비영리 재단 NLnet Labs가 자기들이 1년 동안 키워온 스크립트 언어 Roto의 회고를 공개했어요. NLnet Labs라는 이름이 낯설 수 있는데요, DNS 서버인 Unbound나 NSD, BGP 인증을 다루는 Routinator 같은 도구를 만든 곳이에요. 인터넷이 굴러가는 데 꼭 필요한 "보이지 않는 배관" 같은 소프트웨어를 주로 만드는 팀이라고 보면 됩니다.
그런 곳에서 갑자기 프로그래밍 언어를 만든 이유가 뭘까요. 이들이 새로 개발 중인 BGP 라우팅 엔진 Rotonda 때문이에요. BGP가 뭐냐면, 전 세계 인터넷 망에서 "이 IP 대역으로 가려면 어느 길로 가야 한다"는 정보를 서로 교환하는 프로토콜이에요. 그런데 운영자마다 "이런 경로는 받고, 저런 경로는 거르고, 우선순위는 이렇게 매기자" 같은 정책이 천차만별이거든요. 이걸 매번 Rust 코드로 짜서 다시 컴파일하라고 할 수는 없잖아요. 그래서 사용자가 정책만 가볍게 스크립트로 쓸 수 있는 언어가 필요했던 거예요.
인터프리터 대신 "컴파일"을 택한 이유
Rust 앱에 스크립트를 끼워 넣는 흔한 방법은 Lua나 Rhai, Python 같은 인터프리터 언어를 가져다 쓰는 거예요. 게임 엔진에서 자주 보던 패턴이죠. 그런데 BGP 라우터는 상황이 좀 달라요. 초당 수십만 개의 경로 업데이트가 들어오고, 그때마다 정책 평가가 돌아야 하거든요. 한 줄의 스크립트 실행 비용이 마이크로초 단위로 쌓이면 전체 시스템이 못 버텨요.
그래서 Roto는 인터프리터가 아니라 JIT 컴파일러를 통해 네이티브 코드로 변환된 뒤 실행돼요. 백엔드로는 Cranelift라는 코드 생성기를 쓰는데, 이게 Bytecode Alliance에서 만든 가벼운 컴파일러 백엔드예요. LLVM처럼 무겁지 않으면서도 꽤 괜찮은 머신코드를 뽑아주거든요. 결과적으로 스크립트인데 실행 속도는 Rust 함수 호출에 가까운 수준이 나옵니다.
또 하나 중요한 게 타입 시스템이에요. Roto는 정적 타입 언어로 설계됐고, Rust 쪽 타입과 자연스럽게 연결되도록 만들었어요. 호스트 앱이 BGP Route라는 구조체를 넘기면 스크립트에서 그걸 그대로 받아 필드 접근, 패턴 매칭까지 할 수 있어요. 런타임에 "이 필드가 없는데요?" 같은 오류가 터지는 게 아니라, 스크립트 로딩 시점에 타입이 안 맞으면 바로 거부합니다. 라우터처럼 24시간 돌아가야 하는 시스템에서는 이 "실행 전 검증"이 진짜 중요해요.
비슷한 시도들과 비교해보면
Rust 생태계에는 임베디드 스크립트 후보가 이미 여럿 있어요. Rhai는 Rust 친화적인 동적 언어로 작고 가볍지만 인터프리터라 빠른 편은 아니에요. mlua는 성숙한 Lua를 Rust에 붙이는 바인딩인데 동적 타입이고 외부 런타임이라 무겁죠. WASM 모듈을 끼워 넣는 wasmtime 방식도 있는데 이건 강력하지만 시작 비용이 크고 사용자에게 "WASM으로 컴파일하라"는 진입 장벽이 생겨요. Roto는 이 사이의 빈 자리, 즉 "Rust 타입과 직결되는 작고 빠른 도메인 특화 언어"를 노린 셈이에요.
조금 더 멀리 보면 Envoy의 필터 체인을 위한 Lua/WASM, Cloudflare Workers 같은 엣지 스크립팅, 심지어 eBPF까지 비슷한 고민을 공유해요. 모두 "호스트 프로그램의 핫패스에 사용자 코드를 안전하게 끼워 넣고 싶다"는 문제거든요. 각자 트레이드오프가 다를 뿐이고, Roto는 그중 "네트워크 정책"이라는 좁고 분명한 문제에 집중해서 답을 낸 케이스예요.
한국 개발자에게 주는 시사점
당장 Roto를 실무에 도입할 일은 많지 않을 거예요. 한국에서 자체 BGP 엔진을 굴리는 곳은 통신사나 대형 IX 정도니까요. 하지만 "우리 제품에 사용자 스크립트를 허용하고 싶다"는 고민은 의외로 자주 나와요. 보안 솔루션의 룰 정의, 데이터 파이프라인의 변환 로직, 게임 서버의 이벤트 핸들러 같은 곳에서요. 그때 Lua만 떠올리지 말고 "호스트 타입과 컴파일 타임에 검증되는 작은 DSL을 직접 만드는 길도 있다"는 선택지를 알아두면 좋아요.
Cranelift라는 도구의 존재도 챙겨둘 만해요. LLVM은 너무 무겁고 학습 곡선이 가파른데, Cranelift는 "JIT를 한번 만들어볼까?" 싶을 때 진입하기에 훨씬 친절하거든요. 사내 룰 엔진, 수식 평가기 같은 걸 만들 때 의외로 잘 맞는 선택지가 될 수 있어요.
마무리
한 줄로 정리하면, Roto는 "Rust 앱에 스크립트를 끼워 넣고 싶은데, 안전하고 빠르기까지 해야 한다"는 까다로운 요구에 NLnet Labs가 1년 동안 내놓은 답이에요. 여러분이라면 자기 제품에 사용자 스크립트를 허용해야 할 때, 기존 언어를 임베드하는 길과 작은 DSL을 직접 만드는 길 중 어느 쪽을 택하시겠어요?
🔗 출처: Hacker News
"비전공 직장인인데 반년 만에 수익 파이프라인을 여러 개 만들었습니다"
실제 수강생 후기- 비전공자도 6개월이면 첫 수익
- 20년 경력 개발자 직강
- 자동화 프로그램 + 소스코드 제공