
2026/06/04 16:32
WoofWare.PawPrint:決定論的.NETランタイム
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
WoofWare.PawPrint は、高度なデバッグおよびメモリアドレス追跡を主に目的とした革新的な決定論的 .NET ランタイムを導入します。速度の最適化を行う標準的なランタイムとは異なり、PawPrint はショートカットを用いずに中間言語(IL)コードを解釈し、.NET 10 の Base Class Library (BCL) を支えるためにのみ JIT 内在関数とネイティブコードに対するシャイミングを行います。この部分的な統合にもかかわらず、現在、BCL 内のネイティブコードは完全には処理できず、モデル化されていない大規模なネイティブ命令量が原因であり、ネイティブサポートが標準化されるまで非生産環境での使用に適していません。
該ランタイムは、
Console.WriteLine、async void Main、Task.Run、反射、ならびに Monitor などの低レベル同期プリミティブを含む主要な操作をサポートします。スケジューリングは、「興味深い」というスレッド順序の探索を最大化する確率的並行性テスト(Probabilistic Concurrency Testing)の変種を使用します。初期試験では、このハネスは決定論的な手法を用いて 6 つの標準的なデータ競合を迅速に特定し(多くの場合、試行シードが数回以内)、そのことが確認されました。
現在、早期版の NuGet パッケージとして利用可能である PawPrint は、メモリアドレスを生の整数ではなくオブジェクト識別子でマークすることで、そのコアな安全性を実現しています。この設計により、.NET のルールに違反しアプリケーションを予測不能にクラッシュさせる不適切な算術エラーを防ぐことができます。ただし、同じ配列内であると既知のポインタに対する算術演算は引き続きサポートされています。プロヴェナンス追跡も包括的であり、各ポインタは対象となるオブジェクト/フィールド/メソッドがわかるようにされており、バイト配列では投影(projection)と生のユーザーデータを区別しています。
今後の開発では、ユーザーが独自のネイティブコードハンドラーを統合できるようにすること、および実行履歴の豊かな内部モデルを作成して、タイムトラベルとデバッグに対する完全な制御を実現することに焦点が置かれます。大規模言語モデル(LLM)は、リファレンス(.NET)、仕様検索(ECMA-335 via Gemini 2 Pro)、コード補完の用途に活用され、2026 年以降には Sonnet 4.6、Claude Opus 4.7、GPT-5.5 などのモデルを開始します。ネイティブコード処理に関するアーキテクチャ上の一つの決定事項は、当初 GPT-5.5 に abdicated(譲渡)され、配列に対してフェイクアドレスを使用するというものであり、後にこれにより、「I am the address of heap object Foo」というマーカに置き換わる完全な手書きの再書き換えが必要となり、.NET はそのような整数値を未定義として定義しているため意図した通りこれらの算術演算が不可能となる事態となりました。複雑なシステムにおける目から鱗となるバグの検出においては強力ですが、ネイティブサポートが標準化されさらに機能が成熟するまで、開発者は現在これを非生産環境に制限して使用する必要があります。
本文
WoofWare.PawPrint の発表:決定論的な .NET 実行環境
WoofWare.PawPrint(初期版)を NuGet に公開しました。PawPrint とは、CHESS(確定した状態の評価)に似た概念を持つ、「決定論的」な .NET 実行環境です。
の基礎クラスライブラリ(BCL)を実行します。.NET 10- IL(中間言語) を解釈的に実行し、BCL 内での JIT 関数やネイティブコードのみを「シャイム(代替実装)」で対応しています。
- これに頼った近道は一切取りません。
機能範囲
現在以下の処理に対応可能です:
の実行Console.WriteLine
メソッドのサポートasync void Main(string[] args)- ブロックコード
の解釈{...}
の利用Task.Run- リフレクション(動的型情報の取得など)の多様な利用
などの低レベル同期プリミティブの動作Monitor
「稼働準備」判定の仕組み
6 つの標準的な競合条件を取り上げ、決定論的に検出できることを実証しました。『Deadlock Empire(デッドロック帝国)』をヒントに、「スレッドの交错による既知の不良状態(デッドロックや例外発起)」を検出する形式でテストを行っています。
- 高い検出率: 私が試したあらゆるテストにおいて、テストハネスはすぐにバグを検出しました。
- 少ないトライアル: よくあるケースでは、僅か 2 つのトライアルシード(試行用種)だけで結果が得られました。
制限事項:まだ対応できない領域
現状では、そのままお使いいただくと直後に「爆発」する可能性があります。
- BCL の内部には極めて大容量のネイティブコードが含まれており、PawPrint 内で明示的にモデル化しないと実行できません。
今後の計画
次期リリースでは以下の対応を目指します:
- ユーザーが独自の実装をプラグインできるようにする。
- 内蔵される不完全さによる待ち時間を解消する。
全体設計
PawPrint は最終的に、**「タイムトラベルデバッグ」と「履歴への制御」**を可能にすることを目的としています。そのために IL マシンの極めて豊富な内部モデルを維持しています:
- プロベナンス(起源)の追跡: すべてに施されています。
- インテリジェントなポインタ: 自身が指し示すオブジェクト/フィールド/メソッドなどの情報を把握します。
- バイト配列の区別: 「フォオというオブジェクトからの生/raw バイトへの投影」か、「ユーザーから渡された単なる一連のバイト」かを識別します。
- 演算結果の識別: 「生整数の合計」「同一配列内のポインタ間の差」などの種類を識別します。
LLM(大規模言語モデル)の利用について
- 当初は独自発想で手作業から始めました。一部で Sonnet 4.6 が参考情報として利用されました。
- ECMA-335 の仕様書に対しては、Gemini 2 Pro を使ってフージー検索(あいまいな単語一致)を行って利用しました。
- 2026 年以降、Claude Opus 4.6/7 と GPT-5.5 を用いてコードを「完成形」へと仕上げました。
- これにより開発が数年単位で短縮されました(驚異的な加速要因)。
- 代償として、コードには多少の "Claude らしい雰囲気" が滲み出しました。
という参照実装と.NET 10
という仕様書が存在するため、LLM の力を借りやすいプロジェクトです。ECMA-335
ボットが犯したエラーと修正
アーキテクチャ的な方向性を維持する必要があったため、複雑な判断を GPT に丸投げしたのは唯一のケースでしたが、結局は全てを手作業で書き直す惨劇となりました。
1. その判断(起因)
- 背景: ネイティブコードや
は実際のバイト配列を使って結果を計算する必要があります。unsafe cast - 課題: BCL には多くの
コールが含まれており、プロベナンス追跡されたポインタを平坦なバイト配列経由で「洗う」ことが極めて困難です。Unsafe.As - 信念: PawPrint でプロベナンスの追跡を徹底的に行うべきだ。
2. その間違い(GPT の提案)
- GPT-5.5 が、配列を記憶領域の特定の位置にあるものとして表す方法を選びました。
- 手法: ある範囲内の偽りのアドレスを割り当てる。
- 問題点:
- 時間が経つにつれて扱いづらくなり、演算処理が煩雑化しました。
- 配列を「記憶領域内での位置を示す生整数」として扱うことで、それまでのプロベナンス情報を失いてしまいました。
3. その修正(最終方針)
- 対応策: 上記のアプローチを取り払い、代わりに合成された**「フォオというヒープオブジェクトのアドレス」**という意味を持つマーカー(整数)を置き換えました。
- 動作確認: このようなオブジェクトに対する演算は通常 PawPrint をクラッシュさせますが、.NET の仕様上これらの整数値自体が定義されていないため構いません。
- 保持機能: 「同一配列内にあるポインタに対して演算を行う」ための特別なサポート機能は保持しています。