我正在设计一个预先编译CIL字节码的系统。为了保持相对简单并使其非常便携,系统将发出C源代码(但是所有更高级别的结构,如OOP因素)而不是机器代码。目的是为目标平台的标准C编译器将用于该代码以获得最终产品。
最初我打算使用一种非常简单的GC方法,例如stop-the-world。但是,虽然应用程序不需要出色的性能,但它确实需要不错的性能,因此最终可能需要更改GC。
我正在考虑最终需要某种写屏障的更复杂的GC。我已经看过SATB和卡片标记方法,但我还没准备好实际计划出好的GC。我只是不想通过让事物发出C源代码来发现自己的脚,后来发现有效的GC写屏障需要内联汇编,这在很大程度上违背了发射C的目的。
所以,我的问题是,在C代码中能否有效地实现典型的写入障碍?我们可以假设C编译器有一个不错的优化器。由此产生的“源代码”将完全难以理解,因此清晰度并不重要。
我猜测 - 以牺牲源文件的膨胀为代价, - 它可能可以合理地完成,但我很感激GC设计和/或编译器内部人员的经验。
答案 0 :(得分:4)
我假设你想要一个精确的世代移动或复制GC。
你可以用C写一个写屏障;例如,Ocaml和MELT运行时都具有带写屏障的分代GC。 qish是一个带有写屏障的分代复制GC,使用C。
(BTW,MELT是一种扩展GCC的领域特定语言,它被编译为C,完全像你想要的那样)
更重要的问题是如何保留本地指针(以及GC如何知道它们),这是GC的精确方面。您可能希望将它们打包在某个本地结构中......但是,可能会发生C编译器(例如GCC)优化的情况。
您可能会查看最近版本的MONO的源代码,它们具有分代复制GC。另请查看Chicken Scheme内部(也生成C代码)。
请注意,您的 C 代码生成器必须更改为适合某些(或您的)特定GC实现(因为每个GC的不变量和期望略有不同)。另请注意tail recursion(某些 C 编译器,尤其是最近的GCC,可能会在有限的情况下对其进行优化)。
在Qish,MELT或Ocaml中,写屏障(在C侧)由针对每个触摸指针调用的一些宏(或内联函数)实现。细节是特定于实现的。您的C代码生成器必须处理它们。
请注意多线程GC难以设计,调试GC(即使是简单的GC)也需要花费大量时间并且很难。