Python
コンパイラ
パーサ
x86

pythonでx86コンパイラ自作

pythonでコンパイラを自作してみた。

コンセプトはこんな感じ

  • pythonで実装 (C言語とかじゃなくて)
  • x86_64アセンブラコードを出力 (自作仮想マシン上で動くとかじゃなくて)
  • パーサも自作 (yaccに頼るとかじゃなくて)
  • 実用性はとくに考慮しない (楽しく作って動けばOK)

実装した順に紹介

第一段階
とりあえず動くものを実装
変数宣言や代入や四則演算を実装。パーサも簡単なものなので、ほとんど抽象構文木を手書きしてる感じ。

第二段階
バックエンドを実装
パーサは貧弱なままだけど、配列とか名前空間とか関数呼び出しとかを実装。末尾再帰ぽい機能もオレオレ実装。

第三段階
フロントエンドを実装(完成版)
BNF記法で文法を定義し、SLRパーザを実装。

補足(追記)
Linux環境、python3系で実行してください。
出力はGNU Assemblerです。
また、ソースコードも少し修正しました。

参考資料

  • 滝本宗宏「実践コンパイラ入門」
    Ocamlでコンパイラを実装する本。バックエンドは主にこの本を参考にした。

  • 宮本衛市「はじめてのコンパイラ」
    C言語でコンパイラを実装する本。フロントエンドを実装するときに参考にした。

  • Peter Norvig 「(How to Write a (Lisp) Interpreter (in Python))
    PythonでLispインタプリタを実装する記事。

  • Abdulaziz Ghuloum 「Compilers: Backend to Frontend」
    SchemeでSchemeコンパイラを実装する資料。

  • Rui Ueyama 「簡単なプログラミング言語を作るライブコーディング
    C言語でライブコーディングする動画。