LINUX.ORG.RU

сборка мусора - зацените идейку


1

0

Доброго!

Как я понял, поколенческая сборка мусора требует некоторых дополнительных действий при каждом создании или изменении ссылки, чтобы отследить ссылки старого объекта на молодой. Почему бы тогда не обобщить понятие «поколения» на понятие «область хранения» и не позволить пользователю явно управлять областями? Например, ввести глобальную (поточную) переменную «текущая область хранения» и всё выделение по умолчанию вести в этой области. Или добавить параметр в конструктор (хотя это требует переделки языка). Области могут быть упорядочены в иерархию и тогда нужно будет отслеживать только ссылки «старших» на «младших» по иерархии. Или они могут составлять произвольный граф и тогда нужно отслеживать все ссылки. Причём, можно отслеживать ссылки как тонко (на уровне объектов), так и грубо (на уровне областей). Например, мы знаем, что область A ссылается на область B. Тогда, чтобы собрать мусор в области B, нам нужно искать корни также в области А. Самое главное, если на область B вообще никто не ссылается, то мы можем одним махом убить все объекты в области B.

Например, если у нас есть какое-то чисто функциональное вычисление, которое порождает много промежуточных объектов, а потом возвращает небольшую часть этих объектов в качестве результата, мы можем создать для этого вычисления временную область X и проводить вычисления в ней (на неё никто не ссылается). А когда результат будет получен, мы скопируем его в другую область Y и уничтожим всю область X.

★★★★★

Ответ на: комментарий от kemm

Есть такой диалог:
-Объясните мне зачем нужен GC? Чем смарт поинтеры хуже?

-опять двадцать пять. тебе не нужен. иди дальше лабай на своем недоязычке.

Откуда здесь следует, что «недоязычек» это именно С++? Скорее отсюда следует, что к «недоязычкам» относятся языки без GC, так как ответ был сделан в единственном числе «тебе не нужен» и значит отностится к первому вопросу про GC. И значит огромная масса замечательных программ на C/C++ и прочих языках без GC написана на «недоязычках».

BOEHKOM
()
Ответ на: комментарий от BOEHKOM

Или это свидетельствует о неспособности программеров с GC ясно выражать свои мысли. Может быть это следствие использования GC.

BOEHKOM
()
Ответ на: комментарий от BOEHKOM

> Откуда здесь следует, что «недоязычек» это именно С++?

Назови ещё один распространённый язык без GC и со смартпойнтерами.

kemm
()
Ответ на: комментарий от anonymous

> Все большие и извесные программы написаны на «недоязычках».

какие такие программы?

Даже anonymous 23.12.2009 1:48:36 писал свой комментарий вероятно из браузера на «недоязычке»,

неа, я постил из Сафари. Там более правильный объектный це. 1:0 в мою пользу.

на ОС на «недоязычке»,

Хмм... линукс - Це. Мак ОС Икс - Це + объектный це. 2:0 в мою пользу.

комментарий шёл по сети через маршрутизаторы на «недоязычках»

Скорее це, чем цепепе. 3:0 в мою пользу.

и попал на ХТТП сервер с ЛОРом, написанный на «недоязычке»

Апаче? Це! 4:0 в мою пользу.

и работающий под ОС на «недоязычке».

повторяемся? 5:0 в мою пользу.

А на языках с GC только быдлокодеры пишут недопрограммы из 100 строк для недофирм с быдлосайтами.

не надо так плохо думать об анонимусах. це + тцл + лисп. 6:0 в мою пользу.

Ну может ещё тормозную быдлопрограмму NetBeans.

жаба с ее костылями не нужна . 7:0 в мою пользу.

anonymous
()
Ответ на: комментарий от BOEHKOM

> И значит огромная масса замечательных программ на C/C++ и прочих языках без GC написана на «недоязычках»

Того, кто пишет «C/C++», на костер.

anonymous
()
Ответ на: комментарий от anonymous

>> и попал на ХТТП сервер с ЛОРом, написанный на «недоязычке»

Апаче? Це! 4:0 в мою пользу.

Tomcat.

жаба с ее костылями не нужна . 7:0 в мою пользу.

Fail, см.выше. 8))

kemm
()
Ответ на: комментарий от anonymous

Уважаемый анонимус! Где вы указали, что «недоязычёк» это С++, а не языки без GC? Вам трудно выражать ясно свои мысли?

-объясните мне зачем нужен GC? Чем смарт поинтеры хуже?
-опять двадцать пять. тебе не нужен. иди дальше лабай на своем недоязычке.

Первый человек может писать на любом языке без GC. И просто интересуется, что даёт использование «смарт поинтеры» в каких-то других языках. Как отсюда догадаться, что задавший вопрос пишет на С++, а не на С, Delphi и т.п. языках без GC, которые вы объявили недоязычками?

