照明切换导航菜单[关于我][关于本网站][电影列表][游戏][主页][生活小窍门][文章][阅读列表][热门文章]宣布推出 WoofWare.PawPrint一款确定性 .NET 运行时已向 NuGet 发布了 WoofWare.PawPrint 的早期版本。PawPrint 是一款确定性 .NET 运行时类似于 CHESS。它运行 .NET 10 的 BCL解释执行 IL 代码仅对 BCL 的 JIT 内联函数和本地代码进行包装没有任何捷径可走。目前已实现的功能足以支持以下操作Console.Writelineasync void Main(string[] args) {...}Task.Run大量反射操作许多低级同步原语如 Monitor在调度线程时它采用了概率并发测试的变体旨在最大程度地探索“有趣”的线程顺序。如何判断它已准备就绪选取了六个标准竞态条件并测试证明能够确定性地识别它们。具体来说受 Deadlock Empire 的启发这些测试的形式为“证明某些线程的交错执行会导致已知的不良状况如死锁或抛出异常”。尝试的每个测试测试框架都能立即发现问题通常只需尝试几个种子值。它尚未准备好的方面如果使用它很可能马上就会出错。BCL 包含大量本地代码要让 PawPrint 执行这些代码必须对其进行显式建模。接下来的一项工作是允许用户插入自己的实现以免受内置不完整性的限制。总体设计PawPrint 的最终目标是实现时间旅行调试和对历史的控制。为此它维护了一个极其丰富的 IL 机器内部模型。所有内容都进行了来源跟踪每个指针都知道它指向的对象、字段、方法等每个字节数组都知道它是“对象 Foo 转换为原始字节的投影”还是“用户提供的一堆字节”。所有算术结果都知道它们是“原始整数的和”还是“同一数组内指针的差”等等。大语言模型的使用最初的设计是自己完成的一开始是手动编写代码。在这个过程中的某个时候Sonnet 4.6 发布开始用它来获取有关 .NET 的参考信息。还使用 Gemini 2 Pro 在 ECMA - 335 规范中进行模糊搜索。到了 2026 年也和其他人一样陷入了大语言模型狂热使用 Claude Opus 4.6/7 和 GPT - 5.5 来“完成”项目。这极大地加速了开发进程相信这让项目节省了数年时间但代价是代码在细节上带有 Claude 的风格。这个项目特别适合使用大语言模型因为有参考实现.NET 10 本身和规范ECMA - 335。大语言模型犯的错误在这个项目中仍需把控架构方向。只有一次因为太懒而把一个复杂的架构决策完全交给了 GPT - 5.5结果是一场灾难最后不得不手动重写。这个决策涉及到本地代码和一些不安全类型转换需要真正的字节数组来计算结果而且 BCL 中有大量 Unsafe.As 调用这使得很难避免通过扁平字节来传递来源跟踪指针。在 PawPrint 中严格跟踪来源信息。GPT - 5.5 选择通过在特定范围内分配假地址来表示数组在内存中的特定位置。随着时间的推移这种方式变得越来越难以处理对这些数组进行算术运算也变得很麻烦因为一旦决定用一个真正的整数来表示它们的位置就会丢失其来源信息。最终摒弃了这种方式用合成的“我是堆对象 Foo 的地址”标记来代替那些整数对这类对象进行算术运算通常会导致 PawPrint 崩溃但这没关系因为 .NET 对这些整数结果通常没有明确的定义。对已知在同一数组内的指针进行算术运算有特殊支持。
2026 年发布 WoofWare.PawPrint 早期版本:确定性 .NET 运行时的新进展
发布时间:2026/6/7 9:10:30
照明切换导航菜单[关于我][关于本网站][电影列表][游戏][主页][生活小窍门][文章][阅读列表][热门文章]宣布推出 WoofWare.PawPrint一款确定性 .NET 运行时已向 NuGet 发布了 WoofWare.PawPrint 的早期版本。PawPrint 是一款确定性 .NET 运行时类似于 CHESS。它运行 .NET 10 的 BCL解释执行 IL 代码仅对 BCL 的 JIT 内联函数和本地代码进行包装没有任何捷径可走。目前已实现的功能足以支持以下操作Console.Writelineasync void Main(string[] args) {...}Task.Run大量反射操作许多低级同步原语如 Monitor在调度线程时它采用了概率并发测试的变体旨在最大程度地探索“有趣”的线程顺序。如何判断它已准备就绪选取了六个标准竞态条件并测试证明能够确定性地识别它们。具体来说受 Deadlock Empire 的启发这些测试的形式为“证明某些线程的交错执行会导致已知的不良状况如死锁或抛出异常”。尝试的每个测试测试框架都能立即发现问题通常只需尝试几个种子值。它尚未准备好的方面如果使用它很可能马上就会出错。BCL 包含大量本地代码要让 PawPrint 执行这些代码必须对其进行显式建模。接下来的一项工作是允许用户插入自己的实现以免受内置不完整性的限制。总体设计PawPrint 的最终目标是实现时间旅行调试和对历史的控制。为此它维护了一个极其丰富的 IL 机器内部模型。所有内容都进行了来源跟踪每个指针都知道它指向的对象、字段、方法等每个字节数组都知道它是“对象 Foo 转换为原始字节的投影”还是“用户提供的一堆字节”。所有算术结果都知道它们是“原始整数的和”还是“同一数组内指针的差”等等。大语言模型的使用最初的设计是自己完成的一开始是手动编写代码。在这个过程中的某个时候Sonnet 4.6 发布开始用它来获取有关 .NET 的参考信息。还使用 Gemini 2 Pro 在 ECMA - 335 规范中进行模糊搜索。到了 2026 年也和其他人一样陷入了大语言模型狂热使用 Claude Opus 4.6/7 和 GPT - 5.5 来“完成”项目。这极大地加速了开发进程相信这让项目节省了数年时间但代价是代码在细节上带有 Claude 的风格。这个项目特别适合使用大语言模型因为有参考实现.NET 10 本身和规范ECMA - 335。大语言模型犯的错误在这个项目中仍需把控架构方向。只有一次因为太懒而把一个复杂的架构决策完全交给了 GPT - 5.5结果是一场灾难最后不得不手动重写。这个决策涉及到本地代码和一些不安全类型转换需要真正的字节数组来计算结果而且 BCL 中有大量 Unsafe.As 调用这使得很难避免通过扁平字节来传递来源跟踪指针。在 PawPrint 中严格跟踪来源信息。GPT - 5.5 选择通过在特定范围内分配假地址来表示数组在内存中的特定位置。随着时间的推移这种方式变得越来越难以处理对这些数组进行算术运算也变得很麻烦因为一旦决定用一个真正的整数来表示它们的位置就会丢失其来源信息。最终摒弃了这种方式用合成的“我是堆对象 Foo 的地址”标记来代替那些整数对这类对象进行算术运算通常会导致 PawPrint 崩溃但这没关系因为 .NET 对这些整数结果通常没有明确的定义。对已知在同一数组内的指针进行算术运算有特殊支持。