Обзор конференции Going Native'2012

C++*
Недавно завершилась конференция GoingNative’2012, организованная компанией 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++, во многом определяющие его развитие. Доклады очень интересные, и я вынес для себя много нового. Дальше идёт обзор всех докладов и сессий вопросов и ответов.

Список докладчиков:
  • Bjarne Stroustrup (creator of C++)
  • Herb Sutter (C++ Standards Committee Chair, software architect at Microsoft)
  • Andrei Alexandrescu (C++ template and big compute master from Facebook, one of the authors of D programming language)
  • Chandler Carruth (LLVM/Clang developer from Google)
  • Stephan T. Lavavej (STL master from Visual C++ Libraries team)
  • Hans Boehm (distributed and parallel computing expert from HP Labs)
  • Andrew Sutton (C++ library design expert and ISO committee member from Texas A&M University)

Всем интересующимся современным состоянием языка я рекомендую посмотреть эти 3 выступления:
  • Herb Sutter: C++11, VC++11 and Beyond (link)
  • Bjarne Stroustrup: C++11 Style (link)
  • Stephan T. Lavavej: STL11 – Magic && Secrets (link)

Остальные доклады тоже достойны внимания, но посвящены более узким темам (параллельное программирование, компилятор Clang, шаблоны, концепции). Украсили мероприятие две сессии вопросов и ответов. Все видео и слайды с конференции доступны для скачивания и просмотра online на channel 9.

День 1 – C++11 Today – 2 февраля 2012


Bjarne Stroustrup: C++11 Style

Бьярне говорит о сильных сторонах C++, хорошем стиле программирования, приводит много примеров. Иинтересно сравнение производительности вектора и списка: результат кажется неожиданным, и даёт пищу для размышлений.

Hans Boehm: Threads and Shared Variables in C++11

Наконец в C++ многопоточность попала в стандарт языка. Дизайн потоков во многом повторяет дизайн хорошо известной библиотеки boost.thread. Вскользь упоминается поддержка async/future для асинхронных вызовов. Есть примеры использованию мьютексов/локов.

Основная часть выступления посвещена Data Races. Дано точное определение, что это такое в программе на C++, и что следует ожидать в случае возникновения Data Race. Много говорится о появившихся atomic типах, делается сравнение с volatile из Java, C#.

Stephan T. Lavavej: STL11 – Magic && Secrets

STL рассказывает о многочисленных нововведениях в стандартной библиотеке C++:
  • Указатель со счётчиком ссылок. Техника “type erasure”. Почему лучше использовать make_shared для создания shared_ptr
    auto sp1 = make_shared<T>( args ); // 1 allocation, 24 bytes overhead
    shared_ptr<T> sp2( new T( args ) ); // 2 allocations, 40 bytes overhead
    

  • Emplacement: конструирование объекта непосредственно в контейнере
    v.emplace_back("Carmichael", 3 * 11 * 17); // more efficient, easier to type
    v.push_back( make_pair("Carmichael", 3 * 11 * 17) );
    

  • Как новый стандарт чуть не «поломал» std::pair, или почему стоит использовать nullptr вместо NULL
    pair<X*, double> p1(NULL, 3.14); // это могло-бы не компилироваться, но стандарт исправили
    pair<X*, double> p2(nullptr, 3.14);
    

  • Futures/async, а также зачем иногда лучше передавать тяжеловесные объекты по значению, а не по ссылке
  • Range-based for появится VC11, и будет уже в VC11 Beta. Как он реализован, и почему лучше использовать в связке с auto
  • auto: не только проще писать, но иногда получается более эффективный код
    map<string, int> m; // Что быстрее?
    for (const auto& p1 : m) { … }
    for (const pair<string, int>& p2 : m) { … }
    


Andrei Alexandrescu: Variadic Templates are Funadic

«… 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 части:
  • Рассказывается что такое Variadic Templates, зачем они нужны, описывается снтаксис, и показан пример функции, определяющей равен ли первый переданный аргумент одному из последующих
    isOneOf(1, 1);                 // => true
    isOneOf(1, 2, 6);              // => false
    isOneOf(1, 3.5, 4, 1, 2);      // => true
    

  • Реализована простая надстройка над функцией printf из C, которая проверяет соответствие переданных типов строке формата.
    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(…)
    

  • Показана возможная реализация класса std::tuple (из стандарта C++11)
    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;
    



