Обновить
278.11

C++ *

Типизированный язык программирования

Сначала показывать
Порог рейтинга
Уровень сложности

Создание плагина для Clang для поиска Singleton

Уровень сложностиСредний
Время на прочтение15 мин
Охват и читатели3.1K

Сейчас репутация Singleton давно не та, что была ранее. В последние годы он признается антипаттерном, который следует избегать в новом коде, но что делать с legacy кодом? Ловить косые взгляды современников? В данной статье мы напишем плагин для поиска этого паттерна в коде на C++, разберем аспекты разработки плагина с помощью Clang API и протестируем плагин на реальных проектах.

Читать далее

Новости

Компилируем Python так, чтобы он работал везде

Время на прочтение18 мин
Охват и читатели10K

Это история о том, как написать компилятор Python, генерирующий оптимизированные ядра и при этом позволяющий сохранить простоту кода.

Читать далее

Как поручить работу с доменом стандартным средствам Linux

Уровень сложностиСредний
Время на прочтение6 мин
Охват и читатели7K

В этой статье мы расскажем, как использовать сторонние библиотеки PAM непосредственно из кода для делегирования задач достаточно гибким способом. В прошлом у нас уже была статья про разработку и применение простого PAM модуля для работы со смарт-картами. Рекомендуем ознакомиться для полного понимания.

Читать далее

Coroutines в C++20

Уровень сложностиСложный
Время на прочтение11 мин
Охват и читатели9.3K

В С++ 20 появились coroutines (далее буду называть их корутинами, по‑русски). Если кратко — они позволяют писать асинхронный код также как мы пишем синхронный. При этом асинхронный код это не обязательно должен работать с несколькими потоками. Асинхронным может быть код исполняемый в одном потоке.

Под капотом компилятора корутины — это просто синтактический сахар (syntax sugar). Т.е. корутины не создадут дополнительных потоков. Компилятор заменит корутины вызовом нескольких функций и не более того. Но давайте посмотрим как корутины выглядят в коде.

В этой статье я буду делать простейший таймер на основе корутин. При этом напишу классы, для Awaitable и Promise, которые необходимы для работы корутин.

Читать далее

Как я свой гибридный протокол шифрования за выходные написал

Уровень сложностиПростой
Время на прочтение8 мин
Охват и читатели7.7K

В статье автор делится опытом создания собственного гибридного протокола шифрования ObscuraProto с нулявсего за два выходных дня. Проект, начавшийся как вызов самому себе для простого мессенджера, превратился в полноценную библиотеку на C++ с использованием libsodium.

Автор подробно разбирает архитектуру протокола, который сочетает асимметричную и симметричную криптографию. Описывается трехэтапный процесс «рукопожатия» (handshake) с использованием эллиптических кривых (X25519) для безопасного обмена ключами и обеспечения Perfect Forward Secrecy (PFS). Также объясняется выбор симметричного шифра ChaCha20-Poly1305 для быстрой и безопасной передачи данных и его преимущества перед AES‑GCM на устройствах без аппаратной поддержки.

Статья раскрывает детали реализации, включая структуру зашифрованных пакетов, защиту от replay‑атак с помощью счетчика сообщений и использование KDF для генерации сессионных ключей. Теоретические концепции подкрепляются наглядными примерами кода на C++. Эта статья будет интересна для тех, кто интересуется криптографией и любит создавать «велосипеды» в образовательных целях.

Читать далее

Портируем ML на RISC-V: как не потерять производительность

Уровень сложностиПростой
Время на прочтение13 мин
Охват и читатели7.9K

Современные ML-системы опираются на CPU и ускорители — тензорные или графические. Но их производительность часто ограничена пропускной способностью шины между CPU и GPU: данные приходится постоянно перегонять туда-сюда, и выигрыш от ускорителя нередко тает.

