Я создал чат-сервер всего за 64 КБ. Современные инженеры на это не способны.
Оригинальный Macintosh занимал 128 килобайт памяти для графического интерфейса пользователя, текстового процессора и MacPaint. Вкладка VS Code использует 400 мегабайт для отображения боковой панели. Это видео о том, что произошло между этими событиями — и как вернуть хоть что-то из этого. Код: https://www.patreon.com/posts/64kb-chat-server-158916176 Мы ограничиваем реальный TCP-чат-сервер 64 КБ памяти, наблюдаем за неудачами Node, Go и Rust в этом порядке, а затем выпускаем рабочую версию на C с epoll, которая стабильно работает на уровне 42 КБ при шестнадцати одновременно работающих клиентах. Та же задача. Примерно в 4400 раз меньше памяти. Суть не в C. Суть в том, что целое поколение инженеров перестало уметь делать — и почему это незаметно стало преимуществом в карьере — переучиться этому. Четыре утраченных метода (упаковка битов, самодельные распределители памяти, таблицы поиска, математика с фиксированной точкой), один эксперимент в реальном времени с использованием `ulimit` и `prlimit` для ограничения объема памяти на уровне ядра, объяснение причин, почему современные деревья зависимостей и культура «память дешева» привели к созданию JavaScript-пакетов размером 47 МБ для панелей мониторинга «hello-world», и четыре конкретных привычки — программирование с учетом выделения памяти, профилирование перед фреймворками, целенаправленное использование бережливого стека и чтение диаграммы пламени — которые возвращают вас к программному обеспечению, о котором действительно можно рассуждать. Темы: низкоуровневая оптимизация, раздувание памяти, проектирование производительности, вступительные ролики для демосцены размером 64 КБ, .kkrieger в 96 КБ, серверы на основе epoll, распределители памяти для арены, задержка хвоста p99, стоимость паузы сборщика мусора, раздувание программного обеспечения в 2026 году. ━━━━━━━━━━━━━━━━━━━ РАЗДЕЛЫ ━━━━━━━━━━━━━━━━━━━ 0:00 Проблема 128 КБ против 400 МБ 0:36 Задача 64 КБ: три вещи в порядке убывания 1:10 Определение масштаба: Commodore 64, Apple II, Atari 2600 1:40 Четыре утраченные техники: упаковка битов и распределители памяти Arena 2:57 Демосцена и .kkrieger: целый FPS в 96 КБ 3:35 Эксперимент: настоящий TCP-чат-сервер, ограничение кучи 64 КБ 3:47 Node, Go и Rust умирают до запуска основной программы 4:27 Четвертая попытка: C, epoll и всего 42 КБ 5:33 Почему современное программное обеспечение раздувается: четыре причины, ни одна из которых не является технической 7:12 Что мы на самом деле теряем: предсказуемость, p99, энергию, отладочность 8:08 Путь назад: четыре привычки 9:27 Ограничения заставили нас заняться этим ремеслом. Теперь вам нужно сделать выбор. 10:11 Видео по теме: почему HTTP/3 на 52% быстрее на мобильных устройствах ━━━━━━━━━━━━━━━━━━━ ВИДЕО ПО ТЕМЕ НА КАНАЛЕ ━━━━━━━━━━━━━━━━━━ Почему HTTP/3 на 52% быстрее на мобильных устройствах — та же тема, другой уровень стека. Изменение протокола, которое переписывает правила вместо оптимизации внутри старых. ━━━━━━━━━━━━━━━━━━━ Часто задаваемые вопросы ━━━━━━━━━━━━━━━━━━━ Почему современное программное обеспечение такое медленное и потребляет много памяти? Четыре взаимосвязанные причины: уровни абстракции накладываются друг на друга многократно, деревья зависимостей устанавливают тысячи транзитивных пакетов, «память дешева» стала идеологией по умолчанию примерно в 2010 году, а накладные расходы JIT/GC невидимы для инженера, который их вызвал — последствия проявляются в задержке p99 в производственной среде спустя месяцы. В чем заключается проблема 64 КБ? Проверка дисциплины: создайте реально работающую программу (в этом видео — TCP-чат-сервер с шестнадцатью одновременными клиентами и широковещательной рассылкой) в рамках ограничения размера кучи в 64 килобайта, установленного на уровне ядра с помощью `prlimit` или `ulimit`. Современные среды выполнения, такие как Node и Go, даже не могут загрузиться в рамках этого ограничения. Как инженерам 1980-х годов удавалось уместить операционные системы в 64 КБ? Четыре основных метода: упаковка битов (восемь логических значений на байт), самодельные распределители памяти, перемещающие указатель через один предварительно выделенный буфер, предварительно вычисленные таблицы поиска для сложных вычислений и арифметика с фиксированной запятой вместо арифметики с плавающей запятой. Плюс традиция демосцены, которая позволила уместить целые 3D-демоверсии и даже полноценный FPS (.kkrieger) в размер менее 96 КБ. Что такое упаковка битов в C? Хранение нескольких логических флагов в одном байте с использованием побитового ИЛИ для их установки и побитового И для их проверки, вместо использования одного полного байта (или более, после заполнения структуры) для каждого логического значения. Это уменьшает объем памяти для структуры, содержащей большое количество флагов, примерно на порядок. Как начать писать более эффективное программное обеспечение уже сегодня? Четыре привычки: спрашивать себя, нужно ли вообще выделять память в куче, прежде чем использовать `new`, профилировать ...
Название:
Я создал чат-сервер всего за 64 КБ. Современные инженеры на это не способны.
Категория:
Разное