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.
Связанные понятия
Полезные ресурсы
🔤 Английские термины в этой теме
Слова из этой темы, которые русскоязычные часто произносят неверно. Кнопка 🔊 произносит голосом браузера.
- recursive /rɪˈkɜːrsɪv/ «рикЁрсив» разбор: Флаги вслух: dash r, double-dash force
- asynchronous /eɪˈsɪŋkrənəs/ ударение на второй слог разбор: Немые буквы и ударение: cache, queue, suite, height
- minutes /ˈmɪnɪts/ протокол встречи, произносится как «минуты» разбор: Митинги и инциденты
- thread /θrɛd/ с «θ» разбор: Типичные ошибки русскоязычных: th, w/v, долгота гласных
- written /ˈrɪtn/ «ритн», двойное t произносится как одно, i краткое разбор: Письменная коммуникация
- release /rɪˈliːs/ ударение на второй слог, «релис», а не «релиз» с русским «з» разбор: Версии и числа: two point oh, semver
- repository /rɪˈpɒzɪtəri/ ударение на «по», четыре слога, а не «репозитОри» разбор: Где встречается: код, доки, тикеты, созвоны