Что если есть архитектура, где этого узкого места нет? RISC-V предоставляет гетерогенность принципиально нового уровня, объединяя ключевые компоненты устройства на одном кристалле, что снимает одно из главные ограничений производительности в ML. Но одних процессоров здесь мало — нужна еще экосистема библиотек.

Читать далее

Итоги встречи ISO C++ на Гавайях: начинаем полировку стандарта С++26

Уровень сложностиСредний
Время на прочтение4 мин
Охват и читатели15K

Привет! На связи Антон Полухин из Техплатформы Городских сервисов Яндекса. Сегодня я расскажу о ноябрьской встрече Международного комитета по стандартизации языка программирования C++, в которой принимал активное участие. Это была первая из встреч, связанных с «полировкой» C++26. Другими словами, новые фичи C++ пока не появятся — комитет должен только проработать замечания всех стран-участников, включая наши замечания от России.

Однако от плана немного отступили и втащили некоторые новинки как ответы на пожелания участников комитета: std::integer_sequence оброс новой функциональностью, а std::format научился в constexpr.

Помимо этого, поправили множество багов, перековыряли связку Hardening + Contracts, внесли улучшения во многие части стандартной библиотеки.

Читать далее

quic-test: открытый инструмент для тестирования QUIC, BBRv3 и FEC в реальных условиях

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели8.3K

Можно использовать iperf3, но он про TCP и базовый UDP. Можно взять отдельные QUIC-библиотеки, но без визуализации и нагрузки. Можно написать кастомные симуляторы, но они не отражают реального поведения каналов. Хочешь проверить, как BBRv3 ведет себя на трассе Москва — Новосибирск? Пожалуйста, найди три сервера в разных дата-центрах, настрой netem, собери метрики вручную и надейся, что результаты будут воспроизводимы.

Читать далее

Специальные функции-члены в C++

Уровень сложностиСредний
Время на прочтение25 мин
Охват и читатели5.5K

Продолжаем серию «C++, копаем вглубь». Цель этой серии — рассказать максимально подробно о разных особенностях языка, возможно довольно специфичных. Это девятая статья из серии, список предыдущих статей приведен в разделе 6. Серия ориентирована на программистов, имеющих определенный опыт работы на C++. Данная статья посвящена специальным функциям-членам.

В C++ жизненный цикл экземпляра класса/структуры/объединения (объект, представляемый в коде переменной) начинается с инициализации, то есть задания его начального состояния. Далее, почти всегда, объект копируется, выполняются присваивания или их перемещающие аналоги. Эти операции необходимы для работы функций, контейнеров, алгоритмов. Финальной точкой жизненного цикла объекта является его уничтожение. Именно для поддержки этих операций в C++ и предназначены специальные функции-члены.

Важная особенность специальных функций-членов — это то, что в их реализации принимает участие компилятор. Реализации специальной функции-члена частично (а в ряде случаев и полностью) может быть сгенерирована компилятором. Кроме того, во многих случаях программист не вызывает явно специальные функции-члены в своем коде, эти вызовы генерируются компилятором в определенном контексте.

Итак, попробуем рассказать о специальных функциях-членах максимально подробно.

Читать далее

Форматируем строку по-человечески: C++ и его <format>

Уровень сложностиПростой
Время на прочтение8 мин
Охват и читатели9K

Когда-то давным-давно (то есть до C++20) мы форматировали вывод либо по-старинке через printf, либо используя громоздкие стримы ввода-вывода из <iostream>. Оба подхода, мягко говоря, не очень. printf работал шустро и лаконично, но требовал строгого соответствия типов, забудешь правильный %d или %s в формате, и получишь неопределённое поведение вплоть до падения программы. Компиляторы иногда предупреждают о несоответствиях, но полностью проблему не решают (особенно если форматируемая строка не литерал). Кроме того, printf не умеет выводить пользовательские классы, только примитивы.

Сейчас ситуация изменилась. В C++20 завезли библиотеку <format>, современный подход к форматированию строк, сочетающий лаконичность printf с безопасностью iostream. Инструмент называется std::format и объявлен в заголовке <format>. По сути, это адаптация популярной библиотеки fmt.

