借用检查、原始计数(RC)、垃圾收集(GC)以及另外十一种(!)内存安全方法

这是关于内存安全的系列文章的第一部分,主要介绍了多种内存安全技术及相关研究:

  • Zeke 与 Evan 的对话:Zeke 惊讶于内存安全有十四种方法,Evan 展示了自己多年来收集的“内存安全魔法书”(memory safety grimoire)。
  • 不同内存安全方法及融合

    • 包括垃圾回收(GC)、引用计数(RC)、借用检查等传统方法,以及一些融合和新的探索,如混合不同方法以减少缓存缺失、实现更快速和安全的编程等。
    • 例如 Mayans 可能掌握的将不同内存安全技术融合的古老技巧,以及现代语言如 Rust、Austral 等在这方面的尝试和创新。
  • 神秘的古老发现:在墨西哥坎佩切的古代玛雅城市发现了可能是第五本内存安全秘籍的破旧 tome,上面有关于堆栈帧、引用和区域等的玛雅符号。
  • 各种内存安全技术介绍

    • 移动唯一编程(Move-only programming),类似线性类型,可实现无额外引用的编程。
    • 引用计数,可与追踪 GC 共存,与不可变区域借用融合可减少缓存缺失。
    • 借用检查,使代码像 C 一样快且接近 Haskell 的安全性,Austral 进一步通过线性类型实现更高级的安全性。
    • 仅竞技场编程,更注重内存管理,与其他技术结合可进一步增强内存安全。
    • Ada/SPARK 的指针规则与某些内存安全概念相似。
    • 区域(Regions),可临时打开隔离子图,消除引用的内存安全成本等。
    • 堆栈竞技场(Stack arenas),自动为每个堆栈帧分配内存,与其他技术结合可提高效率。
    • 世代引用(Generational References),通过比较指针的世代号防止使用后释放,与区域结合可提高速度。
    • 随机世代引用,更快的变体,可让结构体在栈、数组或其他对象内,与其他技术结合有很大潜力。
    • MMM++,通过全局数组分配和重用对象避免使用后释放。
    • 追踪垃圾回收,Pony 的 ORCA 机制可实现无暂停的垃圾回收,Verona 进一步增强。
    • 交互网(Interaction nets),一种快速管理纯不可变数据的方式。
    • 约束引用(Constraint references),融合引用计数和单一所有权。
    • 线性引用计数,在编译时实现引用计数,接近但尚未实现。
    • 不是 MVS(Not-MVS),类似 Rust 但无共享引用的编程方式。
    • CHERI,硬件 - 软件混合的内存安全技术。
    • 永不释放(Neverfree),不调用 free 可避免使用后释放。
  • 对知识的思考与应用:强调这些内存安全技术的多样性和融合的可能性,鼓励设计新的内存安全融合,展示各种范式的独特优势,如 RC 的弱指针、C 的侵入式数据结构等。
  • 魔法书中的其他内容:提到魔法书中还有一些半破译的提示和构建块,如类型稳定性、最终引用、唯一引用等,可能有助于新的内存安全模型,欢迎读者参与讨论和提供更多信息。

总之,这篇文章展示了内存安全领域的丰富性和多样性,为进一步研究和创新提供了基础和启示。

阅读 106
0 条评论