Stroustrup씨에게 물어 보았다.


[] C++17의 기능 목록에 대해서 어떻게 생각하세요? 우선 순위 리스트 같은 것은 있나요?

[] 컨셉으로 우리가 생각하는 제네릭 프로그래밍을 바꾸려고 하고 있다. 제네릭 프로그래밍을 지금보다 더 중심으로 삼는 것이다. 그것과 동시에 에러 메시지의 내용에 대한 불만-이것은 이해하지만-에도 대처하려고 한다. 충분한 효과를 얻기 위해서는 이 컨셉을 표준 라이브러리에 도입해야 한다.

 

모듈은 컴파일 시간을 극적으로 개선하고, 매크로 남용의 악영향을 제한함으로써 C++를 더 좋은 도구로 만들어 주는 것을 기대하고 있다.

 

고 수준의 병행 모델은 Concurrent한 코드 기술의 어려움을 대폭 개선해 준다. 완성된 코드의 실행 속도도, 저 수준 스레드 앤 락으로 기술된 코드보다도 빠를 것이다.

 

코드를 단순화함으로써 품질을 개선하는 것으로 이들 기능은 이상적인 것이다.

 

 

[] 과거 몇 년간 위원회 활동과 C++17 때문에 실시되는 향후의 작업에 의해서 C++는 그 동안 논란이 된 큰 제한 몇 가지를 극복하려 하고 있다. 이 것은 위원회에 의한 설계에서는 실질적 진전을 가져올 수 없다로 알려진 그 동안의 고질적인 생각을 반증하는 것이라고 할 수 있다. 위원회가 해온 활동에 대해서 어떻게 생각하세요? 성공 비결이라는 것이 있다면 어떤 것을 채용하고 싶나요?

[] 위원회에 의한 설계에 문제가 있음은 부정할 수 없다. 100(회의에 참여하지 않고 논의에 참여한 사람들도 포함하면 300)이라는 사람들이 모여서, 견고하고 일관성 있는 것을 새로 만들겠다는 것은 극히 어려운 일이다.

 

그것이 잘되고 있다는 것은 놀랍지만 더 잘 된 것이다 라는 예도 있다. 위원회에서의 작업은 욕구 불만 외의 것이 없지만 이 스케일의 작업을 개인이 단독으로 관리한다는 것은 확실히 불가능하다. 그래서 이것은 개인이나 위원회인가라는 문제가 아니라 필연으로 위원회를 어떻게 운영할까? 라는 것이다. 요즘은 세계적으로 중요한 것 중 개인이 도움 없이 만들었다는 것은 거의 없다.

 

 

[] C++17은 비교적 저 수준(언어의 시멘틱스를 매우 자세하게 컨트롤이 가능하다 라는 의미에서), 다중 패러다임으로 어려운 언어라는 C++의 성격을 따라 가는 것 같다. 한편 보다 간단히사용 할 수 있는 언어로 한다는 목표가 위원회 작업의 주요 동기 중 하나이다. C++를 더욱 편하게 쓸 수 있는 언어를 하기 위해서 위원회가 표방하는 원리 같은 것은 있나?

[] 언어 수준이라는 것은 이제 이념으로는 통하지 않는다. 하드웨어를 직접 조작하기 위한 탁월한 능력과 필요하다면 추상화 수준을 향상 가능한 추상화 메커니즘을 양립한 언어로 C++를 이해했으면 좋겠다. 하드웨어에 밀접하게 관계되는 프로그래밍은 많은 중요한 태스크에서 필요한 것이지만 별로 재미는 없다. C++는 오버 헤드 없는 추상화를 가능하게 하는 것으로 비용을 가하지 않으면서 하드웨어에서 우리들을 격리하는 것이다. 단 여기서 오버 헤드 없는 추상화(zero-overhead abstraction)” 라는 것은 수작업으로 작성한 코드에 대해서 1바이트도, 1사이클도 허비하고 있지 않는다는, 의미는 아니다. 함수 호출(특히 간접적인 함수 호출)에 의한 오버 헤드는 필요 이상으로 의식되는 것이 적지 않다. 하드웨어로의 접근과 추상화 양쪽을 제공하는 것이 C++의 기본이며, 그것을 효율적으로 행하여, 다른 언어와의 차별화를 도모하고 있다.

 

이는 이제 다중 패러다임이라는 것은 아니다. 이 호칭은 언어의 기능을 최대한 사용할 것이 아니라 많은 사람들에 대해서 어느 하나의 패러다임을 선택하도록 요구하는 것이기 때문이다. 유감이지만 대신 좋은 캐치 프라이즈는 발견되지 않았다.

 

