Стековый байткод против регистрового: замер на одном языке, одном железе и честной методике
Максим Шевалье-Буавер, в прошлом автор YJIT для Ruby, переписала VM своего языка Plush с стековой модели на регистровую и разложила, откуда взялось ускорение. Инструкция стала 64-битным словом с тремя операндами;
Методика: 11 чередующихся запусков на тест, медиана, повтор всего набора. Медиана ускорения 2,07 раза, максимум 3,37, тесты GC не сдвинулись. Против Lua 5.5.1 на
@prog_stuff
Максим Шевалье-Буавер, в прошлом автор YJIT для Ruby, переписала VM своего языка Plush с стековой модели на регистровую и разложила, откуда взялось ускорение. Инструкция стала 64-битным словом с тремя операндами;
a + b из трёх диспетчеризаций превратилось в одну. Сама смена модели дала 1,55 раза по геометрическому среднему, слитые сравнения-переходы, непосредственные операнды и свёртка констант добавили ещё 25%.Методика: 11 чередующихся запусков на тест, медиана, повтор всего набора. Медиана ускорения 2,07 раза, максимум 3,37, тесты GC не сдвинулись. Против Lua 5.5.1 на
fib быстрее на 24%. Главный урок автора: в интерпретаторе считайте инструкции, а не такты. Полный разбор на сайте.@prog_stuff
Модуль std ускорил сборку Seastar на 22% без единой правки в исходниках
Чуаньцы Сюй из команды Clang показал два способа подключить
Замер на Seastar, Clang и libc++ из ветки 24,
Из ограничений: нужен Clang 24 (в 23 автор ловил зависание), в module map нельзя включать заголовки с макросами вроде
@prog_stuff
Чуаньцы Сюй из команды Clang показал два способа подключить
import std; к проекту, который об этом не знает. Preload заставляет компилятор загружать BMI модуля std перед каждой единицей трансляции через -fmodule-file. Module Map идёт дальше: файл std.modulemap подменяет #include <vector> и остальные STL-заголовки на import std; автоматически.Замер на Seastar, Clang и libc++ из ветки 24,
-j8, медиана из трёх прогонов. Wall-time: 92,21 с с заголовками, 81,09 с с Preload, 71,55 с с Module Map, то есть минус 12% и минус 22%. Пользовательское CPU-время упало с 655,7 до 497,5 с. Память при Preload выросла на 2,7%, при Module Map снизилась на 3,3%.Из ограничений: нужен Clang 24 (в 23 автор ловил зависание), в module map нельзя включать заголовки с макросами вроде
cassert, а заголовки пришлось пробросить симлинками. Полный патч к CMake лежит в ветке автора, разбор в блоге.@prog_stuff
Двухчасовое расследование о том, откуда взялась фраза про преждевременную оптимизацию
Её полвека цитируют то как Кнута, то как Хоара, чаще всего чтобы осадить желание написать код побыстрее. Кейси Муратори собрал больше 200 исторических документов, от переписки Дейкстры времён «GOTO considered harmful» до отчётов конференций NATO 1968 года, и показал, при каких обстоятельствах фраза родилась и к чему её на самом деле применяли.
Попутно у Хоара в 1965 году нашлась конструкция, похожая на SSA-форму, а у Страуструпа в 1979-м приём, который сегодня называют dependency injection. В нашем канале Tproger разобрали подробнее.
@prog_stuff
Её полвека цитируют то как Кнута, то как Хоара, чаще всего чтобы осадить желание написать код побыстрее. Кейси Муратори собрал больше 200 исторических документов, от переписки Дейкстры времён «GOTO considered harmful» до отчётов конференций NATO 1968 года, и показал, при каких обстоятельствах фраза родилась и к чему её на самом деле применяли.
Попутно у Хоара в 1965 году нашлась конструкция, похожая на SSA-форму, а у Страуструпа в 1979-м приём, который сегодня называют dependency injection. В нашем канале Tproger разобрали подробнее.
@prog_stuff
Выделите всю память при старте и никогда больше: как TigerBeetle защищается от перегрузки
Алексей Кладов (matklad) отвечает на письмо читателя, который получил use-after-free в матчере ордеров с пулом объектов, и выводит из этого два приёма из TigerStyle. Первый: никакой динамической аллокации после инициализации. Программа запускается с
На возражение «а вдруг память ещё есть» ответ: а вдруг нет? Попытка выделить ещё один объект под нагрузкой заканчивается OOM-киллером, который снимает весь процесс с миллионом ордеров внутри, а то и супервизор. Со статическим лимитом система может не стартовать без памяти, но если стартовала, деградирует предсказуемо. По дороге разбирается, почему пул объектов одного типа превращает опасный use-after-free в скучный детерминированный баг.
@prog_stuff
Алексей Кладов (matklad) отвечает на письмо читателя, который получил use-after-free в матчере ордеров с пулом объектов, и выводит из этого два приёма из TigerStyle. Первый: никакой динамической аллокации после инициализации. Программа запускается с
--orders-max=1_000_000, выделяет массив под миллион ордеров одной строкой и всё, что сверх лимита, отклоняет.На возражение «а вдруг память ещё есть» ответ: а вдруг нет? Попытка выделить ещё один объект под нагрузкой заканчивается OOM-киллером, который снимает весь процесс с миллионом ордеров внутри, а то и супервизор. Со статическим лимитом система может не стартовать без памяти, но если стартовала, деградирует предсказуемо. По дороге разбирается, почему пул объектов одного типа превращает опасный use-after-free в скучный детерминированный баг.
@prog_stuff
Сколько знаков в 52 факториала и как прикинуть это без калькулятора
Началось с бытового вопроса: насколько велико число перестановок колоды карт. Дальше Эли Бендерски задумался, как оценивать такие величины, не имея под рукой ни калькулятора, ни компьютера.
Оказалось, что за оценкой количества знаков в факториале стоит вполне занятная математика, и разбор разворачивает её шаг за шагом, без предварительных знаний сверх школьных.
Жанр здесь не прикладной, а тот, ради которого такие блоги и читают: короткое погружение в тему, которая на работе не понадобится, но перестраивает интуицию про рост чисел.
Началось с бытового вопроса: насколько велико число перестановок колоды карт. Дальше Эли Бендерски задумался, как оценивать такие величины, не имея под рукой ни калькулятора, ни компьютера.
Оказалось, что за оценкой количества знаков в факториале стоит вполне занятная математика, и разбор разворачивает её шаг за шагом, без предварительных знаний сверх школьных.
Жанр здесь не прикладной, а тот, ради которого такие блоги и читают: короткое погружение в тему, которая на работе не понадобится, но перестраивает интуицию про рост чисел.
«Zero-cost» compile-time информация о типах стоит экспоненциально, а runtime-таблица линейно
Джинджер Билл, автор языка Odin, объясняет, почему Odin форматирует вывод через RTTI, а не через генерацию кода на этапе компиляции. Таблица типов растёт линейно: N типов, N записей, одна процедура печати на все, ноль дополнительной работы у семантического анализатора. Её размер можно прочитать в бинарнике в байтах.
CTTI специализирует код под каждый тип и каждую комбинацию: сериализатор N типов в K форматов даёт N на K инстанциаций, и это повторяется в проверке типов, кодогенерации и размере бинарника. Цену этого никто не может назвать в цифрах, потому что она размазана по компилятору, зато её называют «бесплатной». Автор аккуратно разводит «известно на этапе компиляции» и «бесплатно перечислить на этапе компиляции»: это разные вещи.
@prog_stuff
Джинджер Билл, автор языка Odin, объясняет, почему Odin форматирует вывод через RTTI, а не через генерацию кода на этапе компиляции. Таблица типов растёт линейно: N типов, N записей, одна процедура печати на все, ноль дополнительной работы у семантического анализатора. Её размер можно прочитать в бинарнике в байтах.
CTTI специализирует код под каждый тип и каждую комбинацию: сериализатор N типов в K форматов даёт N на K инстанциаций, и это повторяется в проверке типов, кодогенерации и размере бинарника. Цену этого никто не может назвать в цифрах, потому что она размазана по компилятору, зато её называют «бесплатной». Автор аккуратно разводит «известно на этапе компиляции» и «бесплатно перечислить на этапе компиляции»: это разные вещи.
@prog_stuff
Задержка, пропускная способность или цена токена: карта компромиссов инференса LLM
Филип Кили из Baseten раскладывает все приёмы ускорения инференса на две группы. Одни двигают развёртывание вдоль кривой компромисса: размер батча (маленький даёт низкую задержку и дорогой токен, большой наоборот), tensor parallelism с дорогой all-to-all коммуникацией ради задержки, expert parallelism, который на широких MoE может занимать целую стойку. Другие сдвигают саму кривую: квантизация в MXFP4 и NVFP4, оптимизация ядер, speculative decoding (EAGLE-3, DSpark, DFlash), разнесение prefill и decode по разным воркерам.
Полезная арифметика: удвоение производительности железа и удвоение софтверного слоя вместе дают четырёхкратный выигрыш. И честная оговорка: на практике фронтир зубчатый, и попадание в целевые числа чаще вопрос перебора конфигураций, чем новой идеи.
@prog_stuff
Филип Кили из Baseten раскладывает все приёмы ускорения инференса на две группы. Одни двигают развёртывание вдоль кривой компромисса: размер батча (маленький даёт низкую задержку и дорогой токен, большой наоборот), tensor parallelism с дорогой all-to-all коммуникацией ради задержки, expert parallelism, который на широких MoE может занимать целую стойку. Другие сдвигают саму кривую: квантизация в MXFP4 и NVFP4, оптимизация ядер, speculative decoding (EAGLE-3, DSpark, DFlash), разнесение prefill и decode по разным воркерам.
Полезная арифметика: удвоение производительности железа и удвоение софтверного слоя вместе дают четырёхкратный выигрыш. И честная оговорка: на практике фронтир зубчатый, и попадание в целевые числа чаще вопрос перебора конфигураций, чем новой идеи.
@prog_stuff
WhatsApp* классифицирует мошеннические сообщения на устройстве, не нарушая сквозное шифрование
Задача с виду противоречивая: распознать мошенническое сообщение и не прочитать переписку. Meta* публикует технический обзор Scam Alert до массового выката, вместе с ограниченной бетой, и приглашает исследователей безопасности его ломать.
Решение целиком на устройстве: содержимое сообщений не покидает телефон ради классификации и не отправляется автоматически ни в WhatsApp*, ни в Meta*, ни кому-либо ещё. Функция опциональна и включается пользователем.
Принципы названы прямо: модель достаточно мала, чтобы работать на мобильном железе, достаточно проста, чтобы её опубликовать для независимой проверки, и достаточно эффективна без серверной части. Недавние успехи в моделях на устройстве как раз и сделали такой размен возможным.
*Компания Meta и её продукты признаны экстремистскими, их деятельность запрещена на территории РФ.
Задача с виду противоречивая: распознать мошенническое сообщение и не прочитать переписку. Meta* публикует технический обзор Scam Alert до массового выката, вместе с ограниченной бетой, и приглашает исследователей безопасности его ломать.
Решение целиком на устройстве: содержимое сообщений не покидает телефон ради классификации и не отправляется автоматически ни в WhatsApp*, ни в Meta*, ни кому-либо ещё. Функция опциональна и включается пользователем.
Принципы названы прямо: модель достаточно мала, чтобы работать на мобильном железе, достаточно проста, чтобы её опубликовать для независимой проверки, и достаточно эффективна без серверной части. Недавние успехи в моделях на устройстве как раз и сделали такой размен возможным.
*Компания Meta и её продукты признаны экстремистскими, их деятельность запрещена на территории РФ.
Engineering at Meta
How We’re Building Scam Alert on WhatsApp With End-to-End Encryption and Verifiability Guarantees
WhatsApp is committed to helping people stay safe while protecting the privacy of their messages. As scam tactics evolve — from impersonation to social engineering to AI-generated lures — we’…
❤1🤯1
Все агенты собраны из восьми способностей, а не из отраслевых рецептов: книга на 60 паттернов
Первая волна литературы про агентов была устроена по отраслям: как построить агента для медицины, для финансов, для программирования. Автор считает, что такая рамка теперь мешает: если убрать промпты и наборы инструментов, медицинский и кодовый агент запускают одни и те же пять-шесть архитектурных паттернов, а различия косметические.
Книга переупорядочена вокруг способностей. Их восемь: восприятие, рассуждение, планирование, память, работа с инструментами, координация, обучение и выравнивание. Любой работающий агент, от скрипта в cron, который сводит вам почту, до многоагентной системы, готовящей документы по слиянию, это композиция этих восьми в разных пропорциях.
Для каждого из 60 паттернов даны код, режимы отказа и сводные примеры. Объём книжный, так что это чтение на недели, а не на вечер.
Первая волна литературы про агентов была устроена по отраслям: как построить агента для медицины, для финансов, для программирования. Автор считает, что такая рамка теперь мешает: если убрать промпты и наборы инструментов, медицинский и кодовый агент запускают одни и те же пять-шесть архитектурных паттернов, а различия косметические.
Книга переупорядочена вокруг способностей. Их восемь: восприятие, рассуждение, планирование, память, работа с инструментами, координация, обучение и выравнивание. Любой работающий агент, от скрипта в cron, который сводит вам почту, до многоагентной системы, готовящей документы по слиянию, это композиция этих восьми в разных пропорциях.
Для каждого из 60 паттернов даны код, режимы отказа и сводные примеры. Объём книжный, так что это чтение на недели, а не на вечер.
freeCodeCamp.org
The AI Agent Engineer's Guide: 60 Patterns for Building Autonomous Systems [Full Book]
This book is a capability-led field guide to the architectures that make modern AI agents actually work. It includes code, failure modes, and illustrative composite case studies for every pattern. Abo
CSRF с нуля: почему POST в Spring Boot отдаёт 403 и почему отключать защиту не выход
Сценарий, с которого начинается текст, узнаваем: вы пишете REST API на Spring Boot, ловите неожиданные 403 на каждом POST и «чините» это строчкой
Справочник разбирает предмет снизу вверх: сначала механика браузера, из-за которой атака вообще возможна, потом сами атаки, и только затем реализация защиты в Spring Security.
Автор связывает материал со своим гайдом по OAuth 2.0, где параметр
Сценарий, с которого начинается текст, узнаваем: вы пишете REST API на Spring Boot, ловите неожиданные 403 на каждом POST и «чините» это строчкой
.csrf(csrf -> csrf.disable()) в цепочке фильтров.Справочник разбирает предмет снизу вверх: сначала механика браузера, из-за которой атака вообще возможна, потом сами атаки, и только затем реализация защиты в Spring Security.
Автор связывает материал со своим гайдом по OAuth 2.0, где параметр
state упоминался вскользь как защита авторизационных потоков от CSRF. Здесь та же тема разворачивается целиком. Сохранять стоит тем, кто отвечает за аутентификацию на бэкенде.freeCodeCamp.org
CSRF from Scratch: Browser Mechanics, Attacks, and Spring Security Implementation [Full Handbook]
If you've ever built a web application or configured Spring Security, you've almost certainly encountered Cross-Site Request Forgery (CSRF). In my previous guide, How OAuth 2.0 Works: A Practical Guid
От первых сайтов на HTML до нейросетей — веб прошёл долгий путь, и SpaceWeb прошёл его вместе с рунетом все свои 25 лет. К юбилею компания вместе с Типичным программистом сделала анкету, где эта история рассказана между вопросами про спорт, друзей и обои на рабочий стол, а нужную атмосферу создают аська, скайп и биткоин из разных эпох.
В конце — небольшой взгляд в будущее, промокод на услуги SpaceWeb и результат: узнаешь свой цифровой профиль.
В конце — небольшой взгляд в будущее, промокод на услуги SpaceWeb и результат: узнаешь свой цифровой профиль.
Четыре джойна в SQL против одного запроса в графе: справочник по Neo4j и Python
Рамка задана вопросом, который легко произнести и тяжело написать: у каких инженеров есть свежий контекст по сервисам, задетым ночным инцидентом. В SQL это четыре или пять джойнов, каждый строит промежуточный результат шире нужного ответа и тут же выбрасывает большую часть. Запрос замедляется по мере роста таблиц и хуже читается с каждым возвращением к нему.
Справочник ведёт от пустой базы до работающего графа знаний: загрузка настоящих данных из Python и запросы, на которых идея становится понятной.
Разобраны части, которые туториалы пропускают: как решить, что становится узлом, почему первая модель данных почти наверняка неверна, как ускорить загрузку и как читать план запроса, когда что-то тормозит.
Рамка задана вопросом, который легко произнести и тяжело написать: у каких инженеров есть свежий контекст по сервисам, задетым ночным инцидентом. В SQL это четыре или пять джойнов, каждый строит промежуточный результат шире нужного ответа и тут же выбрасывает большую часть. Запрос замедляется по мере роста таблиц и хуже читается с каждым возвращением к нему.
Справочник ведёт от пустой базы до работающего графа знаний: загрузка настоящих данных из Python и запросы, на которых идея становится понятной.
Разобраны части, которые туториалы пропускают: как решить, что становится узлом, почему первая модель данных почти наверняка неверна, как ускорить загрузку и как читать план запроса, когда что-то тормозит.
freeCodeCamp.org
How to Build a Knowledge Graph with Python and Neo4j [Full Handbook]
Most of the data you work with is really about relationships. A customer belongs to an account. An incident affects a service. An engineer owns a repository. You store all of that in tables, and for a