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

Austin Z. Henley氏が、Pythonのサブセットを実行するインタプリタをC言語でわずか1024バイトに収める挑戦を語る。再帰下降パーサーとCのコールスタックを活用し、ループはソースを再解釈することで実現。変数名は1文字に制限され、エラー処理は一切ない。コードゴルフのテクニックを駆使し、最終的にFizzBuzzを実行可能なインタプリタを完成させた。その過程と工夫が詳しく紹介されている。
中間表現なしでこれができるのは、実に美しい。
HNでの議論
102- 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ならできるのに!
- teddyh
実際に本番でこのようなものが必要な人には、Snekがある:<https://sneklang.org/> 「Snekは、フラッシュとRAMが数kBしかないプロセッサを対象とした、小型の組み込み可能な言語です。」
- marcelo-earth
記事を読んで、Code Golfというものを今になって知ったなんて信じられない。私は10年以上プログラマーをやってきたのに。
しかし、本当に素晴らしいプロジェクトだ!人間が作ったというのがいいね :)
- userbinator
正確に言うと、これは1024バイトのCコードで、それよりはるかに大きなバイナリにコンパイルされ、Pythonのごく一部のサブセットを実装している。
ループは後方にジャンプして、毎回ソースを再解析することで機能する。
これはDOSの.bat処理の仕組みと同じだ。Unix系シェルも同じかどうかはわからない。その「機能」を悪用する必要がなかったから。
ここで別のコメントがC4に言及しているが、もう一つ非常に密度が高く(意図的に「コードゴルフ」されたわけではないので少し大きいが)見る価値のあるインタプリタとして、J Incunabulumがある:
https://www.jsoftware.com/ioj/iojATW.htm
より一般的に、配列プログラミング文化では、このレベルの密度が標準であると考えられているようだ:
- stevefan1999
しかし正直なところ、最小の解釈可能で実用的なチューリング完全VMは何だろうか?私は、Pythonインタプリタを低レベル化したbrainfuckを実装するか、あるいは型なしラムダ計算やSKIコンビネータのインタプリタを実装することが非常に有用だと思う。特にハードウェアのブートストラップには。
SectorLispのようなものを考えている:https://justine.lol/sectorlisp/
- jeanmichelselli
興味深い。特に、昔は32KB未満で完全なBASICインタプリタを出荷していたことを知ると、なおさらだ。
- shmoil
著者の説明で早速つまずいた。
>> 私が思いつく最も基本的なコードから始めた:1 + 2
それをどうやって512/1024バイトに収めたんだ??? print(3 * * 1000) を試したのか?
- andai
著者の別の作品:
超小型コンパイラを作ろう