Обновить
242.85

C++ *

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

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

Насколько полезны объяснения кода от SourceCraft?

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

Недавно на Хабре появилась функция "Объяснить код с SourceCraft", реакция на которую была неоднозначна из-за довольно странного решения сделать эту функцию обязательной, а не опциональной. Мусолить эту тему особо желания нет, а вот пройтись по существу хотелось бы, потому что как мы все знаем LLMки довольно хороши в коде, который уже миллион раз был выложен в открытый доступ, но вот со всякими редкими штуками есть проблемы, а еще они позвиздеть любят. В этой статье распишу как я прошёлся по сниппетам кода в двух своих статьях на хабре, попросил SourceCraft пояснить сломанные варианты этих сниппетов, и что из этого вышло. Спойлер: результат лучше, чем я предполагал, штука определённо полезная если использовать с умом.

Дисклеймер. За эту статью мне никто не платил, в ней есть сгенерированный контент, он явно обозначен и спрятан под спойлеры, а я вообще скептик относительно AI, но стараюсь трезво и честно оценивать его.

Читать далее

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

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

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

Читать далее

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

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

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

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

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

Читать далее

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

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

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

Читать далее

Тупик

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

Мат рождается в душе. Больше всего его рождается когда сталкиваешься с чем-то похожим на <подставь свой фреймворк>. Инструмент с прекрасными целями и задачами постепенно превращается во все больший и больший кусок г.. в котором приходиться копаться. Ощущаешь себя жужжащей мухой, летающей вокруг по необходимости.

Когда трава была зеленее, когда мы сильно боролись за каждый такт процессора, тратя на это наше время, которое мы тогда не очень ценили, все было в какой-то мере проще.
Если тебе нужна была фича, ты ее делал сам.
Или ты искал уже реализованную фичу, и прикручивал к своему коду.
Больше времени уходило на поиск. Не всегда можно было найти.

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

Раньше было просто. Возьмем для примера <подставь свой фреймворк>. Ты подключал и говорил ему, что нужно делать в первом случае, что во втором, что в третьем.
Сейчас же так просто не работает. Все стало сложнее. Ты указываешь доступный всем метод по старинке, но не тут то было. Клиенты получают в ответ фигу. Ты думаешь, что поменялся синтаксис, ищешь новые незадеприкейчаные методы (которых по количеству уже меньше, чем задеприкейчаных), но все равно клиенты получают фигу. Один и тот же код разрешает пользователям работать с одними запросами, но не разрешает с другими. Уверен, что это как-то объясняется. Просто подключается ещё куча бинов по дефолту, с доп параметрами по дефолту, и т.д. Идеология упрощения.
Но то, что прямо игнорируется команда разработчика, это уже перебор.

Читать далее

Rust не станет (С++)++, а Carbon — возможно, но нескоро

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

Безопасная, эргономичная интероперабельность между Rust и C/C++ была популярной темой на RustConf 2025. Чендлер Каррут, создатель языка Carbon и руководитель команд C++, Clang, и LLVM в Google, представил доклад о различных подходах к интероперабельности в Rust и Carbon — экспериментальном языке, позиционируемого как (C++)++. Его конечный вывод заключается в том, что, хотя возможности Rust по взаимодействию с другими языками постепенно расширяются, полного решения для совместимости с C++ в ближайшее время не будет — и поэтому остаётся место для Carbon, который может предложить другой путь постепенного обновления существующих C++‑проектов. Слайды его доклада доступны тем, кто хочет подробнее изучить приведённые примеры кода.

Читать далее

Делаем настольные часы с Wi-Fi из тетриса

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

Если вы посмотрели видео, то уже хорошо понимаете, что представляет из себя этот гаджет, но на всякий случай ещё раз перечислю, что он умеет: онлайн‑синхронизация времени, фоторамка, демонстрация логотипа, имитация волшебного шара из фильма «Трасса 60». В часах используется модуль WeAct ESP32‑C6 Mini с процессором ESP32‑C6 QFN32 и дисплей WeAct ST7735 (9 $ за всё вместе с доставкой с AliExpress).

Читать далее

Мониторинг CPU + RAM в трее. Часть 2

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

Я хотел видеть состояние своих CPU и ОЗУ прямо в трее панели задач, чтобы не открывать дополнительные окна, по типу cpuz или CoreTemp. Решил написать свою фоновую программу с возможностью настроек и вот что получилось.

Интересно!

Как построить открытую АСУТП. Архитектура программного ПЛК. Демонстрация работы среды исполнения

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

Добрый день! Меня зовут Иван Ярцев, я — архитектор автоматизированных систем управления технологическим процессом (АСУ ТП) в ИТ-компании «Северсталь», занимающейся разработкой компонентов для открытой АСУТП.

В этой статье рассмотрим архитектуру программного программируемого логического контроллера (ПЛК), а также самостоятельную сборку среды исполнения из исходников и запуск её из готовых сборок. Самостоятельную сборку опишем на примере российского одноплатного компьютера Repka-pi, имеющего архитектуру aarch64.

Читать далее

Как мыслит дизассемблер: внутренняя логика decompiler-инструментов на примере Ghidra и RetDec

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

