From b3ec548422f6ec63f40e17cdca72f86927aa4f4e Mon Sep 17 00:00:00 2001 From: Cliff Click Date: Mon, 26 Oct 2026 18:42:42 -0700 Subject: More incremental loading and compilation. --- chapter28b/README.ja.md | 41 +++++++++++++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 8 deletions(-) (limited to 'chapter28b/README.ja.md') diff --git a/chapter28b/README.ja.md b/chapter28b/README.ja.md index a3221da5..0c565a76 100644 --- a/chapter28b/README.ja.md +++ b/chapter28b/README.ja.md @@ -25,12 +25,35 @@ Store の幅、元のソース位置も保存します。入れ子の構造体 組み合わせを今回の番号へ写します。型とノードに同じ写像を使い、複数ファイルを またぐ再帰型も復元します。 -読み込みの単位は現在オブジェクトです。無関係なオブジェクトは読み込まずに済みますが、選ばれた -オブジェクトの保存済み IR は全体を復元し、記録された依存先も読み込みます。`sys.io.p` だけを -呼ぶ場合でも、`sys.o` にまとめられた十個の単位をすべて読み込み、`aryu8` と `aryi64` も含みます。 -必要なメンバーだけの読み込みは今後の目標です。IR の読み込みだけでクラスが初期化されたり、 -その本体がクライアントの出力にコピーされたりするわけではありません。元のソースの解析は省けますが、 -インポートしたグラフも新しい呼び出し元とともに最適化し、型検査します。 +コンパイル単位ごとに `sys.o`、`sys/io.o`、`sys/libc.o` などを出力します。宣言と関数の +要約は本体より先に保存し、IR を復元せずに読めます。未ロードの関数は `FunNode`、 +`SummaryNode`、`ReturnNode` で表し、戻り値・メモリ・エスケープ情報を解析に使います。 +要約そのものはインライン化しません。ワークリストが空になった時点で、保存したサイズを +参考に本体を要求し、読み込んで解析してから実際のインライン化を判断します。 + +`sys.io.p` を通常の呼び出しとして残す場合、`io` の IR は不要です。`io.o` の本体を +読み込んでも、その中の外部参照には型があり、別の本体を自動的に要求しません。 +メタデータの探索は保守的で、要求したオブジェクト内の関数本体はまとめて読み込みます。 +さらに細かい関数単位の読み込みは今後の目標です。 + +要約には直接呼び出しとクラス初期化の依存辺も保存します。循環の可能性が見つかったら、 +残りの本体をすべて読み込み、最適化後に再検査してからエラーを報告します。循環の外の +ヘルパーが返す定数によって、循環内の辺が消える場合もあるためです。 + +コンパイル直後のネイティブリンクは CompUnit に保存されたオブジェクトのパスを使います。 +コンパイラの状態を持たず保存済みオブジェクトだけをリンクするテストでは、必要な +オブジェクトをすべて明示的に列挙します。必要なファイルが欠けていればリンクに失敗します。 +ネイティブ実行では実行時の動的ロードは行いません。 +Eval2 も実行前の解析時に依存オブジェクトを解決します。型検査済みプログラムの +オブジェクトは、互いに整合するビルドから提供されることを前提とします。 +実行しない分岐からの依存でも、必要なオブジェクトがなければ失敗します。 +Eval2 は型検査済みのプログラムを実行し、呼び出しで必要になったオブジェクトの IR だけを +復元して個別にスケジュールします。これはリンク済みプログラムの準備を遅らせる仕組みで、 +実行中に新しいライブラリを探索するものではありません。実行中のグラフの再最適化は行いません。 +理想ノードの CLInit を直接実行します。子の `` は親の初期化を確認してから、 +自分の `$init` フラグを設定し、本体を実行します。Eval2 と Lower 後のコードでこの順序を +共有し、呼び出し側は対象クラスのフラグだけを検査します。 +IR の読み込みだけではクラスの初期化や本体の出力は起こりません。 ## 実行できる例 @@ -90,7 +113,7 @@ java -ea -cp "build/classes/main:build/classes/test:lib/*" \ ## 検証と今後 明示的に指定したソースは常にコンパイルします。他のローカルオブジェクトを再利用する前に、 -記録された依存関係をたどり、各オブジェクトにまとめられた全ソースを検査します。 +記録された依存関係をたどり、各オブジェクトのソースを検査します。 入力の欠落や、より新しいソース・依存オブジェクトがあれば、保存した型や IR を使わず 再解析します。A が B をインライン化していれば、B のオブジェクトが未更新でも、 B のソース変更で A は無効になります。循環は訪問済み集合で処理します。 @@ -110,9 +133,11 @@ make tests CHAPTERS=chapter28b オブジェクトにします。`make release` は jar と標準ライブラリを作り、`make view` は 共通のグラフビューアーを起動します。 -`IncrementalBuildTest` は時刻を明示的に設定し、再利用、間接的な変更、まとめられた +`IncrementalBuildTest` は時刻を明示的に設定し、再利用、間接的な変更、オブジェクト間の 循環、入力の欠落、ライブラリ更新を検査します。変更後のネイティブ実行結果も クリーンビルドと比較します。 +`SelectiveLoadingTest` は要約による呼び出し、インライン化のためのロード、静的リンク、 +初期化循環の再検査を確認します。 保存形式は `C0DE` 以外のバージョン番号をまだ持ちません。コンパイラや形式を変えたら オブジェクトを再構築してください。高コストの往復一致検査は無効のままで、古い増分 -- cgit v1.2.3