Читать далее

Как мы за 8 месяцев переписали 3 года разработки: переход «Инферит ИТМен» с .NET на C++

Уровень сложностиПростой
Время на прочтение4 мин
Охват и читатели8.4K

Привет, я Данила Трусов, директор продукта «Инферит ИТМен».
Хочу рассказать, как мы в буквальном смысле переписали три года разработки за восемь месяцев — и почему этот переход оказался не просто технологическим апгрейдом, а шагом к полной независимости продукта.

Читать далее

Мифы, суеверия и народные мудрости в разработке игр

Время на прочтение23 мин
Охват и читатели13K

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

В других конторах, обычно молодых и индерзких, могут использовать различной длины приборы для наложения или заниматься плюшкинством и тащить в проект все что плохо или бесплатно лежит, обмазывая и без того непростую архитектуру толстым слоем абстракций, тулов и фреймворков, пока оно вообще не перестает работать. В такой атмосфере уже трудно разобраться, работает ли мудрость, или её просто утопили под десятком слоёв инженерного творчества. Поэтому к любым "истинам" лучше относиться спокойно и проверять их на практике, а не по степени древности. Собственно по любому пункту миф это или народная мудрость можете отписываться в комментариях, будет интересно услышать ваше мнение. Получился лонгрид, так что заваривайте чаю, ну или чего покрепче, картинок не будет... почти, а еще получилось, что кони, люди и мухи слеплены в большую котлету и размышления о разработке и плюсах перемежаются со студийными суевериями, кто был в студии, тот поймет.

Понедельнишное

Retro68: если вам скучно жить на свете

Уровень сложностиСложный
Время на прочтение18 мин
Охват и читатели8.3K

Конец ноября в Питере — крайне мрачное время года, на улице лишь холод, сырость и уныние. Что определенно влияет на психику местных жителей, порождая в головах самые нездоровые желания.

Видимо по этой причине, одним мрачным осенним днем мне захотелось создать графическое приложение на современном C++ под.. классический Mac из 90х.

Читать далее

Ближайшие события

Алгоритмы на графах

Уровень сложностиСредний
Время на прочтение8 мин
Охват и читатели11K

Краткое и доступное руководство по базовым алгоритмам на графах: BFS, DFS, топологической сортировке и алгоритму Дейкстры. Чёткие объяснения, примеры и код на C++ — для тех, кто хочет быстро и уверенно освоить фундамент графовых алгоритмов.

Узнать больше об алгоритмах

Создаем свои компоненты для ESPHome на примере датчика света и приближения (AP3216)

Уровень сложностиСредний
Время на прочтение14 мин
Охват и читатели10K

ESPHome позволяет создавать программы для микроконтроллеров (ESP32, ESP8266 и т. д.) посредством написания YAML файлов. Это значительно упрощает и ускоряет разработку. Внешние компоненты (external components) разрабатываются с использованием С/С++ и Python и могут быть использованы повторно, по аналогии с библиотеками. Внешние компоненты могут разрабатываться для сенсоров, кнопок, GUI-компонентов и т.д.; подключаться локально или из удаленных репозиториев.

В статье я покажу как создавать внешние компоненты и повторно их использовать на примере AP3216 (датчика света и приближения).

Читать далее

Direct2D #4 Графика. Введение

Уровень сложностиПростой
Время на прочтение20 мин
Охват и читатели7.3K

Данная статья является вводной по графике в Direct2D, после неё вы узнаете что такое ресурсы зависимые от устройства и не зависимые. Научитесь выводить на экран любую сложную(2D) геометрию. Узнать теоретическую часть по выводу графики, что такое ID2D1Factory и остальные вводные вещи.

Читать далее

Вайб-кодим локальный мультимедийный сервер на C++ и Vue.js

Уровень сложностиСредний
Время на прочтение4 мин
Охват и читатели7.2K

