Обновить
256K+

C++ *

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

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

Когда Python становится слишком медленным: пишем C‑расширение с нуля и сравниваем с pybind11 (бонус JIT‑компилятор)

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

Недавно я прочел статью про pyrusmorph — python обёртку над 30-летним с++ ядром libmorph/rus. Бенчмарки удивили: в 30 раз быстрее PyMorphy3 при обработке текста. После я задумался. Как это вообще работает? Почему мы пишем import pyrusmorph и получаем доступ к нативному с++ коду и функциям прямо внутри python.

В статье я предлагаю пройти этот путь с нуля. Разобраться, как устроен Python «под капотом», написать своё расширение на чистом C‑API, а потом посмотреть, как эту боль лечит pybind11. В конце — бенчмарки и практические советы, когда вообще стоит лезть в c++ для оптимизации. Бонус — немного о компиляторе python кода (JIT‑компилятор)

Читать далее

Новости

Rust круче C++? Часть 1: скорость

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

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

Спор «Rust или C++» идёт с 2015 года, с выхода Rust 1.0, и за одиннадцать лет превратился в отдельный жанр со своими приколами. «В Rust на каждом индексе проверка, вот он и тормозит». «В плюсах проверок нет, значит, быстрее». «Ага, а у Rust ссылки не пересекаются, так что быстрее как раз он». «Паника дорогая», «исключения дорогие», «абстракции бесплатные». Каждая сторона уверена в своём, а в ассемблер почти никто не смотрит, хотя ответ лежит прямо там (и местами он неприятный для обеих сторон).

В одну статью вопрос «круче ли Rust, чем C++» не влез, так что это первая часть, и она про скорость. Безопасность и прочие поводы поругаться ждут своей очереди.

Читать далее

Как я устал от VPN‑клиентов на 300 МБ ОЗУ и написал (claude) свой TUN‑клиент на чистом Rust (Unbihex)

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

Всем привет! Последние пару лет экосистема обхода блокировок развивалась по принципу «больше фич — жирнее обертка». Большинство популярных десктопных и мобильных клиентов сегодня — это либо тяжелые комбайны на Electron/Flutter, либо графические обертки над ядром Xray или sing‑box через gomobile и C‑FFI, которые тянут за собой рантайм Go, сборщик мусора и жрут от 200 до 400 МБ оперативки просто в фоне.

Когда у тебя слабый ноутбук, офисная машина или телефон, на котором открыта пара тяжелых приложений, лишние 300 МБ под один только VPN начинают ощутимо бить по системе. А если речь идет об iOS, где системный лимит на сетевые расширения (PacketTunnelProvider) составляет жесткие 50 МБ, такие клиенты регулярно падают по OOM (Out Of Memory) при попытке загрузить крупные гео‑базы.

В один прекрасный день мне это надоело. Я решил взять всё в свои руки и написал с нуля собственный кроссплатформенный TUN‑клиент и сетевое ядро на чистом Rust без единой сторонней прослойки. Встречайте — Unbihex (названный в честь гипотетического 126-го элемента унбигексия). Сейчас он потребляет 18 МБ ОЗУ в режиме TUN (и 12 МБ в прокси), поддерживает полный стек современных протоколов и уже готов к продакшену.

Под катом — как это устроено под капотом, какие грабли пришлось собрать при работе с TUN под Windows и как удалось подружить ядро с популярными панелями.

Читать далее

Системное программирование на C++: процессы, C-API и WinAPI

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

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

Это вторая статья цикла про C++. В первой я разбирал базу для тех, кто начинает с нуля: переменные, циклы, классы, контейнеры. Здесь идём на уровень ниже — как обычная C+±программа договаривается с операционной системой.

Сразу скажу, зачем я вообще полез в эту тему. В колледже была лаба, где нужно было поднять процесс, дождаться его и снять код возврата. Я неделю не понимал, почему fork() в одном случае возвращает ноль, а в другом — PID, и почему после exec ребёнок «исчезает». Препод объяснил это минут за десять — и я понял, что половину объяснений всё равно не понял. С тех пор я пишу такие вещи с расстановкой: не «fork() создаёт процесс», а что именно он возвращает, что происходит в коде после вызова и что будет, если забыть закрыть дескрипторы. Поэтому статей будет много, а примеров в каждой — ещё больше.

Что дальше в цикле, чтобы было понятно, куда мы движемся:

Читать далее

Тулпар: компилируемый язык с казахским синтаксисом, написанный с нуля (без LLVM, без libc, без C-компилятора)

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

Рассказываю про Тулпар (Тұлпар) — язык программирования с казахскими ключевыми словами и синтаксисом в стиле Python, который компилируется в нативный код x86-64. Компилятор и рантайм написаны на Rust с нуля: без LLVM и без libc, с собственным аллокатором регистров и сборщиком мусора. Разбираю конвейер компиляции, устройство GC, замеры против C, Rust и Python, а также то, чего в языке пока нет.

