Инструменты11 сентября 2026 г., 17:50 МСК🤖 Auto

Интерпретатор Python за 1024 байта: как уместить язык в один килобайт

Программист Остин Хенли создал работающий интерпретатор подмножества Python, уложившись в 1024 байта кода на C. Никаких библиотек, только хардкорный код-гольфинг и рекурсивный спуск.

Баннер новости 7283

Суть проекта: Python без компиляции

Автор оригинальной идеи, Остин Хенли, поставил перед собой задачу написать интерпретатор, способный выполнить классическую задачу FizzBuzz, используя не более 1024 байт кода на языке C. В отличие от CPython, который проходит сложный путь токенизации, построения AST, генерации байт-кода и его выполнения, этот мини-интерпретатор работает напрямую с исходным текстом.

Результат — полностью рабочий код, поддерживающий ключевые элементы синтаксиса Python: def, отступы, операторы if/else, циклы for/while и базовую арифметику. При этом используются только переменные с одним символом в нижнем регистре, что позволяет оптимизировать поиск в таблице символов.

Технические детали и оптимизация

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

  • Отсутствие промежуточного представления: Парсер и исполнитель работают в реальном времени. Циклы реализованы через возврат к позиции условия в исходном коде, а рекурсия функций использует стек вызовов C.
  • Глобальное состояние: Весь код хранится в массиве src[999], а таблица символов — в vars[256]. Это избавляет от выделения памяти на стеке.
  • Код-гольфинг: Использованы трюки из стандарта C89: неявное объявление типов как int, использование ASCII-кодов вместо символьных литералов, побитовые операции и тернарный оператор. Например, проверка на новую строку заменена на вычитание 10.

Сравнение размеров кода

Разница между читаемой версией и финальным «голым» кодом колоссальна. Ниже приведена таблица, демонстриющая эффективность оптимизаций:

Версия кода Размер (байты) Характеристики
Исходная (читаемая) > 4800 Понятные имена, стандартный стиль C, базовая логика
Оптимизированная (финал) 1024 Односимвольные имена, C89-хитрости, отсутствие обработки ошибок
Целевой лимит 1024 Подмножество Python, работающее FizzBuzz

Почему это важно

Этот проект — отличный пример того, как глубокая понимание архитектуры языка и компилятора позволяет радикально сокращать код. Хотя такой интерпретатор не подходит для продакшена (из-за отсутствия обработки ошибок и ограничений на имена переменных), он демонстрирует элегантность алгоритмов рекурсивного спуска и важность понимания низкоуровневых оптимизаций. Для энтузиастов embedded-разработки и создателей DSL (Domain Specific Languages) этот код служит вдохновляющим кейсом по достижению максимальной функциональности при минимальных ресурсах.

Источник: Habr ↗