У каждого из нас на жестких дисках копятся терабайты контента. Фильмы, скачанные «про запас», архивы семейных видео, гигабайты музыки во FLAC, которую жалко удалять, и тысячи фотографий. Но есть проблема: потреблять этот контент локально — неудобно. Когда дома лежит большой медиа‑архив — фотографии за годы, фильмы, музыка, куча видео — начинаешь задумываться, что работать с этим напрямую через файловую систему совсем не удобно. Особенно в эпоху, когда интерфейсы крупных медиа‑сервисов настолько продуманы, что сами по себе стали стандартом UX.

Я поставил перед собой задачу: сделать полноценный мультимедийный сервер, который работает из одного .exe файла, не требует интернета, не требует настройки и предоставляет удобный интерфейс.

Читать далее

Искусство выжить. Простое руководство для настоящих программистов

Уровень сложностиСредний
Время на прочтение15 мин
Охват и читатели19K

Задача Эдсгера Дейкстры о философах – великая задача великого программиста. Уж сколько лет, а она актуальна. Решая ее, прикасаешься к этому величию. И вот, перефразируя известное, «давно не было такого и вот опять», можно познакомиться с ее «новым прочтением» на Хабре[1].

Ну, как новое?… Но она стала тем триггером, который подвигнул меня к очередной попытке ее решения. Тем более, что с момента знакомства с философами пролетела уйма лет, а в  багаже - опыт применения автоматной модели и значительно усовершенствованная среда их реализации.

Познакомился с проблемой обедающих философов – Dinning Philosopher Problem (DPP), я более двадцати лет тому назад (про DPP см. [2]). Результатом стала статья, в которой философы выполняли поставленную задачу, как минимум, не хуже, чем классические алгоритмы сортировок[3]. Позднее был сделан доклад на конференции по параллельным вычислениям в Саратове, где на суд научной общественности была предъявлена модель автоматных параллельных вычислений и пример ее приложения - задача Дейкстры[4].  

Замечание 1. В рамках обсуждения статьи на Хабре было проигнорировано  предложение поручить сортировку философам. Зря, конечно, т.к. надо же как-то убедиться, что предлагаемое решение работает хотя бы в первом приближении. К примеру, тот же DeepSeek, моментально выдавший свое решение DPP, так и не смог заставить их сортировать.

Не знаю, считается ли данная задача решенной, но то, с чем я знаком, по большей части беглое рассмотрение проблем, которые она отражает. У задачи есть теория, которая представлена монографией Хоара[5], или моделями сетей Петри у Питерсона[6] и В.Е. Котова[7] или другими подобными публикациям. Но, повторюсь, все это по большей части достаточно краткий анализ свойств модели и/или даже конкретного решения. Статья на Хабре из этой же серии. Все это ни как не окончательное решение описываемых ею проблем параллелизма. Правда, может, [авторами] вопрос так и не ставился, но все же ответ на него весьма желательно иметь.

Читать далее

Крупнейшая утечка секретных документов DARPA раскрыла неожиданные детали IT сектора США

Время на прочтение4 мин
Охват и читатели11K

Издание SelaNi опубликовало результат анализа утечки секретных документов DARPA, слитых в сеть в начале недели. В документах в основном финансовые отчёты и перечисления финансируемых программ, но также там оказались планы и отчёты по экспериментам и разработкам проведённым агентством за период с 2009 до 2025 год.

Отчёт 2010 года свидетельствует о том, что основной проблемой военной промышленности США стал найм программистов. Основные критические системы, такие как банки, были написаны на COBOL, а в военной сфере по директиве DoD 3405.2 использовался только язык программирования Ada. Оба языка постепенно потеряли носителей и к 2010 году стало понятно, что им нужно искать замену.

Читать далее

Как не надо писать код на C++

Уровень сложностиПростой
Время на прочтение8 мин
Охват и читатели7.8K

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

Читать далее
1
23 ...

Вклад авторов