Декомпиляция — это не магия, а очень упрямый, скрупулёзный и грязноватый процесс, где каждый байт может оказаться фатальным. В этой статье я разложу по винтикам, как мыслят современные декомпиляторы: как они восстанавливают структуру кода, зачем строят SSA, почему не верят ни одному call’у на слово, и как Ghidra и RetDec реализуют свои механизмы под капотом. Это не глянцевый обзор, а техразбор, вплоть до IR, реконструкции управляющего графа и попытки угадать типы переменных там, где они уже испарились. Будет сложно, но весело.

CALL more_text

MemHawk — профилировщик памяти для многопоточных приложений

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

Практически каждому разработчику однажды приходилось искать утечки памяти в его приложении / либо же профилировать использование памяти процессом. Задача эта довольно трудоемкая и непростая.

Большинство популярных профилировщиков памяти либо дают неточную информацию (sampling), либо значительно замедляют выполнение (Valgrind, heaptrack). При этом в многопоточной среде они плохо масштабируются и требуют сложной настройки.

Желание совместить детализацию аналогичную heaptrack и при этом решить проблему с многопоточностью привело к созданию MemHawk. Новый профилировщик сочетает преимущества традиционного подхода с учетом каждой аллокацией, но при этом предоставляет статистику по каждому уникальному стектрейсу без записи каждой аллокации в лог.

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

Спойлер - удалось ускориться по отношению к heaptrack в 30 раз.

Читать далее

Асинхронная обработка ошибок – это сложно. Пример на CUDA

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

Или как я научился не беспокоиться из-за cudaGetLastError() и просто признал её нежелательной


Любому, кто сталкивался с проектированием API, приходилось мучиться над вопросом, как лучше всего распространять ошибки к вызывателям функций. Эта проблема появилась ещё раньше, чем термин «API». Даже несколько десятилетий назад (скажем, 30+) проектировщики интерфейсов умели отделять возвращаемые ошибки от прочей полезной нагрузки в рамках тех функций, которые доставляют эту информацию вызвавшему их узлу.
Читать дальше →

Обратный вызов operator delete: когда, как и зачем он вызывается

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

Привет, Хабр!

Сегодня разбираемся, когда, как и зачем рантайм вызывает обратный вызов operator delete, откуда берётся sized delete, почему компилятор подсовывает placement-delete, и когда стоит выкинуть всю эту ручную экзотику, заменив коллбэки на std::function_ref или шаблонные параметры.

Читать далее

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

Нативная мощь: Flutter SDK на C++ ядре. Часть 2

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

На связи тимлид Mobile SDK в 2ГИС Александр Максимовский и Flutter-разработчик Михаил Новосельцев (@Sameri11). Наша команда разработала собственный продукт для генерации платформенного Dart-кода на базе публичного C++ API, и мы уже рассказали об основных принципах его работы.

Эта статья — про то, как на основе сырого сгенерированного кода реализовать SDK, готовый к внедрению в пользовательские Flutter-приложения.

Читать далее

Третья часть исследования Nau Engine

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

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

Читать далее

Откуда взялась хвостовая рекурсия и когда ожидается ее реализация в новом стандарте языка Си. Рекурсия VS Iteration

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

Я надеюсь что это неожиданное название заставит вас обратить внимание на эту статью, но самое главное на что я надеюсь что прочитав эту статью вы уже не сможете так просто игнорировать факты.

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

Читать далее

Динамическая рефлексия для C++

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

Всем привет

Меня всегда интересовала тема рефлексии в языках программирования, и то, какие программы можно создавать с ее помощью. Рефлексия — это мощный инструмент, позволяющий работать с программой не как с набором логических объектов (в случае использования ООП), а как с набором свойств и методов из которых они состоят. Такой подход дает возможность создавать алгоритмы, которые могут работать с любыми типами данных, для которых включена поддержка рефлексии.

Читать далее

PVS-Studio в 2024 году

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

За окном январь 2025 года, а это значит, пора подвести итоги за 2024 год! В этой статье вы узнаете, чем занималась команда PVS-Studio в прошлом году: новые плагины, интеграции, фичи и многое другое!

Читать далее

Гибкая ECS с кастомными layout-профилями: как я строил ECSS внутри своего игрового движка

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

Всем привет, я делаю свой пет-проект - игровой движок, и какой пет-проект без собственноручно сваренного велосипеда, так я и пришел к идее реализации своей ECS.

В этой статье я хочу рассказать простыми словами - что такое ECS, и как он эволюционно появился у меня.

Что такое ECS - Entity Component System (Сущность Компонент Система) - архитектура хранения данных, где логика - системы, явно отделена от данных - компонентов, которые объединены одним общим id - сущностью.

В двух словах, идея ECS заключается в том, чтобы навести порядок в игровом коде, и игровом мире - выделить все данные игровых объектов(сущностей), и желательно сделать это data-oriented (почему желательно я расскажу ниже).

Предположим, у вас в игре есть объект КУБ - квадратный, все стороны равны, все углы равны, классический такой КУБ. У него есть положение в мире (Transform) у него есть его кубический меш (Mesh), он умеет быть отрендеренным (IsRenderable), и, ко всему прочему, он еще и обладает какой-то своей кубической физикой (Physic).

Читать далее

Сплайновые срединные поверхности в геометрическом ядре C3D

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

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

Вместе с описанием новой функциональности в этой статье отдельное внимание уделяется численным методам и подходам к поиску точек срединных поверхностей.

Читать далее

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