Суть проекта: 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 ↗
