在OCAML中停止并复制垃圾收集器

时间:2014-12-10 23:24:27

标签: garbage-collection iteration ocaml

我有一个家庭作业,完成在OCaml中编写一个停止复制的垃圾收集器。需要编写3个函数。首先要知道的是一个名为ram的64插槽阵列将是垃圾收集器用作内存的。每个插槽都包含一个“cell”类型的对象。该类型可能如下所示:

  • 对象(id,size,references)
  • ObjData _
  • FwdPointer(_)

我相信我对第一个功能没问题,但我需要帮助的第二个功能。 功能是:

let rec scan_tospace (free : int) (unscanned : int) =

以下是该功能的目标:

  

(*扫描到空格,将所有引用的对象复制到To-space和     更新对象中的引用。递归直到空闲指针为止     与未扫描的指针相同。

     

[free]是指向To-space中下一个空闲地址的指针,     [unscanned]是第一个未扫描对象的地址     到空间。

     

在所有对象完成后返回空闲指针的地址     扫描。   *)

我想要做的是在未扫描指针的元素上进行模式匹配。如果它是一个对象(x,y,z),那么我希望结果遍历整数列表z中的每个元素,并将函数'let copy_obj(free:int)(addr:int)='应用于它参数addr。问题是函数copy_obj需要2个参数,我无法弄清楚如何在调用List.iter时插入第二个参数,如下所示:

List.iter obj_copy free z

当它与对象成功匹配时,我也尝试了这个结果:

List.iter (fun k -> match k with
                | int k -> copy_obj free k) z;

我得到了这个:

Error: This expression has type int * int
       but an expression was expected of type unit

我没有故意发布任何代码,但如果你喜欢看它,我可以发布更多。我不想给任何答案。另外,我不是在寻找有人为我写任何代码,另一个原因是我没有发布很多代码。正确方向的任何想法都会非常有用,谢谢!

1 个答案:

答案 0 :(得分:0)

List.iter obj_copy free z应为List.iter (obj_copy free) z,因此free是obj_copy的第一个参数,列表中的项目是第二个。通过此更改,您应该得到与后续代码相同的错误。

这里的问题是使用List.iter。当您浏览引用的对象并复制它们时,free必须更改。否则,您将每个对象复制到前一个对象上。您还需要记住复制对象的位置,以便更新外部对象中的引用。因此copy_obj返回(我假设)一个对象的元组和新的free。

您必须使用List.fold_leftList.fold_right或手动递归来浏览列表,同时跟踪空闲和复制的对象。