Обновить
128K+

C++ *

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

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

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

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

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

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

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

Читать далее

Новости

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

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

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

Да давай уже

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

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

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

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

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

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

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

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

Читать далее

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

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

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

Читать далее

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

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

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

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

Читать далее

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

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

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

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

Читать далее

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

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

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

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

Читать далее

HurriCache: как мы подружили строгую типизацию с RESP‑коннектором

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

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

Строгая типизация в HurriCache — осознанный выбор. Мы явно создаём скаляры (целые числа, числа с плавающей точкой, байтовые массивы) и контейнеры (List, Vector, Queue, OrderedSet, HashSet, SortedMap, HashMap) без ленивого приведения типов. Это даёт предсказуемость поведения и контроль над памятью, но повышает порог входа: нельзя просто взять и «подставить» HurriCache вместо Redis, не меняя семантику работы с данными.

Чтобы решить эту проблему, мы добавили RESP‑коннектор, совместимый с Redis‑клиентами. И сразу столкнулись с фундаментальными различиями моделей данных: то, что в Redis «просто строка», в HurriCache требует явного типа и стратегии создания.

Читать далее

Задачи из Jira и GitHub, встречи и заметки в одном окне: полгода соло‑разработки на Qt 6 / C++20

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

Утро у меня начиналось с вкладки трекера, вкладки календаря, заметок и пары PR, и полгода назад я начал делать себе десктопное приложение, которое собирает это в одно окно с клавиатуры. Ниже — что внутри и где я по дороге наступил на грабли: 13 трекеров через один дескриптор, все данные в одном JSON с миграциями и машиной времени, Vim‑клавиши по физическому месту клавиши и задача, которую подсказывает git‑ветка. Называется Tabless, код открыт под MIT.

Как это устроено

Читаем DataMatrix с конвейера: открытое сравнение четырёх библиотек на 1368 синтетических кадрах

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

На производстве код «Честного знака» читает камера над лентой, и символ на кадре мелкий — 2–3 пикселя на модуль, повёрнутый, смазанный, на изогнутом боку бутылки. Мы сравнили, как с такими кадрами справляются ZXing, zxing-cpp, libdmtx и наша библиотека dmr. Кадры, ожидаемые строки и скрипты замера выложены — любую цифру можно проверить.

Коротко: — на 1368 синтетических кадрах dmr прочитал 82 %, zxing-cpp — 70 %, libdmtx — 65 %, ZXing (Java) — 3 %; — ложных чтений — ноль у всех четырёх библиотек; — dmr надёжно читает от 1,4 пикселя на модуль и при любом угле поворота; — zxing-cpp примерно в 2,5 раза быстрее; — есть условия, где соперники читают больше dmr, — разбираем их в статье.

Таблицы, графики и данные

Русский язык в программировании. РУСИ++

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

Статья посвящена системному программированию на русском языке с C-подобным синтаксисом. Компилятор для языков программирования РУСИ, РУСИ++ и объектный-РУСИ создан путём модификации и пересборки компилятора GCC 14й версии с превращением его в полноценный русско-английский билингвальный компилятор. Отдельно дана инструкция модификации русской раскладки клавиатуры для добавления в неё фигурных, угловых и квадратных скобок - дабы не переключаться и не терять поток.

Читать::Далее();

Shared memory в ROS 2 Humble: CycloneDDS + iceoryx на практике

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

Shared memory в ROS 2 это буквально чит-код на бесплатное ускорение? Одна строка в конфиге, и мегабайтные сообщения летят через общую память, а не через сеть, но ros2 node list показывает пустой список, хотя всё работает. Разбираемся в нюансах и фичах механизмов shm и zero-copy на примере ROS2 Humble + CycloneDDS.

Читать далее

Препарируем Solocraft в MMORPG: как математически пересобрать групповой контент 3.3.5a под одного игрока

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

Классические MMORPG золотой эпохи (в частности, стек World of Warcraft времен Wrath of the Lich King) архитектурно строились вокруг так называемой «святой троицы»: танк, целитель, бойцы урона. Вся математика подземелий — тайминги способностей боссов, механики переагривания, периодический урон (DoT), дебаффы и энкаунтеры — изначально рассчитывалась на плотное разделение ролей между 5, 10 или 25 участниками.

Однако демография игроков за 15 лет кардинально изменилась: порог входа по свободному времени вырос, а потребность в исследовании старого контента осталась. В сообществе эмуляторов (TrinityCore, AzerothCore и кастомных форков) сформировалось целое направление — Solocraft.

Ниже разберем, с какими геймдизайнерскими и математическими вызовами сталкиваются разработчики при адаптации мультиплеерных энкаунтеров под соло‑прохождение, на примере архитектуры проекта WoW Prime.

Читать далее

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

