一个简单的半空间垃圾回收器
本文介绍了半空间垃圾回收器的实现。半空间垃圾回收器将内存分成两个相等的空间,fromspace 和 tospace。分配按顺序在 tospace 中进行,当 tospace 满了,两个空间的角色互换。回收器将所有活动数据从 fromspace 复制到 tospace,从一组根对象开始。复制完成后,分配在新 tospace 中继续进行。文章详细解释了对象表示、GC 和用户代码之间的约定、堆的创建、复制算法、Cheney 扫描算法以及分配器的工作原理。
阅读更多
本文介绍了半空间垃圾回收器的实现。半空间垃圾回收器将内存分成两个相等的空间,fromspace 和 tospace。分配按顺序在 tospace 中进行,当 tospace 满了,两个空间的角色互换。回收器将所有活动数据从 fromspace 复制到 tospace,从一组根对象开始。复制完成后,分配在新 tospace 中继续进行。文章详细解释了对象表示、GC 和用户代码之间的约定、堆的创建、复制算法、Cheney 扫描算法以及分配器的工作原理。
阅读更多
这篇文章探讨了保守式垃圾回收(GC)和精确式垃圾回收的性能差异。作者认为,普遍观点认为精确式 GC 更好,因为它能精确识别垃圾对象,但保守式 GC 也有其优势。文章列举了保守式 GC 速度更快的几个原因,包括:更小的对象生命周期、更小的栈帧、无需运行时开销和栈映射等。作者认为,在设计 GC 系统时,不应忽视保守式 GC,它可能是某些系统的更好选择。
阅读更多
文章探讨了具有块结构堆的复制垃圾收集器的可靠性问题。作者指出,这种类型的垃圾收集器在内存分配方面存在不确定性,因为碎片整理后的结果可能比碎片整理前更糟。多线程和并行收集器线程进一步加剧了这种不可靠性。文章还讨论了其他导致垃圾收集器不可靠的因素,例如,收集期间的内存分配以及虚拟内存和分页。尽管存在这些挑战,但作者认为,通过增加堆大小和使用可增长的堆,可以减轻与碎片相关的不可靠性。
阅读更多
这篇文章详细介绍了 Hoot Scheme-to-Wasm 编译器如何使用 Continuation-Passing Style (CPS) 变换来实现 push 调用。文章首先解释了 Scheme 中尾调用和非尾调用的区别,以及在 WebAssembly 中实现 push 调用的挑战。然后,文章探讨了三种可能的实现策略:通用切片、插桩切片和 CPS 变换,并解释了 Hoot 选择 CPS 变换的原因。最后,文章讨论了 Hoot 在实现 CPS 变换时遇到的一些挑战和解决方案,例如如何拆分函数、如何保存变量以及如何处理调用约定等。
阅读更多
本文探讨了如何构建 Hoot 语言,Hoot 是一种编译为 WebAssembly 的 Scheme 方言。文章分析了 Hoot 的依赖关系图,强调了所有模块都依赖于 (hoot primitives) 模块,该模块提供了核心绑定和语法定义。文章还介绍了 %inline-wasm 宏,它允许在 Scheme 代码中嵌入 WebAssembly 代码,并讨论了如何使用 cond-expand 在编译时和运行时提供不同的定义。最后,文章展望了 Hoot 的未来发展方向,包括完成对 Guile 运行时库的支持。
阅读更多
这篇文章主要介绍了Hoot Scheme-to-WebAssembly编译器的开发历程,作者详细阐述了从最初的纸上设计到实现完整Guile语言的过程。作者重点介绍了Hoot的启动过程,包括时间轴上的发展以及功能的逐步完善。文章还讨论了Guile模块系统的静态语义,以及Hoot如何实现与Guile的兼容性。最后,作者展望了Hoot的未来发展方向,即与Guile合并,为用户提供更强大的WebAssembly开发体验。
阅读更多
WebAssembly (Wasm)在网页端的成功有限,尽管其在Photoshop等大型C++程序移植方面表现出色。文章探讨了Wasm在DOM重型应用中的局限性,并指出其在非C/Rust语言中的成功案例不多。作者认为,随着Wasm对垃圾回收的支持,它在Python等语言的Web开发中将更有潜力。然而,要实现大规模应用,需要有效的tree-shaking算法来减小Wasm模块的大小。文章详细分析了tree-shaking的原理和挑战,并强调了优化编译器和标准库的重要性。
阅读更多