Обновить
258.12

C++ *

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

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

О формальном доказательстве безопасной работы с памятью на основе «владения и заимствования»

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


Некоторое время назад я попробовал найти формальное доказательство безопасной работы с памятью, которое реализовано в Rust, но так и не смог его найти. После чего у меня сложилось впечатление, что доказательство в формальном виде и вовсе отсутствует, а вся концепция безопасного управления памятью на основе "владения и заимствования" формально не доказана и держится только на честном слове.


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


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

Читать дальше →

Разработка трёхфазного энергомонитора на базе ESP8266 с функцией автоматической проверки прибора учёта

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

Подробная инструкция по разработке трёхфазного энергомонитора на базе ESP8266 с функцией автоматической проверки прибора учёта электроэнергии.

Читать далее

Performance matter

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

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

Быстрые тулы не должны быть чем‑то WOW, это необходимость для нормальной работы — когда не надо отвлекаться от реализации, ломать ход мыслей, ходить за кофе. Итерации запуска уровня должны быть в пределах секунды или их вообще не должно быть. Это не должны быть минуты, которые складываются в часы, дни и годы простоя моего времени.

Текущее состояние тулзов в индустрии мне хочется назвать «быстрософт», не от слова «быстро работает», а потому что быстро сделали на коленке и быстрее всех выложили в стор, пока другие не сделали то же самое. Но я помню ощущения от настоящего «быстрософта».

Читать далее

librats: Выпуск версии 0.5.x. Ускорение поиска пиров, алгоритм spider, поддержка JavaScript, Python и многое другое

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

Привет! Работа над ядром поисковика rats-search продолжается. Новая версия библиотеки librats (v0.5.3) приносит важные архитектурные улучшения для построения распределенных сетей в условиях NAT и блокировок.

Ключевые изменения:

Унифицированный API (FFI): Завершена интеграция с Node.js. В отличие от фрагментированных реализаций libp2p, librats предоставляет идентичный набор функций для C++, Python, Node.js и Android через FFI.

Эффективный DHT:

Реализован алгоритм Spider для прибегания с сбора announce.

Добавлена поддержка branch-factor и маршрутизации на основе задержек (RTT-routing).

Персистентность: Routing-таблицы сохраняются при перезапуске, что критически важно для связности сети в сложных сетевых условиях.

BitTorrent: Значительный рефакторинг и оптимизация модуля.

Платформы: Windows (x64), Linux (x64), Android (32/64), macOS (x64).

Читать далее

Подключение ЖК дисплея POS терминала Ingenico IPP320 к Arduino (ESP32)

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

В Ingenico IPP320 установлен графический 128х64 монохромный ЖК дисплей с белой подсветкой и диагональю примерно 2.8 дюймов. Он устанавливался и в другие устройства и также известен как:
LBL-VLFM1574-02C
LBL-VLFM1574-02B
COG-VLFM1574-05
WU3540C-01 B
WU3540B-01

Конкретно мой дисплей я получил из терминала оплаты Ingenico IPP320. Терминалы эти, при покупке на вторичном рынке, как правило, уже сами заблокировали себя, так что чтобы использовать их напрямую даже в любительских целях, потребуется дорогостоящая разблокировка производителем. Такие терминалы можно найти за достаточно низкую цену на Авито и других площадках. Я, например, нашел новенький Атол 60Ф за 340 рублей. Разобрав, потыкав осциллографом и мультиметром, я подключил ESP32 между платой терминала оплаты и дисплеем. Попутно накидал следующую распиновку коннектора:

Читать далее

QML и Widgets в одном проекте: решение без костылей

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

В проектах на Qt рано или поздно встаёт вопрос: делать интерфейс на Widgets или на Quick. Первый вариант даёт зрелый набор контролов и привычное поведение окон, второй — гибкость, анимации и GPU-рендеринг. Иногда нужно объединить эти подходы: например, когда в приложении на Qt Quick требуется окно, способное выходить за границы основного, как это делают всплывающие подсказки или выпадающие списки в классических десктопных программах.

