У меня на ладони лежит очень горячий сотовый телефон, который разогрелся из‑за того, что мессенджер отображает статичное сообщение с пузырем и текстом на экране при помощи браузерного движка и безумного количества сторонних библиотек. При этом я отлично помню время, когда десктоп был в 10 раз менее производительным, чем этот сотовый, а не‑кроссплатформенные мессенджеры тех времен, написанные на С++, отображали текст не нагружая эти допотопные процессоры и на 10%. Я считаю, что в такой деградации виноват в первую очередь комитет по стандартизации C++. Их близорукие решения и неспособность адаптироваться к реальным потребностям разработчиков привели к парадоксальной ситуации: несмотря на постоянное увеличение мощности компьютеров, программы работают медленнее и потребляют больше ресурсов, чем их аналоги десятилетней давности, а С++‑разработчики не могут создать даже простой мессенджер, который будет работать на 2–3 распространенных операционных системах, не используя массы сторонних библиотек.
C++ задумывался как язык, который должен был дать программистам возможность писать эффективный код с высоким уровнем абстракции. Однако комитет по стандартизации своими действиями превратил его в переусложненный инструмент, непригодный для решения базовых задач современного программирования. Давайте рассмотрим, как именно комитет саботирует развитие языка.
Комитет создал порочную практику бесконтрольного добавления новых возможностей без удаления устаревших. C++ превратился в настоящего монстра, где даже для такой базовой операции как создание строки или умного указателя существует множество способов. Такое разнообразие не только затрудняет обучение языку, но и создает реальные проблемы при разработке, когда разные библиотеки используют разные подходы к решению одних и тех же задач.
Для чего в С++ auto и лямбды? Для чего синтаксический сахар с новыми формами цикла for? Или вот тот же механизм исключений. Изначально хорошая идея была реализована настолько неудачно, что многие крупные проекты полностью запрещают использование исключений. Комитет создал систему, где любая функция может выбросить исключение в любой момент времени, что делает код непредсказуемым и ненадёжным. Попытка исправить ситуацию добавлением throws в синтаксис языка только усугубила проблему — вместо чётких гарантий времени компиляции получилась очередная полумёртвая полумера, дополнительный способ выстрелить себе в ногу.
Показательна и ситуация с управлением зависимостями и сборкой проектов. В то время как в других языках эти проблемы давно решены, в C++ до сих пор нет стандартного пакетного менеджера. Каждый проект вынужден изобретать собственный способ управления зависимостями, что создает настоящий хаос в экосистеме языка. Даже простая задача сборки программы превращается в нетривиальный квест по настройке систем сборки и поиску совместимых библиотек.
Ситуация усугубляется полным отсутствием стандартных инструментов для работы с сетью. В 2024 году, когда интернет стал неотъемлемой частью любого приложения, в C++ до сих пор нет даже простейшей библиотеки для работы с TCP/IP! Программисты вынуждены искать сторонние решения или подключать громоздкие фреймворки только для того, чтобы отправить HTTP‑запрос. Это не просто неудобство — это прямое препятствие для развития экосистемы языка.
Наиболее губительным для языка является отсутствие базовых кроссплатформенных библиотек для работы с различными видами ввода‑вывода. Без стандартных средств для работы с клавиатурой, мышью, геймпадом, звуком, 2D и 3D графикой, видео, сетью, файлами, базами данных и графическим интерфейсом, C++ оказался в парадоксальной ситуации: он стал языком, на котором одновременно тяжело писать операционные системы и драйверы устройств, и при этом практически невозможно создавать кроссплатформенные прикладные программы.
Уже существуют множество библиотек для решения этих задач, например, Qt, Boost.ASIO, SDL, SFML, это приводит к фрагментации сообщества, единая экосистема не появляется из‑за высокой фрагментации. При этом эти библиотеки не являются стандартными и не входят в стандартную библиотеку C++. Комитет предпочитает создавать абстрактного коня в вакууме, не пригодного для решения практических задач, он парализован и годами не может договориться даже о простых вещах, таких как стандартная библиотека для работы с сетью. Да, когда язык создавался, вывод текста в консоль был современной технологией, но, складывается впечатление, что члены комитета так и остались в 1980-х и не готовы признать, что современные прикладные программы имеют графический интерфейс, выводят звук, видео, работают с мышью и другими устройствами ввода‑вывода, да с тем же принтером.
Абсурдность ситуации достигла такого уровня, что создание простого мессенджера на C++, который будет работать хотя бы на двух‑трех популярных операционных системах, требует от опытного С++‑разработчика больше времени и усилий, чем изучение JavaScript с нуля и создание того же мессенджера с использованием веб‑технологий. Это не просто провал — это полная капитуляция языка перед базовыми потребностями современной разработки.
Вместо решения этих критических проблем комитет занимается добавлением всё новых синтаксических конструкций и метапрограммных возможностей, которые только усложняют язык. Концепты, корутины, ranges, span не являются ни базовыми, ни необходимыми для создания прикладных программ. Комитет словно живет в параллельной реальности, где программистам не нужно создавать прикладные программы, а из средств ввода‑вывода достаточно файлов и текстовой консоли.
В результате безответственной политики комитета мы получили ситуацию, когда язык программирования, изначально предназначенный для эффективной разработки, вынуждает программистов использовать неоправданно сложные технологические стеки даже для простейших задач. Это не просто неудобство — это прямой удар по производительности и энергоэффективности программного обеспечения, который ощущают на себе все пользователи современных приложений.
Единственный способ исправить ситуацию — это кардинальное изменение приоритетов комитета по стандартизации C++. Вместо бесконечного усложнения языка им следует наконец заняться созданием полноценной стандартной библиотеки, включающей все необходимые современному разработчику компоненты: от базовых средств ввода‑вывода до инструментов для создания графического интерфейса. Только так можно остановить повальное бегство разработчиков к веб‑технологиям и вернуть C++ статус языка, на котором можно эффективно создавать современные приложения. Но есть ли у текущего состава комитета желание и компетенция для решения этих задач? К сожалению, текущие тенденции развития языка говорят об обратном.
В С++ уже несколько раз предлагали добавить поддержку вывода графики:
-
SG13 (Study Group 13: HMI/Graphics) — в 2013 году 2D графике во всех популярных ОС исполнилось 18 лет, но в стандарт С++ предлагали добавить не что‑то совсем‑совсем базовое, не способ выводить на экран 2D изображение, а вдруг решили решить одним махом и проблемы обработки ввода от мышек и тачпадов, и проблему сложного рисования и текстурирования, и ввести высокоуровневые абстракции типа кистей, не имеющие ничего общего с низкоуровневыми примитивами рисования как в 2013 году, так и до и после этого.
-
Graphics TS (Technical Specification) — в 2016 году, казалось бы, уж вывод примитивной 2D графики понятно было как сделать, но почему‑то всерьез рассматривали возможность использовать векторную графику.
-
P0267 — C++ 2D Graphics API — снова кисти, фигуры, дуги.
Да для чего это все нужно? Комитет, очнитесь! В стандартной библиотеке нет ничего, нельзя даже имея готовую 2D картинку в памяти, вывести ее на экран. Стандартизуйте самые базовые возможности, хотя бы аналог возможности работать с пикселями в canvas в браузере. Да посмотрите на самые базовые возможности SDL в конце концов. Стандартизуйте ввод мышкой хотя бы с 2 кнопками и без колесика, через год добавите колесико. Стандартизуйте создание окошка. Почему в браузере API для всего этого может появиться, а в С++ нет? Сделайте хоть один шаг вперед.
Складывается впечатление, что цель комитета стандартизации C++ — заставить всех С++‑разработчиков наконец выучить JavaScript и перестать использовать С++.
Автор: NeonNomad