- PVSM.RU - https://www.pvsm.ru -
Недавно завершилась конференция GoingNative’2012 [1], организованная компанией Microsoft. Она проходила 2 и 3 февраля в Редмонде, и главной темой был C++11. Мне показалось, что это замечательное событие недостаточно полно освящено, и захотел исправить ситуацию.
«C++11 feels like a new language» Bjarne Stroustrup
«We’re all learning C++11» Herb Sutter
«We broke every single book on the planet, and we broke every single programmer on the planet» Herb Sutter
Герб Саттер во вступительном слове посвятил конференцию Деннису Ритчи, создателю языка C, и ключевому разработчику операционной системы UNIX.
Это очень важное событие для сообщества С++, где выступали и отвечали на вопросы люди, ставшие легендами в мире C++, во многом определяющие его развитие. Доклады очень интересные, и я вынес для себя много нового. Дальше идёт обзор всех докладов и сессий вопросов и ответов.
Список докладчиков:
Всем интересующимся современным состоянием языка я рекомендую посмотреть эти 3 выступления:
Остальные доклады тоже достойны внимания, но посвящены более узким темам (параллельное программирование, компилятор Clang, шаблоны, концепции). Украсили мероприятие две сессии вопросов и ответов. Все видео и слайды с конференции доступны для скачивания и просмотра online на channel 9 [1].
Бьярне говорит о сильных сторонах C++, хорошем стиле программирования, приводит много примеров. Иинтересно сравнение производительности вектора и списка: результат кажется неожиданным, и даёт пищу для размышлений.
Наконец в C++ многопоточность попала в стандарт языка. Дизайн потоков во многом повторяет дизайн хорошо известной библиотеки boost.thread. Вскользь упоминается поддержка async/future для асинхронных вызовов. Есть примеры использованию мьютексов/локов.
Основная часть выступления посвещена Data Races. Дано точное определение, что это такое в программе на C++, и что следует ожидать в случае возникновения Data Race. Много говорится о появившихся atomic типах, делается сравнение с volatile из Java, C#.
STL рассказывает о многочисленных нововведениях в стандартной библиотеке C++:
auto sp1 = make_shared<T>( args ); // 1 allocation, 24 bytes overhead shared_ptr<T> sp2( new T( args ) ); // 2 allocations, 40 bytes overhead
v.emplace_back("Carmichael", 3 * 11 * 17); // more efficient, easier to type v.push_back( make_pair("Carmichael", 3 * 11 * 17) );
pair<X*, double> p1(NULL, 3.14); // это могло-бы не компилироваться, но стандарт исправили pair<X*, double> p2(nullptr, 3.14);
map<string, int> m; // Что быстрее? for (const auto& p1 : m) { … } for (const pair<string, int>& p2 : m) { … }
«… After all, He-Who-Must-Not-Be-Named did great things—terrible, yes, but great.»
В выступлении гуру шаблонного метапрограммирования речь идёт о Variadic Templates: новой фиче стандарта C++11, позволяющей создавать шаблонные классы/функции параметризованные переменным числом параметров. Например, теперь можно написать типобезопасный аналог функции printf/scanf из C. Скорее всего, у большинства C++ программистов никогда не возникнет потребность самим писать что-либо, пользуясь Variadic Templates, но для создателей библиотек эта возможность очень важна. Выступление будет интересно тем, кто хочет посмотреть на используемый синтаксис, и понять, как можно пользоваться Variadic Templates.
Выступление содержит 3 части:
isOneOf(1, 1); // => true isOneOf(1, 2, 6); // => false isOneOf(1, 3.5, 4, 1, 2); // => true
safe_printf( “%d %f”, 12.1, 1.1 ); // => throws invalid format exception safe_printf( “%d”, 1, 2, 3, 4, 5 ); // => throws too few format specifiers exception safe_printf( “%d %f”, 11, 12.1 ); // => ok, redirects to printf(…)
tuple<int, string, double> t; get<0>(t) = 42; assert(get<0>(t) == 42); get<0>(t) = “this will not compile”; // => compilation error get<1>(t) = "forty-two"; get<2>(t) = 0.42;
Сессия вопросов ответов:
Пара интересных цитат:
“But I think that Garbage Collection is not as critical for C++ as it is for many of the other languages. We just don’t generate that much garbage” Bjarne Stroustrup
"...the most frequent category of email I get about C++ training and information is from people saying, where can I go to find a good white paper on how to use modern C++11 for Java and C# developers…" Herb Sutter
Саттер обещает полную поддержку стандартной библиотеки C++11 в следующей версии студии VC11, а также (приятная неожиданность), в beta-версии, которая должна выйти в этом месяце, появится поддержка range-for и final/override. Планируется выпустить несколько “Out-of-band” релизов (не привязанных к релизам Visual Studio) вскоре после выхода VС11 с последовательно улучшающейся поддержкой нового стандарта: initializer lists, template aliases, variadic templates, constexpr, noexcept, =default/delete, … Есть возможность поучаствовать в опросе, какие фичи нового стандарта наиболее важны, и хотелось бы увидеть по возможности скорее: bit.ly/mscpp11 [5].
Вторая часть посвящена новому стилю, идиомам и рекомендованным способам программирования на C++. Саттер утверждает, что все книги по C++ устарели с выходом стандарта, что каждый пример из книги может и должен быть переписан в новом стиле: We broke every single book on the planet, and we broke every single programmer on the planet. Как минимум одна книга по C++11 уже есть: bit.ly/meyers11 [6]. Ожидаемые сроки обновления других известных книг по C++:
В третьей части говорится о возможных планах развития стандарта C++. По его мнению, такое кардинальное изменение стиля, и идиом как в C++11, нежелательно в ближайшее время. В конце выступления Герб эффектно описал самую слабую сторону C++, и рассказал, что планируется сделать, чтобы исправить ситуацию.
Разработчик Clang рассказывает о том, зачем понадобилось писать ещё один компилятор C++ при живом gcc:
Последняя версия полностью поддерживает стандарт C++98, и частично C++11. Работает на Linux, Mac. Поддержки Windows нет, так как среди разработчиков не хватает Windows-разработчиков.
Приведено много примеров проблемного кода на C++, и какие при этом сообщения об ошибках, и предупреждения выдаёт компилятор. Похоже, получился интересный статический анализатор кода, но есть и возможности анализа поведения в run-time. На базе компилятора разрабатываются очень интересные средства рефакторинга и анализа C++ кода. Например, средство для удаление ненужных include [7].
Речь идёт о предложении добавить в стандарт языка конструкцию static_if, которая хорошо себя зарекомендовала в языке D. Она позволило бы серъёзно упростить некоторый шаблонный код, на который сейчас нельзя смотреть без содрогания. Вот как могло бы выглядеть его использование:
// функция определена только когда It – forward iterator template <class It> It rotate(It b, It m, It e) if (is_forward_iterator<It>::value) {...} // В зависимости от параметра WithParent хранить или нет ссылку на родителя enum class WithParent { no, yes }; template <class T, WithParent wp> class Tree { class Node { ... }; static if (wp == WithParent::yes) { Node * parent_; } Node * left_, * right_; T payload_; }; Tree<string, WithParent::yes> dictionary;
Концепции — многострадальная фича, которая не вошла в стандарт языка C++11, и серъёзно задержала его принятие. Страуструп рассказывает, как он понимает концепции в языке, а Саттон останавливается на технических деталях. Как я понял, есть желание всё-таки добавить концепции в язык, и предложение будет внесено в комитет по стандартизации. Предложение серъёзно переработано в сторону упрощения по сравнению с первоначальным. Вот так может выглядеть код, использующий концепции:
template<InputIterator I> DistanceType<I> distance(I first, I last); // медленная но работает для всех итераторов template<RandomAccessIterator I> DistanceType<I> distance(I first, I last); // быстрая, но только для random-access итераторов template<Sortable Iter> void sort(Iter first, Iter last);
Сессия вопросов и ответов. Затронуто очень много тем:
Из обсуждения constexpr:
Chandler Carruth: … But we are not done yet. It that hard. It is harder then variadic templates, I believe it is actually harder then lambdas. It is one of the most challenging to implement correctly features in entire C++11
Bjarne Stroustrup: It is interesting to note, that it is one of these features, that was made more complicated over the dead bodies of its proposers and initial implementors during the standardization
Огромное спасибо организаторам и участникам конференции!!!
Автор: tenzink
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/c-plus-plus/2672
Ссылки в тексте:
[1] GoingNative’2012: http://channel9.msdn.com/Events/GoingNative/GoingNative-2012
[2] link: http://channel9.msdn.com/Events/GoingNative/GoingNative-2012/C-11-VC-11-and-Beyond
[3] link: http://channel9.msdn.com/Events/GoingNative/GoingNative-2012/Keynote-Bjarne-Stroustrup-Cpp11-Style
[4] link: http://channel9.msdn.com/Events/GoingNative/GoingNative-2012/STL11-Magic-Secrets
[5] bit.ly/mscpp11: http://bit.ly/mscpp11
[6] bit.ly/meyers11: http://bit.ly/meyers11
[7] средство для удаление ненужных include: http://code.google.com/p/include-what-you-use/
Нажмите здесь для печати.