BOEHKOM
()
Ответ на: комментарий от kemm

>Назови ещё один распространённый язык без GC и со смартпойнтерами.
Смартпоинтеры необязательно должны явно присутствовать.

Booster ★★
()
Ответ на: комментарий от Booster

> Смартпоинтеры необязательно должны явно присутствовать.

Да-да, а ещё GC не обязательно должен отсутствовать. И вообще вы там об альтернативной реальности рассуждаете...

kemm
()
Ответ на: комментарий от kemm

Пишет человек :«Объясните мне зачем нужен GC? Чем смарт поинтеры хуже?»
Он пишет программы, например, на Делфи или С и задумывается об автоматизации работы с памятью и переходе на другой язык. Думает, что возможно лучшей альтернативой GC будет «смарт поинтеры». Где тут нашли С++?

BOEHKOM
()
Ответ на: комментарий от BOEHKOM

В смартпойнтерах. Множество распространённых языков без GC и со смартпойнтерами состояит из одного элемента. Утверждение о том, что автор вопроса пишет именно на нём, возможно, было сделано неправомерно, но правомерность этого высказывания никак не влияет на весь остальной бред по треду, последовавший за ним.

kemm
()
Ответ на: комментарий от Booster

Упоминание про С++ из слов про «смарт поинтеры» было оговоркой по Фрейду :))))) Тайные фанаты С++ себя выдали.

BOEHKOM
()
Ответ на: комментарий от Booster

> А как же Perl?

У него есть смартпойнтеры? У него GC на подсчёте ссылок. Это, всё-таки, разные случаи. Смартпойнтеры предполагают ручное оборачивание нужных вещей в них.

kemm
()
Ответ на: комментарий от Booster

> В соседнем треде писали о Vala и Gene. Значит всё же не один.

Я сказал — распрстранённые. Я даже не знаю, что там у Вали и у Жени — GC на тупом подсчёте ссылок или действительно смартпойнтеры, но в любом случае распространёнными их пока назвать нельзя.

kemm
()
Ответ на: комментарий от anonymous

>Того, кто пишет «C/C++», на костер.

Количества файлов

Firefox 3.5.6

*.c    1490
*.cpp  3850
*.h    4116

VirtualBox 3.1.2 OSE

*.c   1450
*.cpp 1464
*.h   4989
*.hpp 115

BOEHKOM
()
Ответ на: комментарий от BOEHKOM

>Количества файлов

И что? Да, эти программы написаны на двух разных языках с общим корнем.

legolegs ★★★★★
()
Ответ на: комментарий от kemm

>У него есть смартпойнтеры? У него GC на подсчёте ссылок. Это, всё-таки, разные случаи. Смартпойнтеры предполагают ручное оборачивание нужных вещей в них.
По-моему вы не правы. Смартпоинтеры это разновидность автоматического управления памятью. GC это это тоже одна из форм автоматического управления памятью, код который периодически освобождает память, удаляя объекты, которые уже не востребованы приложением. Так пишет вики и мне нет повода не доверять этому. А явно или нет реализованы смартпоинтеры это уже детали.

Booster ★★
()
Ответ на: комментарий от Booster

Нет, имхо. Смартпойнтеры можно (с натяжкой) обозвать вариантом GC, GC на подсчёте ссылок обозвать смартпойнтерами нельзя.

kemm
()
Ответ на: комментарий от kemm

Уборщик это именно что-то отдельное. Если все за собой убирают, то вряд ли всех можно назвать уборщиками. Так можно всех назвать и поварами и продавцами и чем угодно. Но всё же главное занятие у всех одно, два. Так и под GC подразумевают вполне конкретное понятие.

Booster ★★
()
Ответ на: комментарий от kemm

В перле есть автоматическое управление памятью на неявных смартпоинтерах. Сборщика мусора там нет. ^) Давайте придержживаться принятой терминологии.

Booster ★★
()
Ответ на: комментарий от Booster

>В перле есть автоматическое управление памятью на неявных смартпоинтерах. Сборщика мусора там нет. ^) Давайте придержживаться принятой терминологии.

Ну...

1) Ты сперва пойди в соседней теме разберись с вопросом. Так как из того обсуждения ясно, что ты не в теме.

2)Согласно общепринятой терминологии, в перле есть сборщик мусора. Плохой, но есть. Точка.

Waterlaz ★★★★★
()
Ответ на: комментарий от Love5an

> под GC обычно понимают отслеживающий сборщик.

