summaryrefslogtreecommitdiff
path: root/docs/chapter29/README.ja.md
diff options
context:
space:
mode:
Diffstat (limited to 'docs/chapter29/README.ja.md')
-rw-r--r--docs/chapter29/README.ja.md39
1 files changed, 39 insertions, 0 deletions
diff --git a/docs/chapter29/README.ja.md b/docs/chapter29/README.ja.md
new file mode 100644
index 00000000..4c697528
--- /dev/null
+++ b/docs/chapter29/README.ja.md
@@ -0,0 +1,39 @@
+# 第29章: 技術的負債の整理
+
+[English](README.md) | 日本語
+
+[前の章: 第28b章 — 分離コンパイル](../chapter28b/README.ja.md)
+
+この章では、コンパイラを読みやすく、変更しやすく整理します。
+最初の変更は、3,000行を超えたパーサを
+文法のまとまりに沿って `parser/` パッケージへ分割することです。
+
+`Parser` がカーソル、スコープ、型の登録情報を持ち、各部品は `Parser P` を
+共有します。構文解析は引き続き Sea-of-Nodes IR を直接生成します。
+`Var` は `parser/` に、反復ピープホール最適化の `IterPeeps` は `codegen/` に移ります。
+
+[パーサの構成(英語)](../../src/main/java/com/seaofnodes/simple/parser/README.md)と
+[文法と実装の対応表(英語)](29-grammar.md)からコードをたどれます。
+インスタンスのフィールドは、初期化中も通常の Load と Store を使います。
+各終了経路のメモリは Return に統合し、最後に全フィールドを再格納する処理は行いません。
+未初期化のフィールドは `TypeScalar.BOT` で表し、meet でも未初期化の分岐が残ります。
+通常のメモリ型の前向き解析で初期化を確認します。詳細は `Construction.java` の
+クラスコメントに記載しています。クラスのシングルトン初期化は従来の方式を維持します。
+ソース上のプライバシー制約は今回は追加せず、[ロードマップ](../roadmap.md)に残します。
+
+[構築グループの実験(英語)](construction-groups.md)では、コンストラクタの
+`C ^arg` 引数で未完成の参照を渡せます。未完成の引数を受け取る new の結果も未完成です。
+`TypeMemPtr` の修飾子を通常の型解析で伝播し、一時的な `ConstructNode` が
+各 new の実引数から結果の修飾子を計算します。
+未完成のオブジェクトのフィールドは self 以外から読めず、通常の関数呼び出しには
+完成した参照が必要です。フィールド要件の推論は後回しにし、対応するテストを保存しています。
+`^` を使うコンストラクタの分離コンパイルは未対応です。
+
+リポジトリのルートからビルドとテストを実行します。
+
+```sh
+make lib tests release CHAPTERS=chapter29 CTAGS=
+```
+
+IntelliJ では `chapter29` モジュールと **chapter29 tests** 実行設定を使用します。
+ネイティブ実行を使うテストの前に、Make でランタイムと `sys` ライブラリをビルドしてください。