Сборка мусора переопределена в LLVM 3?

Я читал о том, что LLVM v3 использует статический анализ кода для реализации своего рода автоматической сборки мусора, которая подготавливается и выполняется во время компиляции.

Если компилятор статически вставляет, сохраняет и выпускает, тогда никакой компонент времени выполнения для сборки мусора больше не нужен или что?

Это правда? Будет ли он работать как замена обычной сборки мусора при разработке iOS и OS X? Не понятно что будет..

Должны ли мы полагаться на такую ​​«статическую сборку мусора»?


person Jack    schedule 09.06.2011    source источник
comment
Хотя это было закрыто из-за того, когда его спросили, мой ответ здесь немного рассказывает о различиях между ARC в LLVM 3.0 и сборкой мусора. См. также сообщение Криса Латтнера здесь по этому вопросу.   -  person Brad Larson    schedule 21.06.2011


Ответы (3)


Это интересный вопрос: может ли статический анализатор реализовать полноценную систему сборки мусора?

Ответ, по-видимому, будет отрицательным. Единственный способ реализовать сборку мусора — это знать, что выделенная часть памяти (например, экземпляр объекта) больше не может использоваться. В сборщике мусора во время выполнения эти знания получаются путем (эффективного) сканирования стека и кучи. Выполнение этого во время компиляции потребует анализа всех возможных путей кода в системе, чтобы определить, где при его выполнении конкретное выделение больше не будет доступно. Это эквивалентно проблеме остановки. Тем не менее, LLVM утверждает, что поддерживает по крайней мере ограниченную форму автоматического подсчета ссылок (вставка сохранения/освобождения) для вас. См. http://developer.apple.com/technologies/ios5/. Я подозреваю, что то, что делает LLVM, не является полным сборщиком мусора, он использует статический анализатор, чтобы определить, когда все ссылки на объект выходят за рамки, и вставляет для вас соответствующие сохранения/релизы. Подсчет ссылок происходит во время выполнения, как и раньше. Я очень сомневаюсь, что он будет автоматически выполнять free блокировку malloc'ов за вас.

Если он работает так, как рекламируется на общедоступном сайте выше, я бы сказал, используйте его.

person Barry Wark    schedule 09.06.2011
comment
Это, конечно, возможно, по крайней мере частично; См. en.wikipedia.org/wiki/Region-based_memory_management. - person SK-logic; 09.06.2011

Если компилятор статически вставляет, сохраняет и выпускает, тогда никакой компонент времени выполнения для сборки мусора больше не нужен или что?

ARC означает «Автоматический подсчет ссылок» и, следовательно, прибегает к подсчету ссылок (RC) в целом. RC — одна из старейших форм сборки мусора, восходящая к 1960 году, и редко используется на практике, потому что она очень медленная, имеет неограниченные паузы и неточная, потому что она пропускает циклы.

RC медленный, потому что счетчики ссылок увеличиваются и уменьшаются каждый раз, когда вы обрабатываете ссылку на объект (например, читаете ссылку из кучи или записываете ее в кучу), а потокобезопасный подсчет ссылок должен корректировать счетчики с использованием атомарных операций увеличения и уменьшения. Наивный подсчет ссылок (например, shared_ptr в C++) примерно в 10 раз медленнее, чем трассировка сборки мусора. ARC использует статический анализ, чтобы удалить некоторые из этих приращений и уменьшений счетчика, что улучшит производительность, но мне неизвестны какие-либо тесты, и я серьезно сомневаюсь, что результат будет конкурентоспособным по сравнению, например, с JVM или CLR (оба из которых отказались от подсчет ссылок давно, потому что они обнаружили, что трассировка сборки мусора намного быстрее и точнее).

person J D    schedule 08.07.2015