위원회에 모종의 이념이 있다 라고는 그다지 생각하지 않는다. 우리는 다양한 배경을 가진 많은 개인이며, 시각도 다양하다. 그렇지만 먼저 말한 C++의 설명에 대해서는 대부분이 동의할 할 것이다. 그것은 C++의 기본이며, 타협할 수 없는 부분이다. 호환성에 대해서 까다롭다는 것은 동의를 얻을 수 있는 것이다. C++ 커뮤니티는 진보를 원하고 있지만 그 프로세스에서 그들의 수 십억개의 코드가 훼손된다는 것은 전적으로 인정하기 어려운 사태이다. 어떤 개선이 가장 의미 있는 것인지, 합리적인 타임 스케일로 실현 가능한 것은 어느 것인지, 그것들을 언어 사양 또는 표준 라이브러리로서 어떻게 실현할까? 라는 것의 상세가 중요하다. 많은 그룹에서 동의를 얻기는 어려운 일이지만 합의는 불가결하다. 내가 이번 문서를 쓰고 그것을 다음 회의에서 논의하려는 것은 이런 이유 때문이다.

 

나는 지금까지 C++과 그 표준화에 많은 시간을 할애했다. 그것이 컴퓨터, 반도체, 수송, 통신, 금융, 제조, 항공 우주 등 많은 산업에 중요한 부분을 차지하고 있기 때문이다. 매우 중요한 시스템과 장비의 속을 보면 그곳에 C++이 도입되고 있는 것을 알게 될 것이다. 그런 사실에 덧붙여서 미력 하나마 과학의 발전을 지원할 수 있다는 의식이 나의 모티베이션이 되고 있다. C++중요한 성과물의 구축에 사용하는 툴이어야 한다.

 

 

Stroustrup씨의 안은 이전에 reddit 이나 Hacker News, The Register에 공개되어 많은 코멘트가 전해진 기사에 대한 후속이다.

 

출처: http://www.infoq.com/news/2015/04/stroustrup-cpp17-interview

저작자 표시
신고
by 흥배 2015.06.03 08:00

C++의 설계자이며 오리지날 구현자인 Bjarne Stroustrup씨가 최근 C++17의 설계 목표와 실현 될 새 기능에 관한 논의 제기를 목적으로 하는 드래프트 문서를 배포했다. C++17에는 3개의 설계 목표가 있다고 그는 말한다.

- 대규모로 신뢰성 높은 소프트웨어 개발 지원 강화.

- 병행 처리를 위한 고 레벨 모델의 지원 제공.

- 핵심 언어의 간략화.

 

이 목표들 각각에 대하여 Stroustrup씨는 C++17에서 이것을 실현하기 위한 새 기능을 나열하고 있다. 예상 되는 기능 속에서 그가 바람직하다고 생각하는 것은 다음과 같다.

- 모듈. 국소성과 컴파일 시간을 개선한다.

- 계약(contract). 사양의 명시성의 향상.

- 타입 안전한 공용체와 아마도 함수 프로그래밍 스타일에 기초한 패턴 매칭.

- 컨셉(concept).

- 레인지(range).

- 호출 구문의 통일. 사양 정의와 템플릿 라이브러리의 이용을 간략화 한다.

- 루틴. , 재개 가능한 함수.

- SIMD . 현대적인 하드웨어 기능의 활용.

 

한편 Stroustrup씨는 C++17이 어떤 것인지, “언어의 기능이나 표준 라이브러리의 컴포넌트의 수로 그 상세를 판단하는 잘못을 범하지 않도록 경고한다. 중요한 것은 C++14과는 대조적으로 C++17메이저 릴리스가 된다는 점을 이해하는 것이다. 그래서 유저의 언어 사용에 큰 영향을 미친다는 의미에서 적어도 “2개 내지 3개의 주요 기능을 포함해야 한다. 컨셉이나 모듈, 레인지 등은 그 예다.

 

흥미롭게도 그의 문서도 C++17이 어떤 것인가를 분명히 밝히려고 한다. 바람직하지 않는 기능으로서 그는 다음과 같은 것을 구체적으로 꼽는다.

- C++를 근본적으로 다른 언어로 바꾸거나, 혹은 고 수준의 서브 언어를 따로 제공한다.

- “다른 모든 언어에 대한 대응이나 새로운 패러다임을 지원할 목적으로 C++에 신기능을 더 하는 것.

- “가장 요구하는 엄격한 태스크 시스템 프로그래밍을 전제로 언어를 복잡화하거나 언어의 능력을 저해하는 것.


출처: http://www.infoq.com/news/2015/04/stroustrup-cpp17-interview



저작자 표시
신고
by 흥배 2015.06.02 08:00