Почему подсветка док-станции Flydigi выглядит дёшево и как я написал свою

Время на прочтение5 мин
Охват и читатели0

У меня геймпад Flydigi Vader 5 Pro и к нему док-станция Charging Dock 2 Pro. На доке 162 RGB-светодиода, и сами по себе они хорошие, а вот эффекты из фирменной Space Station выглядят дёшево: медленные анимации идут ступеньками, градиенты грязнеют в середине.

Стало интересно, виновато железо или софт. Спойлер: софт. Разобрал, как док принимает кадры, переписал эффекты с нуля и сделал свой редактор подсветки.

Читать далее

Заводим C++ корутины на микроконтроллере

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

Мне давно было интересно попробовать запустить корутины на микроконтроллере, но стандарт С++ совершенно не учитывает мир embedded с его ограничениями и не даёт возможности создать корутину в статической памяти.

Недавно я обнаружил что LLM агенты уже могут реализовывать довольно сложные задачи самостоятельно с неплохим качеством кода.

И тут я понял - чего бы не попробовать сделать своё расширение для clang с корутинами, которые гарантированно не используют аллокации и поверх этого реализовать небольшую операционную систему на корутинах для микроконтроллера.

Читать далее

MicroBuild: DOOM‑Style движок на AVR

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

Что, если я скажу, что на 8-битном микроконтроллере AVR можно запустить честный секторный 3D‑движок? Не рейкастер, не вращающийся куб, а настоящий Build Engine в духе Duke Nukem 3D — с порталами, секторами и перепадами высот?

Все знают, что Джон Кармак в 1993 году сделал DOOM. Гораздо меньше людей знают, что Кен Сильверман тогда же пытался разобраться в BSP‑деревьях Кармака, не понял их — и изобрёл свой движок. На нём потом взлетел Duke Nukem 3D. Я пошёл по его стопам — только вместо ПК — AVR, без FPU, без DMA и с крошечным стеком

В статье — как я боролся за каждый такт: Fixed‑Point арифметика, бинарное измерение углов, таблицы синусов, замена рекурсии на очередь задач. И почему 12 FPS на AVR — это повод для гордости.

Читать далее

Как, на мой взгляд, должна выглядеть лучшая стандартная библиотека на C++

Время на прочтение22 мин
Охват и читатели0

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

Чтобы держать марку, расскажу и ещё об одном языке, программировать на котором — всё равно, что разбавлять утренний кофе самогоном. Естественно, речь пойдёт о C++.

Если вы из тех мучеников, которым довелось работать с C++ профессионально, то вы знаете, насколько в самом деле плоха стандартная библиотека C++. С чего бы начать?

Читать далее

S.T.A.L.K.E.R OGSR на Switch и Android

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

Многие знают, что я уже довольно давно переписываю движок OGSR (S.T.A.L.K.E.R.) на Vulkan. Несколько раз писал тут об этом. Пройти мимо недавней волны портов я тоже не смог: рендер у меня был практически готов, так что я решил запрыгнуть в этот поезд. И вот он — запущен на Android и Switch. Из примечательного: на демонстрации сборка модов OGSR GA, которая существенно расширяет игровой мир и геймплей оригинальной игры. Тем не менее на Switch это стабильные 60 кадров без разгона, а на OnePlus 12 — 120 кадров. Надеюсь, что сообщество благодаря обновлённому движку также поддержит выход остальных прекрасных модификаций на разные устройства.

Читать далее

Игровой конвейер из начала десятых: реверс-инжиниринг Spark Casual Engine

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

У меня лежал файл Game.cub на 437 мегабайт от казуального квеста 2011 года. Внутри — 3559 файлов с расширениями, которых не знает ни один редактор: .cubebin, .stex, .sparkeffect, .binldinfo. Я решил разобраться, что это такое.

Читать далее

120% прокачка beamNG

Время на прочтение6 мин
Охват и читатели0

Когда‑то давно я горел игровой физикой: писал свои игровые физические движки, физику авто и самолета. И уменя была мечта — сделать физику разрушаемых объектов, в частности автомобилей. Мне не нравилось что авто в играх «ломаются» по заготовленным лекалам — мятый бампер, предзаготовленные текстуры царапин и так далее

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

Но все же физика beamNG не идеальна. Она обладает некой «желейностью», это проявляется в излишней гибкости и резиновости кузова и деталей. А еще, физика beamNG не позволяет разрывать и разрушать материал. В нем есть разрывы, но они удаляют части геометрии, из‑за чего это выглядит неестественно — целые куски кузова просто исчезают.

Недавно я подумал — «смогу ли я с ИИ реализовать свои старые идеи игровой физики?». Они как раз были про более честный рассчет и более правзоподобные повреждения.

Под катом мои эксперименты

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