리눅스 토발즈(Linus Torvalds)는 리눅스(Linux)의 창시자이자 오랜 리더로, C++에 대한 강한 비판으로도 유명합니다. 그는 리눅스 커널 개발에서 C++ 사용을 단호히 거부하며, 기술적·철학적 이유를 들어 이를 뒷받침해 왔습니다.
이 글에서는 리눅스가 C++을 반대하는 주요 논거를 살펴보고, 그 타당성을 검토하며, 개발자들이 그의 입장에서 배울 수 있는 점을 정리하겠습니다.
리눅스가 C++을 거부하는 이유
리눅스의 C++ 비판은 커널 개발의 특수한 요구사항과 그의 오랜 경험에서 비롯됩니다.
아래는 그가 커널 메일링 리스트와 공개 발언에서 밝힌 핵심 주장들입니다.
1️⃣ C++의 예외 처리 (Exception Handling)
🔹 주장: C++의 예외 처리는 "근본적으로 잘못된 것"이며, 커널 개발에 부적합하다고 비판합니다.
🔹 이유:
- C는 오류를 반환값으로 처리하지만, C++은 예외를 사용하며 예측 불가능한 동작을 초래할 수 있습니다.
- 커널처럼 안정성과 예측 가능성이 최우선인 환경에서는 부적절합니다.
- 3천만 줄이 넘는 리눅스 커널 코드에서 예외가 도입되면 디버깅이 어렵고, 안정성이 흔들릴 수 있습니다.
2️⃣ C++ 컴파일러의 메모리 관리
🔹 주장: RAII(자원 획득은 초기화) 등 C++의 메모리 자동 관리 기능은 컴파일러 뒤에 숨겨져 있어, 정밀한 메모리 제어를 방해한다고 봅니다.
🔹 이유:
- 커널은 메모리 관리를 극도로 최적화해야 하며, 자동화된 기능은 효율성을 떨어뜨릴 위험이 있습니다.
- 메모리 할당과 해제를 완전히 예측 가능해야 하므로, 자동화보다는 수동 관리가 필요합니다.
3️⃣ 객체 지향 프로그래밍 (OOP): C++ vs. C
🔹 주장: 커널에서는 C++의 객체 지향 기능이 필요 없으며, C에서도 구조체와 함수 포인터만으로 충분하다고 주장합니다.
🔹 이유:
- 객체 지향은 모듈성을 높이지만, 커널에서는 성능과 안정성이 더 중요합니다.
- C++의 OOP 기능을 도입하면 추가적인 오버헤드가 발생할 수 있습니다.
4️⃣ C++ 라이브러리와 의존성 문제
🔹 주장: STL이나 Boost 같은 C++ 라이브러리는 이식성과 안정성에 문제가 있으며, 외부 의존성이 보안 취약점을 유발할 수 있다고 경고합니다.
🔹 이유:
- 리눅스 커널은 철저한 안정성과 이식성이 필요합니다.
- 외부 라이브러리는 예상치 못한 보안 문제를 일으킬 가능성이 있습니다.
5️⃣ 비효율적이고 과도한 추상화
🔹 주장: C++의 높은 추상화 수준이 비효율적인 코드를 만들고, 최적화를 어렵게 한다고 비판합니다.
🔹 이유:
- 추상화는 성능 병목을 숨길 가능성이 큽니다.
- 대규모 커널 코드에서는 미세한 성능 저하도 치명적일 수 있습니다.
6️⃣ 결국 C처럼 쓰게 된다
🔹 주장: 효율적인 C++ 코드를 작성하려면 결국 C 스타일로 코드를 제한하게 되므로 C++을 사용할 이유가 없다고 주장합니다.
🔹 이유:
- C는 단순함과 성능 최적화에 초점을 맞추고 있습니다.
- C++의 많은 기능이 제한되면, 결국 C처럼 사용하는 것이나 다름없습니다.
🚀 C++ 거부, 과연 정당한가?
리눅스의 C++ 거부는 커널 개발 맥락에서는 정당하지만, 모든 소프트웨어 개발에 적용되는 것은 아닙니다.
✅ 커널 개발에서는 C++이 성능과 안정성을 해칠 위험이 있어 C가 더 적합합니다.
✅ 일반 애플리케이션 개발에서는 C++이 강력한 도구가 될 수 있습니다.
📌 개발자들이 배울 점
✔ 상황에 맞는 도구 선택: 성능과 안정성이 중요한 시스템에서는 단순한 도구가 유리할 수 있습니다.
✔ 의존성 관리: 외부 라이브러리를 사용할 때 장기적인 유지보수와 보안 문제를 고려해야 합니다.
✔ 안정성 우선: 신뢰성이 중요한 시스템에서는 안정성을 확보하는 것이 최우선입니다.
🎯 마무리
리눅스 커널은 수십억 기기에서 작동하는 중요한 소프트웨어이며, 그 안정성은 타협할 수 없습니다.
C++은 강력한 언어이지만, 커널 개발의 높은 기준에는 맞지 않는다는 것이 리눅스의 결론입니다.
📌 결국, 도구는 "어떤 문제를 해결할 것인가"에 맞춰 선택해야 합니다.