C++: 다큐멘터리: 세계에서 가장 중대한 프로그래밍 언어
1 hour ago
1
- Bell Labs의 시작부터 전 세계 채택과 현재 성장세까지를 한 편으로 정리한 C++ 40년사 다큐멘터리로 C++ 역사와 표준화, 도구 생태계에 참여한 인물들이 출연
- C++ 는 Bjarne Stroustrup이 Bell Labs에서 C의 하드웨어 제어력과 Simula의 객체지향 추상화를 결합하려 만든 C with Classes에서 출발했고, 대규모 시스템을 위한 효율적 추상화 언어로 커짐
- 초기 구현 CFront는 C++를 C 코드로 변환해 기존 C 인프라와 라이브러리를 그대로 쓰게 했고, 1983년 이후 사용자가 늘면서 호환성이 핵심 과제로 떠오름
- IBM, HP, Sun의 압박으로 시작된 ANSI/ISO 표준화는 벤더별 구현 분열을 막았고, 1997년 표준에는 namespace, exception, template, STL이 포함됨
- 2000년대 초 Java와 C#, 닷컴 붕괴, 빠른 CPU 성능 증가로 C++ winter가 왔지만, 2004년경 주파수 스케일링이 멈추고 병렬성이 중요해지며 C++11이 르네상스를 만듦
- 오늘날 C++는 CERN, 게임, 금융, CUDA 기반 AI·HPC, 임베디드 시스템 등에서 쓰이며, 메모리 안전성, 복잡성, 표준위원회 규모, 자금 부족이 주요 과제로 남아 있음
Bell Labs에서 시작된 C with Classes
- C++는 40년이 넘은 언어이며, 처음 만들어질 당시에는 에디터, 구문 강조, 코드 탐색, 자동 완성, 리팩터링 같은 도구가 없었고 많은 개발자가 BASIC이나 칩마다 다른 어셈블리 언어를 사용했음
- 더 크고 복잡한 프로그램이 필요해지던 시기에 Bjarne Stroustrup은 Bell Labs에서 분산 시스템을 만들려 했고, 장치 드라이버, 네트워크 인터페이스, 메모리 관리자, 프로세스 같은 요소를 다루려면 저수준 언어가 필요했음
- C는 하드웨어를 완전히 제어할 수 있고 시스템 프로그래밍에 적합했지만, 프로그램이 커질수록 모듈, 통신 채널, 프로토콜 같은 구조를 표현하기에는 부족했음
- Stroustrup은 Cambridge에서 사용한 Simula의 강한 타입 안전성, 사용자 정의 타입, 클래스, 클래스 계층을 좋아했지만 Simula가 너무 느리고 메모리를 많이 쓴다고 봤음
- 그래서 Simula의 기본 기능을 C에 넣는 방식으로 C with Classes를 만들었고, 이후 거의 40년 동안 C++가 Simula와 C가 할 수 있는 일을 모두 하게 만드는 방향으로 발전시킴
CFront, 이름, 초기 확산
- C with Classes는 처음에 C 전처리기 형태로 만들어졌고, 다른 사람들이 쓰기 시작하면서 Stroustrup은 C와의 차이가 충분하지 않다고 판단해 1년 동안 컴파일러와 언어 개선에 투자함
- CFront는 전통적인 백엔드로 기계어를 만들지 않고 C 코드로 컴파일했으며, C++ 사용자가 새로운 인프라나 라이브러리를 전부 도입하지 않고 기존 C 환경을 유지할 수 있게 했음
- CFront는 1983년에 만들어졌고, 어휘 분석, 구문 분석, 타입 검사, 트리 표현 생성, 트리 최적화를 수행하는 실제 컴파일러였음
- C++라는 이름은 C의 ++ 연산자가 증가를 뜻한다는 점에서 나왔고, 의미상으로는 ++C가 맞지만 색인과 참조 편의를 위해 C++가 됨
- AT&T는 컴퓨터와 소프트웨어 사업에 뛰어들며 C++ 컴파일러 판매를 시도했지만 하드웨어가 충분히 팔리지 않았고, 초기 C++ 구현은 테이프 비용과 낮은 상업 사용료 수준으로 사실상 널리 배포될 수 있었음
- Stroustrup은 한동안 문서, 컴파일러, 언어 구현, 헬프데스크를 모두 맡았고, AT&T의 투자는 매우 작았으며 한 번은 범용 프로그래밍 언어 보급에 3년간 5,000달러가 배정됨
- CFront 2.0에서는 다중 상속 처리 버그가 발견됐고, 이미 약속한 핵심 기능이 현장에 나가면 고칠 수 없는 방식으로 깨질 수 있어 며칠 안에 수정본을 만들어 배포함
- 같은 릴리스 번호를 유지해야 했기 때문에 버전은 2.0.1 대신 2.0.0으로 배포됐고, 호환성은 농담처럼 “C word”라고 불릴 만큼 지배적인 요구가 됨
표준화와 STL
- C++는 AT&T 내부 생산성을 높이는 도구였지만, 단일 기업에 갇힌 언어로는 성공할 수 없었고 외부 개발자와 라이브러리 생태계가 필요했음
- 웹 이전에는 Usenet의 comp.lang.c++ 같은 그룹과 Byte 같은 컴퓨터 잡지가 정보 확산 경로였고, Stroustrup은 1980년대 후반 여러 회사와 조직에서 강연하며 언어를 알림
- 광고 캠페인이나 강력한 후원자 없이 사용이 늘었지만, Borland, Microsoft, IBM, Sun 등 여러 벤더가 각자 C++ 구현과 template 설계를 만들면서 코드 호환성이 심각하게 갈라짐
- IBM, HP, Sun을 대표한 사람들이 Stroustrup에게 ANSI 규칙 아래 C++ 표준화를 요구했고, Stroustrup은 너무 이르다고 봤지만 결국 1년 뒤 표준화 기반 문서를 만들기로 함
- Annotated Reference Manual, 즉 ARM은 표준화 입력 문서가 됐고, template, exception, namespace 같은 기능을 포함하는 방향으로 이어짐
- 표준은 C++ 코드를 쓰는 사람과 C++ 구현 사이의 계약으로 정의됐고, 여러 벤더가 같은 코드를 같은 의미로 받아들이게 만드는 장치가 됨
- Alexander Stepanov가 만든 STL은 알고리듬을 적용 가능한 모든 자료구조에서 동작하게 하고, 자료구조들이 서로 데이터를 채울 수 있게 하는 것을 중심 아이디어로 삼음
- STL 이전에는 각자 array, list, tree, container, 알고리듬 방식을 만들었지만, STL은 알고리듬과 컨테이너를 정의하는 하나의 강력한 방식을 제시함
- STL 제안은 표준화 일정상 너무 늦고 너무 크다는 반대를 받았고 Microsoft 등 주요 회사도 반대했지만, 발표와 논의를 거쳐 위원회 약 80%가 찬성하면서 표준에 들어감
- C++는 1997년 11월 표준화됐고, namespace, exception, template, Standard Template Library가 주요 기본 기능으로 추가됨
- LLVM은 이 표준화 이후 시작됐기 때문에 이전 코드 마이그레이션 부담 없이 새 기능을 의도된 방식으로 사용할 수 있었음
겨울과 C++11 르네상스
- C++는 1990년대에 CERN 같은 고에너지 물리 소프트웨어와 컴퓨팅 분야에서 Fortran 중심 개발을 바꾸는 언어가 됐고, 기존 라이브러리와 코드가 C++로 포팅되거나 C++에 맞게 다시 만들어짐
- 게임 개발에서는 비디오 카드와 API가 저수준 작업을 담당하면서 C와 어셈블리에서 C++로 올라가는 흐름이 생겼고, Unreal 같은 엔진 생태계에서 C++가 쓰임
- 금융에서는 프로그램 매매와 고빈도 매매가 등장하면서 마이크로초 단위 지연시간이 중요해졌고, C++는 모든 줄을 미세 최적화하지 않아도 낮은 지연시간을 얻을 수 있는 언어로 쓰임
- 2000년 닷컴 붕괴와 함께 Java가 Sun의 강한 마케팅으로 “미래의 언어”와 “인터넷의 언어”로 부상했고, Java는 C++의 복잡성에 대한 명시적 반응으로 등장함
- Microsoft 내부에서는 Visual Basic의 쉬운 폼 기반 개발과 C++의 성능·표현력을 결합하려는 욕구가 있었고, 그 결과 C#이 만들어짐
- 2000~2005년 사이에는 단순한 정체가 아니라 C++의 쇠퇴가 있었고, CPU 주파수가 계속 올라가던 시기라 많은 언어 설계자와 개발자는 성능을 덜 중요하게 봄
- 2004년경 프로세서 주파수 스케일링이 끝나고 단일 코어의 성능·전력 한계와 명령어 수준 병렬성의 수확 체감이 나타나면서, 하드웨어가 자동으로 프로그램을 빠르게 만들어주던 시대가 끝남
- 멀티코어와 병렬성이 중요해졌지만 당시 C++ 표준에는 threading이 전혀 없었고, Herb Sutter의 “C++ multi-threading: is the standardization committee listening” 메일이 이 문제를 부각함
- C++0X는 2002년에 시작됐고 2007~2009년 완료를 목표로 했지만, 중요한 기능을 더 넣기 위해 계속 지연되면서 13년이 걸림
- C++11은 move semantics, concurrency, auto, range-based for loop, smart pointer, lambda, constexpr 등을 도입했고, C 계열 언어 중 threading을 공식적으로 다룬 첫 표준이 됨
- C++11은 더 쉽고 안전한 언어 기능과 하드웨어 성능을 최대한 활용하려는 필요가 동시에 맞물리면서 르네상스가 됨
- 이후 정해진 시간에 표준을 내는 train model이 도입됐고, 위원회는 2년 주기 대신 3년 주기를 택함
- C++14는 C++11에 넣지 못한 사항과 버그 수정을 담은 작은 릴리스였고, C++17과 C++23에서는 많은 언어 및 표준 라이브러리 기능이 추가됨
현재의 규모와 과제
- C++는 복잡성이 계속 커졌고, 변수 초기화 방식이 여러 가지라는 비판과 “이해하기 어려운 복잡성”이라는 혹평을 받음
- 표준위원회도 커져 527명 규모가 됐고, 시작 당시 전체 구성원 수만큼의 위원회와 위원장이 생겼다는 우려가 있음
- 언어 설계에서는 추가는 가능하지만 제거는 거의 불가능하기 때문에, 무엇을 넣을지보다 언제 거절할지가 중요한 문제가 됨
- C++는 전력 생산, 풍력 터빈, 밥솥, 볼링장, 할리우드 영화, 자동차, 금융, 카메라 등 다양한 곳에 쓰이며, “대략 어디에나” 있다는 표현이 나옴
- HRT의 C++ 코드베이스는 100만 줄 이상, 15,000개 파일로 구성되어 있고, 2025년에만 약 800명의 개발자가 84,000개 커밋을 만들었음
- 게임에서는 Unity가 C#을 쓰는 반면 Unreal은 C++를 쓰며, Call of Duty처럼 높은 프레임률과 빠른 그래픽이 필요한 게임은 속도 때문에 C++를 사용함
- Nvidia와 가속 컴퓨팅에서도 C++는 중요하고, 표면에서는 Python을 쓰더라도 실제 계산 부담은 고도로 최적화된 CUDA 라이브러리가 담당함
- 빠르게 성장하는 언어로 Rust와 C++가 꼽혔고, C++ 개발자는 2022년 940만 명에서 2025년 1,630만 명으로 늘었다는 수치가 제시됨
- 성능 대비 전력 효율이 중요한 언어에 대한 수요가 계속되고 있어 C++는 뛰어나고 대체하기 어려운 사용처를 확보함
- 동시에 대형 플레이어들이 AI로 이동하면서 C++에 대한 자금이 줄어들 수 있다는 우려가 있음
- 팬데믹 기간 정부와 규제 기관에서 기본적으로 메모리 안전성을 제공하지 않는 C++에서 벗어나려는 움직임이 있었고, 메모리 안전성은 해결해야 할 가장 중요한 문제로 제시됨
- C++26에서는 소프트웨어 강화를 위해 초기화되지 않은 변수가 더 이상 undefined behavior가 아니게 되고, C++26 표준 라이브러리에서는 string, span, vector 같은 공통 타입에 bounds safety 옵션이 제공됨
- C++26의 static reflection은 프로그램 코드가 프로그램 코드를 볼 수 있게 하는 기능이며, 표준화된 단일 기능 중 가장 영향력이 큰 기능으로 평가됨
- AI가 언어 안전성과 프로그래밍 언어 사용 방식에 큰 영향을 줄 가능성은 있지만, 앞으로 어떤 일이 일어날지는 아직 알 수 없다는 결론으로 남음
-
Homepage
-
개발자
- C++: 다큐멘터리: 세계에서 가장 중대한 프로그래밍 언어