Boost: asio, spirit, hana и экосистема библиотек

Тема дорожной карты · Modern C++ Developer

Boost — крупнейшая коллекция рецензируемых C++-библиотек и главный «инкубатор» стандарта: умные указатели, std::function, регулярные выражения, std::filesystem, std::optional и std::variant сначала появились в Boost и лишь затем вошли в ISO C++. Сегодня в Boost более 180 библиотек, от контейнеров и сериализации до асинхронного ввода-вывода. Уметь ориентироваться в этой экосистеме, отличать header-only библиотеки от требующих сборки и знать три флагманских проекта — Asio, Spirit и Hana — необходимо любому разработчику, работающему с легаси или высоконагруженным кодом.

Как это работает

Boost распространяется единым архивом, но библиотеки внутри независимы и версионируются вместе (релизы выходят трижды в год). Большинство из них header-only: достаточно добавить путь к заголовкам. Отдельные библиотеки — Boost.System, Boost.Filesystem, Boost.Thread, Boost.Regex, Boost.Serialization — требуют сборки через b2 или подключения собранных артефактов через CMake (find_package(Boost COMPONENTS system filesystem)), Conan или vcpkg.

Asio — библиотека асинхронного ввода-вывода: сокеты, таймеры, последовательные порты и универсальная модель executors. Она существует в двух вариантах — внутри Boost и как автономная библиотека без зависимостей — и послужила основой для сетевого предложения в стандарт. Spirit — встроенный в C++ язык описания парсеров: грамматика записывается прямо в коде через перегруженные операторы, а компилятор генерирует рекурсивный нисходящий парсер (актуальная версия — Spirit X3). Hana — библиотека метапрограммирования для C++14 и выше, где типы и константы обрабатываются как значения: hana::tuple, hana::map, рефлексия структур через BOOST_HANA_DEFINE_STRUCT.

Помимо флагманов, в повседневной работе чаще всего встречаются Boost.Beast (HTTP и WebSocket поверх Asio), Boost.Program_options, Boost.Multiprecision, Boost.Interprocess, Boost.Container (например, flat_map, small_vector) и Boost.Test.

Когда применять

Берите Boost, когда нужной функциональности в стандарте ещё нет или её нельзя использовать из-за старого компилятора: Asio для сетевого кода до появления стандартного networking, Multiprecision для длинной арифметики, Interprocess для разделяемой памяти, Program_options для разбора командной строки. Spirit оправдан для нетривиальных грамматик — конфигурационных языков, DSL, протоколов, — где регулярных выражений уже не хватает, а тянуть внешний генератор парсеров не хочется. Hana пригодится в библиотечном коде с тяжёлой обработкой списков типов. Если же нужна одна маленькая функция, а компилятор поддерживает C++17/20, предпочтите стандартную библиотеку — зависимость от Boost заметно увеличивает время сборки и размер репозитория.

Типичные ошибки

Подключение всего Boost ради одной библиотеки без выделения нужных модулей раздувает сборку и CI на минуты. Смешивание версий Boost между зависимостями ломает ABI, особенно у собираемых библиотек вроде Boost.System. Spirit печально известен временем компиляции и объёмом диагностики: одна ошибка в грамматике даёт сотни строк вывода, поэтому грамматики стоит дробить и выносить в отдельные единицы трансляции. Использование boost::shared_ptr, boost::optional и boost::filesystem в новом коде, когда есть стандартные аналоги, создаёт две несовместимые вселенные типов внутри одного проекта. Наконец, header-only библиотеки не означают отсутствие зависимостей: Boost.Asio на Windows требует линковки с ws2_32, а с SSL — с OpenSSL.

Связанные понятия

Полезные ресурсы

🔤 Английские термины в этой теме

Слова из этой темы, которые русскоязычные часто произносят неверно. Кнопка 🔊 произносит голосом браузера.

Весь словарь терминов →