diff options
Diffstat (limited to 'services/nuldoc/content/posts/2025-05-05/make-tiny-self-hosted-c-compiler.md')
| -rw-r--r-- | services/nuldoc/content/posts/2025-05-05/make-tiny-self-hosted-c-compiler.md | 98 |
1 files changed, 49 insertions, 49 deletions
diff --git a/services/nuldoc/content/posts/2025-05-05/make-tiny-self-hosted-c-compiler.md b/services/nuldoc/content/posts/2025-05-05/make-tiny-self-hosted-c-compiler.md index b1ce56ae..cac69e68 100644 --- a/services/nuldoc/content/posts/2025-05-05/make-tiny-self-hosted-c-compiler.md +++ b/services/nuldoc/content/posts/2025-05-05/make-tiny-self-hosted-c-compiler.md @@ -4,7 +4,7 @@ uuid = "64f5e1a6-2f5c-4d5d-b1c8-8346a66c1d40" title = "セルフホスト可能な C コンパイラを作った" description = "ゴールデンウィークを使って、セルフホストできる C コンパイラを開発した。" tags = [ - "c", + "c", ] [[article.revisions]] @@ -34,68 +34,68 @@ C コンパイラと言えば、世界三大自作したいソフトウェアの 今回は次のような設計とした (compilerbook の設計を踏襲しているものは除く)。 * 宣言の文法を単純にパースできるものに絞る - * `typedef` をサポートしない - * 構造体には必ず `struct` キーワードを書く - * 配列型をサポートしない - * 常にヒープに確保してポインタ経由で扱う - * 以上の制限により、型に関する情報が必ず変数名の前に来る + * `typedef` をサポートしない + * 構造体には必ず `struct` キーワードを書く + * 配列型をサポートしない + * 常にヒープに確保してポインタ経由で扱う + * 以上の制限により、型に関する情報が必ず変数名の前に来る * 無くてもなんとかなる構文糖を実装しない。ソースを書くときに頑張る - * インクリメント・デクリメント演算子 (1足したり引いたりする) - * 複合代入演算子 (左辺と右辺で 2回書く) - * なお、`+=` と `-=` はセルフホスト達成後に実装された - * `while` (`for` で置き換える) - * なお、`while` はセルフホスト達成後に実装された - * `switch` (`if` で置き換える) - * ほか多数 + * インクリメント・デクリメント演算子 (1足したり引いたりする) + * 複合代入演算子 (左辺と右辺で 2回書く) + * なお、`+=` と `-=` はセルフホスト達成後に実装された + * `while` (`for` で置き換える) + * なお、`while` はセルフホスト達成後に実装された + * `switch` (`if` で置き換える) + * ほか多数 * プリプロセッサのほとんどを実装しない - * 数値または識別子へ置換する単純な `#define` のみサポートする - * 特に、`#include` をサポートしないのは重要な設計判断。すべて 1ファイルでおこなう + * 数値または識別子へ置換する単純な `#define` のみサポートする + * 特に、`#include` をサポートしないのは重要な設計判断。すべて 1ファイルでおこなう * グローバル変数を用いない - * `stdin`、`stdout`、`stderr` を含む - * これは compilerbook とは大きく設計が変わった部分 - * これにより、トップレベルに来るのは関数か構造体の定義/宣言のみとなった + * `stdin`、`stdout`、`stderr` を含む + * これは compilerbook とは大きく設計が変わった部分 + * これにより、トップレベルに来るのは関数か構造体の定義/宣言のみとなった * 変数のシャドウイングを実装しない - * 変数は常に関数スコープ - * グローバル変数もないので、スコープチェーンの実装が不要になる + * 変数は常に関数スコープ + * グローバル変数もないので、スコープチェーンの実装が不要になる ## 言語機能 {#language-features} 最終的にサポートされた機能は以下のとおり。 * 文 - * `if` / `else` - * `for` - * `break` - * `continue` - * `return` - * `while` (実装はセルフホスト達成後) + * `if` / `else` + * `for` + * `break` + * `continue` + * `return` + * `while` (実装はセルフホスト達成後) * 式 - * 二項演算 - * `+` / `-` / `*` / `/` / `%` - * `==` / `!=` - * `<` / `<=` / `>` / `>=` - * `&&` / `||` - * 代入 - * `=` - * `+=` / `-=` (実装はセルフホスト達成後) - * 単項演算: `-` / `!` / `*` / `&` / `sizeof` - * 関数呼び出し: `f(a, b)` - * 配列アクセス: `a[b]` - * メンバ呼び出し: `a.b` / `a->b` - * 整数リテラル - * 文字列リテラル + * 二項演算 + * `+` / `-` / `*` / `/` / `%` + * `==` / `!=` + * `<` / `<=` / `>` / `>=` + * `&&` / `||` + * 代入 + * `=` + * `+=` / `-=` (実装はセルフホスト達成後) + * 単項演算: `-` / `!` / `*` / `&` / `sizeof` + * 関数呼び出し: `f(a, b)` + * 配列アクセス: `a[b]` + * メンバ呼び出し: `a.b` / `a->b` + * 整数リテラル + * 文字列リテラル * 型 - * `char` - * `int` - * `long` - * `void` - * `struct` - * それらのポインタ + * `char` + * `int` + * `long` + * `void` + * `struct` + * それらのポインタ * 宣言・定義 - * 関数 - * 構造体 + * 関数 + * 構造体 * プリプロセッサ - * 引数なし `#define` + * 引数なし `#define` # 開発 {#development} |
