Modern C++에 대해 알아보자
Modern C++란?
Bjarne Stroustrup에 의해 개발된 초기 C++은 컴퓨터에 최적화 되어 빠른 속도를 기대할 수 있었지만, 프로그래머가 프로그램을 만들면서 신경써야 할 부분이 굉장히 많았고 언어에서 제공해주는 라이브러리 등의 기능이 풍부하지 않았기 때문에 비공식적으로 개개인이 만든 함수나 모듈 형태로 이용했습니다.
C++은 1983년에 탄생한 언어이지만 1998년 최초의 표준인 C++98이 완성되었고, C++98의 문제점을 개선하여 2003년에 C++03을 발표합니다. 현재 C++라고 부르는 경우 일반적으로 C++98, C++03을 의미하는 경우가 많습니다.
이후 C++ 표준 위원회는 8년간 많은 기능을 추가하고 변화를 준 C++11을 2011년에 발표합니다.
C++11을 시작으로 기능을 개선하거나 새로운 기능들을 C++에 추가하기 시작했으며 3년 주기로 제공하는 표준안 C++14, C++17, 가장 최근의 C++20을 두고, 일반적으로 Modern C++이라고 부릅니다.
Modern C++는 3년마다 제정됩니다
본래 C++98은 1989년에 시작되어 1994년에 출시될 것으로 예상했으나 1998년에 제정되었습니다.
C++11역시 2000년대의 한 시점에 공개될 것으로 예상해서 C++0x라고 불렸으나 2009년까지 출시되지 못했습니다. 그래서 다시 2010년대의 한 시점에 공개될 것으로 예상해 C++1x로 변경했고, 2011년 8월 12일에 들어서 국제 표준으로 확정되면서 C++1x는 최종적으로 C++11이 되었습니다.
결과적으로 각각 4년, (C++0x이면 2009년까지는 출시되었어야 하므로)2년씩 지연된 셈입니다.
이것은 기능에 중점을 두고 릴리즈를 했던 사례 중 하나인데, 기능이 완료되어야 릴리즈 할 수 있고 따라서 기능이 완료되지 않는 경우 출시 기간은 지연되게 됩니다.
C++ 표준 제정이 지연되면서 표준을 만드는 사람들과 위원회 내부에서도 제정 시기에 의구심을 가졌고, 컴파일러를 만드는 회사의 입장에서도 다 만들어둔 기능이 표준 규격에 의해 변경되면 적극적으로 구현할 이유가 없었기 때문에 C++컴파일러 구현도 늦어졌습니다.
이런 점으로 볼 때 C++98과 C++11은 ‘기능’에 중점을 두고 릴리즈를 했으나 이후부터는 ‘기간’에 중점을 두고 릴리즈를 합니다.
C++98, C++11 표준화를 진행하며 얻은 당해본😢경험으로 ‘언제(기간)’ 출시할 것인지에 더 중점을 두었고, C++표준 위원회는 3년마다 표준을 출시하기로 결정합니다.
이것을 ‘기차 모델’이라고 부르는데, 3년간 새로운 기능을 개발하고 발표하며 3년간의 개발 동안 추가되거나 개선되지 못한 기능은 3년 뒤에 다시 발표하는 방식입니다. 예를 들어 C++20에서 스펙이 완성되지 못한 경우라 할지라도 C++20 출시 시기를 미루지 않으며 계획했던 기간에 완성하지 못한 내용은 C++23에서 완성하는 것으로 변경합니다.
이러한 이유로 Modern C++는 3년을 주기로 개선되고 있습니다.
- 현재 C++ 표준은 3년 단위로 제정되고 있습니다. 제정 기간과 관련된 자세한 글은 여기를 참고하세요.
이러한 Modern C++은 2011년도에 표준화된 C++11부터를 나타내며, 마이너 업데이트인 C++14를 포함합니다.
Modern C++은 이후부터는 3년마다 새로운 표준을 내놓는 ‘기차 모델’을 따릅니다.
TS(Technical Specification)가 충분한 논의를 거쳐 합의되면 다음 버전에 포함 되고, 이것을 트렁크에 포함되었다고 합니다.
< 이미지 출처 : https://isocpp.org/std/status >
변화되는 부분
Modern C++는 대략적으로 다음의 특징을 갖습니다.
(개선되는 과정에서 일부의 함수는 더 이상 사용하지 못하도록 제외되기도 합니다.)
- C++11 : move, smart pointer, lambda를 포함하여 중요한 문법적 요소가 많이 추가됨 (Boost C++ library 일부가 정식적으로 포함됩니다.)
auto
anddecltype
- rvalue references
- lambda expressions
- list initilization
nullptr
- range-
for
(based on a Boost library) 등등
- C++14 : C++11에서 추가되었던 기능을 개선
- variable templates
- generic lambdas
- lambda init-capture
- new/delete elision
- relaxed restrictions on constexpr functions
- binary literals 등등
- C++17 : 프로그래밍 언어상 새로운 기능에 주력
- fold-expressions
- class template argument deduction
- non-type template parameters declared with
auto
- compile-time
if constexpr
- inline variables
- C++20 : 컴파일 속도 향상을 위한 소스파일 모듈화, 비동기 프로그래밍 지원을 위한 코루틴 등
- Coroutines
- Modules
- Feature test macros
- 3-way comparison operator <=>
- designated initializers 등등
각 버전별 기능 정리는 여기를 참고하세요.
— | C++ | Informal name | 핵심 언어 기능 및 사용 가능 라이브러리 | 위키 참고 |
---|---|---|---|---|
1998 | ISO/IEC 14882:1998 | C++98 | ||
2003 | ISO/IEC 14882:2003 | C++03 | ||
2011 | ISO/IEC 14882:2011 | C++11 | https://en.cppreference.com/w/cpp/11 | https://ko.wikipedia.org/wiki/C%2B%2B11 |
2014 | ISO/IEC 14882:2014 | C++14 | https://en.cppreference.com/w/cpp/14 | https://ko.wikipedia.org/wiki/C%2B%2B14 |
2017 | ISO/IEC 14882:2017 | C++17 | https://en.cppreference.com/w/cpp/17 | https://ko.wikipedia.org/wiki/C%2B%2B17 |
2020 | C++20 | https://en.cppreference.com/w/cpp/20 | https://ko.wikipedia.org/wiki/C%2B%2B20 |