Pup*_*ppy 10 c++ compiler-construction memory-management
对于静态类型的复杂语言的编译器中类型的内部表示,编写内存管理时遇到了一个小问题.考虑一下C++中的一个简单片段,它可以很容易地演示一个引用自身的类型.
class X {
void f(const X&) {}
};
Run Code Online (Sandbox Code Playgroud)
类型可以具有几乎无限复杂的关系.那么,作为编译过程,您如何确保它们被正确收集?
到目前为止,我已经决定垃圾收集可能是正确的方法,我不会太满意,因为我想用C++编写编译器,或者只是留下它们而不是为生命收集它们需要它们的编译阶段(具有非常固定的生命周期),然后将它们全部收集起来.问题在于,如果你有很多复杂的类型,那么你可能会失去很多内存.
内存管理很简单,只需为每个声明范围提供一些表类型名称 -> 类型描述符。无论嵌套多么复杂,类型都通过名称唯一标识。即使是递归类型也仍然只是单一类型。正如 tp1 所说,您通常会执行多次传递来填充所有空白。例如,您可以在第一遍中检查类型名称是否已知,然后计算所有链接,稍后计算类型。
请记住,像 C 这样的语言没有真正复杂的类型系统——尽管它们有指针(允许递归类型),但没有进行太多类型计算。