GN⁺: C++의 두 파벌
(herecomesthemoon.net)- 방언(Dialect) 없는 단일 C++의 꿈은 이미 오래전에 사라진 것으로 보임
- Reddit와 그 오렌지색 웹사이트(HN), 그리고 공식 C++ 표준 위원회 회의에서 C++의 미래에 대한 많은 논쟁이 있음
C++의 현재 상태
- C++의 진화 작업 그룹(EWG)은 P3466 R0를 채택하기로 합의함.
- ABI(응용 프로그램 이진 인터페이스) 중단 없이 C 및 이전 C++과의 링크 호환성을 유지함.
- '바이럴 주석'을 사용하지 않음.
- ABI 중단과 제로 오버헤드 원칙이라는 상충되는 목표를 고수함.
- 미국 정부는 C++ 사용을 중단하도록 권고함.
- CISA, NSA, 백악관 등 여러 기관이 메모리 안전하지 않은 언어 사용에 대한 경고를 발표함.
- 대형 기술 기업들이 Rust를 채택하고 있음.
- Microsoft, Google, AWS 등이 Rust를 사용하고 있음.
- Google은 C++/Rust 상호 운영 툴까지 개발
- C++ 커뮤니티 내 내부 갈등
- Herb Sutter가 Microsoft를 떠나고 MSVC가 C++23 기능 구현에 느리다는 소식이 있음.
- Google은 C++ 개발 프로세스 참여를 줄이고 자체 C++ 후속 언어를 개발 중임.
- 기존 C++ 표준 위원회 프로세스에 대한 신뢰 부족
- 모듈 기능은 여전히 미완성 상태
- '안전 프로파일(‘Safety Profiles’)'이 이상한 상태에 있음
C++의 두 문화
-
현대적이고 자동화된 도구 사용 그룹
- Google과 같은 대형 기술 기업들이 주요 예
- 최신 C++ 표준(C++17 이상)을 사용하며, 자동화된 빌드 및 테스트 도구 지원
- 코드 품질 유지에 투자하며 지속적으로 코드베이스를 현대화
-
레거시 C++ 그룹
- 오래된 환경과 도구에서 운영되는 코드베이스
- 소스 코드 없이 운영되거나 빌드 시스템이 구식
- 유지보수 비용이 높고 현대화의 장벽이 큼
- 주요 차이점은 도구와 프로세스
- 현대 C++ 그룹은 통합 빌드 시스템과 정적 분석기, 포매터, 린터 등 도구에 의존
- 레거시 그룹은 이러한 도구와 프로세스 부재로 인해 운영 효율성이 낮음
결과 및 영향
-
안전 프로파일
- 기존 레거시 코드의 변경 없이 안전성을 강화하려는 목적
- 현대적 C++의 요구보다는 기존 코드 유지에 초점
-
모듈
- 헤더 파일을 모듈로 간단히 가져올 수 있도록 설계
- 레거시 코드와의 호환성을 고려해 설계됨
-
C++ 커뮤니티의 분열
- 현대와 레거시 그룹 간의 요구사항 불일치로 커뮤니티 내 갈등 심화
- C++ 표준 위원회의 보수적 접근이 이러한 갈등을 완화하려는 시도로 보임
대안적 관점
- Safe C++ 같은 대안적인 아이디어는 커뮤니티 내에서 환영받지 못하고 있음
- 표준 위원회의 일부 멤버가 개인적인 미적 기준을 고수하며 변화에 저항하는 경우가 있다는 비판 존재
Rust 는 gui 개발 생태계가 아직 없어서, 채택하질 못하고 있긴 한데요
Rust를 사용하는 괜찮은 gui 프레임워크가 나와야할텐데...
러스트가 C++를 대체할 수 있는지는 잘 모르겠지만
신규 C++ 프로젝트가 거의 보이지 않는 것은 사실이죠...
C++ 위원회는 탈태보다 본래의 가치를 더 중시하는 방향이 옳다고 정한 듯 하네요.
Hacker News 의견
-
Google의 C++ 코드는 종종 최신 버전에서 작동하지 않으며, 개발자들이 이를 수정할 의지가 없는 경우가 많음. 이는 Google의 코드가 오래된 것과 현대적인 것 사이의 중간 지점에 머물러 있기 때문임
- Google의 C++ 코드는 상태 기계와 수동 약한 포인터로 인해 메모리 손상이 발생할 수 있음
- Google이 C++ 생태계를 떠나는 것을 긍정적으로 봄
- Rust 생태계에 대한 Google의 관심이 긍정적이지 않을 것이라고 생각함
-
C++ 표준 작업자들에게 현재의 C++ 방향성을 지지하며, C++의 미래에 대해 온라인에서 나오는 소음은 무시하라고 조언함
- Rust를 사용하여 정적 수명 검사를 원하는 사람들에게 Rust를 사용하라고 권장함
- 정부 계약자라면 Rust를 사용하라고 제안함
- 기존의 C++ 개발 프로세스가 잘 작동하고 있다고 주장함
-
C++를 사용하는 유일한 집단은 리팩토링하기에는 너무 큰 레거시 코드베이스를 가진 집단일 것이라고 주장함
- WG21에 대한 신뢰를 잃은 다른 집단은 새로운 언어로 이동하고 있음
- Herb Sutter가 C++에 수명 주석을 추가하는 것이 다른 언어로의 "출구 램프"를 만들 것이라고 언급함
-
Rust의 에디션 시스템이 매우 잘 작동한다고 평가함
- C++에도 이러한 시스템이 도입된다면, 모듈 경계에 제한이 있을 수 있지만 두 진영이 모두 만족할 수 있는 방법이 될 수 있다고 제안함
-
Herb Sutter가 Microsoft를 떠난다는 소식이 Microsoft에 좋지 않은 영향을 미칠 것이라고 우려함
- Herb가 C++ 표준 채택을 주도하고 더 나은 미래 비전을 위해 노력했다고 평가함
- Microsoft의 제안이었던 std::span이 범위 검사를 제외하고 채택된 것을 언급하며, Herb의 노력이 필요했다고 주장함
-
자동화된 테스트가 두 진영을 구분하는 주요 요소라고 강조함
- 레거시 C++ 앱에서 자동화된 테스트가 없으면 코드 변경이 앱을 손상시킬 위험이 있다고 설명함
- C++의 특성상 무해해 보이는 코드 변경도 문제를 일으킬 수 있다고 경고함
-
C++의 매력을 떨어뜨린 주요 요인은 모듈의 부재라고 주장함
- 모듈이 있었다면 C++ 커뮤니티가 형성될 수 있었을 것이라고 평가함
-
Herb Sutter는 타협을 이끌어내는 데 능숙했지만, Google은 자신의 의제를 밀어붙였다고 비교함
-
대규모 코드베이스를 가진 고객들은 엄격한 규칙을 만족시키기 위해 코드의 1%도 변경하지 않으려 한다고 언급함
- 많은 회사들이 새로운 표준으로 업그레이드하는 데 시간을 투자하고 있다고 주장함
-
Python과 Javascript/Node/Typescript에도 여러 파벌이 존재한다고 설명함
- Rust는 이러한 파벌을 피하려고 했지만, 학습 곡선이 높아졌다고 평가함
- Go는 파벌을 방지하고 널리 채택되기 위한 시도를 했지만, 제네릭을 도입해야 했다고 언급함