Panel: The Importance of Being Native (Bjarne, Andrei, Herb, Hans, Stephan)

Сессия вопросов ответов:
  • If C++ is answer, what is the question?
  • Занимается ли кто-то целенаправленным продвижением языка C++?
  • Появится ли в ближайшее время поддержка модулей в C++?
  • Кто будет писать код, использующий Variadic Templates, и потом его поддерживать?
  • Какие перспективы включения в стандарт средств поддерживающих task-based параллелизм (наподобии PPL), вычислений с помощью GPGPU, корутин?
  • Какие перспективы появления Garbage Collection в C++?
  • Появится ли бинарная совместимость в C++?
  • Насколько применим C++ к программированию hard real-time систем, разработке ядра
  • ...

Пара интересных цитат:
“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


День 2 – C++11 Today and Tomorrow – 3 февраля 2012


Herb Sutter: C++11, VC++11 and Beyond

Саттер обещает полную поддержку стандартной библиотеки 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.

Вторая часть посвящена новому стилю, идиомам и рекомендованным способам программирования на C++. Саттер утверждает, что все книги по C++ устарели с выходом стандарта, что каждый пример из книги может и должен быть переписан в новом стиле: We broke every single book on the planet, and we broke every single programmer on the planet. Как минимум одна книга по C++11 уже есть: bit.ly/meyers11. Ожидаемые сроки обновления других известных книг по C++:
  • C++ Primer (Moo) – Aug 2012
  • The C++ Programming Language (Stroustrup) – Late 2012
  • Programming: Principles & Practice Using C++ (Stroustrup) – Late 2013
  • Effective C++ (Meyers) – 2013-2014
  • C++ Coding Standards (Sutter, Alexandrescu) – 2015

В третьей части говорится о возможных планах развития стандарта C++. По его мнению, такое кардинальное изменение стиля, и идиом как в C++11, нежелательно в ближайшее время. В конце выступления Герб эффектно описал самую слабую сторону C++, и рассказал, что планируется сделать, чтобы исправить ситуацию.

Chandler Carruth: Clang — Defending C++ from Murphy's Million Monkeys

Разработчик Clang рассказывает о том, зачем понадобилось писать ещё один компилятор C++ при живом gcc:
  • Плохие сообщения об ошибках
  • Низкая скорость компиляции
  • Технические особенности gcc, делающие его непригодным для построения средств анализа кода
  • Политические ограничения gcc, делающие его непригодным для построения средств анализа кода

Последняя версия полностью поддерживает стандарт C++98, и частично C++11. Работает на Linux, Mac. Поддержки Windows нет, так как среди разработчиков не хватает Windows-разработчиков.

Приведено много примеров проблемного кода на C++, и какие при этом сообщения об ошибках, и предупреждения выдаёт компилятор. Похоже, получился интересный статический анализатор кода, но есть и возможности анализа поведения в run-time. На базе компилятора разрабатываются очень интересные средства рефакторинга и анализа C++ кода. Например, средство для удаление ненужных include.

Andrei Alexandrescu: Static If I Had a Hammer

Речь идёт о предложении добавить в стандарт языка конструкцию 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;


Bjarne Stroustrup and Andrew Sutton: A Concept Design for C++

Концепции — многострадальная фича, которая не вошла в стандарт языка 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); 


Panel: Ask Us Anything! (all speakers)

Сессия вопросов и ответов. Затронуто очень много тем:
  • adoption to C++
  • constexpr
  • shared_ptr
  • reflection
  • plans for C++ next standard
  • modules
  • polymorphic lambdas
  • writing portable code
  • compiler vendors
  • template exports
  • concepts
  • concurrency
  • build time
  • C++ syntax
  • refactoring tools

Из обсуждения 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


Огромное спасибо организаторам и участникам конференции!!!
+66
29 февраля 2012, 03:04
111
tenzink 6,0 G+

комментарии (40)

