Обновить
128K+

C *

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

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

Пул объектов: паттерн эффективного управления памятью

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

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

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

Читать далее

Новости

Структуры данных на практике. Глава 15: Графы и их обход с эффективным использованием кэша

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

«Задача абстракции — не быть расплывчатой, а создать новый семантический уровень, на котором можно достичь абсолютной точности», — Эдсгер Дейкстра

Взрывной рост количества промахов кэша

При определении топологии сети для обхода 500 коммутаторов нашей системе требовалось 37,5 миллисекунды. Вроде бы это не так медленно, если не учитывать количество промахов кэша: 8,5 миллиона. При 500 узлах это 17 тысяч промахов на узел.

Структура данных была фундаментально неподходящей для этой задачи.

Работа инструмента была простой: определение топологии сети при помощи обхода графа соединённых устройств. У каждого коммутатора было до 48 портов, а нам нужно было при помощи поиска в ширину найти все доступные устройства из начальной точки.

Реализация была как по учебнику — список смежности со стандартным BFS. В случае сети из 500 коммутаторов (в среднем по 12 соединений у каждого) статистика была такой: 8,5 миллиона промахов кэша на 500 узлов. Это 17 тысяч промахов кэша на узел!

Я переписал этот код, реализовав графовое представление, учитывающее кэш. Результаты: код стал в 3,75 раз быстрее, а количество промахов кэша уменьшилось в 7 раз.

В этой главе мы поговорим об эффективном описании и обходе графов.

Читать далее

Беззнаковые размеры: пять лет назад мы совершили ошибку

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

Краткое примечание для читателей, не знающих о C3: это язык системного программирования, продолжающий традиции C. В статье приведена специфика C3, но все плюсы и минусы применимы к любому языку, в котором нужно выбирать типы для размеров и длин.

C3 переходит к использованию типов со знаком по умолчанию, но почему? Разве как минимум для размеров правильнее не использовать беззнаковые типы? Попытаемся ответить на этот вопрос.

Читать далее

Вариация на тему Рида-Соломона

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

Адаптация кода Рида-Соломона (РС) под контроллер esp32-s3. esp32-s3 имеет крайне интересный функционал поддержки работы с векторами. Задача - совместить кодирование РC с векторными возможностями этого микроконтроллера.

Читать далее

Опыт написания компилятора вручную: Часть 2

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

Компилятор и главный репозиторий: GitHub

Здесь я напишу о своём личном проекте — компиляторе к C-подобному языку. Я не являюсь профессиональным разработчиком, изучал эту тему почти самостоятельно и не читал никакие книги по написанию компиляторов (но читал по операционным системам).

Читать далее

Невидимый враг многопоточности: False Sharing и кэш-линии процессора

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

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

Читать далее

OneOCR — скрытая OCR внутри Windows 11

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

OneOCR — это набор из двух динамических библиотек и одной модели ONNX для распознавания текста в приложениях Snipping Tool и Photos в Windows 11.

Читать далее

На периферии трёх миров: ещё один шаг к нейронной операционной системе

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

Я в Termux (планшет, смартфон) пытаюсь понять, как из нескольких строк на чистом Си рождается свободная и не зависимая личность - Нейрон.

Этот проект об искусственном интеллекте, который начался не с установки библиотек, а с чертежа в тетради. Здесь машинное обучение - это не абстрактный т тоермин, а физическая подстройка " Виртуальных резисторов ".

На нахожусь на периферии трёх миров :

Читать далее

Создаем клиентскую библиотеку ROS2. «Hello ROS»

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

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

Создатели ROS2 вынесли базовый функционал в C библиотеку  rcl (ROS Client Libraries). В теории, достаточно создать обертку на каком-либо языке программирования и можно пользоваться. Между тем, сторонних клиентских библиотек не так уж много. На мой взгляд, можно выделить следующие причины:

Читать далее

Реализация модульной архитектуры прошивки методом ручной динамической линковки на примере STM32

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

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

Читать далее

Структуры данных на практике. Глава 14: Обработка строк и эффективность использования кэша

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

«В Computer Science есть только две сложные вещи: инвалидация кэша и придумывание названий», — Фил Карлтон

Разрыв в производительности

Наш парсер логов обрабатывал 800 тысяч строк в секунду. Нам требовалось 3 миллиона строк в секунду. От нужного нам показателя мы отставали в 3,75 раза.

Задача инструмента заключалась в парсинге строк логов в реальном времени, извлечении временных меток, уровней логов и сообщений из миллионов строк в секунду. Обработка миллиона строк логов в текущей реализации требовала 1,25 секунды — слишком долго для анализа в реальном времени.

Профилировщик показывал 85 миллионов промахов кэша. Для обработки строк это казалось слишком большим показателем.

В реализации использовались стандартные строковые функции C — простые, читаемые, но, очевидно, слишком медленные.

Я переписал этот код, добавив обработку строк с учётом кэша. Результаты были такими:

В 4,5 раза быстрее и в 7 раз меньше промахов кэша.

