1024バイトのC言語でPythonインタープリタを作成
原題: Making a Python interpreter in 1024 bytes
なぜ重要か
極限まで制約されたコード量でプログラミング言語の基本動作を実現する実装例として、言語処理系設計や組み込み向け軽量インタープリタの教育的参考事例となる。
MicrosoftのエンジニアAustin Z. Henleyは、1024バイトのC言語コードでPythonのサブセットを解釈できる小型インタープリタを作成した。マクロやライブラリの使用を禁止するという制約のもと、FizzBuzzプログラムが動作するレベルのPython構文をサポートする実装を実現した。
MicrosoftのエンジニアAustin Z. Henleyが、1024バイトのC言語コードのみを使用してPythonインタープリタを実装するという個人的な挑戦を公開した。当初の目標は512バイトだったが、それでは不十分と判断し、1024バイトに拡張した。
この実装はCPythonのようなトークナイズ・AST構築・バイトコード生成といった標準的な処理パイプラインを一切持たない。代わりに、ソースコードを格納する固定長配列(999文字)、シンボルテーブルとして機能する256要素の整数配列、現在の読み取り位置を示すポインタ変数など、わずかなグローバル変数のみで状態を管理する。
式の解析には再帰下降パーサの手法を採用しており、パースと同時に実行を行う。エラーハンドリングは一切実装されておらず、入力コードの正確さを前提としている。変数名は英小文字1文字のみに限定されており、これによりシンボルテーブルの参照を配列の直接インデックスアクセスで実現している。
制御フローについては、インデントレベルを監視することで実現している。ブロック実行関数はインデントが減少した時点でリターンし、CプログラムのコールスタックをそのままPythonの制御構造の管理に活用する仕組みになっている。`for`ループは`for K in range(N):`の形式のみをサポートし、キーワードのスキップは固定バイト数のポジション移動で行う。
サポートされる構文は、`def`による関数定義、インデントベースのブロック、`if/else`文、`for/while`ループ、`print()`関数、基本的な算術演算と比較演算など、FizzBuzzプログラムが動作するレベルのPythonサブセットに限定されている。