Под сборщиком мусора обычно понимают сборщик мусора. В перле GC на подсчёте ссылок, менее сборщиком или менее мусора он этого не становится. Т.е. это, конечно, в некотором смысле хреновый GC, но это GC, а не НЁХ или смартпойнтер.

kemm
()
Ответ на: комментарий от Booster

> В перле есть автоматическое управление памятью на неявных смартпоинтерах. Сборщика мусора там нет.

Где там смартпойнтеры?! Где?! Чтобы могли быть _смарт_пойнтеры, должны быть обычные, под которые НЁХ под названием смартпойнтер и пытается мимикрировать. Где в перле указатели?

В перле — сборщик мусора. Синхронный, на основе подсчёта ссылок.

Давайте придержживаться принятой терминологии.

Давайте. В рамках общепризнанной терминологии в перле есть сборщик мусора и нет умных указателей.

kemm
()
Ответ на: комментарий от Waterlaz

> 1) Ты сперва пойди в соседней теме разберись с вопросом.

Заглянул в соседнюю тему... Мда. На этом я общение с данным специалистом, пожалуй, закончу. 8))) Лопнет же, бедолага. 8)))

kemm
()
Ответ на: комментарий от kemm

Употреблять понятие «сборщик мусора» по отношению к reference counting некорректно, т.к. это не какая-то отдельная специальная подсистема.
Можно говорить «сборка мусора с помощью подсчета ссылок».
Но, еще раз, когда говорят GC в 90% случаев имеют ввиду именно tracing gc, т.е. то, что свою родословную ведет от gc лисп-системы Маккарти
вон в русской википедии вся статья про gc, например, только про него.

Love5an
()
Ответ на: комментарий от Waterlaz

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

Я так чувствую у нас сейчас будут циклические связи и мы войдём в бесконечный цикл.

2)Согласно общепринятой терминологии, в перле есть сборщик мусора. Плохой, но есть. Точка.


Пруф в студию пожалста.
Вот мой - http://en.wikipedia.org/wiki/Garbage_collection_(computer_science)


Booster ★★
()
Ответ на: комментарий от Love5an

> Употреблять понятие «сборщик мусора» по отношению к reference counting некорректно, т.к. это не какая-то отдельная специальная подсистема.

На основании чего будем делить на какие-то отдельные подсистемы? Лексический, синтаксический разбор и компиляция в байт-код — это сколько отдельных подсистем, одна, две или три? 8))

Да, GC такого типа тупой и до безобразия маленький, но это всё-таки GC в бОльшей степени, чем умный указатель (в отсутствии в языке понятия «указатель» как такового).

Но, еще раз, когда говорят GC в 90% случаев имеют ввиду именно tracing gc

Отлично, сейчас случай как раз из оставшихся 10%. 8)) Консенсус? 8))

kemm
()
Ответ на: комментарий от Waterlaz

>Ты хоть читай свои пруф линки, а?
Хочешь сказать счётчики ссылок не могу использоваться в GC? Нонсенс.
И не нужно предёргивать, Love5an уже написал, что сборка мусора(освобождение памяти) может быть на счётчиках. Но под GC понимают именно отдельную подсистему, занимающейся уборкой.

Booster ★★
()
Ответ на: комментарий от kemm

> Но, еще раз, когда говорят GC в 90% случаев имеют ввиду именно tracing gc

Отлично, сейчас случай как раз из оставшихся 10%. 8)) Консенсус? 8))


Потому-что некоторые понимают не то, что понимает большенство. ^)

Booster ★★
()
Ответ на: комментарий от den73

> Так, ну, похоже, по теме тут не с кем разговаривать. Жаль.

Что ты хотел? Мусор возбуждает местную илиту и ынтерпрайз не хуже, чем GNOME - хомячка.

mannaz
()
Ответ на: комментарий от den73

По какой теме?

Почему бы тогда не обобщить понятие «поколения» на понятие «область хранения» и не позволить пользователю явно управлять областями?


Это же бред.

если у нас есть какое-то чисто функциональное вычисление, которое порождает много промежуточных объектов, а потом возвращает небольшую часть этих объектов в качестве результата, мы можем создать для этого вычисления временную область X и проводить вычисления в ней (на неё никто не ссылается). А когда результат будет получен, мы скопируем его в другую область Y и уничтожим всю область X.


И чего ради весь этот гимморой? Никогда не известно, сколько именно памяти потребуется для конкретного вычисления. Нет никакой гарантии, что мы вернем некое вычисленное значение, не ссылку на объект в этом самом регионе.

Твоё предложение - это закат вручную велосипеда с квадратными колесами.

Нужно тебе явное выделение памяти, которую потом можно одним махом сбросить - есть тебе malloc().

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

