Справочник программиста Библиотеки Гид по TFT-дисплеям

Как писать web-приложения на C++

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

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

Под C++ нет общепризнанных стандартов для создания бэкенда. Библиотек очень много и в их обилии легко запутаться. Это отпугивает. Действительно, требуется высокая квалификация, чтобы написать базу для своего web-сервиса, да и сам порог вхождения в технологию куда выше, чем в том же Go. Код получается несколько громоздким, не существует решения, позволяющего инициализировать бэкенд в 5-6 строчек кода, как в Node.js.

Однако у C++ есть и ряд преимуществ по сравнению с ориентированными на web конкурентами. Прежде всего, это высокая производительность. Сравниться по скорости с компилируемыми языками интерпретируемым практически невозможно, а большинство высокоуровневых языков для создания бэкендов как раз интерпретируемые. Конечно, для них существуют хорошие инструменты повышения производительности. Но ни один из них не позволит обогнать C++-решение по скорости работы. Такие ускорители требуют настройки, дополнительного изучения и поддержки со стороны системного программиста.

C++, который работает даже на микроволновке, является образцом технологии переносимого кода. Бэкенд на C++ можно собрать под любую платформу, даже самую редкую и специфичную, а часть кодов спокойно позаимствовать из открытых библиотек и предыдущих проектов. Мощная объектно-ориентированная парадигма позволяет создавать невероятную по сложности бизнес-логику. В наличии большая общая база кодов, включающая машинное обучение, численные методы, работу с big data, компьютерное зрение. Она позволяет создавать любое приложение, каким бы специфичным оно ни было.

К слову, для базы web-бэкенда нужно реализовать не так много «низкоуровневых» компонентов — принимающую http-часть (поверх которой сейчас модно создавать RESTful API), маршалинг объектов, парсинг JSON (реже XML, еще реже разбираются различные кастомные бинарные форматы), многопоточную обработку клиента и связь с любой популярной СУБД. При выдаче результатов клиенту в браузер зачастую нужен еще шаблонизатор.

Для создания REST API в C++ недавно появился классный фреймворк от Microsoft – C++ REST SDK. Также хорошая реализация локального web-сервера с нужным инструментарием, парсингом JSON и XML, оберткой над популярными базами данных имеется в POCO. Можно написать собственный http-сервер на основе boost::io, это несложно.

На boost также быстро пишется распараллеливание (а также на OpenMP и OpenCL), парсинг JSON и XML. Для баз данных же C++ - стандарт, поэтому большинство СУБД официально имеют клиентское API в виде библиотек под плюсы, например, для самой популярной из реляционных баз данных, Postgresql, это библиотеки libpqxx и libpq++. В качестве шаблонизатора можно присмотреться к Wt.

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

В целом, если есть возможность не писать web-бэкенд на C++, то лучше ею воспользоваться. Аналогичный код на Golang или RoR выйдет более поддерживаемым и емким. Однако при повышенным требованиям к скорости работы или узкой специфике целевой платформы нужно держать в голове, что создание web-бэкенда на C++ - процесс сравнительно безболезненный и не лишенный изящества.

14.12.2018 | Публикации | Теги статьи |
Ардуино+