C++ - C++17시대 Herb Sutter씨에게 듣는다

원문

Herb Suttrer씨는 소프트웨어 개발의 제일인자로 “Exceptional C++” 이나 “C++Coding Standars”라는 책을 집필했다.
ISO C++ 표준 위원회 위원장을 15년간 맡음과 더불어 Microsoft에서는 소프트웨어 아키텍트로서 C++/CLI, C++/CX, C++ AMP 같은 기술을 위한 언어 확장 설계를 담당하고 있다.



ISO C++ 위원회는 2017년 4월에 작업 완료했던 C++17 표준을 공식 승인했다.
새 C++ 표준에 대해서는 InfoQ에서도 지금까지 몇번 거론하였고 승인된 주요 새 기능과 컴파일러의 설치 상황을 소상히 설명했다.
이번 우리는 오랫동안 C++ 위원회의 활동에 종사하며 위원장도 맡고 있는 Herb Sutter씨와 말할 기회를 얻었다.



InfoQ:
C++17에는 새 기능이 많이 포함되어 있어서 힘들 것이라는 첫인상이 있다. 이번 새 표준의 주요 특징은 무엇일까요? 개발자에게 가장 환영 받을 것 같은 C++17의 기능은 무엇이라고 생각하나요?

Herb Sutter:
내가 C++17에서 중시한 것은 계속해서 개발 작업을 쉽게 만들어 주는 기능입니다.
C++11이 등장했을 때 수많은 새 기능 중에는 대규모로 화려한 것도 있었지만 실제로 영향이 있었던 것은 “매일 사용하는 작은 기능”– range base for loop, auto, 스마트 포인터, 람다, 클래스 멤버 초기화 라는 것이었습니다.
이들은 코드를 더 깨끗하고 안전하도록 우리가 하루 만에 배우고 사용하는 것입니다.

이번 C++17에서도 일부에서는 병행 STL 같은 “큰” 기능에 기대를 모았습니다.
그러나 나는 매일 눈에 띄고 혜택을 받는 것은 예를 들면 구조화 속박(structured binding, for (auto [key, value] : my_map) {…} 같은 기술)과 클래스 템플릿 매개 변수 추론(pair<int, double>{1, 2.0}; 을 pair p{1, 2.0}; 와 같이 기술), for 루프에서 이미 가능한 영역 내 변수 초기화가 if 나 switch 에서도 가능하게 된 것 등이라고 생각합니다 – 이들 기능은 우리가 코드를 쓸 때 필요한 세리머니를 자제하고 코드 기술 및 유지 보수를 보다 간단한 것으로 만들어 줍니다.
표준 라이브러리에서는 std::string_view 와 std::optional 이 새로운 키인 “어휘형(vocabulary type)”으로서 함수 파라미터와 반환 값에 널리 이용되게 된다고 생각합니다. std::string_view는 string 타입의 템플릿화를 대체할 수 있습니다.
std::variant 와 std::any도 일반적인 타입으로서 클래스나 함수 함수 본체 내부에서 자주 보게 될 것이예요.
작은 기능, 특히 간소화에 초점을 맞춘만큼 오랫동안 이용되게 될 것입니다.



InfoQ:
가장 고대하던 기능인 컨셉(concept)은 C++17에서는 채용되지 않았습니다. 연기된 이유에 대한 코멘트를 주시겠습니까?

Sutter:
단순히 타이밍의 문제입니다 – 성숙 하기 위한 시간이 필요합니다.
컨셉 기능은 모든 사람이 바라고 있고, 꾸준히 진보하고 있습니다.
우리가 기술 사양서(TS/Technical Specification)와 “베타 브랜치”를 공개한 뒤 C++17의 기능 동결은 1년도 안 됐어요.
그래서 위원회에서는 마감 직전에 표준에 밀어넣는 것보다 TS에서 더 경험을 얻어야 한다는 의견이 대부분을 차지하고 있었습니다.
TS/베타에서 기능을 공개함으로써 표준으로 사양이 확정되기 전에 피드백을 취득하고 변경을 가할 수 있습니다( 그래야 합니다).
기능이 C++ 국제 표준(IS/International Standard)로서 공개되어 버리면 우리의 재임 중 고정되어, 호환성을 훼손할 필요가 있는 수정을 하는 것은 거의 불가능하게 됩니다.

콘셉트는 이미 현재 C++20의 드래프트에 포함되어 있습니다. 올해 여름에 열린 C++20 정기 회의에서는 C++17 이후의 C++에 추가되는 최초의 큰 기능으로 소개 되었습니다.
흥미로운 것은 TS 경험을 바탕으로 한 개선이 이미 몇몇 포함된 것입니다 – C++17에 억지로 밀어 넣었다면 이러한 변경은 불가능하거나 매우 어려웠을 것입니다.



