C++의 강력한 성능과 폭넓은 활용성에도 불구하고, 메모리 관리의 복잡성으로 인한 안전성 문제는 늘 개발자들의 고민이었습니다. 이러한 문제를 해결하고자 러스트(Rust)는 엄격한 소유권(ownership) 및 빌림(borrowing) 모델을 통해 메모리 안전성을 보장하며 주목받았습니다. 울트라CPP(UltraCPP)는 바로 이 두 언어의 장점을 결합하려는 야심 찬 시도입니다. 즉, C++와 유사한 문법을 유지하면서도 러스트 수준의 메모리 안전성을 제공하는 새로운 시스템 언어를 목표로 하고 있습니다.
울트라CPP의 개발 과정은 순탄치 않았습니다. 초기에는 C++의 포인터(T*)와 참조(T&) 문법에 러스트의 Box<T>, 불변 빌림(immutable borrow), 가변 빌림(mutable borrow) 개념을 단순히 매핑하려 했습니다. 그러나 C++ 문법이 가진 고유한 의미와 러스트의 안전성 모델이 충돌하면서 문제가 발생했습니다. 예를 들어, C++에서 T*는 소유권과 일반 포인터의 역할을 동시에 수행할 수 있는데, 이를 러스트의 소유권 개념에 일괄적으로 적용하자 '스택 변수를 포인터가 해제하는가?'와 같은 모순적인 상황에 직면한 것입니다. 결국 개발팀은 기존 모델이 C++에 적합하지 않다는 결론에 도달했고, 현재는 소유권과 수정 권한을 명확히 분리하는 새로운 접근 방식을 채택했습니다.
이러한 전환은 단순히 문법을 바꾸는 것을 넘어, 언어 설계 철학의 근본적인 변화를 의미합니다. 이제 울트라CPP에서는 '누가 리소스를 해제할 책임이 있는가?'(소유권)와 '누가 지금 값을 쓸 수 있는가?'(수정 권한)라는 두 가지 질문을 별도로 다룹니다. T*는 기본적으로 소유권을 가지며 수정 권한도 부여되지만, 이 두 상태는 독립적으로 추적됩니다. 이를 통해 비소유자도 리소스 해제 책임 없이 수정 권한만 받을 수 있게 되어, C++의 유연성을 유지하면서도 러스트와 같은 수준의 안전성을 확보할 수 있는 가능성을 열었습니다. 울트라CPP의 이러한 시도는 기존 언어의 한계를 극복하고 더 안전하고 효율적인 시스템 개발 환경을 제공하려는 중요한 진전으로 평가됩니다.