Что можно делать с помощью
Языки C и C++. Где их используют и зачем?
Сфера применения C и C++ на удивление широка. Даже в сегодняшнем мире, несмотря на всё многообразие современных надёжных инструментов, эти два языка программирования остаются незаменимыми. Давайте же выясним, какие популярные приложения написаны на этих языках и зачем нам использовать их сегодня.
1. Операционные системы
Язык C первоначально создавался для системного программирования, поэтому не удивительно, что его так активно применяют при создании операционных систем и программного обеспечения.
Быстрый и энергоэффективный, он достаточно близок к аппаратному слою, что позволяет работать с кодом низкого уровня.
Вот почему он идеален для разработки операционных систем.
Любая операционная система в первую очередь должна быстро запускаться и эффективно управлять системными ресурсами. Например, Linux, Microsoft Windows, Mac OS полностью написаны на языке C, а Android и iOS — частично.
Разработчик на языке C может реализовывать все структуры данных самостоятельно, производя тонкую настройку мельчайших деталей операционной системы. Такая высокая гибкость — весомый аргумент в пользу языка.
В отличие от других языков программирования, язык C не имеет зависимостей времени исполнения. Это означает, что программа может выполняться силами аппаратных средств без участия менеджера памяти, входного или выходного слоя.
2. Программирование встроенных систем
Язык программирования C просто необходим при проектировании встроенных систем.
Главным образом из-за высокой производительности и простоты использования. Язык C очень экономичен в потреблении ресурсов системы, благодаря чему программа выполняется быстро. В результате встроенные системы работают в реальном времени без замедления.
Ещё важнее здесь — код на C, будучи платформенно-независимым, не связан с каким-либо конкретным микропроцессором или системой. Так что встроенную программу можно скомпилировать в разных устройствах и платформах с незначительными изменениями или вовсе без них.
Вот почему беспилотные автомобили, умные часы, сенсоры и устройства, использующие технологию Интернета вещей (например, кофемашины), имеют встроенное ПО, целиком написанное на C или C++. В связанных системах C позволяет работать непосредственно с ресурсами памяти и править любую часть кода.
3. Разработка игр и игрового движка
Производительность крайне важна для игры, поэтому выбор языка программирования здесь ограничен.
Являясь самым быстрым на сегодняшний день языком программирования, С++ оказывается одним из лучших для игр в 3D, многопользовательских и других.
Например, Counter-Strike, StarCraft: Brood War, Diablo I, World of Warcraft — все эти игры написаны на C++. Не говоря уже о консолях Xbox и PlayStation, в основе которых лежит программирование C++.
В ядре игрового движка Unity — самого популярного движка для создания видеоигр под несколько операционных систем одновременно — также использовался C++.
Средства разработки C++ могут совладать даже с самой сложной игровой графикой. Они позволяют оптимизировать и регулировать то, как именно будут использоваться ресурсы памяти и структуры данных в игре.
4. Разработка настольных и кроссплатформенных приложений
C++ также можно использовать для создания настольных приложений. Всё благодаря превосходным кроссплатформенным средствам разработки (иногда называемым фреймворками), таким как Qt. Оно позволяет нацелиться на Windows, Linux, macOS, Android и встроенные системы — все c единой кодовой базой. Так что разработка приложений с помощью Qt оказывается отличным решением для тех, кто хочет сэкономить на времени и стоимости программирования.
Стоит упомянуть и о библиотеке SDL, нашпигованной функциями, позволяющими создавать приложения одновременно для Windows, Linux, Android, MacOS и iOS.
Кстати, Photoshop, Illustrator и Adobe Premiere целиком написаны на C++.
Какие ещё есть приложения?
В Facebook перевели часть кода из PHP на язык C++, чтобы сократить затраты электроэнергии в расчёте на одного пользователя. Возможно, облачные системы хранения, базы данных, драйверы устройств и другие виды ПО тоже используют C++.
Сюда также можно отнести банковские и другие приложения, обладающие высокой степенью многопоточности и низким периодом ожидания. Словом — всё, что должно работать быстро и без проблем.
Выводы
Принимая во внимание всё вышесказанное, будем считать, что языки C/C++ вполне годятся для:
Также можно отметить, что в проектах, имеющих дело со сложными типами данных, разработка ПО с использованием C++ предотвращает перегрузку данными и похожие проблемы.
Так что, если вы спросите:
Почему мы до сих пор используем C/C++?
Есть короткий ответ: C и C++ гибкие, очень быстрые и эффективные. К тому же они ближе к машинному коду, чем любой другой язык программирования. Именно поэтому в некоторых случаях эти языки просто незаменимы.
Так что наш прогноз таков: в ближайшем будущем язык C не сойдёт с технологической арены. Особенно по причине роста количества устройств, поддерживающих технологию Интернета вещей, а эти устройства крепко завязаны на управлении машинным кодом и памятью.
А вы уже в предвкушении будущего?
Возможно Вам также будет интересно:
Что можно реализовать на разных языках программирования? С++ Java Python на какие ОС?
И снова здравствуйте!
Мне прямо как то неудобно снова здесь задавать такие вопросы почти на ту же тематику. Полазил по Google Wikipedia и не нашел то что искал. Написано что мне подходит и С++ Pyton Java а для сайтов ( PHP)
Я понимаю что каждый язык предназначен под определенные задачи!
Но всё же, насколько я понял С++ просто нереально огромен и сложен ( как говорят «сломает мышление напрочь )
Про Java знаю лишь то что написано на Wikipedia и больше нечего по сути.
Про Python то что на нём написан Youtube и то что есть на Wikipedia ( тоже по сути не много)
Подскажите или дайте направление, что же подойдет мне в данный момент и пригодится в будущем. Я благодаря Wikipedia думаю о Python но о нем лестные отзывы только там и в сомнительного содержания
( вроде начните зарабатывать кучу денег или научитесь программировать как царь ) блогах. Что в свою очередь толкает исключительно к С++ ибо о Java я вообще не слышал нечего лестного.
PS Я понимаю что хороший программист должен знать не одни язык но мне хоть старт взять. И пожалуйста не нужно сарказма, я умею пользоваться Google и другими поисковыми системами, о Кнуте знаю, уже скачаны и ждут прочтения. Мне действительно негде и не у кого спросить.
В первую очередь нужно научится «думать как программист». но это все бредни)
Если хотите реально чему-то научится то стоит начать с основ.
Это Керниган Ритчи «Язык программирования Си».
Java в последнее время очень хорошо себя зарекомендовала в вэбе.
Хватит первого тома Core Java. Из фреймворков могу посоветовать Grails и Play2.
Python / JS можно выучить на курсах Codecademy за 2-3 недели. Там же можно разгребсти html/css.
Если хотите пойти в вэб.
Желательно разобраться в haml sass compass stylus jade grunt bower yeoman bower angular библиотеках.
Желательно разобраться с шаблонами проектирования, и почитать Мартина Фаулера.
Есть ещё книги из серии Pragmatic Programmer самое интересное что у этого издательства нет ни одной плохой книги.
Вообще по программированию и методологиям в целом стоит почитать совершенный код.
Можно ещё почитать чистый код, и идеальную архитектуру.
Для кроссплатформенных мобильных приложений можно разобраться с Air и Flex.
Начинайте с python!
С, С++, Java съедят мозг еще на этапе «Hello World». Громоздкие конструкции создания простейшей программки отбивают желание дальше что-то делать.
Список сайтов, которые работают на python/django:
Dropbox, Instagram, Mozilla, Disqus, Pinterest, tiu.ru, tranio.ru
Ох, эта сложнейшая конструкция съела мовй мозг..
Возможно вам действительно стоит пойти в сторону Java, но никак не Python (ИМХо).
Если хотите идти в сторону веба начинайте с абстрактного понимания HTML, CSS, PHP, а затем уже думайте что вам надо, Flash, Java, или припрет работать на стороне сервера.=)
Вам нужно пройти практикумы:
— (для разогрева) «Introduction to Interactive Programming in Python», Rice University, на Coursera.org; (или аналогичный там же, или что-то по питону на Udacity.com, Udemy.com etc.)
— «Introduction to Programming in Java» (всего 4 главы, но десятки и сотни примеров, заданий и выполненных заданий от топ-кафедры по программированию)
Курсы на Coursera.org:
— «Algorithms, I», Princeton University
— «Algorithms, II», Princeton University
— «Introduction to Databases», Stanford University (он же на edX.org)
— «Introduction to Computer Networks», University of Washington
— (опционально) «Natural Language Processing», Stanford University or Columbia University
— (опционально) «Artificial Intelligence Planning», University of Edinburgh
— «Java For Complete Beginners»
— «Java Design Patterns and Architecture»
— «Java Swing (GUI) Programming: From Beginner to Expert»
— «Java Servlets and JSP»
— «The Java Spring Tutorial»
А также изучите построение клиент-серверных приложений на основе Netty (см. netty.io/wiki/).
Если план сработает, дайте знать через полгода!
Не могу сказать что навыки алгоритмизации сильно помагают программисту в работе. Сейчас всё очень шаблонно, и программисту не нужно думать головой. что собственно очень печально.
Бессмысленный вопрос. Программировать можно на чём угодно. И всё это бред про «начинать стоит с основ».
Сделать следует две вещи. Порядок не важен!
5 полезных государственных онлайн-сервисов
Книга-инструкция про портал госуслуг в России
Книга-инструкция про портал госуслуг в России
Мы расскажем о полезных государственных интернет-сервисах, описанных в книге «Госслужба на 100%».
Портал госуслуг
Что можно делать с помощью портала госуслуг:
Зарегистрировавшись на «Госуслугах», можно использовать учетную запись для доступа к ряду других государственных порталов и сервисов. Например, с помощью портала Пенсионного фонда можно узнать о состоянии индивидуального лицевого счета, накопленных баллах в страховой пенсионной системе, сбережениях в накопительной части пенсии.
Росреестр: важная информация об объектах недвижимости
Человек, который планирует приобрести квартиру, дом, офис или земельный участок, может узнать больше об этом объекте недвижимости на портале Росреестра с помощью сервиса «Справочная информация по объектам недвижимости в режиме онлайн». Здесь можно получить справочные данные о размерах и местонахождении объекта, наличии или отсутствии зарегистрированных прав, их ограничений и обременений.
Еще одна полезная возможность — узнать кадастровую стоимость недвижимости, что весьма актуально для понимания размера налога на имущество, который придется платить. По данным Росреестра, более 20% от общего объема государственных услуг, предоставляемых гражданам и организациям различными федеральными органами исполнительной власти в России, оказывает Росреестр.
Дополнительные возможности портала Росреестра
Для получения кода доступа, обеспечивающего полноценную работу с порталом, необходима электронно-цифровая подпись. Ее можно получить, придя с паспортом, СНИЛС и ИНН в один из удостоверяющих центров.
Проверка задолженности перед выездом за границу
Всем, кто выезжает за границу по делам или на отдых, бывает полезно проверить, нет ли у них долгов, по базе данных судебных приставов. Иначе неприятным сюрпризом при прохождении пограничного контроля может оказаться запрет на выезд, связанный, например, с невыплаченными алиментами, кредитами, налогами или штрафами ГИБДД.
За границу могут не выпустить должников, уклоняющихся от уплаты по обязательствам, долг которых подтвержден судебным решением и превышает 10 тысяч рублей.
Как проверить наличие долгов и запрета на выезд?
Обнаружив задолженность, можно сразу оплатить ее онлайн. Нужно иметь в виду, что после погашения задолженности потребуется время, порой до двух месяцев, чтобы сведения об отмене запрета на выезд дошли до пограничной службы. Попытаться это ускорить можно, лично явившись в Службу судебных приставов с чеками, подтверждающими оплату задолженности.
Регистрация ИП
Многие самозанятые россияне — программисты, дизайнеры, электрики и представители иных специальностей — не платят налоги с доходов. Точно так же немало людей, сдающих в аренду квартиры, не декларируют полученные средства и не платят подоходный налог.
Это опасная «экономия». Незадекларированный наличный доход невозможно предъявить, например, банку для получения ипотеки. Принимая деньги от заказчика или арендатора наличными, трудно отстоять свои интересы в суде в случае конфликта. Наконец, сложно привлечь в число клиентов компании с хорошей репутацией, которые не используют «черный нал» в расчетах, а легальные выплаты физическому лицу по договору подряда обязывают их внести в казну весьма существенные социальные налоги.
Самозанятым специалистам, арендодателям квартир — физическим лицам и, наконец, начинающим предпринимателям, создающим небольшой бизнес, стоит задуматься о такой простой и удобной государственной услуге, как регистрация индивидуального предпринимателя.
Как зарегистрировать ИП
Учтите, у сервиса есть недостаток: он не формирует заявление на применение упрощенной системы налогообложения. Его можно скачать в интернете (например, на сайте www.iloveip.ru), заполнить и подать при регистрации в ИФНС.
Личный кабинет налогоплательщика
Каждый читающий эту статью является налогоплательщиком. За наемного работника подоходный налог на зарплату обычно рассчитывает и платит работодатель. Однако у многих из нас есть имущество, которое облагается налогом.
Бывают дополнительные доходы, например от сдачи в аренду недвижимости, которые необходимо задекларировать и заплатить налог. Чтобы предоставить людям возможность удобно управлять своими налоговыми обязательствами, получать напоминания о неуплаченных налогах, сохранять информацию о прошлых платежах, платить онлайн, Федеральная налоговая служба разработала удобный сервис, которым на момент написания книги пользовались уже около 16 миллионов человек.
Для доступа к сервису «Личный кабинет налогоплательщика» можно воспользоваться тремя способами:
Информацию о других полезных государственных сервисах, а также ответы на вопросы о работе чиновников вы найдёте в книге «Госслужба на 100%».
С++ на практике
Все мы знаем, что С++ — мощный язык, у которого много сторонников. Но чем могут быть недовольны даже сторонники? Где сталкиваешься с неудобствами и чем они вызваны? Почему в примитивном приложении могут вылезти неожиданные сложности и чего не хватает в стандартной библиотеке? А главное, что можно сделать для улучшения ситуации?
Антон Полухин (antoshkka), состоящий в комитете по стандартизации C++ и работающий в «Яндекс.Такси», рассказал обо всём этом в докладе «C++ на практике». Сам доклад появился ещё в 2019-м, и с выходом C++20 что-то изменилось, но главные тезисы и вывод остались актуальны. Поэтому теперь, готовя новую конференцию C++ Russia 2021, мы решили сделать для Хабра пост на основе этого доклада. Под катом — и текст, и видеозапись. Далее повествование идёт от лица Антона.
Вступление
Меня зовут Антон Полухин, я сотрудник компании «Яндекс.Такси». В свободное и рабочее время я занимаюсь развитием C++: разрабатываю Boost-библиотеки, провожу мастер-классы и читаю лекции о своём любимом языке программирования.
Сегодня мы поговорим о том, насколько приятно пользоваться C++ в повседневной жизни: рассмотрим два совершенно разных приложения и увидим всю боль, ужасы и приятности «плюсов».
В «Википедии» умные люди пишут, что C++ — это «компилируемый, статически типизированный язык программирования общего назначения». А это значит, что на нём можно писать практически всё, что угодно: и консольные вспомогательные утилиты, и игры, и Android-приложения, и поисковые движки! По крайней мере, так говорят. Давайте проверим.
Пример «Ёлочка»
Под Новый год знакомый скинул мне программу на Bash, которая выводила на экран ёлочку в ASCII-графике с красиво мигающими лампочками:
Насколько сложно написать то же самое на «плюсах»? У меня это заняло день. Но написание на Perl, Python или Bash отняло бы столько же времени и было бы чуть неприятнее.
Что собой представляет это мини-приложение? Ёлочка мигает, а при нажатии на клавишу меняется режим «гирлянды»: все лампочки становятся одного цвета.
Суперсерьёзная программа! Она занимает примерно 100 строчек кода, но даже тут есть некрасивости. Например, что происходит в этом блоке?
И чтобы обойти это, приходится создавать отдельный поток и там смотреть, когда же пользователь нажмёт кнопку. А еще внутри придётся воспользоваться атомиками.
Нам всего лишь хотелось нарисовать ёлочку в терминале, а тут внезапно вылезла многопоточность! Не очень приятно.
А вот и вторая неприятность:
Есть файл с ASCII-графикой, и мы его никак не меняем — из него нужны только байты. Но в С++ нельзя работать с файлом как с массивом байт: придётся открыть поток, считать информацию из потока в контейнер (string или vector) и только тогда работать с этим контейнером.
Почему всё так криво?
Казалось бы, программа простая, почему же возникают такие сложности?
Круг задач, которые можно решать с помощью C++, очень широк. И за то, чтобы эти задачи можно было решать, отвечают вот эти люди:
Знакомьтесь — комитет по стандартизации языка C++. Они эксперты в своих областях: одни в машинном обучении, другие в компиляторах, третьи великолепно знают алгоритмы. Но есть маленькая проблема: все члены комитета находятся в круге задач, отвечающих за высокую производительность.
Если обозначить экспертов зелёными точками, область задач с высокой производительностью — чёрным кругом, а область всех задач, которые можно решать на C++ — жёлтым, ситуация выглядит так:
Так сложилось исторически.
Например, есть стартап, где мало денег и где код пишут как придётся. Со временем стартап ширится, развивается и через 20 лет вырастает в огромный монолит и конгломерат. И тогда компания задумывается о том, что хорошо бы влиять на тот язык программирования, на котором у них всё написано. Поэтому нужен человек, который хорошо разбирается в языке и преследует интересы компании — его-то и отправляют в комитет по стандартизации C++.
Так уж получается, что самые хардкорные C++ программисты занимаются самыми суровыми вещами — они редко читают вывод с клавиатуры или из файлика, а занимаются только тем местом, которое критично для всего приложения. Если программа на C++, значит, нужна высокая производительность. Поэтому человек из комитета и отвечает за высокую производительность.
Около двадцати лет назад в комитете было 20 человек, а теперь уже ближе к двумстам. И по-прежнему это люди, которые решают задачи, связанные с высокой производительностью.
А наша задача с ёлочкой помечена на картинке звёздочкой, и очень далека от целей комитета.
На примере этой программы мы видим, что несмотря на шероховатости, всё работает. А какие будут проблемы в приложении, требующем высокой производительности?
«Ява не тормозит»
В основе «Яндекс.Такси» лежит микросервисная архитектура. Если взять какой-то один сильно нагруженный сервис в отдельном дата-центре, то он будет обрабатывать где-то 20 000 сообщений в секунду. Что-то приходит в виде запроса, что-то он считывает, ищет на графе, обращается к базе и выдает ответ. Каждое такое событие нужно логировать, то есть записать информацию в файл. Один микросервис в отдельном дата-центре порождает 30 гигабайт логов в час, а в сумме все микросервисы генерируют в час больше терабайта логов и миллиарда событий.
Терабайты данных собираются со всех машин и отправляются в удалённое хранилище, где удаляются. Но перед удалением на них смотрят разработчики и менеджеры: находят интересные стратегии улучшения, какие-то несоответствия и то, на чём можно строить дальнейший бизнес.
Раньше для отправки таких сообщений мы использовали Logstash — популярное, бесплатное и открытое приложение, написанное на Java, которым пользуется огромное количество компаний.
Казалось бы, что может пойти не так?
Демон — это то, что принимает запрос, обрабатывает его, обращается к удалённому хранилищу, получает ответ, что-то считает на графе, производит криптографические операции, пишет лог и отдаёт ответ. А Java — это Logstash, который просто отправляет этот лог в удалённое хранилище. При этом потребляет Logstash в два раза больше оперативной памяти и в девять раз больше ресурсов процессора.
Что тут происходит под капотом? Logstash делает следующее:
Вооружимся perf и натравим его на Java. Что мы видим? Logstash постоянно что-то сует в какие-то конкурентные ассоциативные контейнеры, в которых тратится огромное количество времени.
Для чего здесь вообще эти контейнеры? У нас ведь обычный пайплайн и простые правила по преобразованию логов, где по ключу и значению можно сразу понять, что там произошло и как это трансформировать. Нет никаких сложных правил, например, по разной обработке в зависимости от того, встретился ли до этого один ключ или другой.
Давайте сделаем свой Logstash без излишеств — шустрый, модный и современный. Для этого воспользуемся всеми доступными фишками C++17.
«Пилорама»
Представляю вашему вниманию «Пилораму». Почему такое название? Говоря по-английски, пилорама — это «factory in which logs are sawed». То есть что-то, что «пилит логи»! Вот и наша «Пилорама» пилит их и отправляет куда-то дальше.
Учтём ошибки Logstash и вместо трёх стадий с обменом контейнерами между ними (разделение на ключ—значение, применение правил, формирование записи) сделаем одну. Есть кусок данных, мы знаем, как преобразовать его в конечный формат, и никаких сложных промежуточных шагов не нужно.
Берём ключ, проверяем, нормальный ли он. Затем достаём значение и проверяем, пришло ли оно целиком. Записываем всё в выходной формат, применяя какие-то правила. Повторяем до тех пор, пока есть что разбирать.
Но для чего тут нужны две проверки?
«Пилорама» и основной демон работают в разных процессах. Основной демон может захотеть записать четыре с лишним килобайта логов, но успеет записать всего два, когда вклинится «Пилорама» и начнёт эти логи читать. В какой-то момент она заметит, что запись не готова целиком. Для таких случаев и нужны проверки.
С этой функцией конвертации получается более 360 тысяч записей в секунду, а это более 75 мегабайт данных в секунду. Итого больше 270 гигабайт логов в час. Таким образом можно держать 10 самых загруженных микросервисов на одном ядре «Пилорамы» или вообще все логи «Яндекс.Такси» на четырёх ядрах.
Честно говоря, когда я только написал этот конвертер и впервые запустил его, то был недоволен результатом: всего в 30 раз быстрее Java. Но потом я выспался и понял, что собирал всё в режиме отладки. Поэтому сейчас мы примерно в 100 раз быстрее Java, что более-менее приемлемо, но все равно недостаточно.
Почему так медленно? Вот вам немного нашей боли. В приложении есть конвертация данных и преобразование времён, а в C++17 для этого ничего нет. Поэтому приходится пользоваться сторонними библиотеками, например cctz. А эта «редиска» в цикле динамически аллоцирует память.
Если это безобразие убрать и заменить на работу с датой/временем из C++20, то скорость конвертации увеличится практически в два раза.
С++ на практике
Теперь попробуем считать данные с диска. Стандартный подход в C++ — использовать стримы. Есть файл, с которым нужно что-то сделать. Мы открываем ifstream и даём ему команду читать из конкретного файла в определённый контейнер. Тот, в свою очередь, говорит операционной системе отдать какой-то файл. ОС не умеет работать напрямую с диском и записывать байты прямо с него в пользовательские буферы. Сначала ОС подтягивает большой кусок файла в оперативную память и уже оттуда копирует байты в нужный контейнер.
Такой способ работы с файлами — стандартный, но большинство современных ОС могут работать лучше. Операционная система сразу даст доступ к этому фрагменту памяти и работать с ним можно будет без всякого копирования.
Здесь есть какой-то result и функция, которая читает данные с диска, конвертирует и добавляет их в result. Затем мы проверяем, что данных для отправки достаточно, и если их недостаточно, то засыпаем на секунду, а если достаточно, то отправляем их в удаленное хранилище.
Вы можете спросить: «Sleep в коде? Это точно высокопроизводительный сервис?» Если есть 100 файлов, значит, нужно 100 потоков, и все эти потоки иногда спят. Изредка им нужно резко пробудиться, что-то сделать и снова уснуть. ОС будет переключаться между этими потоками и пытаться угадать, какие и когда нужно разбудить. Если файлов 10 тысяч, то и потоков будет 10 тысяч, и тогда все станет ещё хуже: оперативная память будет съедаться, а операционная система — зашиваться. Выглядит не очень производительно.
От пользователя полностью скрыто, что происходит под капотом. Можно просить программистов писать код максимально просто, а под капотом будет эффективная работа, о которой он даже не задумывался.
Отправлять их по сетке может быть очень долго, поэтому мы говорим операционной системе: «Отправь эти сто тысяч мегабайт данных туда-то, а когда сделаешь это, вызови вот эту функцию». Тогда текущая задача снимается с выполнения, откладывается в сторону, а вызываемая функция помечает эту задачу как готовую к выполнению и переносит ее в очередь готовых к выполнению задач. Поток остался без задачи, и поэтому подхватывает ту, что готова к выполнению. И выполняет другую задачу.
Чего не хватает в C++
Более того, размеры у них одинаковые и кажется, что компилятор должен превратить обе функции в идентичный ассемблерный код. Но нет:
Функция, принимающая char8_t* на треть короче. Почему?
Но и в C++20 будет не всё. В С++ по-прежнему не хватает memory map: он нужен и для простых приложений, вроде нашей «Ёлочки», и для высоконагруженных. Предложение по mmap есть в комитете по стандартизации, и оно может быть принято в C++23.
Не хватает стандартной библиотеки побольше. У нас удалённое хранилище, но оно не неоптимальное: написано на Java и работает с JSON. А в С++, к сожалению, из коробки нет возможности работать с JSON. Также хочется Protobuf.
Ну и не хватает правильной работы с вводом/выводом. Есть networking TS, где под капотом используется библиотека Asio, и возможно, её добавят в C++23. Есть Boost.Beast, который работает с HTTP асинхронно — им сложно пользоваться, но код в итоге получается красивым. И есть библиотека AFIO, которая позволяет асинхронно работать с файловой системой и может сказать ОС: «Когда в этой директории появится новый файлик, вызови эту функцию». А там просыпается какая-то корутина и начинает делать с файликом что-то полезное. К несчастью, AFIO — это прототип, работающий, но не быстро.
Что можете сделать лично вы?
Мы рассмотрели два приложения, в каждом из которых есть шероховатости. В случае второго приложения большинство этих недочетов исправят в C++20, но «осадочек остался». Ведь, наверное, с подобными проблемами встречаюсь в разработке не только я. И скорее всего, у разных людей «шероховатости» разные. Что в связи с этим делать?
В комитете по стандартизации хотелось бы видеть больше людей. Причём из разных областей, не обязательно из области высокой производительности. Нужны люди из стартапов, которые будут говорить, где им становится неудобно в начале работы над приложением. Нужны люди из академического мира. В комитете есть преподающие профессора, которые могут рассказать, где студенты стреляют себе в ноги. И с задних рядов слышен голос: «Да-да, я эксперт, и я тоже себе в этом месте ногу отстрелил».
Также требуются люди из тех областей, где C++ не популярен или вообще не используется. Хорошо, если в комитете будет сидеть матерый разработчик embedded-железок, слушать о том, как механизм исключений уместили в 200 байт, и говорить: «А у нас всего 128 байт (нет, не килобайт), думайте дальше».
Если вам что-то не нравится в C++ и вы хотите это улучшить или донести свою боль до комитета по стандартизации, начните с сайта stdcpp.ru. Там люди обмениваются мыслями, желаниями и проблемами, связанными с развитием языка C++. Идеи обсуждаются, обрабатываются и некоторые из них становятся официальными предложениями для международного комитета. При этом рук не хватает, поэтому особенно ценная помощь — когда человек готов не только генерировать идеи, но и браться за написание предложений к ним (хотя бы черновиков).
Драматичным шёпотом: и таким человеком может стать каждый из вас!
Если оптимизация программ на С++ для вас не пустой звук, обратите внимание на C++ Russia 2021, где будет много всего интересного. Конференция пройдёт с 15 по 18 ноября 2021, информация и билеты на сайте.