Читать далее

Можно ли навайбкодить операционную систему как Linux, только быструю?

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

Наступила эпоха, когда любая домохозяйка за несколько промптов поднимает себе CRM: фронтенд на JS, бэкенд на Go, данные в Postgres. И при этом не понимает ни слова из того, что я сейчас написал.

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

Дело было вечером, подписка на Claude Code простаивала, мысли вертелись. Перебирая прожитые годы, я вспомнил детскую мечту: написать свою операционную систему. Хорошую, чтобы всех радовала и приносила людям пользу. Как Windows, только лучше.

Windows из списка хороших систем я вычеркнул ещё в школе, вместе с синим экраном. Да и Linux перестал казаться идеалом, когда я начал считать микросекунды.

Читать далее

Как я поселил Claude в Яндекс Станцию Мини

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

Отдельная линия этой истории: я делал всё это в паре с Claude Code. И где-то к середине проекта поймал себя на забавной мысли — Claude Code, по сути, собирал своего же младшего брата: маленького Claude, который теперь живёт внутри колонки и откликается на «Клод». Старший пишет код, отлаживает, диагностирует — чтобы младший поселился в железке и заговорил. Дальше эта мысль меня уже не отпускала.

Читать далее

Как я писал эмуляцию звука для Nintendo Gameboy на C++ целый год

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

В этой статье я расскажу, как устроена звуковая подсистема Nintendo Gameboy, с какими проблемами я столкнулся, пытаясь в реальном времени генерировать звук и синхронизировать с ним картинку. Статья является продолжением моей прошлой публикации.

Читать далее

pyrusmorph: в 30 раз быстрее. Интеграция ядра libmorph/rus в Python

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

Разбираем производительность морфологических анализаторов для русскоязычных текстов в Python-среде. Расскажем, почему библиотеки семейства PyMorphy работают так медленно и как интеграция нативного C++ ядра libmorph/rus решает проблему производительности high-load систем.

Читать далее

librats: Выпуск версии 3.0.x (библиотека для распределённых P2P‑приложений и стриминга). И 3 приложения на ней

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

Всем привет! Я продолжаю развивать свою библиотеку для создания распределённых приложений. Она уже легла в основу новой версии rats-search (распределённый торрент-поисковик) и rasync (синхронизация папок, файлов и исходников между устройствами) и ratcast (распределенный видео-аудио стриминг и приложение наподобие Discord для совместного просмотра фильмов и видео-конференций с более высоким качеством и большим количеством участников и сложной p2p+MCU топологией), а также librats, судя по всему, используется в стороннем клиенте UltraVNC (VNC-клиент).

Библиотека позволяет развернуть собственную P2P-сеть, связать пользователей между собой и выстроить обмен данными через потоки разных типов — бинарные, строковые и другие. Главная особенность — автоматическое обнаружение участников (peer discovery) на основе mDNS и DHT Mainline протоколов без необходимости в серверах, что особенно актуально в условиях постоянных блокировок и сетевых ограничений. Общения происходит напрямую - без посредника.

На данный момент поддерживаются C/C++, Java (Android), Python и Node.js.

В этом обновлении значительно улучшен собственный QUIC-подобный протокол поверх UDP: добавлена поддержка app-limited-режима, управление перегрузкой переведено на BBRv3, реализована полноценная прямая коррекция ошибок (FEC), улучшен обход NAT, а также появился модуль rendezvous для развёртывания вспомогательных серверов, повышающих связность сетей.

Последний стабильный релиз на сегодня — 3.0.3. Исходный код и собранные бинарные файлы доступны для:

Читать далее

Turbo Vision спустя 36 лет: нормальный интерфейс для journald

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

journald умеет почти всё, что нужно для разбора проблемы на сервере: индексирует поля, фильтрует по юниту, процессу, пользователю и загрузке, ищет по времени и отдаёт записи по курсору. А смотрим мы его через journalctl, то есть одной командой за раз. Эта статья — о том, как оконный интерфейс из 1990 года оказался почти идеальной формой для этих возможностей, и о том, как устроен получившийся просмотрщик TurboJedi.

Читать далее

Управление памятью в контейнерах STL. От абстракций к реализации

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

Каждый разработчик на C++ начинает свой путь с оператора new. Нам объясняют его работу очень просто: «new выделяет память в куче и создает там объект». Мы пишем auto ptr = new MyClass(42); и до поры до времени не задумываемся, что скрывается за этой строчкой.

Читать далее

Как я провёл второе соревнование по программированию на Эльбрусах (e2k) «Кубок СЭРПАС 2026»

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

