C++ 창시자 비야네 스트롭스트룹이 ‘Profiles’ 제안으로 메모리 안전성 시대에 C++의 생존을 도모하는 과정과, 그로 인해 커뮤니티가 겪는 분열을 다룬다.
거인의 유산을 지키기 위한 싸움을 지켜보는 이야기를 해보겠다. 1979년에 C++를 세상에 내놓은 74세의 덴마크 컴퓨터 과학자, 비야네 스트롭스트룹(Bjarne Stroustrup)은 지금 어쩌면 커리어에서 가장 중대한 전투에 발이 묶여 있다. 상대는 Rust 전도사들이나 정부 규제 당국만은 아니다—물론 그들도 판에 껴 있지만—그보다 더 큰 적은, 메모리 안전성 편집증의 시대에 그의 언어가 “리스크”가 되어버렸다는 인식이다.
2013년의 스트롭스트룹
Profiles 제안은 단순한 또 하나의 C++ 진화가 아니다. 이는 애초에 안전성을 위해 설계되지 않은 언어에 안전성을 ‘레트로핏’(사후 장착)하려는 스트롭스트룹의 시도다. 그리고 그 전개 양상은? 내가 C++와 함께 일해 온 30년 동안 본 어떤 것보다도 C++ 커뮤니티를 산산조각 내고 있다.
스트롭스트룹이 왜 Profiles를 그렇게 강하게 밀어붙이는지 이해하고 싶다면, 타임라인을 보라. 2015년, 그가 허브 서터(Herb Sutter)와 함께 CppCon에서 C++ Core Guidelines를 공개했을 때만 해도 안전성 논의는 아직 학술적이었다. HFT(초고빈도 매매) 업계에 있던 우리는 메모리 손상보다는 나노초 단위 지연시간이 더 걱정이었다. 그 가이드라인은 생존 전술이 아니라 모범 사례로 포지셔닝되어 있었다.
하지만 2022년 무렵 무언가가 바뀌었다. NSA가 메모리-비안전 언어에 대해 목소리를 내기 시작했다. 이어서 CISA도 가세했다. 2024년 2월이 되자 백악관 자체가 메모리 안전 프로그래밍을 촉구했다. 갑자기 C++는 글로벌 인프라의 척추에서 보안 세계의 공공의 적 1호로 추락했다.
2024년 2월의 그의 문서 P2739에서 드러난 스트롭스트룹의 반응은 의미심장했다. “이는 전례 없는 C++에 대한 심각한 공격들에 부분적으로 대응하기 위한 긴급 행동 촉구(call to urgent action)다.” 45년 동안 이 언어를 쌓아 올린 사람이, 정부 기관들이 사실상 “목적에 부적합”하다고 선언하는 것을 지켜보고 있다. 그게 안 아프겠나?
대부분이 놓치는 역사적 맥락이 있다. 스트롭스트룹은 시작부터 안전성을 고민해 왔다. 1991년의 역사 논문에서 그는 C++가 의도적으로 C의 비안전 기능을 유지한 이유를 이렇게 썼다. “그런 검사를 보장하려면, 실행 시간과 공간 효율성에서 C가 큰 이점을 갖게 되는 것을 피할 수 없었기 때문이다.” 성능을 안전성보다 우선한 결정은 무지에서 나온 게 아니라, 시스템 프로그래밍의 한 시대를 규정한 계산된 트레이드오프였다.
그렇다면 Profiles는 정확히 무엇인가? 구현 디테일에 악마가 숨어 있으니, 메커니즘을 따라가 보자.
Profiles는 스트롭스트룹이 “subset-of-superset(상위집합의 부분집합)” 전략이라고 부르는 방식으로 작동한다. 먼저 몇 가지 라이브러리 추상화(가이드라인 지원 라이브러리, GSL)를 통해 C++를 확장한다. 그런 다음—여기가 논쟁의 핵심인데—특정 컨텍스트 내에서 어떤 언어 기능들을 금지한다. 그 결과 스트롭스트룹이 다소 과장되게 표현하자면 **“스테로이드를 맞은 C++”**이 된다. 좋은 부분은 증폭되고, 위험한 부분은 억제된다.
초기 제안은 세 가지 핵심 프로파일에 초점을 맞춘다.
타입(type) 프로파일은 초기화되지 않은 변수, 위험한 캐스트, union 남용을 제거한다. 바운즈(bounds) 프로파일은 배열 범위 초과와 무분별한 포인터 산술을 막는다. 라이프타임(lifetime) 프로파일은—가장 야심찬 목표로—정적 분석으로 객체의 수명을 추적해 use-after-free 버그를 방지하려 한다.
이게 단순히 코딩 가이드라인을 따르는 것과 뭐가 다를까? Profiles는 “권고”가 아니라 컴파일러가 강제하도록 설계되었다. 코드에 프로파일을 표시하면, 컴파일러가 집행자가 되어 해당 프로파일의 보장을 위반하는 코드를 컴파일 자체를 거부한다.
GSL은 조연 역할을 한다. span, not_null, owner 같은 타입들이 안전한 패턴을 더 인체공학적으로(쓰기 쉽게) 만들어 준다. 그런데 여기서 흥미로운 점: 스트롭스트룹은 이것이 “100% ISO 표준 C++”라고 주장한다. 새로운 언어가 아니라, 제약과 라이브러리 지원일 뿐이라는 것이다.
이제 드라마로 들어가 보자. 스트롭스트룹이 Profiles를 밀어붙이던 동안, 션 백스터(Sean Baxter)라는 뛰어난 엔지니어는 훨씬 급진적인 무언가를 만들고 있었다. 백스터는 혼자 힘으로 Circle 컴파일러를 밑바닥부터 만든 ‘미친 천재’인데, 그는 Safe C++(P3390)를 제안했다—요컨대 Rust의 차용 검사기(borrow checker)를 C++에 접붙이는 접근이다.