复杂语言类型的内存管理

时间:2011-07-06 14:56:46

标签: c++ memory-management compiler-construction

对于静态类型的复杂语言的编译器中类型的内部表示,编写内存管理时遇到了一个小问题。考虑一下C ++中的一个简单片段,它可以很容易地演示一个引用自身的类型。

class X {
    void f(const X&) {}
};

类型可以具有几乎无限复杂的关系。那么,作为编译过程,您如何确保它们被正确收集?

到目前为止,我已经决定垃圾收集可能是正确的方法,我不会太满意因为我想用C ++编写编译器,或者只是留下它们而不是收集它们对于需要它们的编译阶段的生命(具有非常固定的生命周期),然后将它们全部收集起来。问题在于,如果你有很多复杂的类型,那么你可能会失去很多内存。

2 个答案:

答案 0 :(得分:1)

内存管理很简单,只需要一些表类型名称 - >每个声明范围的类型描述符。无论嵌套有多复杂,类型都按名称唯一标识。即使是递归类型仍然只是一种类型。正如tp1所说的那样,您通常会执行多次传递以填充所有空白。例如,您可能会检查第一遍中是否已知类型名称,然后计算所有链接,稍后再计算您的类型。

请记住,像C这样的语言没有真正复杂的类型系统 - 即使它们有指针(允许递归类型),也没有太多的类型计算。

答案 1 :(得分:1)

我认为您可以通过使用单独的对象来表示声明定义,从依赖图中删除循环。假设类似于C ++的类型系统,您将具有层次结构依赖性:

  • 功能定义取决于类型定义和功能声明
  • 类型定义取决于函数和类型声明(以及所包含类型的定义
  • 函数声明取决于类型声明

在您的示例中,依赖关系图是f_def -> X_def -> f_decl -> X_decl

图表中没有循环,您可以使用简单的引用计数来管理对象。