NLnet 지원으로 6개월간 Nova를 풀타임 개발하며 이룬 진전(모듈, GC, 핵심 언어 기능들)과 남은 과제, 그리고 앞으로의 계획(기능 플래그, 성능, Servo 연동, 자금 계획 등)을 공유합니다.
게시일 2025-11-08 · 작성자 Aapo Alasuutari
정확히 6개월 전, Nova가 NLnet의 NGI Zero Core 펀드로부터 보조금을 받았고 제가 6개월 휴직을 시작한 지 한 달이 지났다는 글을 썼습니다. 계산을 해 보고 그 함수의 5제곱의 로그 미분을 외삽해 보면, 지금 저는 평소의 본업으로 복귀한 지 한 달이 되었겠다는 결론에 도달할지도 모릅니다.
맞습니다. 저는 다시 낮에는 TypeScript 개발자이고, Nova와 관련한 두 건의 학생 프로젝트를 지도하고, 앞으로 Nova의 골치 아픈 부분을 덜 아프게 만들고자 하는, 다소 무모한 Rust 언어 실험의 저자이며, 그 와중에 남는 밤에는 가끔 Rust 개발자로 일하고 있습니다.
그렇다면 그 6개월 동안 Nova에는 무슨 일이 있었고, 다음에는 어디로 갈까요? 이야기를 나눠봅시다.
Nova는 본질적으로 열정 프로젝트입니다. 내가 존재하길 바라는, 아니 적어도 시도되길 바라는 형태의 JavaScript 엔진이죠. NLnet이 그 열정을 풀타임으로 쏟을 기회를 준 것에 정말 감사하지만, 솔직히 말해 6개월 휴직을 시작했을 당시 Nova는 테스트 스크립트 이상의 것을 돌릴 수 있다고 평가하기 어려운 상태였습니다. 열정만으로는 처음부터 JavaScript 엔진을 만들 수 없습니다. 가장 큰 문제는 사실상 가비지 컬렉션의 부재에 가까웠습니다.
기술적으로 가비지 컬렉터는 존재했고, 그때와 지금 사이에 크게 바뀌지도 않았습니다. 다만 당시의 문제는 JavaScript가 실행 중일 때는 가비지 컬렉션을 돌릴 수 없었다는 점이었습니다. 이는 Nova가 극도로 비동기적인 JavaScript만 제대로 실행할 수 있게 만든다는 뜻이었고, Promise가 해결되길 기다리는 동안에만 가비지 컬렉션이 가능했죠. 6개월 전, 제가 글을 쓸 당시엔 상호교차되는(인터리브된) 가비지 컬렉션의 부재는 막 해결된 직후였지만, 엔진은 여전히 우리가 JavaScript에서 기대하는 많은 기능이 부족했습니다.
그로부터 6개월 동안, 제대로 쓸 수 있는 가비지 컬렉터 외에 Nova에 추가된 내용은 다음과 같습니다.
for-of 루프와 for-await-of 루프의 완성try-finally 블록super 키워드JSON.stringify현재 기준, 우리 자체 집계로 Test262 준수율이 77%까지 올라왔습니다. 결코 적은 수치가 아니며, 이제 엔진이 상당히 쓸 만한 단계에 들어섰다고 생각합니다! 제 입장이라면 아직 회사의 핵심을 Nova에 걸지는 않겠지만, 다른 엔진을 프로젝트에 시도해 보고 싶다면 꽤 잘 버텨줄 겁니다. (문제를 발견하면 꼭 제보해 주세요. 아니면 직접 와서 함께 고쳐요!)
그렇다면 NLnet 보조금으로 하는 일은 끝났을까요? 아직은 아닙니다. 남은 일들이 있습니다.
남은 목록이 아주 길지는 않습니다만, 그리고 저는… 글쎄요, 보조금 기간이 끝나는 12월 둘째 주 이전에 이 모든 걸 끝낼 현실적인 방법이 있냐 하면 사실 잘 모르겠습니다. 그래도 최선을 다해보려 합니다. 도와주고 싶다면 디스코드에 들어와서 위 목록에서 "진행 중" 표시가 없는 항목을 하나 골라 주세요.
그럼 다음은 무엇일까요? 당장은 다시 낮에는 TypeScript 개발자입니다. 전혀 나쁘지 않아요. 단기 보조금(선급도 없는!)보다 훨씬 안정적이고 스트레스가 적게 생활비를 벌 수 있으니까요. 본업에서도 Nova에서 하는 일과 비슷한 재미있는 작업을 하고 있습니다. 이번 주에는 특정 캐시 자료구조의 메모리 사용량을 10배 줄였습니다. 여러 객체 그래프로 얽힌 11 MiB짜리 컬렉션을 하나의 ArrayBuffer와 2~10개의 TypedArray 뷰로 바꿔 1 MiB대의 그래프 컬렉션으로 만든 것이죠. 다음에는 비슷한 작업을 라이브 런타임 자료구조(변화는 드문)에도 적용할 예정입니다. 불변식을 유지(혹은 원칙 있게 깨기)하는 게 어렵겠지만, 극단적인 테스트 케이스에서 수십 메가바이트까지 커질 수 있는 구조들이라 성과는 더 달콤할 겁니다.
작은 곁다리이자 잠깐의 훈수 타임: 큰 캐시 그래프 중 일부는 ArrayBuffer에 담으면 크기가 킬로바이트 단위입니다. 이런 경우엔 그것을 바라보는 10개의 TypedArray 각각이 의미 있는 역할을 하며, 클래스 인스턴스의 프라이빗 프로퍼티로 보관합니다. 하지만 더 단순한 경우에는 TypedArray가 2개만 필요하고 각자가 1030바이트를 바라보면 충분하며, 나머지 프라이빗 프로퍼티들은 모두 50바이트 정도고, 인라인 프라이빗 프로퍼티 10개를 가진 클래스 객체 하나는 52바이트입니다. 즉, TypedArray가 2개뿐인 경우, 사용 가능한 데이터 20바이트를 담기 위해 약 150바이트의 JavaScript 객체가 필요합니다. ArrayBuffer만 남기고 나머지를 다 버린다 해도, 20바이트를 담는 데 ArrayBuffer 약 50바이트는 씁니다. 슬픈 일이고, 그래서 저는 Nova가 존재하고 성공하길 바랍니다.null을 담게 됩니다. 제 이전 글이나 FOSDEM 2024에서 했던 발표를 보셨다면, V8에서 TypedArray가 꽤 크다는 걸 기억하실 겁니다. 힙 레퍼런스가 각각 4바이트에 불과한 Chrome에서도, TypedArray나 ArrayBuffer 하나가 대략 40
이것이 Nova 작업의 끝이 아님은 분명합니다. 산으로 도망갈 생각도 없고요. 다만 지금 제 시간이 역사상 최저로 쪼개져 있는 것도 사실입니다. 글 서두에서 눈치채셨겠지만, 여러 가지로 바쁘고 압박이 심합니다. 그럼에도 모든 건 결국 Nova를 위한 일입니다.
현재 베르겐 대학교의 두 학생 프로젝트가 엔진 안팎에서 작업을 마무리하고 있습니다. 하나는 더 많은 이들이 즐길 수 있도록 우리의 SoAVec 크레이트를 확장·개선하는 작업이고, 다른 하나는 Nova의 Temporal API 구현을 시작하는 프로젝트입니다. 저는 이들을 지도하고 있고, 봄 학기에도 새로운 학생 프로젝트를 감독하겠다고 약속했습니다. 이런 프로젝트는 Nova에 큰 복이자 영광이며, 개인적으로도 학생과 주니어 엔지니어와 함께 일하는 걸 정말 좋아합니다. 제 마음속에선(비록 머리카락의 새치가 말리더라도) 저도 여전히 그런 사람입니다.
Rust 언어 쪽에선, 저는 다크 사이드로 건너가 Rust 자체에서 사용자 정의 타입의 재대여(reborrowing)를 지원하기 위한 언어 실험을 시작했습니다. 이 작업은 올해 하반기 Rust 프로젝트의 대표 목표의 일부이기도 하여, 자세한 내용은 Rust 블로그에서 보실 수 있습니다! (이건 "우리가 쉬워서 하는 게 아니라, 쉬울 줄 알았기 때문에 하는" 유형의 일입니다. 제 역량을 훌쩍 넘어서고 있어요!) 재대여는 Nova의 가비지 컬렉션 안전성 이야기에서 핵심 요소이며, 코드베이스에서 가장 복잡하고 이해하기 어려운 부분이기도 합니다. 언어 차원의 재대여 지원은 이 부분을 훨씬 덜 흉하게 만들고, 장기적으로는 Nova의 가비지 컬렉션을 진짜로 빌림 검사기만으로 완전하게 검증할 수 있는 길을 열어줄지도 모릅니다. 지금은 이를 강제로 검사하도록 편법을 쓰고 있으니까요.
바쁘긴 해도, 물론 Nova 작업을 그만두는 건 아닙니다! 현재 Atomics 객체를 구현 중이고, 이달 말엔 (유급!) 휴가를 2주쯤 내서 NLnet 보조금 잔여 과업을 마무리해 보려고 합니다. 그리고 NLnet 보조금 기간이 마침내 끝나면… 세상이 제 호주머니는 아니겠지만, 이미 여러 가능성을 타진 중입니다. 첫째, NLnet에 추가 작업을 위한 새 보조금을 신청할 수 있고, 이에 대한 생각도 조금 있습니다. 둘째, 세상에는 신청할 수 있는 다른 보조금들도 있고, 실제로 몇몇은 이미 신청했습니다. 보조금의 문제는 불안정성입니다. 새로 6개월이나 12개월짜리 보조금을 받는다 해도, 회사가 이렇게 금방 다시 장기 휴직을 허락해 줄지는 모르겠습니다. 그렇다고 그 정도 기간을 위해 회사를 그만둘 수도 없죠. 그러니 제 미래가 보조금에 달려 있다면, 최소 2년짜리처럼 더 긴 것이어야 할 겁니다.
그 외엔, 머리 위로 금 항아리가 떨어질지도 모르겠네요. 실제로 그런 게 떨어지는 걸 본 적도 있습니다(그 항아리가 어디를 굴러다녔는지는 모르겠지만… 양날의 항아리일지도요?). 관심 있는 항아리를 아신다면 제게로 던져 주세요. 그게 아니라면, 현실은 status quo ante stipendium으로 돌아가는 것입니다. 주어진 제한된 시간 안에서 최선을 다해 Nova를 계속 개선하고, 무언가 변할 때까지 조금씩 나아갈 겁니다.
앞으로 Nova의 미래에서 흥미로운 점 몇 가지는 다음과 같습니다.
미래 얘기는 이쯤에서 마치죠. 미래는 결국 미래이고, 저는 점쟁이가 아니니까요. 금 항아리가 떨어지면 알려 드리겠습니다. 또한 보조금 작업의 세부를 다룬 글도 한두 편 더 써 보려고 합니다. 흥미로울 만한 내용이 있을 거예요. 마지막으로 하나 더 알립니다. Nova를 JavaScript 엔진으로 사용하는 Andromeda 런타임의 Dean Srebnik이 다음 주 JSConf JP에서 발표를 합니다. 도쿄에 계시다면 꼭 들어보시고, 아니라면 영상이 올라오길 기다려 주세요. 건배!