InfoQ:
C++20에서는 어떤 영역을 중시하시죠?

Sutter:
공개된 TS를 보시면, 향후의 C++의 주요 기능을 이해 할 수 있습니다.
최신의 리스트는 isocpp.org/std/status에서 공개 중입니다.
일반론으로서는 차기 표준의 컷오프 1년 이상 전에 공개된 TS, C++20의 경우라면 2018년 초까지 공개되는 TS에 대해서는 차기 표준 문서로 후보에 포함될 가능성이 높아집니다.
주의하고 싶은 것은 TS가 변경 없이 채용될 수 없다는 점입니다 – 이는 동시에 규모가 큰, 혹은 실험적인 기능에서 최초로 TS를 실시하는 것에 대한 유의성 증명이기도 합니다.
이미 공개된 TS중 C++17에서 채용되지 않은 것은 주로 다음의 것입니다.

Concepts TS: “간결한 구문(terse syntax)”(void f(MyConcept param){…} 같은 기술)을 제외하면 모두 채용했어요. 위원회는 몇가지 기술적인 우려 사항에 대처하는 개선이 시행되면 그 다음은 구문에 관한 검토를 진행 하겠다는 뜻을 굳히고 있습니다. 다음 회의에서는 C++20의 드래프트에 그 형태를 도입할 수 있다고 생각합니다.

Concurrency TS: 이건 실제로는 기능 그룹에서 개별적으로 체리 픽 할 것입니다. atomic한 스마트 포인터와 래치에 대해서는 채용될 가능성이 높습니다. future<> 확장은 현재는 아직 제출 concurrent executor 제안에 의존하기 때문에 그쪽이 실시되는 것을 기다릴 겁니다.

Library Fundamentals 2: 이것도 라이브러리 기능의 그룹에서 기능 단위로 C++20 드래프트에 통합 되리라고 생각합니다.

Ranges TS, Coroutines TS, Networking TS: 이들은 최종 승인을 받고 곧 공개될 예정이어서 내년에는 C++20 드래프트에 통합될 가능성이 높은 기능입니다.

다만 이들 기능이 C++20에 포함 된다라고 말하는 것은 아닙니다. 어디까지나 유력한 후보 리스트입니다.
이 다른 큰 기능에서도, 정적 리플렉션(static refrection) 등 먼 장래가 아닌 것은 1, 2개는 C++20에 도입 될 가능성이 없다고 말할 수 없습니다.
그러나 실제로 그렇게 될지는 그 제안이 향후 6~12개월에서 어디까지 완성도를 높이느냐에 달렸어요.
당연하지만, 여기에서 나온 것이 C++20에서 예정된 모든 기능은 아닙니다 – 표준에는 반드시 미리 TS를 통과할 필요 없는 무수한 작은 개량 사항이 포함된 것입니다.



InfoQ:
Rust, Swift 나 Go 등 새로운 언어에서 흥미로운 것, 영감을 얻을 수 있는 것은 있습니까?

Sutter:
물론입니다. 다른 언어에서 진행되는 탐구나 실험에는 항상 주시하고 있습니다.
새로운 언어의 등장과 흥륭은 이 업계의 건전성을 나타내는 중요한 사인이라고 나는 생각합니다. 정상적으로 아이디어를 제공함으로써 모든 사람들의 생태계가 개선되는 것입니다.
특히 Swift는 현행의 주류 언어(Objective-C)을 명확히 전환한다는 관점에서 훌륭한 시도입니다. 새로운 언어의 개발과 보급을 하는 기업이 기존 언어를 사용 중인 주요 기업이자 동시에 그 언어가 대세인 2개의 OS 플랫폼 소유 기업이라는 것은 새 언어에 있어서는 이상적인 상황입니다. 이는 아마 이 새 언어를 촉진하는 기업에게 다른 언어의 시장과 개발 베이스를 대대적으로 획득하는(혹은 대체하는) 가장 큰 영향력이 될 것입니다. 어떤 진전을 보일지 관심이 많고 또 참고도 됩니다.



InfoQ:
당신은 C++에 관한 중요한 저서를 여럿 가지고 있지만 현재 집필 중인 새로운 책이 있습니까? 혹은 더 넓게 현재는 무엇에 주목하고 있습니까?

Sutter:
책이나 기사를 쓰고 있는 것은 쓰기를 좋아한다는 것, 그리고 자신의 공부 때문입니다. 새로운 것을 나누는 것이 즐거울 뿐 아니라 다른 사람에게 가르치려면 자신이 그것을 깊이 이해할 필요가 있습니다.
사람에게 무언가를 설명함으로써 자신의 이해가 완전하다고 확인하는 것 이상의 것은 이외에 없습니다.
요즘은 C++의 새 기능을 공부 하기보다는 정의하는 것이 많아지고 있습니다. 그래서 지금은 책이나 기사는 쓰지 않지만 조만간 Q&A 형식의 블로그 기사를 몇가지 쓸 생각이에요. 현재 집필 작업은 거의 전부가 표준 제안서와 C++ 코어 가이드 라인에 관한 것입니다.