В этой статье я разберу рабочий способ показывать окна Qt Widgets из приложений Qt Quick — без хака с QQuickPaintedItem и без потери преимуществ Scene Graph.

Читать далее

Книга: «Создаем игры и изучаем C++»

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

Привет, Хаброжители! Мечтаете создавать игры, но не знаете, с чего начать? Книга «Создаем игры и изучаем C++» станет вашим проводником в мире игровой разработки!

Это издание было адаптировано под Visual Studio 2022, C++20 и библиотеку SFML, оно предлагает уникальный подход: вы не только освоите язык C++ с нуля, но и примените знания на практике, создав четыре игры в разных жанрах.

Вы начнете с изучения основ программирования, познакомитесь с ключевыми темами C++: объектно-ориентированное программирование (ООП), указатели и стандартная библиотека шаблонов (STL). Разберетесь с методами обнаружения коллизий и столкновений в игровой физике на примере игры Pong. Создавая игры, вы познакомитесь с массивами вершин, направленным звуком, шейдерами OpenGL, порождением объектов и многим другим. Вы погрузитесь в игровую механику и реализуете обработку ввода, повышение уровня персонажа и даже «вражеский» ИИ. Наконец, вы изучите паттерны проектирования игр, чтобы усовершенствовать навыки программирования на C++.

К концу книги вы сможете разрабатывать собственные игры, публиковать их и удивлять аудиторию.

Читать далее

Думай как компилятор: позиции и значения в Rust

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

Некоторое время назад мне попался в Интернете вопрос о таком синтаксисе в Rust:

*pointer_of_some_kind = blah;

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

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

Читать далее

Язык программирования C. Твой путь начинается здесь, самурай

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

Приветствую!

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

Поэтому я решил здесь в данном блоге (Habr идеальное место для этого) собрать в кучу как свои мысли так и свой опыт. А также опыт других людей которые также использовали данный инструмент в своей работе или просто как хобби.

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

Читать далее

DIY проект: cистемная информация на LCD дисплее GC9A01 (часть 1)

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

Всем доброго дня! Мой никнейм Arduinum628, я занимаюсь DIY проектами и программированием на Python и C++. В этой статье пойдёт речь о выводе системной информации с ПК на круглый LCD дисплей GC9A01.

Сама идея проекта мне пришла во время разговора с другом Иваном @proDream Я рассказал ему, что заказал пару LCD дисплеев GC9A01 с Ali Express для своих будущих DIY проектов. Во время разговора Иван внезапно сказал, что ему-бы пригодился девайс для вывода системной информации с ПК. Я подумал - почему-бы не научиться использовать этот дисплей на подобном проекте?!

Сам проект я буду писать не для нужд друга, а скорее в целях обучения работы с этим дисплеем. Как я понял, что ему нужно что-то более компактное и встраиваемое в корпус ПК. По моему совету он купил компактную плату esp32 с дисплеем и будет писать своё решение сам. Я же собираюсь делать что-то вроде приборной панели и поставлю её за клавиатурой. Это чем-то будет напоминать спидометр автомобиля =)

Читать далее

Современный C++23/26: концепты, корутины и многое другое в высокопроизводительных службах

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

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

Читать далее

От космической баллистики до kernel bypass — все, что вы хотели знать про C++ и Linux

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

Заходят как-то в лофт разработчик на С++, доктор математических наук и инженер-программист Linux kernel — и вместо шутки начинается System Level Meetup. 24 мая в Санкт-Петербурге соберутся те, кто пишет код на уровне железа, оптимизирует ядро Linux и проектирует архитектуру сложных систем. Два трека — C++ и Linux kernel, десятки докладов, живое общение, стенды, квесты и железо от YADRO. Регистрируйтесь и подключайтесь — онлайн или офлайн.

Читать далее

