Используете libgc с GNAT?

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

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

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


person David Given    schedule 19.05.2014    source источник
comment
Между прочим, хотя это и не отвечает на мой вопрос, но если кто-нибудь может указать мне на достойный (то есть не слишком громоздкий) Ada, эквивалентный shared_ptr C++, я бы с удовольствием использовал его вместо libgc.   -  person David Given    schedule 20.05.2014
comment
Вы всегда можете попробовать запустить ACATS с libgc и посмотреть, не сообщит ли он о каких-либо ошибках.   -  person Jacob Sparre Andersen    schedule 20.05.2014
comment
shared_ptr: попробуйте AdaCore Gems 97, 99, 100, 107, 123.   -  person Simon Wright    schedule 20.05.2014
comment
Также GNATColl.Refcount.   -  person Marc C    schedule 21.05.2014


Ответы (2)


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

Вы можете использовать GNAT для JVM.

Я думаю, что причина, по которой простая ссылка на libgc не даст вам сборку мусора [по крайней мере, насколько мне известно], заключается в том, что GNAT не знает, как его использовать. Однако, учитывая, что GNAT использует бэкэнд GCC, я не понимаю, почему он не должен «просто работать», если он работает с C.

person Shark8    schedule 23.05.2014

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

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

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

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

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

person David Given    schedule 17.08.2014
comment
Вторичный стек используется для объектов без ограничений — объектов с неизвестными параметрами во время компиляции. Например, строка, инициализированная вызовом функции, или матрица m x n. Это устраняет большую часть необходимости в сборке мусора и вообще в указателях. - person Zerte; 23.03.2019