0
gridem #
С++ превращается в какого-то монстра, которого уже и создатели начинают побаиваться.
+10
NeoCode #
Я в свое время на rsdn предлагал такую идею…
Не вводить новые монстодиальные навороты в и без того навороченный С++. Текущий стандарт С++ заморозить и никаких изменений в него больше не вносить.
Вместо этого просто разработать новый язык (типа D), более мощный, и в то же время более стройный и логичный, учитывающий все ошибки дизайна С++, и назвать его «новым стандартом». Обязать компиляторы поддерживать оба языка, декларировать двоичную совместимость, какую-то совместимость на уровне заголовочных файлов. И все.
Никто бы не кинулся переписывать код, но в существующих проектах новые файлы можно было бы писать на новом языке, по мере рефакторинга переписывать неспеша старые модули. Новые проекты сразу бы писали на новом языке. Лет через 10 старую ветку прикрыть.
0
gridem #
Да, такая идея мне по душе. Т.е. обладать полной совместимостью, но при этом иметь другой синтаксис, более удобный. А также иметь возможность, скажем, преобразовывать хедера из C++ в новый язык. Но такого никто не будет делать. Для ентерпрайза это все равно очень обременительно. В компании, где я работаю, GCC не обновляли 10 лет. 10 ЛЕТ!!! А вы говорите.
0
KindDragon #
Капец. Наверное код теперь уже сложно будет заставить скомпилироваться в новой версии.
0
volum_separatum #
Вы при этом не учитываете психологию людей (как программистов, особенно начинающих, так и менеджерскую прослойку).
«Что? Новый язык? Зачем нам это, сколько лет на С++ работали, и дальше будем на нем работать.»
+1
NeoCode #
«Новые языки» бывают разные. И отношение к ним может быть разное.
Одно дело язык с синтаксисом, максимально близким к С++, но в то же время лишенный его недостатков и со множеством красивых и полезных фич, которые хорошо себя зарекомендовали в других языках — это одно. А нечто совершенно новое и непонятное — это другое.
Тут главное — «бесшовная» интеграция из коробки для основных компиляторов. Если программист без всяких танцев с бубном просто создает новый файл с новым расширением (типа cppx), добавляет его в существующий рабочий проект в своей IDE (в той же Visual Studio), вставляет в него код примера с интернет-страницы нового языка — и вуаля — все работает! — то это одно. А если нужно что-то там настраивать, шаманить, компилятор/линкер выдает загадочные ошибки или вообще отказывается работать — это совсем другое.

0
Stvad #
Насколько я помню, тот же D предоставляет такую возможность…
+1
orcy #
> Обязать компиляторы поддерживать оба языка
Под страхом смерти?

Большинство возможностей нового стандарта не не монстроидальныйе навороты. Что вам не понятно, auto, variadic templates, lambda? Это наоборот пойдет на упрощение многих конструкций.
0
QtRoS #
Ага, интересно, кто-нибудь потом вообще сможет сказать — я знаю С++ ?!
0
tangro #
Так его и сейчас никто толком не знает. Компиляторы Microsoft, Intel, gcc, Clang имеют кучу собственных несовместимых друг с другом флагов, поддержка С++11 у всех разная, плюс к этому есть С++\CLI и еще будет новый С++ для Win8.

