コンパイラ作成の旅
この Github リポジトリでは、C 言語のサブセット用の自己コンパイル コンパイラを作成するまでの過程を文書化しています。また、詳細を書いているので、フォローしたい場合は、コンパイラの理論を参照しながら、私が何をしたのか、なぜ行ったのかについて説明します。
しかし、あまり理論的なものではなく、これを実践的な旅にしたいと思っています。
これまでに私が行った手順は次のとおりです。
- パート 0: 旅の紹介
- パート 1: 字句スキャンの概要
- パート 2: 解析の概要
- パート 3: 演算子の優先順位
- パート 4: 実際のコンパイラ
- パート 5: ステートメント
- パート 6: 変数
- パート 7: 比較演算子
- パート 8: If ステートメント
- パート 9: While ループ
- パート 10: For ループ
- パート 11: 関数、パート 1
- パート 12: タイプ、パート 1
- パート 13: 関数、パート 2
- パート 14: ARM アセンブリ コードの生成
- パート 15: ポインタ、パート 1
- パート 16: グローバル変数を適切に宣言する
- パート 17: 型チェックとポインター オフセットの改善
- パート 18: 左辺値と右辺値の再考
- パート 19: 配列、パート 1
- パート 20: 文字および文字列リテラル
- パート 21: さらなるオペレーター
- パート 22: ローカル変数と関数呼び出しの設計アイデア
- パート 23: ローカル変数
- パート 24: 関数パラメータ
- パート 25: 関数呼び出しと引数
- パート 26: 関数プロトタイプ
- パート 27: 回帰テストと嬉しいサプライズ
- パート 28: 実行時フラグの追加
- パート 29: ちょっとしたリファクタリング
- パート 30: 構造体、共用体、列挙型の設計
- パート 31: 構造体の実装、パート 1
- パート 32: 構造体のメンバーへのアクセス
- パート 33: ユニオンとメンバー アクセスの実装
- パート 34: Enum と Typedef
- パート 35: C プリプロセッサ
- パート 36:
break
てcontinue
- パート 37: Switch ステートメント
- パート 38: ぶら下がっている Else など
- パート 39: 変数の初期化、パート 1
- パート 40: グローバル変数の初期化
- パート 41: ローカル変数の初期化
- パート 42: 型キャストと NULL
- パート 43: バグ修正と追加のオペレーター
- パート 44: 定数フォールディング
- パート 45: グローバル変数の宣言、再考
- パート 46: Void 関数のパラメーターとスキャンの変更
- パート 47:
sizeof
のサブセット - パート 48:
static
のサブセット - パート 49: 三項演算子
- パート 50: 掃討、パート 1
- パート 51: 配列、パート 2
- パート 52: ポインタ、パート 2
- パート 53: 掃討、パート 2
- パート 54: レジスターの流出
- パート 55: 遅延評価
- パート 56: ローカル配列
- パート 57: 掃討、パート 3
- パート 58: ポインタのインクリメント/デクリメントの修正
- パート 59: なぜうまくいかないのか、パート 1
- パート 60: トリプル テストに合格する
- パート 61: 次は何ですか?
- パート 62: コードのクリーンアップ
- パート 63: QBE を使用した新しいバックエンド
- パート 64: 6809 CPU のバックエンド
今後の部分のスケジュールやタイムラインはありません。そのため、私がさらに書いたかどうかを確認するためにここをチェックし続けてください。
著作権
私は、Nils M Holm が作成した SubC コンパイラーからコードの一部と多くのアイデアを借用しました。彼のコードはパブリックドメインにあります。私のコードは、コードに別のライセンスを適用できるほど大幅に異なっていると思います。
特に明記されていない限り、
- すべてのソース コードとスクリプトは (c) Warren Toomey であり、GPL3 ライセンスに基づいています。
- すべての非ソース コード ドキュメント (英語ドキュメント、画像ファイルなど) は (c) Warren Toomey であり、Creative Commons BY-NC-SA 4.0 ライセンスに基づいています。