C++에 Contracts 기능이 표준으로 채택된 것이 아쉬움
이미 복잡성이 한계에 도달한 언어에 또 다른 복잡성을 더하는 느낌임
Bjarne Stroustrup도 이 기능을 “불완전하고 위원회식으로 부풀려진 설계” 라고 표현했음
기능 자체의 위험 요소(footgun)도 많아 정당성이 부족하다고 생각함
90년대 초에 C++에 Contracts 확장을 직접 구현했었음
하지만 아무도 관심을 보이지 않았음
관련 자료는 여기에 있음
많은 사람들이 “C++은 너무 복잡하다”고 말하지만, 각자 떠올리는 복잡한 기능이 다 다르다는 점이 흥미로움
C++의 Contracts 설계가 잘못됐을 수도 있지만, 개념 자체는 언어 발전에 꼭 필요하다고 생각함
Ada나 Rust처럼 정형 검증(proof assistant) 과 통합되어 테스트 대신 정적 검증을 가능하게 하는 핵심 요소임
Ada Spark를 참고할 만함
Contracts에 대한 문서가 너무 혼란스러움 cppreference 문서의 첫 예시는 오히려 상태를 변경하는 예외적인 케이스임
문법도 직관적이지 않음
예를 들어 asserts_pre(num >= 0) 같은 형태가 pre(num >= 0)보다 훨씬 명확했을 것임
하지만 간결함이 우선된 듯함
Contracts는 이미 C++ 개발자들이 비공식적으로 해오던 일을 표준화한 것임
복잡성을 더한다기보다는, 각자 구현하던 것을 통합해 상호운용성을 높이는 방향임
오히려 Reflection 같은 기능이 더 복잡성을 추가한다고 봄
C#, Java 개발자로서 궁금한 점이 있음
C++로 요즘 어떤 종류의 애플리케이션을 만드는지 알고 싶음
실제로 어떤 문제를 해결하는지 잘 들을 기회가 없음
초기화되지 않은 변수의 “erroneous behavior” 재정의가 흥미로움 표준 문서에 따르면 런타임 비용이 생기며, [[indeterminate]] 속성을 사용하면 다시 undefined behavior로 돌릴 수 있음
int x [[indeterminate]];
std::cin >> x;
D 언어는 모든 변수를 자동으로 초기화함
정말 초기화하지 않으려면 int x = void;처럼 명시적으로 써야 함
실수로 그렇게 작성할 일은 거의 없음
문서를 빠르게 읽어보니 두 가지가 놀라움
“독립적으로 결정된 값”이란 게 정확히 무엇을 의미하는지 불분명함 — 0으로 채우는 건지, 메모리의 임의 값인지?
[[indeterminate]]가 왜 다시 UB(Undefined Behavior) 로 돌아가는지 의문임
아마도 이 기능은 컴파일러 플래그로 제어할 수 있을 듯함
일부 프로젝트는 여전히 수동 초기화를 선호할 것임
나중에 코드에서 [[indeterminate]]를 보게 될 사람을 생각하면 끔찍함
결국 의미를 찾아보느라 시간을 낭비하거나, 나중엔 그냥 무시하게 될 것임
Rust에서 제너릭과 트레잇이 너무 많아 코드 읽기 힘들었던 경험이 떠오름
90년대 MS의 C++ 팀에서 일했었음
그때는 RTTI가 C++이 가질 수 있는 반사(reflection) 시스템의 한계라고 생각했음
지금의 발전이 놀라움
Croydon에서 회의를 열고, 서명할 때까지 아무도 못 나가게 한 건 꽤 교묘한 전략이었음
다시는 거기서 일하고 싶지 않음
GCC와 Clang의 C++26 구현 상황이 궁금했음
GCC는 이미 reflection과 contracts를 trunk에 병합했지만, Clang은 어느 정도인지 알고 싶음
Bloomberg가 Clang용 reflection 구현을 여기에 공개했음
이미 Compiler Explorer에서도 사용 가능하며, simdjson에 reflection을 추가하는 데 활용됨
이번 표준의 모듈 시스템 변경이 실제로 더 널리 쓰이게 만들지 의문임
C++ WG가 한 번쯤은 새 기능보다 모듈과 패키징에 집중해야 한다고 생각함
Rust의 Cargo가 C++을 압도하는 이유가 바로 그 부분임 cargo add 한 줄로 의존성을 추가할 수 없다는 점이 새 세대를 멀어지게 함
대부분의 컴파일러가 아직 header unit을 지원하지 않음
Clang의 2단계 컴파일 모델을 CMake가 채택하면 빌드 속도가 크게 개선될 것이고,
그때야 비로소 모듈이 본격적으로 채택될 것임
모듈은 이미 실패한 아이디어라고 생각함
주류로 자리 잡을 가능성이 거의 없음
솔직히 이제는 C++ 개발을 멈췄으면 함
새로운 기능이 너무 많아 따라가기 힘듦
빌드 시스템도 엉망이고, 헤더 파일은 이제 사라져야 함
주제와는 다르지만, “London Croydon”이라는 표현이 이상하게 들림
보통 “Croydon, London”이라고 하지 않나?
“London Gatwick Airport”처럼 일반적인 역순 표현도 존재함
여행 계획을 세울 때는 큰 지역부터 작은 지역 순으로 읽는 게 더 자연스러움
사람마다 구체적인 것부터 말하느냐, 일반적인 것부터 말하느냐가 다름
“London, Croydon”이라고 쓴 이유는 아마도 “런던에서 회의했다”는 인상을 주기 위해서일 것임
“Croydon, London”은 “런던 외곽의 Croydon에서 했다”는 느낌이라 덜 멋져 보임 — 농담 섞인 해석임
“언어 폐기 직전에 맞춰 나왔다”는 식의 냉소적인 반응도 있음
C++29가 품질 개선과 기존 기능 다듬기에만 집중한다면 커뮤니티도 크게 불만 없을 것 같음
Hacker News 의견들
C++에 Contracts 기능이 표준으로 채택된 것이 아쉬움
이미 복잡성이 한계에 도달한 언어에 또 다른 복잡성을 더하는 느낌임
Bjarne Stroustrup도 이 기능을 “불완전하고 위원회식으로 부풀려진 설계” 라고 표현했음
기능 자체의 위험 요소(footgun)도 많아 정당성이 부족하다고 생각함
하지만 아무도 관심을 보이지 않았음
관련 자료는 여기에 있음
Ada나 Rust처럼 정형 검증(proof assistant) 과 통합되어 테스트 대신 정적 검증을 가능하게 하는 핵심 요소임
Ada Spark를 참고할 만함
cppreference 문서의 첫 예시는 오히려 상태를 변경하는 예외적인 케이스임
문법도 직관적이지 않음
예를 들어
asserts_pre(num >= 0)같은 형태가pre(num >= 0)보다 훨씬 명확했을 것임하지만 간결함이 우선된 듯함
복잡성을 더한다기보다는, 각자 구현하던 것을 통합해 상호운용성을 높이는 방향임
오히려 Reflection 같은 기능이 더 복잡성을 추가한다고 봄
C#, Java 개발자로서 궁금한 점이 있음
C++로 요즘 어떤 종류의 애플리케이션을 만드는지 알고 싶음
실제로 어떤 문제를 해결하는지 잘 들을 기회가 없음
초기화되지 않은 변수의 “erroneous behavior” 재정의가 흥미로움
표준 문서에 따르면 런타임 비용이 생기며,
[[indeterminate]]속성을 사용하면 다시 undefined behavior로 돌릴 수 있음정말 초기화하지 않으려면
int x = void;처럼 명시적으로 써야 함실수로 그렇게 작성할 일은 거의 없음
[[indeterminate]]가 왜 다시 UB(Undefined Behavior) 로 돌아가는지 의문임일부 프로젝트는 여전히 수동 초기화를 선호할 것임
[[indeterminate]]를 보게 될 사람을 생각하면 끔찍함결국 의미를 찾아보느라 시간을 낭비하거나, 나중엔 그냥 무시하게 될 것임
Rust에서 제너릭과 트레잇이 너무 많아 코드 읽기 힘들었던 경험이 떠오름
90년대 MS의 C++ 팀에서 일했었음
그때는 RTTI가 C++이 가질 수 있는 반사(reflection) 시스템의 한계라고 생각했음
지금의 발전이 놀라움
Croydon에서 회의를 열고, 서명할 때까지 아무도 못 나가게 한 건 꽤 교묘한 전략이었음
다시는 거기서 일하고 싶지 않음
GCC와 Clang의 C++26 구현 상황이 궁금했음
GCC는 이미 reflection과 contracts를 trunk에 병합했지만, Clang은 어느 정도인지 알고 싶음
GCC 페이지에는 “yes”로 표시되어 있음
이미 Compiler Explorer에서도 사용 가능하며, simdjson에 reflection을 추가하는 데 활용됨
이번 표준의 모듈 시스템 변경이 실제로 더 널리 쓰이게 만들지 의문임
Rust의 Cargo가 C++을 압도하는 이유가 바로 그 부분임
cargo add한 줄로 의존성을 추가할 수 없다는 점이 새 세대를 멀어지게 함Clang의 2단계 컴파일 모델을 CMake가 채택하면 빌드 속도가 크게 개선될 것이고,
그때야 비로소 모듈이 본격적으로 채택될 것임
주류로 자리 잡을 가능성이 거의 없음
새로운 기능이 너무 많아 따라가기 힘듦
빌드 시스템도 엉망이고, 헤더 파일은 이제 사라져야 함
주제와는 다르지만, “London Croydon”이라는 표현이 이상하게 들림
보통 “Croydon, London”이라고 하지 않나?
여행 계획을 세울 때는 큰 지역부터 작은 지역 순으로 읽는 게 더 자연스러움
“London, Croydon”이라고 쓴 이유는 아마도 “런던에서 회의했다”는 인상을 주기 위해서일 것임
“Croydon, London”은 “런던 외곽의 Croydon에서 했다”는 느낌이라 덜 멋져 보임 — 농담 섞인 해석임
“언어 폐기 직전에 맞춰 나왔다”는 식의 냉소적인 반응도 있음
C++29가 품질 개선과 기존 기능 다듬기에만 집중한다면 커뮤니티도 크게 불만 없을 것 같음