## .NET 垃圾回收器:实现标记阶段 本期内容重点在于使用 C# 实现自定义 .NET 垃圾回收器的“标记”阶段。标记阶段用于识别可达对象,从而确定哪些对象可以被释放。它从三个来源扫描“根”——无条件被认为是存活的引用:局部变量/线程静态存储(由运行时通过 `GcScanRoots` 处理)、GC句柄和最终化队列。 `GcScanRoots` 方法使用回调函数来遍历局部变量。`ScanContext` 结构体提供线程 ID 和栈限制等信息。为了标记对象,实现利用了方法表指针的对齐方式;设置最低有效位表示对象已被标记。 深度优先搜索 (DFS) 遍历对象图,使用栈来避免递归。目前,为了简单起见,忽略了“内部指针”(对象内的引用)。 标记完成后,“扫描”阶段遍历堆。未标记的非空闲对象将被清除(内存尚未重用,以确保过早回收不会导致崩溃),并替换为空闲对象,以保持堆的可遍历性。 虽然已经建立了一个功能性的基础,但由于缺少对 GC 句柄、最终化队列和内部指针的支持,当前的 GC 仍然会导致应用程序崩溃——这些是未来开发的主题。完整的代码可在 GitHub 上获取。
## LLVM 开发总结 - 2025
2025 年 LLVM 多个关键项目持续取得进展。历时多年的 **ptradd 迁移** 接近完成,将 GEP 指令规范化为单个偏移量,从而实现公共子表达式消除并改进链式 GEP 处理——这些优势与最终迁移无关。目前仍在继续讨论 `ptradd` 的缩放因子支持以及过渡到强制使用。
**生命周期 intrinsic** 发生了重大变化,强制其与 allocas 一起使用,并删除了大小参数,从而改进了栈着色并发现了现有的 IR 问题。**捕获跟踪** 得到了增强,可以区分地址捕获和来源捕获,从而使 Rust 优化受益。
为改进 LLVM 的 ABI 处理,开发了一个原型 **ABI 下降库**,并对 Clang 和 LLVM 之间的类型对齐进行了一致性检查。通过对 SCCP 和对象大小计算进行优化,以及来自其他贡献者(如调试行表发射)的贡献,**编译时间** 得到了改善。
进一步的优化包括 **存储合并优化** 和在 SCCP 中启用 **PredicateInfo**。Rust 更新利用了 LLVM 的新功能,例如只读捕获和 alloc-variant-zeroed 属性。打包改进包括单体构建和 PGO,但简化兼容性包的尝试失败,凸显了 RPM 符号链接方面的挑战。
最后,作为领域团队和项目委员会参与新的 LLVM 治理结构,并与形式化规范工作组进行初步合作,完成了这一年。大约审查了 2500 个 pull request。
## Wiki 教育与生成式人工智能:保护维基百科的完整性
Wiki 教育负责培养 19% 的新英文维基百科编辑者,调查了生成式人工智能(GenAI)工具(如 ChatGPT)对内容质量的影响。他们的研究揭示了一个令人担忧的趋势:虽然人工智能不一定会*创建*虚假引用,但**超过三分之二的人工智能生成文章包含无法在引用来源中验证的信息**——这是一种微妙但重要的错误信息形式。
他们使用 Pangram 检测工具发现,ChatGPT 发布后人工智能生成文本急剧增加。干预措施——包括培训、自动警报和内容审查——被证明是有效的。通过主动阻止直接复制粘贴并强调可验证性,他们将文章中人工智能草稿的内容从预计的 25% 降低到仅 5%。
Wiki 教育虽然告诫不要使用 GenAI 来*撰写*内容,但发现人工智能对研究任务(如识别文章中的空白和查找来源)有帮助。他们提倡广泛采用 Pangram 等工具进行自动内容审查,并建议为新编辑提供更明确的指导,强调基于来源的写作,而不是人工智能生成的草稿。
最终,Wiki 教育的经验强调了在人工智能时代保持警惕和适应的重要性,以确保维基百科保持其准确性和可靠性。