Здравствуйте, друзья, меня зовут Ерохин Кирилл, я популяризатор российского программного и аппаратного обеспечения, и в этом сентябре я провёл уже второе, теперь ежегодное, соревнование по алгоритмическому программированию на отечественных аппаратных платформах «Кубок СЭРПАС 2026», собрав 112 участников со всей России, результатами которого пришлось поделиться с вами. А Хабр мне в этом поможет, ему не впервой.

Читать далее

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

Архитектура RayQuiro: от синтаксического дерева и байт-код ВМ до нативного машинного кода через LLVM

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

Привет, Хабр! Меня зовут mixitosik, я разрабатываю открытый язык программирования общего назначения RayQuiro.

Когда берешься за создание собственного языка, большинство гайдов и туториалов быстро упираются в тупик: они учат писать либо «игрушечные» древовидные интерпретаторы (Tree-walk AST), либо простые трансляторы в C. На практике же любой язык общего назначения требует решения жестких системных задач: проектирования компонуемой модульной системы, многоуровневого пайплайна исполнения (для мгновенных итераций и для продакшена), кроссплатформенного рантайма и интеграции легковесного GUI без раздувания зависимостей до размеров Electron.

В этой статье я по шагам разберу внутреннее устройство RayQuiro: структуру парсера и AST, архитектуру стековой виртуальной машины, генерацию IR для LLVM-бэкенда, а также инженерные грабли, на которые пришлось наступить при реализации динамического языка со строгим управлением памятью.

Читать далее

Как я простенький keygen писал

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

Это моя первая статья подобного рода(да и в целом любого рода), в которой я покажу как писал keygen для простенького приложения. Я использовал динамический анализ через x96 dbg, плюсы для keygen'а, и, конечно же, родненький ассемблер. Статья предназначена для новичков в реверсе и всех, кто хочет что‑то вспомнить. Если зайдет — это может превратиться в серию статей с повышающимся уровнем сложности реверса, но это в мечтах, а пока к сути.

Да давай уже

Как я заставил ESP8266 рисовать 3 D, стрелять и летать: полный технический разбор кода

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

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

В первой части я рассказал про железо, сборку корпуса и немного затронул программную реализацию. Сегодня — самое вкусное. Мы заглянем в исходники проекта и разберем математику, алгоритмы и оптимизацию под слабое железо.

Код написан на C++ в Arduino IDE, весь проект живет в одном файле. У нас три игры

(но в исходнике их уже пять), которые переключаются конечным автоматом через gameState.

Блок 1: Raycast — 3D на коленке

Сердце движка — DDA-алгоритм (Digital Differential Analyzer). Мы не рендерим 3D-полигоны, мы пускаем 320 лучей из точки игрока и смотрим, где они пересекают сетку 32x32.

Читать далее

UDP без потерь и переупорядочивания

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

UDP ничего не обещает: датаграмма может не дойти, прийти дважды или обогнать соседнюю. Обычно в ответ берут TCP или пишут свой протокол с повторными запросами. Оба пути платят за потерю как минимум одним round trip, и платят именно тогда, когда сеть и так перегружена. В статье разобран другой вариант: отправитель заранее добавляет в поток избыточные пакеты, и получатель восстанавливает потерянное сам, ни о чём не спрашивая. Это прямая коррекция ошибок (FEC, forward error correction) кодом Рида — Соломона.

Читать далее

Кривые Безье для обработки звука

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

Казалось бы, в чём связь между графикой и звуком?

Продолжая тему расчёта цифровых фильтров, постараемся дать ответ на этот вопрос.

Читать далее

Асинхронное ядро для ShuttleEngine: Lock‑Free планировщик корутин с ускорением 25 х на i9-14900KF

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

Разработка графического движка на Vulkan API требует параллельного выполнения задач: сборки командных буферов, стриминга ресурсов и генерации кадров.

В этой статье описана архитектура библиотеки shuttle_async, написанной на бесстековых корутинах C++23. Ниже подробно разобрано устройство многопоточного планировщика Work Stealing на деках Chase-Lev, механизм снижения избыточных пробуждений потоков (Coalesced Wake-ups), а также логика работы Immediate-режима запуска, миграция контекста в котором может приводить к нарушению инвариантов Structured Concurrency.

Читать далее

Множество Мандельброта — объемная картина? Выпуклая? И почему из 120 картин кажутся только две?

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

Это фрагмент множество Мандельброта и я его описал в википедии:
https://commons.wikimedia.org/wiki/File:Mandelbrot_Set_Image_118.png

А вот скажите... Кажется ли вам что объемная картина? Выпуклая? Особенно синий! А почему? Это же очень интересно! Говорят что да. Это мощный оптический эффект трехмерности на плоском рисунке. Наш мозг, привыкший считывать распределение света и тени в реальном мире, мгновенно интерпретирует эти плавные градиенты как трехмерный рельеф, хотя на самом деле мы смотрим на абсолютно плоскую двухмерную проекцию.

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