C++의 차기 표준이 될 C++17에 들어갈 후보 중 비동기 프로그래밍과 관련된 ConcurrenctTS에는 MS에서 제의한 기능 중 __resumable/__await가 있다.

최신의 C# 언어를 알고 있다면 아마 __resumable/__await가 무엇인지 대충 감을 잡을 것이다.

__resumable/__await은 C#으로 친다면 async/await에 해당된다.

 

__resumable 지시어를 사용한 함수 a에서 __await 지시어로 작업을 비동기로 처리하면서 작업이 끝날 때까지 대기하지 않고 함수 a를 호출한 곳으로 제어를 넘긴 후 비동기 작업이 끝나면 다시 함수 a로 제어권이 넘어가서 __await 이후에 남은 작업을 처리한다.

 

현재 VC에서는 Visual Studio 2013의 "Visual C++ Compiler November 2013 CTP"를 설치하면 이 기능을 테스트 해 볼 수 있다.

다운로드: http://blogs.msdn.com/b/vcblog/archive/2013/11/18/announcing-the-visual-c-compiler-november-2013-ctp.aspx

 

설치 후 프로젝트의 속성에서 "플랫폼 도구 집합"에서 CTP용 컴파일러를 선택한다.

 

아래 예제를 보면 대충 어떤 기능이고 어떻게 사용하는지 알 수 있을 것이다.

 

(코드는 http://www.rsdn.ru/forum/cpp/5366761.1 것을 참고하였다)

 

VC의 경우 C++의 스레드 기능은 VC 자체 라이브러리인 ConcurrencyRuntime 위에서 실행되므로 __resumable/__await도 ConcurrencyRuntime의 API를 사용하여 구현 되어 있다.

위와 비슷한 것을 ConcurrencyRuntime API를 사용하면 아래와 같다.

 

 

좀 더 자세한 설명은 아래를 참고 하면 좋을 것이다.

Asynchronous programming in C++ using resumable functions and await

http://blogs.msdn.com/b/vcblog/archive/2013/12/20/asynchronous-programming-in-c-using-resumable-functions-and-await.aspx

C++ await

http://view.officeapps.live.com/op/view.aspx?src=http%3a%2f%2fvideo.ch9.ms%2fsessions%2fgonat%2f2013%2fGN13BrewisAwait.pptx

 

개인적인 C++17 이전에 새 버전의 VC에서는 정식으로 __resumable/__await이 들어가지 않을까 생각한다.

 

< 예제 1 >

#include <iostream>

#include <thread>

#include <ppltasks.h>

#include <pplawait.h>



concurrency::task<int> foo(int a) __resumable

{

std::cout << "foo 시작" << std::endl;


auto sum = a;

std::cout << "foo __await 시작" << std::endl;

sum += __await concurrency::create_task([] { 

std::cout << "foo 스레드ID: " << std::this_thread::get_id() << std::endl;

::Sleep(3000); 

return 20; 

});

std::cout << "foo __await 완료" << std::endl;


return sum;

}



int main()

{

std::cout << "main 시작. 스레드ID: " << std::this_thread::get_id() << std::endl;


std::cout << "foo 호출 전" << std::endl;

auto&& t = foo(1);

std::cout << "foo 호출 후" << std::endl;


std::cout << "foo 결과 대기" << std::endl;

std::cout << t.get() << '\n';

std::cout << "foo 결과 받음" << std::endl;


return 0;

}


< 예제 2>

#include <iostream>

#include <thread>

#include <chrono>


#include <ppltasks.h>

#include <pplawait.h>



int __suspendable_foo(int a)

{

std::cout << "__suspendable_foo" << std::endl;


auto sum = a;


std::cout << "await_task 시작" << std::endl;

sum += concurrency::details::await_task<int>(concurrency::create_task([] {

std::cout << "task 스레드ID: " << std::this_thread::get_id() << std::endl;

std::this_thread::sleep_for(std::chrono::milliseconds(2));

return 20;

}));


std::cout << "await_task 완료" << std::endl;


return sum;

}


concurrency::task <int> __create_resumable_foo()

{

std::cout << "__create_resumable_foo" << std::endl;


return concurrency::details::create_resumable_context<concurrency::task<int>>([]

{

return __suspendable_foo(11);

});

}



int main()

{

std::cout << "main 시작. 스레드ID: " << std::this_thread::get_id() << std::endl;


std::cout << "__create_resumable_foo 호출 전" << std::endl;

auto&& t = __create_resumable_foo();

std::cout << "__create_resumable_foo 호출 후" << std::endl;


std::cout << t.get() << std::endl;


std::cout << "main 끝" << std::endl;

return 0;

}



신고
by 흥배 2014.02.19 08:00
| 1 |