>Это же бред.
Да, неясно, что хуже - отсутствие собеседников вообще, или такие, непонимающие собеседники с заранее готовым негативным мнением. Что же, долго разжёвывать не буду, но минимальные усилия предприму.

Нет никакой гарантии, что мы вернем некое вычисленное значение, не ссылку на объект в этом самом регионе

Читай внимательнее, что я предложил. На последнем этапе можно скопировать результат в другую область. Даже если это дерево. А если это число - то тем более.

Никогда не известно, сколько именно памяти потребуется для конкретного вычисления

Иногда известно. Например, в случае сортировки. И даже если общее количество неизвестно, то может оказаться известным, что нет смысла собирать мусор до завершения вычисления. Например, типичный компилятор выделяет не слишком много памяти на каждый файл. Можно создавать новую область под временные данные компилятора для каждого вновь компилируемого файла.
Далее, рассмотрим процесс обработки запросов к вебу в языках типа PHP. Как правило, программа не велика и она выгружается полностью после исполнения одного запроса (бывает, конечно, что экземпляры PHP кешируются, но не всегда). Значит, это как раз аналог того, что я называю «областью», при этом, возвращаемое значение - это код ошибки ОС. Берём PHP. Переводим на лисп, образ которого постоянно крутится. Под каждый новый запрос создаём область, делаем в ней всё, что делает соответствующая программа на PHP, потом удаляем эту область.

den73 ★★★★★
() автор топика
Ответ на: комментарий от Booster

Booster, если ты имеешь в виду

2. Определять, как размещаются вновь создаваемые объекты по областям


то, насколько я понимаю, при поколенческой сборке мусора это не так. Все новые объекты кладутся в первую область. Может быть, я что-то не знаю?

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

> Подсчёт ссылок - это НЕ сборщик мусора. Точка.

Сам придумал? Молодец, возьми с полки пирожок. Подсчёт ссылок — это не сборщик мусора. Съешь пирожок только после того, как осознаешь, что сборщик мусора на подсчёте ссылок — это сборщик мусора. Свободен.

kemm
()
Ответ на: комментарий от kemm

То, что автор Перла приврал и назвал вещи не своими именами, не делает счётчик ссылок сборкой мусора. Вот, первая ссылка из Яндекса на эту тему

http://www.michurin.com.ru/python-vs-perl.shtml

То, что в Perl называется «механизмом сборки мусора», в Python называется гораздо скромнее — «механизм подсчёта ссылок». Эти механизмы работают одинаково и не способны, на пример, удалять циклические ссылки. Вот пример программы на Perl, вызывающей утечку памяти, так как здесь подсчёт ссылок бессилен:

while(1) { my $x; $x=\$x; }

Создать подобную утечку памяти в Python практически невозможно, так как Python имеет второй механизм сборки мусора (он-то и называется в Python «механизмом сборки мусора»). Он способен удалить циклические ссылки или вернуть программисту указатели на эти потерянные структуры с целью их корректного удаления. Этот механизм можно включать, выключить и запускать принудительно, когда это необходимо.

Если бы ты не начал хамить, я бы промолчал. Но теперь придётся предоставить тебе неширокий выбор. Выбирай, кто ты - троль или ламер.

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

>то, насколько я понимаю, при поколенческой сборке мусора это не так. >Все новые объекты кладутся в первую область. Может быть, я что-то не знаю?
Я имел ввиду уничтожение временных переменных. Хотя может я вырвал это из контекста и не правильно понял? Честно говоря не совсем понял про что тут и для чего. Для чего отслеживать ссылки старого объекта на молодой?

Booster ★★
()
Ответ на: комментарий от den73

> То, что автор Перла приврал и назвал вещи не своими именами, не делает счётчик ссылок сборкой мусора.

А заодно и все остальные, кто рассматривает подсчёт ссылок как один из механизмов сборки мусора. Очень удобная позиция — все, кто не подтверждает мою точку зрения, называются лжецами.

Вот, первая ссылка из Яндекса на эту тему

Ты б ещё у тумбочки спросил. почти (с)

То, что в Perl называется «механизмом сборки мусора», в Python называется гораздо скромнее — «механизм подсчёта ссылок».

Клёва. Оттого, что в питоне что-то по-другому обозвали, оно сразу становится тем и только тем, чем его в питоне обозвали. Феерично, ничего не скажешь.

Python имеет _второй_ механизм сборки мусора: ...

Ой, какая досада. Т.е. подсчёт ссылок — это тоже механизм сборки мусора? А распинались-то...

Выбирай, кто ты - троль или ламер.

Ты — точно тролль. Может, ещё и ламер, но тут сказать ничего не могу.

kemm
()
Ответ на: комментарий от den73

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

Waterlaz ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.