Python-интерпретатор в 1024 байтах C-кода

Making a Python interpreter in 1024 bytes

Python-интерпретатор в 1024 байтах C-кода

Остин З. Хенли, создатель инструментов для разработчиков, рассказывает о своём новом выходном проекте: он написал интерпретатор Python всего в 1024 байтах кода на C. В статье подробно описывается, как он обошёл ограничения, используя рекурсивный спуск, хитрости с пробелами и отступами, а также минификацию кода. В итоге получился интерпретатор, способный выполнять программы с переменными, циклами, функциями и даже рекурсией, но с рядом ограничений, таких как однобуквенные имена переменных и отсутствие обработки ошибок. Полный код доступен на GitHub.

Управление потоком работает за счёт прыжков назад и повторного разбора исходного кода на каждой итерации цикла.
  1. jrdres

    Код вызывает улыбку, потому что он мерзкий. Это не как C4, крошечный, но полный C-компилятор, который выполняет проверку ошибок для своего подмножества. Вместо этого это хуже, чем Sector C, который использует все возможные сокращения и просто предполагает, что всё в исходнике правильно.

    Этот «Python» просто предполагает для ключевых слов:

    Любая «f» — это «for [x] in range[y]» (именно так, никаких других for).

    Любая «w» — это «while».

    Любая «i» — это «if».

    Любая «d» — это «def».

    Любая «p» — это «print(».

    Мерзко, мерзко.

    (Также мерзко то, что фрагменты кода в статье содержат больше комментариев, чем github-копия «читаемой» версии. Вам нужна статья, чтобы понять, что происходит.)

    Это слишком просто для «Tiny Python». Если кто-то готов допустить ещё несколько килобайт, я бы хотел увидеть хотя бы списки и словари — Lisp умеет их!

  2. teddyh

    Тем, кому на самом деле нужно что-то подобное в продакшене, стоит обратить внимание на Snek: <https://sneklang.org/> «Snek — это крошечный встраиваемый язык, ориентированный на процессоры всего с несколькими килобайтами флеша и ОЗУ».

  3. marcelo-earth

    Читая статью, не могу поверить, что только сейчас узнал о Code Golf. Я программист уже более десяти лет.

    Но да, потрясающий проект! Мне нравится, что он сделан человеком :)

  4. userbinator

    Если быть точным, это 1024 байта C, которые компилируются в бинарник во много раз больше и реализуют очень крошечное подмножество Python.

    Циклы работают путём перехода назад и повторного разбора исходника на каждой итерации.

    Так работает обработка .bat в DOS; не уверен, что Unix-подобные шеллы делают так же, так как у меня никогда не было необходимости использовать эту «фичу».

    Другой комментарий здесь упомянул C4, но ещё один чрезвычайно плотный (и чуть больший, так как он не был намеренно(!) «code-golfed») интерпретатор, на который стоит взглянуть, — это J Incunabulum:

    https://www.jsoftware.com/ioj/iojATW.htm

    В более общем плане, в культуре программирования на массивах, похоже, считается нормой такая плотность:

    https://news.ycombinator.com/item?id=45800777

  5. stevefan1999

    Но, честно говоря, мне интересно, какая самая маленькая интерпретируемая и практичная Тьюринг-полная ВМ? Я бы сказал, что реализация brainfuck, на который мы опускаем интерпретатор Python, или даже, скажем, интерпретатор бестипового лямбда-исчисления или SKI-комбинаторов была бы очень полезна, особенно для загрузки оборудования.

    Я говорю о таких вещах, как SectorLisp https://justine.lol/sectorlisp/

  6. jeanmichelselli

    Интересно, особенно когда знаешь, что раньше они поставляли полный интерпретатор BASIC менее чем в 32 КБ...

  7. shmoil

    Автор потерял меня сразу.

    >> Я начал с самого простого кода, который мог придумать: 1 + 2

    Ок, как вы уместили это в 512/1024 байта??? Вы пробовали print(3 * * 1000)?

  8. andai

    Также от автора:

    Создадим крошечный-прекрошечный компилятор

    https://news.ycombinator.com/item?id=36102460

Ещё за этот день

2026-09-06