Использование libgc с GNAT?

Я слышал несколько упоминаний о том, что Ada поддерживает сборку мусора - и, глядя на языковой дизайн, он явно разработан с учетом этого.

У меня есть приложение не в реальном времени, для которого сборка мусора была бы действительно очень полезна. Однако я не видел упоминаний о наличии сборщика мусора для моего компилятора, GNAT. Это удивляет меня; даже C поддерживает сборку мусора, просто ссылаясь на libgc.

Если я просто добавлю libgc в свою строку компоновщика, это сработает или произойдут ужасные вещи?

2 ответа

Решение

Я нашел привязку libgc как часть библиотеки AdaCL здесь: http://adacl.sourceforge.net/

Однако в документации libgc также сказано, что libgc не может видеть указатели, хранящиеся в блоках, выделенных системой malloc(), Это означает, что доступ, который хранится только в объекте, выделенном из пула памяти по умолчанию, не будет считаться корневым и может быть признан недействительным в любой момент. Это исключает использование стандартных Ada содержит от хранения доступа к коллекционным объектам! Это также может относиться к вторичному стеку, но я не знаю, для чего используется вторичный стек.

Однако мои исследования показывают, что сборка мусора работает наивно:

while true loop
  p := new big_thing_t;
end loop;

... работает вечно. Так что это, вероятно, теоретически возможно сделать, но сейчас я не думаю, что это безопасно.

Однако я не видел упоминаний о наличии сборщика мусора для моего компилятора, GNAT. Это удивляет меня; даже C поддерживает сборку мусора, просто ссылаясь на libgc.

You could use GNAT targeting the JVM.

I think that the reason simply linking against libgc won't give you garbage collection [at least to my knowledge] is because GNAT doesn't have any notion of how to use it. However, given that GNAT uses the GCC backend I don't see why it shouldn't "just work" if it does w/ C.

Другие вопросы по тегам