2년 전부터는 C++를 보다 강력하고 심플하게 – 즉 현실의 C++코드와 프로그램의 기술과 관리를 간단하게 하기 위해서 언어를 보다 강력하게 –하기 위한 방법을 탐구하고 장기적인 프로젝트에 중점을 두고 있습니다. 이것을 계속 할 거예요. 할 수 있는 것은 많이 있다고 생각하고, 몇가지 시험해 보고 어느 것이 잘 될지를 확인한 뒤 단숨에 표준화에 임하겠다고 생각합니다.
그동안 작업에서는 논문 P0515에서 설명한 우주선 비교 연산자(‘<=>’)이라는 작은 기능을 제공하고 있습니다. 개선 그룹에서는 이미 승인된 11월에 열리는 다음 미팅에서 표현의 표준화에 관한 리뷰를 할 예정입니다. 잘하면 C++ 20드래프트에서 즉시 채용될지도 모릅니다.
두번째는 좀 더 큰 기능으로 아직 시험 중인 장기적인 것이지만 P0707에서 제안한 메타 클래스에 관한 작업입니다.
CppCon 2017에서 세션을 YouTube에서 볼 수 있습니다.

위원회의 많은 멤버가 나에게 동참하여 언어를 간단하게 하는 작업에 참여하길 기대하고 있습니다. 작은 기능을 독립적으로 가하는 것은 개발 작업에서는 재미 있는데 일관성을 결여한 부분적인 솔루션이 쌓여가는 위험성도 있습니다.
개발자가 직접 쓴 C++ 코드를 단순화할 여지가 남아 있다는 것은 큰 의의가 있다고 나는 생각합니다. 그것을 실현하려면 언어를 폭넓게 원칙적으로 파악하는 시점을 가지면서 부분적인 개량을 가하는 것이 필요하다고 생각합니다.
처음에 말했듯이 C++11과 C++14, 어쩌면 C++17에서도 그렇지만 이들 중에서 가장 영향력 있는 기능은 반드시 “큰 기능” 이 아니라 오히려 일상적인 코드 기술을 단순화하는 작은 기능입니다.
우리는 지금 작은 클린업뿐만 아니라 대규모 간략화에 의해 심플함을 구체적인 목표로 하는 큰 기회가 있습니다.
이것이 C++를 좋은 방향으로 크게 개선하고 주고 있을 것이라고 신중하면서 낙관적 시각을 갖고 있습니다.
Bjarne Stroustrup씨가 항상 밑바닥무터 다시 한다면 더 소규모로 단순한, 말 그대로 C++의 1/10의 복잡성을 가진 언어를 C++에서 만들어 낼 수 있다고 말하는 것은 유명한 이야기입니다.
물론 이를 그대로 실행에 옮길 수가 없어요(Objective-C에서 Swift로와 같습니다) 이 점진적이고 장기적인 시야에서 C++의 코드를, 그리고 최종적으로는 언어 자체를 간소화하는 수단은 있지 않을까 저는 생각하고 있습니다. 지금은 아직 도중이라 할지라도 매우 큰, 짜릿한 개선이 되겠죠.

“표준화는 더 빨리 진행되지 않는가?”라는 질문을 받는데 약 450만명의 프로그래머가 사용하는 언어의 개선에 시간과 노력이 필요하다는 것을 C++ 위원회는 인식하고 있습니다. 모든 주요 업계, 그리고 중요한 인프라에서 사용자 애플리케이션(다른 언어의 컴파일러도 다수 포함됩니다)까지 모든 소프트웨어의 수십 억개에 이르는 코드에 대한 배려가 더없이 중요한 것입니다.
“민첩하고 파괴하는(Move fast and break things)”것이란 여기에는 전혀 들어맞지 않습니다.
ISO C++로 우리의 작업은 이 거대한 생태계를 남겨 두는 아니라 앞으로 나갈 것입니다 – 추구하는 것이 얼마나 훌륭한 것이라 하더라도 그것은 우리의 나아갈 길이 아니에요.
“체계적이고 원칙적인 개선으로 전진하다”라는 것이 우리의 경우에는 이상적으로 가까운 만트라입니다.
일반적으로 2년간 할 수 있는 것은 과대 평가되고, 10년에 달성 가능한 것은 과소 평가될 것이라는 격언을 생각하세요. 이 격언대로 개선을 계속함으로써 향후 10년간 C++는 더 훌륭한 것이 된다고 나는 신중하고 낙관적으로 생각하고 있습니다.


이 글은 2017-12-19에 작성되었습니다.