В этой главе мы поговорим о том, как эффективно использовать кэш при обработке строк.

Читать далее

Как я написал движок распознавания лиц на C, который обогнал ONNX Runtime

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

Полгода назад я начал портировать нейросеть EdgeFace-XS из ONNX в чистый C. Думал — граф небольшой, 1.77M параметров, что может пойти не так? Первый наивный порт выдал 24мс. ONNX Runtime — 3.9мс. В 6 раз медленнее. А потом началась оптимизация

Читать далее

Структуры данных на практике. Глава 13: Структуры данных без блокировок

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

«Блокировки — это goto конкурентного программирования», — Морис Херлихи

Проблема 60%

Наша система логгинга тратила 60% своего времени на ожидание снятия блокировок. Не на выполнение полезной работы, только на одно ожидание.

Восемь ядер, пытавшихся записывать сообщения логов, имели общий кольцевой буфер. Реализация была простой: буфер защищался мьютексом. При высокой нагрузке, когда все ядра записывали логи одновременно, профилировщик демонстрировал ужасный паттерн: 60% тактов CPU тратилось на операции с мьютексом.

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

«Можно ли улучшить ситуацию, отказавшись от блокировок?», — спросил меня мой менеджер во время ревью производительности.

Этот вопрос привёл к полной смене архитектуры...

Читать далее

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

Проектирование на основе абстрактного синтаксического дерева

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

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

Редактор АСД

Потоковая запись ADC семплов на STM32

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

В этом тексте я показал как настроить потоковую запись ADC семплов на микроконтроллере STM32.

ADC модуль это основа любого электронного измерения. Основа любого DMM. Всё что за корпусом микроконтроллера - это аналоговый мир. ADC это портал который позволяет аналоговым сигналам просачиваться в мир цифры.

Читать далее

Пишем логический калькулятор, лёжа на диване: как Termux и Си заменяют IDE, когда лень вставать

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

Говорят, для программирования на Си нужен стол, стул, мощный ПК и Linux. У меня другой стек: диван, планшет на Андроиде и Termux. Но иногда мой монитор помещается в карман — это смартфон.

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

Противостояние против индустрии

Идея родилась внезапно. Захотелось проверить одну логическую схему, но вставать и идти к компьютеру было выше моих сил. Так началось моё «преступление» против канонов профессиональной разработки.

Читать далее

Сладкие оковы вайб-кодинга

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

Некоторое время назад я высказал предположение, что проблемы С++ настолько глубоки, а процесс принятия решений комитетом настолько медленный, что доработки в С++ не в состоянии успеть за скоростью развития отрасти Ахиллесова пята C++ и будущая р̶е̶ эволюция / Хабр.

Конечно, я не считаю, что С++ будет забыт, но с большой долей вероятности ему будет уготована нишевая роль, как сейчас это произошло с языком С, которому С++ и пришел на замену. Причем я предположил, что способ плавной замены С++ на какую то альтернативу должен происходить точно также, как сам С++ пришел на замены старому С, через транспрлайтер (sourse to source translation).

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

Читать далее

Лечим загрузчик часов Redmi Watch 5 от падений

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

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

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

Читать далее

Как я разрабатывал отказоустойчивый промышленный контроллер. Ч1

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

Я, автор , независимый исследователь, разработчик SCADA системы Gatherlog А так же автор комплекса по разработке Промышленных Контроллеров под названием 3o|||sheet..

Читать далее

Nuitka 4.0: как я разогнал свой Python-скрипт на 335% и почему JIT-будущее уже на пороге

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

Представьте себе: вы запускаете свой старый добрый Python-скрипт, он привычно задумывается на пару секунд, а потом начинает работать. А теперь представьте, что тот же самый скрипт без единого изменения в коде — просто после прогона через одну утилиту — стартует почти мгновенно и работает втрое быстрее. Никакой магии, просто вышел Nuitka 4.0.

22 апреля 2026 года проект, который когда-то начинался как нишевый компилятор, дорос до мажорной версии 4.0. И это не просто «пофиксили баги, добавили пару флагов» — это реально меняет правила игры для тех, кто пишет на Python и хочет, чтобы код летал, а не ползал. По данным официальных тестов, скомпилированные скрипты показывают повышение производительности на 335% в pystone-бенчмарке по сравнению с CPython. Можете представить, что ваш веб-парсер или ML-пайплайн ускоряется втрое без переписывания на Rust.

Если совсем просто: PyInstaller просто пакует ваш скрипт вместе с интерпретатором в один файл — по сути, это архив с «батарейками». А Nuitka переписывает весь Python-код на чистый C и компилирует его в настоящий исполняемый файл. Никакой интерпретации на лету — только скомпилированный бинарник, который в теории может обогнать даже PyPy. И теперь, с версией 4.0, эта теория стала куда ближе к практике. «Раньше я думал, что ускорение от Nuitka довольно скромное... но с версией 4.0 вижу реальный прогресс», — примерно так звучат комментарии на Hacker News, и я с ними согласен.

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