Вот только это мало кого парит, поскольку каждый пишет на своей платформе\компиляторе и всё.
0
orcy #
Тем не менее есть довольно много кросплатформенного С++ кода. Можно конечно ныть, но С++ поддерживается на большем количестве платформ чем любой другой язык (кроме С :-) )
0
xiWera #
Да и щас, если по чесноку, во всем мире это могут сказать не так уж и много людей…
0
9mm #
Причём в монстра он превращается из монстра.
0
gridem #
Я бы здесь немного уточнил: превращается из монстрика в монстра.
0
9mm #
Ага, всё познаёт со в сравнении :).
0
9mm #
(познаётся) Блин, клятая автозамена.
+2
nuit #
Стандарт языка(не включая либ) C++ не больше чем у C#/Java.
0
elw00d #
Не верю. В С++ намного более сложные синтаксические правила, чем в C#/Java. Перегрузка операторов, конструкторы копий, нюансы механики вызова функций и возврата значений (return const reference к примеру), константность, указатели на члены класса, friend-классы, множественное наследование, виртуальное наследование, — всего этого просто нет в C#/Java, поэтому и описание этих языков не может быть таким же большим, как С++.
+2
nuit #
0
elw00d #
И правда, около 400-500 страниц и там и там. Как же так-то…
0
Useless_guy #
C++98 — 714 страниц
Черновик C++0x на 2007 год — более 1000
C# 4 — 507 страниц
+2
nuit #
_не включая либ_
0
ChernovDmitry #
Java может быть, а в C# на самом деле очень много всего. Например недавно увидел вопросительный знак в декларации переменной и был дико в шоке.
+5
tangro #
Он наоборот, превращается из монстра во что-то читабельное. Например, auto, лямбды и ranged for сделали код намного проще и читабельнее.
+1
gridem #
Имелось ввиду описание языка и его поддержка со стороны компиляторов. Конечно, auto и лямбды — это все отлично, но вот лямбды могут быть вложенные, переменные могут в первом случае браться по ссылке, во втором: по значению. И это все надо описывать.
+1
rtorsten #
Новый С++ меня радует всем. Код стало писать намного проще, и при этом он стал более эффективным и безопасным. Из всех докладов больше всего понравилась доклад Страуструпа, у него очень удачные примеры, которые действительно изменили ход моих мыслей о том как лучше программировать вообще и на С++ в частности.
+7
9mm #
Вот с чем согласен, так это с ненужностью в C++ GC. Его наличие создаёт больше проблем чем решает. Если он будет, половина кода будет написана с его использованием, а половина – без. Разобраться в этом бараке будет ещё сложнее.

Собственно, главный плюс GC: он позволяет не следить за временем жизни объекта (только если единственный ресурс объекта – память). Ещё, если GC перемещающий, он автоматически борется с фрагментацией памяти. Минусы: непредсказуемые запуски GC, Перерасход памяти, сложность при взаимодействии с не GC кодом (читай с функциями на C), проблемы с концепцией деструкторов.

В общём, называйте меня закостенелым старпёром, но я предпочту старое доброе ручное управление памятью, без непредсказуемых запусков GC.
+1
bitterman #
а почему непредсказуемость запуска GC является атрибутом GC как концепции? Никто не мешает запускать GC в предсказуемые моменты времени.
0
9mm #
Ничего не мешает, но с попытка определить самые удачные моменты для запуска GC это тот ещё геморой, сомневаюсь что на уровне приложения можно подобрать эти моменты существенно лучше чем на уовне GC.
+2
icc #
Вот поэтому и нужно самому следить за памятью. Все таки C++ это не C#.
+1
PQR #
В конце выступления Герб эффектно описал самую слабую сторону C++, и рассказал, что планируется сделать, чтобы исправить ситуацию.

Заинтриговали! В двух словах, что является самой слабой стороной C++ и что планируется для исправления ситуации?
+4
nuit #
Если не ошибаюсь, то там говорилось про создание стандартных библиотек таких же как в Java/C#
+1
tangro #
Именно так. Отсутствие стандартных средств чтобы «из коробки» любого компилятора распарсить XML\JSON, сделать HTTP-запрос, разархивировать ZIP и т.д. — основная проблема. Новичкам тяжело понять, почему этого всего нет сразу, как в Java и .NET, зачем нужна куча библиотек, как выбрать самую лучшую и т.д. Плюс масса людей ежедневно пишет собственные велосипеды или прикручивает огромные внешние либы (типа буста) ради какой-то мелочи.
+1
icc #
Про atomic переменные понравилось. Хорошо, что за многопоточность взялись.
0
icc #
И от OpenMP можно будет оказаться в некоторых случаях.
–1
zim32 #
Ну все. Теперь вместо книг «С++ за 24 часа» буду «С++ за 26 часов». Печаль… )
+1
agmt #
Нет, время не изменилось. Не забудьте про эпилог.
0
agmt #
Это прекрасно. Родные (native) программисты — замечательно.
И мне очень нравится появление неделимых (atomic) действий, лямбда-выражений и особенно типа auto (странно, что их не было раньше) в этом замечательном cross-platform assembler.
+2
Gorthauer87 #
Где вы видели ассемблер со встроенным ООП? Оо
0
bigbes #
IlASM или MSIL, как хотите:)

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.