Учимся рефакторить код на примере багов в TDengine, часть 2: макрос, пожирающий стек

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

Макрос пожирает стек


Проверяя код проекта TDengine с помощью PVS-Studio, можно встретить код с запахом, канонические ошибки и опечатки. Многое из этого можно избежать, если изначально аккуратно оформлять код, делать логику простой и избегать макросов. Давайте рассмотрим некоторые фрагменты кода и подумаем, как можно провести его рефакторинг так, чтобы багам просто не было там места.

Читать дальше →

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

Линейная алгебра в C++ с Eigen

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

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

Кто хоть раз пытался работать с матрицами в C++, знает, что это удовольствие сродни написанию своего STL — возможно, но зачем? Eigen — это библиотека, которая избавит вас от ручного управления памятью, оптимизирует вычисления и позволит писать код, похожий на чистую математику. Поэтому в этой статье мы разберем эту прекрасную библиотеку.

Читать далее

Как сериализовать всё состояние C++-программы и пережить обновление бинарника

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

Экспериментальная система сериализации графов объектов с самоописанием, миграциями и живой отладкой — без VM и без JSON

О чём статья:

долгоживущие(сохранение всего runtime-состояния) программы и движки

загрузка старых данных в новую(с обновлённой системой типов) версию бинарника

правка состояния на лету без перезапуска

без виртуальной машины

без замедления в 10–50 раз

Почему стандартные форматы не подходят:

они работают с деревьями, а не с графами

не умеют циклы и самоссылки

ломаются при изменении структуры типов

Что будет показано:

сериализация объектных графов с циклами

самоописание типов прямо в файле

миграция данных при удалении и перестановке полей

какие идеи оказались тупиком, а какие — нет

Читать далее

Элегантный OSDev: Пишем ядро ОС на modern C++ без макросов. Часть 3: Аппаратный HAL и Прерывания

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


Это третья статья из цикла по разработке ОС на С++. В данной статье я познакомлю читателя, с прерываниями x86 реализуем ее поддержку. Добавим работу с клавиатурой. Познакомимся с такими устройствами как PIC и напишем код для работы и инициализации. Я так же буду делать упор, на абстракцию и высокоуровневый код.

Заходите будет интересно.

Читать далее

От MOS6502 к x86: эволюция эмулятора микропроцессоров

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

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

Читать далее

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

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

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

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

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

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

Читать далее

Движок для Arcanum: Ретро-кодинг на ПК 1995 года как акт цифровой археологии. Глава 01 — Синопсис

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

Недавно сообщество фанатов классической RPG Arcanum: Of Steamworks and Magick Obscura потрясла новость: разработчик по имени Alex завершил титанический труд по реверс-инжинирингу оригинального движка игры. Теперь у нас есть его полнофункциональные исходные коды, которые можно компилировать под Windows, Linux и macOS с использованием современной библиотеки SDL3.

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

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

Егог

Харденинг, модули в С++ и первый опыт вайб-кодинга у программиста со стажем5

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

Считается, что на конференции лучше всего запоминаются первое и последнее выступления. И тут я не являюсь исключением, так как при посещении С++ Zero CostConf 2025 мне сильнее всего запомнились как раз первый и последний доклады, но думаю не только из-за эффекта края, но и по той причине, что они были для меня самыми интересными и именно ради них и я решил съездить в Москву из далекой российской глубинки.

Но мне не хочется писать про само мероприятие, тем более, что видеозапись всех выступлений выложена на сайте конференции C++ Zero Cost Conf 2025 и пересказывать технически детали докладов не имеет смысла.

Однако прошедшее мероприятие было очень необычным и запоминающимся: мне удалось попробовать себя в роли вайб-кодера, а по результатам общения с докладчиками — написать два предложения в комитет по стандартизации C++ от России. Поэтому я всё же решил поделиться с читателями «Хабра» своими впечатлениями от некоторых докладов конференции и собственными выводами о вайб-программировании.

Читать далее

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