UTF-8-декодер на C: таблица и несколько строк кода
Бьёрн Хёрманн реализовал декодирование UTF-8 через конечный автомат (DFA). Он обрабатывает байты по одному, собирает кодовую точку Unicode и проверяет корректность последовательности.
Таблица
* определяет класс очередного байта;
* выбирает следующее состояние автомата.
`ACCEPT` означает, что кодовая точка полностью прочитана. `REJECT` - обнаружена ошибка. Остальные состояния означают, что нужны дополнительные байты.
Подход удобен для потоковой обработки: если символ разорван между двумя сетевыми пакетами, достаточно сохранить состояние и накопленное значение.
Нюанс: после последнего байта тоже нужно проверить состояние. Если оно не
Бьёрн Хёрманн реализовал декодирование UTF-8 через конечный автомат (DFA). Он обрабатывает байты по одному, собирает кодовую точку Unicode и проверяет корректность последовательности.
Таблица
utf8d выполняет две задачи:* определяет класс очередного байта;
* выбирает следующее состояние автомата.
`ACCEPT` означает, что кодовая точка полностью прочитана. `REJECT` - обнаружена ошибка. Остальные состояния означают, что нужны дополнительные байты.
Подход удобен для потоковой обработки: если символ разорван между двумя сетевыми пакетами, достаточно сохранить состояние и накопленное значение.
Нюанс: после последнего байта тоже нужно проверить состояние. Если оно не
ACCEPT, строка некорректна - например, оборвалась посреди символа.❤4🔥3
🦈 Открытое собеседование на Middle C# | 6 октября, 19:00 МСК
Приглашаем на открытое собеседование: Senior C# разработчик проведёт его в прямом эфире. Можно посмотреть, как всё устроено изнутри, и понять, насколько ты готов к такому интервью.
Как это будет:
📂 Собеседует Александр Моргунов — Senior C# разработчик, 7+ лет в европейских высоконагруженных сервисах. Отвечает разработчик-доброволец;
📂 Всё как на настоящем собесе: Александр задаёт те вопросы и задачи, которые даёт кандидатам на своих интервью. Заранее их никто не знает;
📂 После каждого ответа Александр даст обратную связь: что прозвучало сильно, а что стоило раскрыть иначе. Так станет понятнее, на что обращают внимание на собесе;
📂 В конце можно задать любой вопрос.
Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для C# разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.
Переходи в нашего бота, чтобы получить ссылку на эфир -> @shortcut_csharp_bot
Реклама.
О рекламодателе.
Приглашаем на открытое собеседование: Senior C# разработчик проведёт его в прямом эфире. Можно посмотреть, как всё устроено изнутри, и понять, насколько ты готов к такому интервью.
Как это будет:
📂 Собеседует Александр Моргунов — Senior C# разработчик, 7+ лет в европейских высоконагруженных сервисах. Отвечает разработчик-доброволец;
📂 Всё как на настоящем собесе: Александр задаёт те вопросы и задачи, которые даёт кандидатам на своих интервью. Заранее их никто не знает;
📂 После каждого ответа Александр даст обратную связь: что прозвучало сильно, а что стоило раскрыть иначе. Так станет понятнее, на что обращают внимание на собесе;
📂 В конце можно задать любой вопрос.
Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для C# разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.
Переходи в нашего бота, чтобы получить ссылку на эфир -> @shortcut_csharp_bot
Реклама.
О рекламодателе.
❤2
Наследование в чистом C: одно правило, и всё работает
В C нет классов, но наследование можно собрать вручную. Правило одно: родительская структура должна стоять первым полем дочерней.
Почему это законно: стандарт C гарантирует, что в начале структуры нет паддинга, а указатель на структуру, приведённый к нужному типу, указывает на её первое поле. Поэтому
Это не трюк из головоломок, а основа реальных систем. Так устроены объекты в CPython, где каждая структура начинается с
Есть важная оговорка: обратное приведение
В C нет классов, но наследование можно собрать вручную. Правило одно: родительская структура должна стоять первым полем дочерней.
struct Animal { int age; char name[32]; };
struct Dog {
struct Animal base; // обязательно первым
char breed[32];
};
struct Dog d = { {3, "Rex"}, "Labrador" };
print_animal((struct Animal *)&d); // работает
Почему это законно: стандарт C гарантирует, что в начале структуры нет паддинга, а указатель на структуру, приведённый к нужному типу, указывает на её первое поле. Поэтому
&d и &d.base это один и тот же адрес, и функция, которая ждёт Animal*, спокойно работает с Dog.Это не трюк из головоломок, а основа реальных систем. Так устроены объекты в CPython, где каждая структура начинается с
PyObject_HEAD, так же работают GObject в GTK и многие структуры ядра Linux. Если родитель лежит не первым полем, ядро достаёт его через макрос container_of.Есть важная оговорка: обратное приведение
Animal* в Dog* корректно, только если объект действительно Dog. Компилятор этого не проверит, и ошибка здесь превращается в тихое повреждение памяти.❤4👍4🔥1
Rust vs Go vs C# в 2026: почему наивный Rust проиграл Go
Сравнение производительности Rust, Go и C# в 2026 году: наш тест на аллокациях, где наивный Rust уступил Go, а Rust с ареной оказался в 7 раз быстрее, плюс разбор GC, памяти, холодного старта, Green Tea и .NET 10
Спор «что быстрее: Rust, Go или C#» обычно заканчивается ссылкой на чей-то бенчмарк, где один язык обгоняет другой в полтора раза. Мы решили проверить простую вещь и сразу получили результат, который ломает привычную картину: наивный код на Rust проиграл Go по времени выполнения. Ниже разбираем, почему так вышло, что на самом деле означает «производительность» в 2026 году и как выбирать язык под конкретную нагрузку.
https://uproger.com/rust-vs-go-vs-csharp-proizvoditelnost-2026/
Сравнение производительности Rust, Go и C# в 2026 году: наш тест на аллокациях, где наивный Rust уступил Go, а Rust с ареной оказался в 7 раз быстрее, плюс разбор GC, памяти, холодного старта, Green Tea и .NET 10
Спор «что быстрее: Rust, Go или C#» обычно заканчивается ссылкой на чей-то бенчмарк, где один язык обгоняет другой в полтора раза. Мы решили проверить простую вещь и сразу получили результат, который ломает привычную картину: наивный код на Rust проиграл Go по времени выполнения. Ниже разбираем, почему так вышло, что на самом деле означает «производительность» в 2026 году и как выбирать язык под конкретную нагрузку.
https://uproger.com/rust-vs-go-vs-csharp-proizvoditelnost-2026/
❤4😁2👍1
Альфа-Банк ищет скиллового коллегу QA Fullstack на C#
Предлагаем полную удалёнку или гибридный график – у нас классные ИТ-офисы в Москве, Питере и Екатеринбурге.
Что нужно делать
– Разрабатывать автотесты на C#.
– Запускать функциональные, регрессионные и интеграционные тесты, включая API.
– Снижать количество дефектов в диалоге с разработкой и бизнесом.
Какие навыки важны
– Опыт автоматизации на C# и ручного тестирования от года.
– Знание API (SOAP, REST), SQL, основ клиент-серверной архитектуры и тест-дизайна.
Условия и развитие
– Сильное сообщество QA и C#-разработчиков: можно получить совет и поделиться опытом на митапе и в блоге на Хабре.
– Реальная перспектива роста: технический трек развития, в том числе до C#-лида
Оставляйте отклик по ссылке.
Предлагаем полную удалёнку или гибридный график – у нас классные ИТ-офисы в Москве, Питере и Екатеринбурге.
Что нужно делать
– Разрабатывать автотесты на C#.
– Запускать функциональные, регрессионные и интеграционные тесты, включая API.
– Снижать количество дефектов в диалоге с разработкой и бизнесом.
Какие навыки важны
– Опыт автоматизации на C# и ручного тестирования от года.
– Знание API (SOAP, REST), SQL, основ клиент-серверной архитектуры и тест-дизайна.
Условия и развитие
– Сильное сообщество QA и C#-разработчиков: можно получить совет и поделиться опытом на митапе и в блоге на Хабре.
– Реальная перспектива роста: технический трек развития, в том числе до C#-лида
Оставляйте отклик по ссылке.
❤1
💡 В C можно заполнить три элемента массива, а остальные обнулятся автоматически
Для этого есть designated initializers — инициализация с указанием индексов:
Получаем:
•
•
• Все остальные элементы равны
Удобно для таблиц флагов, классификации символов и индексов из enum. Не нужно вручную перечислять сотни нулей.
Возможность входит в стандарт C начиная с C99.
Для этого есть designated initializers — инициализация с указанием индексов:
int flags[256] = {
['A'] = 1,
['Z'] = 1,
[42] = 99
};
Получаем:
•
flags['A'] и flags['Z'] равны 1.•
flags[42] равен 99.• Все остальные элементы равны
0, даже если массив локальный.'A' здесь — символьная константа: её числовое значение используется как индекс.Удобно для таблиц флагов, классификации символов и индексов из enum. Не нужно вручную перечислять сотни нулей.
Возможность входит в стандарт C начиная с C99.
❤2
20 готовых программ на C++ с кодом: практика для новичков и не только (2026)
20 готовых программ на C++ с исходным кодом: от калькулятора до LRU-кэша и алгоритма Дейкстры. Копируйте, запускайте и прокачивайте навыки в 2026 году.
https://uproger.com/20-programm-na-cpp-s-kodom-2026/
20 готовых программ на C++ с исходным кодом: от калькулятора до LRU-кэша и алгоритма Дейкстры. Копируйте, запускайте и прокачивайте навыки в 2026 году.
https://uproger.com/20-programm-na-cpp-s-kodom-2026/
❤3🔥1🥰1
👨🏻💻 AI в бэкенд-задачах — на Podlodka Backend Crew
Код теперь может написать агент, но за результат всё ещё отвечаете вы. Организаторы Podlodka Backend Crew собрали конференцию о том, как работать с бэкендом после того, как AI написал код.
Причём в программе нет докладов в жанре «у нас все получилось» — только реальная практика. Конференция пройдёт с 26 по 30 октября.
🧠️️️️ Участники сезона:
• Разберут пулл‑реквесты от агента и попробуют предотвратить возможные инциденты на рулетке кейсов
• Выяснят, какие неожиданные ловушки скрываются в OpenAPI и на что обращать внимание при разработке контрактов
• Разберут антипаттерны в AI-юнит-тестах, узнают, как их избежать с помощью современных инструментов, и заберут себе новый агентский скилл
• Спроектируют бэкенд дейтинг-приложения на архитектурной кате и решат, где в нём действительно нужен AI.
Формат Podlodka Backend Crew — комфортный онлайн: 5 дней, утренние и вечерние сессии в Zoom.
Отдельный плюс — цена: заметно ниже привычных конференций, при этом вы не просто слушаете о чужом опыте, а разбираете PR и отвечаете за релиз, проектируете систему в команде и расследуете чужие провалы.
Такого вовлечения не получить на обычной конференции.
🔗 Изучайте программу и присоединяйтесь: https://podlodka.io/becrew
Промокод на скидку для подписчиковbackendcrew
Код теперь может написать агент, но за результат всё ещё отвечаете вы. Организаторы Podlodka Backend Crew собрали конференцию о том, как работать с бэкендом после того, как AI написал код.
Причём в программе нет докладов в жанре «у нас все получилось» — только реальная практика. Конференция пройдёт с 26 по 30 октября.
🧠️️️️ Участники сезона:
• Разберут пулл‑реквесты от агента и попробуют предотвратить возможные инциденты на рулетке кейсов
• Выяснят, какие неожиданные ловушки скрываются в OpenAPI и на что обращать внимание при разработке контрактов
• Разберут антипаттерны в AI-юнит-тестах, узнают, как их избежать с помощью современных инструментов, и заберут себе новый агентский скилл
• Спроектируют бэкенд дейтинг-приложения на архитектурной кате и решат, где в нём действительно нужен AI.
Формат Podlodka Backend Crew — комфортный онлайн: 5 дней, утренние и вечерние сессии в Zoom.
Отдельный плюс — цена: заметно ниже привычных конференций, при этом вы не просто слушаете о чужом опыте, а разбираете PR и отвечаете за релиз, проектируете систему в команде и расследуете чужие провалы.
Такого вовлечения не получить на обычной конференции.
🔗 Изучайте программу и присоединяйтесь: https://podlodka.io/becrew
Промокод на скидку для подписчиков
❤1
This media is not supported in your browser
VIEW IN TELEGRAM
«what the fu**?»: самый странный комментарий в игровом коде
Одна строка из Quake III заменяет деление и корень сдвигом битов и магическим числом 0x5f3759df. Покажу на примере, как это работает, и посчитаю погрешность: 3.44% до уточнения и 0.175% после одного шага Ньютона. А кто на самом деле придумал трюк, вы вряд ли угадаете.
https://youtube.com/shorts/oIpqqzNNCHo
Одна строка из Quake III заменяет деление и корень сдвигом битов и магическим числом 0x5f3759df. Покажу на примере, как это работает, и посчитаю погрешность: 3.44% до уточнения и 0.175% после одного шага Ньютона. А кто на самом деле придумал трюк, вы вряд ли угадаете.
https://youtube.com/shorts/oIpqqzNNCHo
❤3👍1🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
Эта функция из 1983 года выглядит как ошибка. Но работает
В 1983 году Том Дафф в Lucasfilm вставил switch прямо внутрь цикла do while, чтобы ускорить копирование. Показываю на примере 11 элементов, как код «проваливается» по веткам case, и привожу цитату из его письма Ритчи и Пайку. Я замерил на C: без оптимизаций трюк быстрее обычного цикла на 40%, с оптимизацией выигрыш всего 13%, а memcpy быстрее в пять раз.
https://www.youtube.com/shorts/jnr3r_7j14w
В 1983 году Том Дафф в Lucasfilm вставил switch прямо внутрь цикла do while, чтобы ускорить копирование. Показываю на примере 11 элементов, как код «проваливается» по веткам case, и привожу цитату из его письма Ритчи и Пайку. Я замерил на C: без оптимизаций трюк быстрее обычного цикла на 40%, с оптимизацией выигрыш всего 13%, а memcpy быстрее в пять раз.
https://www.youtube.com/shorts/jnr3r_7j14w
❤1
В C# наконец появились union-типы
Разбираем C# 15 и .NET 11: union-типы, закрытые иерархии через closed, аргументы в коллекционных выражениях, extension-индексаторы и именованные break и continue.
Разработчики на C# просили размеченные объединения (discriminated unions) почти десять лет. Обсуждение в репозитории языка годами оставалось одним из самых популярных, а команды тем временем писали свои OneOf, Result и иерархии из абстрактных record с бесконечными default: throw. В C# 15, который выходит вместе с .NET 11, союзы наконец становятся частью языка. Вместе с ними приходят закрытые иерархии, аргументы в коллекционных выражениях, extension-индексаторы и именованные break/continue. Разберём, что из этого реально пригодится в коде уже сейчас.
https://uproger.com/csharp-15-union-types/
Разбираем C# 15 и .NET 11: union-типы, закрытые иерархии через closed, аргументы в коллекционных выражениях, extension-индексаторы и именованные break и continue.
Разработчики на C# просили размеченные объединения (discriminated unions) почти десять лет. Обсуждение в репозитории языка годами оставалось одним из самых популярных, а команды тем временем писали свои OneOf, Result и иерархии из абстрактных record с бесконечными default: throw. В C# 15, который выходит вместе с .NET 11, союзы наконец становятся частью языка. Вместе с ними приходят закрытые иерархии, аргументы в коллекционных выражениях, extension-индексаторы и именованные break/continue. Разберём, что из этого реально пригодится в коде уже сейчас.
https://uproger.com/csharp-15-union-types/