Pythonインタプリタを1024バイトで作る:コードゴルフの極致

Making a Python interpreter in 1024 bytes

Pythonインタプリタを1024バイトで作る:コードゴルフの極致

Austin Z. Henley氏が、Pythonのサブセットを実行するインタプリタをC言語でわずか1024バイトに収める挑戦を語る。再帰下降パーサーとCのコールスタックを活用し、ループはソースを再解釈することで実現。変数名は1文字に制限され、エラー処理は一切ない。コードゴルフのテクニックを駆使し、最終的にFizzBuzzを実行可能なインタプリタを完成させた。その過程と工夫が詳しく紹介されている。

中間表現なしでこれができるのは、実に美しい。
  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は、フラッシュとRAMが数kBしかないプロセッサを対象とした、小型の組み込み可能な言語です。」

  3. marcelo-earth

    記事を読んで、Code Golfというものを今になって知ったなんて信じられない。私は10年以上プログラマーをやってきたのに。

    しかし、本当に素晴らしいプロジェクトだ!人間が作ったというのがいいね :)

  4. userbinator

    正確に言うと、これは1024バイトのCコードで、それよりはるかに大きなバイナリにコンパイルされ、Pythonのごく一部のサブセットを実装している。

    ループは後方にジャンプして、毎回ソースを再解析することで機能する。

    これはDOSの.bat処理の仕組みと同じだ。Unix系シェルも同じかどうかはわからない。その「機能」を悪用する必要がなかったから。

    ここで別のコメントがC4に言及しているが、もう一つ非常に密度が高く(意図的に「コードゴルフ」されたわけではないので少し大きいが)見る価値のあるインタプリタとして、J Incunabulumがある:

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

    より一般的に、配列プログラミング文化では、このレベルの密度が標準であると考えられているようだ:

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

  5. stevefan1999

    しかし正直なところ、最小の解釈可能で実用的なチューリング完全VMは何だろうか?私は、Pythonインタプリタを低レベル化したbrainfuckを実装するか、あるいは型なしラムダ計算やSKIコンビネータのインタプリタを実装することが非常に有用だと思う。特にハードウェアのブートストラップには。

    SectorLispのようなものを考えている:https://justine.lol/sectorlisp/

  6. jeanmichelselli

    興味深い。特に、昔は32KB未満で完全なBASICインタプリタを出荷していたことを知ると、なおさらだ。

  7. shmoil

    著者の説明で早速つまずいた。

    >> 私が思いつく最も基本的なコードから始めた:1 + 2

    それをどうやって512/1024バイトに収めたんだ??? print(3 * * 1000) を試したのか?

  8. andai

    著者の別の作品:

    超小型コンパイラを作ろう

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

この日のほかの記事

2026-09-06