C++0x 미리보기 13, concepts는 다음 기회로(2부)
Concepts 사건(?) 관련 링크들과 몇 가지 생각해 볼 이야기.
1부 끝에서 C++ 표준 위원회가 Concepts를 차기 C++ 표준에 포함시키지 않기로 한 이유를 좀 더 이야기하겠다고 했었는데, 조금 따져 보니 그 글에서 링크 건 Doug Gregor의 글보다 더 잘 정리하기는 힘들겠다는 생각이 들었습니다. 그래서 그냥 몇 가지 읽어 볼 문서들을 소개하고 개인적인 의견을 덧붙이는 것으로 대신하려고 합니다.
- 우선, 전반적인 사정을 볼 수 있는 Gregor의 글입니다: What Happened in Frankfurt?. 일역을 거친 한역: 프랑크푸르트에서 어떤 일이 있었는가? - 상, 하.
- Stroustrup도 비슷한 성격의 글을 DDJ에 기고했습니다: The C++0x "Remove Concepts" Decision.
- 위의 두 글에서 중요하게 언급하고 있는(일부에서는 "치명타를 날렸다"라고 일컫는) Stroustrup의 글(PDF): “Simplifying the use of concepts.”
- Gregor의 글에 드러나 있는 “애초에 근본적인 입장 차이가 있었다”와 관련해서 생각해 볼만한 David Abrahams의 유즈넷 게시물. 위원회가 무리하게 봉합하려 드는 대신, 차이를 인정하고 선의의 경쟁을 벌이게 했다면 더 낫지 않았을까 라는 의견을 내비치고 있습니다.
- 주요 제안서들의 저자 중 한 명이었던 Jeremy Siek는 Sad day라는 제목의 글로 안타까움을 표시했습니다. 그의 개인적인 소회 외에, 위의 Stroustrup 글을 읽으셨다면 이 글 후반부의 “Second, Haskell has had explicit type classes ... ” 문장에도 주목할 필요가 있을 듯 합니다.
- 반면 Herb Sutter는 “그냥 일정 상의 문제일 뿐”, “어차피 Concepts는 거의 전적으로 오류 메시지에 대한 것” 등 의미를 축소하는 듯한 글을 썼습니다: Trip Report: Exit Concepts, Final ISO C++ Draft in ~18 Months.
마지막 Sutter의 글이 “평범한” C++ 프로그래머의 관점에서 아주 틀린 말은 아닐 수도 있습니다. 그러나 C++이 지원하는 프로그래밍 스타일(“패러다임”)들 중 어쩌면 가장 중요한 것이 일반적 프로그래밍(Generic Programming, GP)이고, 그 GP에 대한 C++의 언어적 지원에서 화룡점정으로 기대를 받은 것이 바로 Concepts인만큼, 이 사건이 평범한 C++ 프로그래머와 무관한 일은 전혀 아닐 것입니다. 관련해서 읽어볼 만한 글로는, 최근 Concepts 건과 관련해서 DDJ에 다시 게재된 1995년 Alex Stepanov 인터뷰가 있습니다.
그나저나, Gregor의 글에서 “이미 타협했던 사항을 막판에 Stroustrup가 뒤엎었다”는 불만을 느낀 것이 제 착각은 아니리라 생각합니다. 한편으로는 Stroustrup이 이해가 갑니다. C++0x의 주요 목표 중 하나가 바로 C++을 “가르치고 배우기 쉽게 만드는(Make C++ easier to teach and learn)” 것이고, 그 목표를 Stroustrup이 얼마나 중요시 하는지를 그의 최신작 Programming - Principles and Practice Using C++(얼마 전에 번역을 마쳤습니다)에서 엿볼 수 있었습니다. 게다가 C++0x에는 람다 함수, 일반화된 초기화 구문, 사용자 정의 리터럴 등 “리터럴”을 좀 더 잘 지원하기 위한(람다 함수는 간단히 말해서 함수 리터럴입니다) 기능들이 추가되었습니다. 리터럴은 의미론적으로 “마법의 수”이고, 마법의 수는 코드의 유지보수와 가독성을 헤치므로 피해야 한다는 관점에 익숙한 프로그래머에게는 다소 의아스러운 일일 것입니다. 그런데 그러한 관점은 “다수의 전문가들이 협동적으로 대형 프로젝트를 수행할 때” 유효하지만, 최종 사용자가 재빠르게 원하는 결과를 얻고자 할 때에도 지켜야 할 것은 아닐 수 있습니다. 다른 말로 하면, 리터럴 지원을 강화한다는 것은 C++을 “캐주얼하게도 쓸 수 있는 언어로 만들자”가 C++0x의 또 다른 목표일 수 있음을 보여줍니다. 이번 Concepts 탈락 결정에는 C++을 가르치고 배우기 쉬운 언어, 캐주얼하게도 쓸 수 있는 언어를 만드는 데 있어 지금 상태의 Concepts가 오히려 방해가 된다는 공감대가 작용한 것이 아닐까 합니다.
그러나 이 결정은 “지금 상태의 Concepts”에 대한 것입니다. 앞에서도 말했듯이 Concepts는 언어 차원의 GP 지원에서 화룡점정에 해당하므로 Concepts 자체가 폐기될 가능성은 거의 없습니다. 좀 오버하자면, Concepts의 현재 문제점들을 만족할만한 수준으로 해결하는 것은 C++ 자체에는 관심이 없더라도 프로그래밍과 프로그래밍 언어에 관심이 있는 사람이라면 주목할만한 과제일 것입니다. 지금의 Concepts에서 해결해야 할 문제를 아주 단순화하면 “프로그래밍에서 서로 배타적으로 보이는 두 가지 장점을 하나도 포기하지 않으려면 어떻게 해야 하는가”입니다. 사실 GP 자체가, 그리고 C++ 자체가 추구해온 것들도 그와 비슷합니다. 효율을 포기하지 않는 추상, 유연함을 포기하지 않는 엄격함, 속도를 포기하지 않는 표현력, 저수준과 고수준의 공존 등등. 그런 관점에서 Concepts를 바라본다면 꽤나 흥미로운 탐구 주제일 것입니다.
이상으로 Concepts 이야기를 마무리하고요. 다음 회에서는 아마도 위에서 잠깐 언급한 리터럴 관련 기능을 다룰 것 같습니다.