CppCon 2016

Наконец-то сбылась мечта и я побывал на CppCon. Очень надеюсь что теперь это будет на регулярной основе

Крайне рекомендую к просмотру следующие выступления:

  • High Performance Code 201: Hybrid Data Structures;
  • Rich Code For Tiny Machines: A Simple Commodore 64 Game In C++17;
  • Using weakly ordered C++ atomics correctly;
  • Lifetime Safety… By Default: Making Code Leak-Free by Construction.

Просто рекомендую. Время зря потерянным однозначно не будет:

  • C++ Coroutines: Under the covers;
  • The Guideline Support Library: One Year Later;
  • Deploying C++ modules to 100s of millions of lines of code;
  • Keynote: Developing Blockchain Software.

async && GCD

std::async из C++11 хорош практически всем: прост, удобен, универсален. И только одна особенность стандарта несколько портит этот праздник – нет четкой регламентации того, где и как должна выполниться асинхронная задача; задача может быть выполнена как в отдельном потоке, так и в пуле потоков. В итоге это приводит к тому, что разработчики STL не утруждают себя пулом потоков (даже при наличии оного в ОС по-умолчанию) и плодят по протоку на каждый std::async вызванный с флагом std::launch::async. В случае с macOS, как мне кажется, это довольно большая оплошность, так как в системе уже есть готовый пул потоков, которым остается только воспользоваться!
В итоге я немного поковырялся в стандарте, доступных реализациях и вышло у меня следующее: Continue reading

Форматирование C++ кода

Одна из особенностей языка Go, которая мне очень нравится – стандартизация практические всего и вся с предоставлением инструментов для валидации и максимальной автоматизации применения. Так все программы на Go выглядят более-менее одинаково как за счет единого стандарта к разработке (да,я не люблю кучу соплей с проверкой результатов возврата, но тем не менее это единообразие) так и за счет единого форматирования. Благодаря этому не приходится испытывать какого-то серьезного дискомфорта разбирая новый кусок кода – каким бы (не)качественным он ни был, выглядеть и как следствие восприниматься он будет как родной. Кроме того, основная масса редакторов Go поддерживает переформатирование текста при сохранении, так как за формат отвечает косольное приложение, то появляется возможность поставить триггеры в VCS и отклонять не удовлетворяющие условиям коммиты. С одной стороны, все это может казаться мелочами. Но только до тех пор, пока ты не работаешь в довольно сильно распределенной команде с крайне разными уровнями у разработчиков.
Continue reading

Rust в Dropbox

Как мне кажется, не так давно произошло довольно знаковое событие для мира C++: Dropbox заявил о том, что перевел часть своей инфраструктуры на компоненты написанные на Rust. Чуть позже программисты из Dropbox ответили на вопросы интересующихся посвященные этой миграции. Немного интересных ответов:

> Are you happy using rust ?
Yes, overall the team has been very pleased with it. Compile times are the only serious complaint.

> How many lines of rust code are you using in production?
About 60k of our own, about 300k incl crates.

> Are you using nightly? or just stable version of rust?
We’re pinned to a particular nightly right now, as we rely on a fair amount of features that are still stabilizing. I imagine we’ll be on a stable by this summer.

> What drove the move to Rust precisely? Most of the players in the industry are somewhat reluctant about moving to Rust.
Well, we basically needed C++, but:
1) Dropbox doesn’t have a strong C++ ecosystem on the backend, and it takes a lot of work to build one.
2) Given (1), we had basically a blank slate, and our team is C++ and Haskell type folks, we decided to use Rust so we could get C++ with better type safety and fewer sharp corners.
So realistically, if we had been at a place with an awesome preexisting set of C++ libraries, practices, etc, we probably never would have used Rust.

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

Генератор CMakeLists.txt файлов

Довольно часто возникает необходимость быстренько написать тестовое приложение на C++ и опробовать в нем что-то. IDE я не слишком люблю, а каждый раз где-то выискивать завалявшийся шаблон к CMake-у довольно лениво. После очередных поисков запилил небольшой вспомогательный скриптик (само собой на Python) для генерации CMakeLists.txt.

На данный момент поддерживается только генерация приложений, как надоест конвертировать приложения в библиотеки, так будут и они генериться

Сам скриптик с руководством по использованию тут: https://github.com/astavonin/gen-cmake

C++XX в CMake

Вообще я очень люблю использовать CMake для создания различных небольших тестов. Собирается везде, ручной работы ощутимо меньше, чем если писать правила для Make, генерируется поддержка для любой IDE (если тестик в что-то более крупное перерастет и т.д). И как-то меня угораздило “проспать” как CMake 3.x так и довольно полезную фифу в нем – простое и понятное подключение поддержки C++11. Я всегда подключал C++11 по старинке:

list( APPEND CMAKE_CXX_FLAGS "-std=c++11")

Но, оказывается-то, прогресс шагнул далеко вперед! так что для тех кого так же как и меня “заморозили” сообщаю – все стало проще и понятнее:

cmake_minimum_required(VERSION 3.1 FATAL_ERROR) # (1)
project(cpp11_test)

add_executable(cpp11_test main.cpp)

set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 11)          # (2)
set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD_REQUIRED ON) # (3)

Прекрасная фича доступна начиная с CMake 3.1 1 и включается она 2 очень просто. Если какие-то обходные пути при отсутствии у компилятора поддержки C++11 не планируются, то стоит объявить 3 наличие поддержки C++11 обязательной.

Выступления Майерса на NDC

Досмотрел лекции Майерса с NDC 2014 (WTF, в Норвегии проходят годные конференции, а у нас нет?!) Effective Modern C++ и CPU Caches and Why You care.

Послушать было достаточно интересно, Майерс просто ну очень хороший докладчик, хотя, надо признать, слушать про Auto достало. Одно радует, опытный докладчик даже из совершенно затертой темы сможет сделать интересный рассказ. В данном случае – это информация о разложенных посредствам auto граблей.

Во второй лекции первые 10 минут можно смело проматывать. Что довольно неожиданно, Майерс, в том числе, говорит и о Instruction Cache, чего я не замечал за другими докладчиками/статьями на эту тему. Ну и как всегда, лекцию пронизывает модная на данный момент мысль: массивы хорошо, все остальное так себе. Кстати, если кто-то не знает что такое False Sharing, то в этой лекции можно найти образцово показательное объяснение сего печального явления.

Modern C++: What You Need to Know

На Channel9 появилось новое выступление Герба Саттера посвященное современному C++. Как всегда познавательно и крайне рекомендуемо к просмотру всем, кто активно работает с C++.

Наиболее интересное для не совсем новичков в C++ в конце лекции, так замеры производительности на вставках в середину массива и списка были для меня удивительным открытием. Пример от Саттера касается массивов с интами, что не очень интересно с практической точки зрения. Более детальное рассмотрение скорости можно найти тут.

Кроме того, Саттер немного рассказывает о новом проекте от Microsoft: ParallelSTL, который должен стать доступным публично на следующей неделе.

Overload #119

overload-119

Коллеги, а знаете ли вы о таком замечательном журнале как Overload? Я уже несколько выпусков как собираюсь о нем написать, но все забываю. На мой взгляд, это лучший журнал посвященный C++ разработке на данный момент. В журнале есть все, начиная от алгоритмов и структур данных, заканчивая особенностями язка C++ и оптимизацией кода.