https://www.quora.com/Is-C-20-still-bad-for-Linus-Torvalds

Just a moment...

Just a moment...

www.quora.com


짧은 답변: 리누스 토르발스의 공개적인 반대는 특정 언어 버전보다는 대규모 저수준 프로젝트에서 사용되는 C++와 C++의 복잡성과 문화에 초점을 맞추고 있습니다. 2024년 5월 현재 공개된 그의 논평에는 이러한 입장이 반전되었음을 나타내는 내용이 없으며, 그는 리눅스 커널 및 유사한 프로젝트에 대해 신중한 표준과 도구를 갖춘 일반 C를 사용하는 것에 대해 여전히 강조하고 있습니다.

맥락 및 핵심 사항

  • 역사적 위치: 토르발스는 C++에 대해 여러 차례 비판해 왔습니다:
    • 언어 복잡성과 특징적인 과장,
    • 숨겨진 비용으로 인한 예측할 수 없는 성능(예외, 임시, 암시적 변환, 무거운 템플릿 메타프로그래밍),
    • 점진적 컴파일, 빌드 및 툴체인 문제,
    • 읽기 쉽고 유지 가능한 시스템 코드보다는 무거운 추상화와 불투명한 코드를 장려하는 문화.
      이러한 비판들은 C++20보다 앞서 있었고, 커널 개발자들이 C를 사용하기로 오랫동안 결정한 것에 대해 알려주었습니다.
  • 시스템 수준 코드와 관련된 C++20 변경 사항:
    • 유용한 추가 사항: 모듈(더 나은 격리 구축), 개념(표현 제약), 코루틴(비동기 프리미티브), constexpr 향상, 범위 및 향상된 템플릿 기능.
    • 위험 요소는 여전히 남아 있습니다: 템플릿 복잡성 증가, 추상화 남용 가능성, 기능이 잘못 사용될 경우 런타임 및 이진 크기의 영향, 숨겨진 비용을 피하기 위한 엄격한 코딩 표준의 필요성.
  • C++20이 토르발스의 반대 의견을 자동으로 무력화하지 않는 이유:
    • 커널의 주요 제약 조건은 엄격합니다: 결정론적 성능, 작고 예측 가능한 바이너리, 작은 ABI 표면, 최소한의 런타임 가정, 그리고 매우 보수적인 배포/백워드 호환성 요구 사항. 암묵적 비용을 도입하거나 런타임이 필요한 언어 기능(예외, RTTI, 숨겨진 파괴자, 복잡한 구성 의미)은 여전히 문제가 됩니다.
    • 툴체인과 이식성: 커널 빌드는 많은 아키텍처와 컴파일러에서 극심한 이식성과 부트스트래핑 예측 가능성을 요구합니다. 최신 언어 기능은 컴파일러 구현과 모든 지원 대상 간의 안정적인 툴체인 동작에 따라 달라지며, 이는 채택 위험이 있습니다.
    • 거버넌스와 정책: 리눅스 커널 개발 모델은 최소한의 명시적인 언어 변경과 광범위한 개발자 이해를 선호합니다. C++를 도입하면 큰 유지보수 및 검토 부담이 생기고 코딩 문화가 변화할 것입니다.
  • 시스템 프로젝트에서 최신 C++에 대한 실용적인 참고 사항:
    • 많은 진지한 시스템 프로젝트와 회사들은 엄격한 코딩 지침(예외 금지, RTTI, 핫 경로에서의 동적 할당, 템플릿/메타프로그래밍 제한, -fno 예외 활성화 등)을 적용하여 선택된 최신 C++ 기능을 성공적으로 사용합니다.
    • C++20은 신중하게 사용할 경우 보일러플레이트를 줄이고 정확성을 향상시킬 수 있습니다(더 명확한 API를 위한 개념, 컴파일 시간 계산을 위한 constexpr, 더 빠른 빌드를 위한 모듈). 이러한 장점들은 실제적이지만 커널 제약 조건에 맞는 규율이 필요합니다.
  • Torvalds / 커널 커뮤니티가 위치를 변경하려면 무엇이 필요합니까:
    • C++20의 하위 집합을 선택한 아키텍처와 컴파일러 전반에 걸친 철저한 증거는 성능, 크기, 휴대성 또는 툴체인 안정성에서 회귀 없이 사용할 수 있습니다.
    • 언어의 오용을 방지하기 위해 명확하고 시행 가능한 코딩 표준과 도구(린터, 컴파일러 플래그, 빌드-시스템 통합)를 제공합니다.
    • 유지보수 및 검토 확장성을 입증하는 커뮤니티 합의 및 단계별 제한된 파일럿 프로젝트.

결론

토르발스의 반대 의견은 특정 C++ 언어 버전에 국한되지 않고 주로 건축적, 문화적, 실용적입니다. C++20은 과거의 몇 가지 문제점을 줄였지만, 새로운 기능이 리눅스 커널과 토발즈를 C에 계속 의존하게 하는 핵심적인 문제를 해결하지는 못했습니다. 더 엄격한 규칙과 도구를 수용할 수 있는 프로젝트의 경우 신중하게 선택한 C++20 기능이 유용할 수 있으며, 커널의 보수적이고 휴대성이 뛰어나며 저수준 환경에서는 실질적인 장벽과 위험이 여전히 상당합니다.