새로운 프로그래밍 언어 Valen(발렌)이 메모리 안전성 분야에서 주목할 만한 접근 방식을 제시했습니다. Rust(러스트)의 강력한 빌림 검사(borrow checker)가 제공하는 안전성을 유지하면서도, 참조 카운팅(reference counting)이나 가비지 컬렉션(garbage collection)처럼 여러 참조를 허용하는 유연성을 동시에 추구하는 '그룹 빌림(group borrowing)' 기반 검사기를 구현하고 있습니다. 이는 컴파일 시점에 해제된 데이터에 대한 참조 사용을 효과적으로 차단하면서도, 개발자가 더 자유롭게 코드를 작성할 수 있도록 돕는 것을 목표로 합니다.
Valen의 핵심은 컴파일러가 각 참조가 가리키는 '소유권 경로(ownership path)'를 추적한다는 점입니다. 객체를 변경할 때, 객체 자체가 아니라 내부 데이터를 가리키는 참조를 무효화하고 이후 사용을 오류로 처리합니다. 예를 들어, `vec.push(...)`는 벡터의 기존 원소를 가리키던 참조를 무효화하지만, 벡터 자체를 가리키는 참조는 유지하여 계속 `push` 작업을 할 수 있습니다. 또한, 함수 시그니처에 변경 가능한 경로를 명시함으로써, 전체 객체를 읽으면서 특정 내부 객체만 수정하는 등의 세밀한 제어가 가능합니다. 이는 `func step(world &World, entity in world.entities[] mut)`와 같이 `World` 전체를 읽으면서 `entities` 컬렉션 내의 특정 `entity`만 변경하도록 허용하는 방식으로 구현됩니다. Valen은 Rust와의 상호운용성(interoperability)을 위해 호출 중 데이터 접근의 유일성을 확인하는 '일시적 유일성(temporary uniqueness)' 개념도 도입했습니다.
이러한 그룹 빌림 개념은 Nick Smith(닉 스미스)가 설계했으며, 처음에는 Mojo(모조)를 염두에 두었으나, 이후 Google(구글)의 Carbon(카본), Ante(안테), Plecra(플렉라), Zeta(제타), Fang(팽) 등 여러 언어에서 채택하거나 설계에 반영하고 있습니다. Valen은 여기에 Vale(베일)의 세대별 참조(generational references)와 영역 빌림(region borrowing)을 결합하여 더욱 강력한 시스템을 구축하려 합니다. 기존의 빌림 검사가 참조가 존재하는 동안 다른 경로를 통한 변경을 제한하는 'shared-xor-mutable' 제약을 가졌다면, 그룹 빌림은 이 제약의 초점을 '해제 후 사용 방지'로 이동시켜 참조가 존재한다는 이유만으로 변경을 금지하지 않고, 변경으로 무효화된 참조를 나중에 사용하는지 검사합니다.
Valen의 접근 방식은 개발자에게 더 높은 사용 편의성과 유연성을 제공할 것으로 기대됩니다. 특히, '불변 내부의 가변 부분(Mutable-in-Immutable)'을 통해 넓은 읽기 접근과 좁은 쓰기 접근을 함께 표현할 수 있어, API 계약을 더 강하게 만들고 예상치 못한 부작용을 줄일 수 있습니다. 또한, 세밀한 변경 정보는 컴파일러 최적화에도 기여할 가능성이 있지만, 이것이 C++나 Rust 대비 무조건 더 높은 속도를 보장하는 것은 아니며, 주로 사용 편의성에 초점을 맞추고 있습니다. 궁극적으로 Valen은 컴파일 시점 검사를 통해 실행 시점 비용 없이 메모리 안전성을 달성하는 것을 목표로 하고 있습니다.