aboutsummaryrefslogtreecommitdiffhomepage
path: root/services/nuldoc/public/blog/posts/2025-05-05/make-tiny-self-hosted-c-compiler.md
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-01-31 20:42:06 +0900
committernsfisis <nsfisis@gmail.com>2026-01-31 20:42:06 +0900
commit2ed4720c79db817401e739a4d333c6cf5b59087a (patch)
treeb87119776576451466e7d0cf8044261682400b8b /services/nuldoc/public/blog/posts/2025-05-05/make-tiny-self-hosted-c-compiler.md
parent9d4c7d916a9477a0cb635197b02a51befe2cd0ad (diff)
downloadnsfisis.dev-2ed4720c79db817401e739a4d333c6cf5b59087a.tar.gz
nsfisis.dev-2ed4720c79db817401e739a4d333c6cf5b59087a.tar.zst
nsfisis.dev-2ed4720c79db817401e739a4d333c6cf5b59087a.zip
style(nuldoc): unify indentation to 4 spaces
Diffstat (limited to 'services/nuldoc/public/blog/posts/2025-05-05/make-tiny-self-hosted-c-compiler.md')
-rw-r--r--services/nuldoc/public/blog/posts/2025-05-05/make-tiny-self-hosted-c-compiler.md98
1 files changed, 49 insertions, 49 deletions
diff --git a/services/nuldoc/public/blog/posts/2025-05-05/make-tiny-self-hosted-c-compiler.md b/services/nuldoc/public/blog/posts/2025-05-05/make-tiny-self-hosted-c-compiler.md
index b1ce56ae..cac69e68 100644
--- a/services/nuldoc/public/blog/posts/2025-05-05/make-tiny-self-hosted-c-compiler.md
+++ b/services/nuldoc/public/blog/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}