순수 언어에서 가비지 콜렉션은 어떻게 다릅니 까?


26

Haskell과 같은 순수한 언어에서는 모든 데이터를 변경할 수 없으며 기존 데이터 구조를 변경할 수 없습니다. 또한, 불변 데이터 및 기능적 프로그래밍 패턴에 대한 많은 알고리즘이 본질적으로 대량의 가비지를 map생성합니다 (예 : 중간 목록을 작성하는 체인 ).

가비지 수집기는 그렇지 않은 순도에 직면하여 어떤 전략과 기술을 사용합니까? 순전 한 상황이 아닌 불순한 언어의 GC에서 잘 작동하는 것은 무엇입니까? 순수한 언어가 GC를 위해 만드는 다른 새로운 문제는 무엇입니까?


1
당신이 읽을 수 있습니다 wiki.haskell.org/GHC/Memory_Management
마테우스 K.

답변:


13

ghc의 현재 구현은 언어가 순수하고 데이터가 변경 불가능하기 때문에 작동하는 전략을 사용합니다. 새로운 것을 참조하도록 변수를 변경할 수 없으며 객체는 오래된 객체에 대한 참조 만 보유하므로 세대 가비지 수집기를 실행합니다 ; 세대가 GCd가 될 때까지 더 높은 세대가 참조하는 오브젝트를 삭제할 수 없으므로 오브젝트를 더 높은 세대로 승격시킵니다. GC가 참조를 스위핑하는 동안 참조를 변경하지 않으므로 병렬로 실행할 수 있습니다.

자세한 내용은 다음과 같습니다 .


4
열성적인 프로모션은 게으름에 의존합니다. 구세대에서 썽크를 업데이트하면 새로운 세대에 대한 포인터를 만들 수 있지만 썽 크는 한 번만 변형되므로 어린 대상을 열심히 홍보하기에 충분합니다. 다른 구식 참조 (예 : 가변 배열)는 "기억 된 세트"를 사용하여 추적되며, 이는 촉진이 어려울 경우에도 사용됩니다.
Jon Purdy

1

Haskell과 같은 순수한 언어에서는 모든 데이터를 변경할 수 없으며 기존 데이터 구조를 어떤 방식으로도 변경할 수 없습니다

사실 그것은 일반적으로 사실이 아닙니다. 순수 언어는 엄격하지 않은 (지연 한) 평가를 사용하므로 잠재적으로 모든 하위 표현식의 평가가 지연됩니다. 평가되지 않은 표현식은 일반적으로 "thunk"로 힙 할당됩니다. 필요할 때 발현은 평가되고 썽크이되는 돌연변이 된 결과 값으로.

가비지 수집기는 그렇지 않은 순도에 직면하여 어떤 전략과 기술을 사용합니까?

내가 생각할 수있는 유일한 것은 블랙홀 입니다. 하스켈 연구 논문에서 GC 측면에서 새로운 것을 본 것은 기억 나지 않습니다.

순전 한 상황이 아닌 불순한 언어의 GC에서 잘 작동하는 것은 무엇입니까?

GC 쓰기 장벽. 불순한 언어는 포인터를 힙에 더 많이 쓰는 경향이 있으므로 쓰기 장벽이 더 많이 최적화되는 경향이 있습니다.

mark-region과 같은 다른 GC 알고리즘은 순수한 언어보다 할당 속도가 훨씬 낮기 때문에 불순한 언어와 관련하여 훨씬 더 실용적입니다.

순수한 언어가 GC를 위해 만드는 다른 새로운 문제는 무엇입니까?

순수한 언어는 매우 드물기 때문에 순수한 프로그램이 메모리를 사용하는 방법에 대한 데이터가 훨씬 적으므로 순수한 언어의 GC를 작성할 때 더 나쁜 위치에서 시작합니다.


"필요한 경우 표현식이 평가되고 썽크가 결과 값으로 변경됩니다." 하스켈 사용자에 관한 한 내부 구현 세부 사항입니다. 돌연변이를 관찰 할 수있는 방법이 없으므로 사용자 관점에서 돌연변이가 아닙니다.
Jack

또한 순수한 언어가 엄격 할 수 있습니다. 예를 들어 Idris를 참조하십시오.
Jack
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.