참조 카운트 GC와 추적 GC는 언어 속성 또는 구현 속성입니까?


9

"Swift는 클래식 (추적) GC를 수행하지 않고 ARC를 사용합니다."

그러나 Swift 의미 체계에 참조 계산이 필요한 것이 있는지 확실하지 않습니다. 추적 GC를 사용하기 위해 자체 Swift 컴파일러 및 런타임을 빌드 할 수있는 것으로 보입니다.

그렇다면 Swift에 대한 "참조 횟수"는 정확히 무엇입니까? 애플의 구현 또는 언어 자체? 언어 자체에 해당 레이블을 사용할 수 있도록 ARC를 강력하게 지원하는 언어 또는 라이브러리 부분이 있습니까?

답변:


9

스위프트 보장 객체에 대한 마지막 참조가 삭제되면 객체는 deinitialized 것을, 그리고 deinit코드는 즉시 실행됩니다.

GC를 통해 이러한 종류의 보증을 얻는 것은 불가능합니다. 적어도 성능을 희생하지 않으면 불가능합니다. 표준 GC 메커니즘은 deinit코드가 결국 다음 GC주기에서 실행 되도록 보장합니다 . 정확한 의미론을 위해서는 어딘가에 참조 횟수가 필요합니다.


3
아, deinit키워드와 관련 의미론 의 존재 는 실제로 구현 영역이 아닌 언어로 참조 카운트를 세는 것입니다.
Ray Toal

2
아무것도 할당 해제 될 때마다 GCed 런타임이 도달 할 수없는 객체를 확인하는 것을 막을 수 없습니다. 정말 비효율적입니다.
Raphael

@Raphael 해당 지점에서보다 정확하게 편집되었습니다.
chi

3

chi는 신속한 신체에 관한 특정 질문에 대답했습니다.

참조 카운트 GC와 추적 GC는 언어 속성 또는 구현 속성입니까?

기준 계수 GC 및 추적 GC는 프로그래머에게 다양한 보증을 제공합니다.

참조 카운팅은 객체가 파괴 된 프로그램 흐름의 위치에 결정 성을 제공합니다. 이는 객체가 신속하게 해제되어야하는 부족한 리소스를 소유하는 경우 중요 할 수 있습니다. 반면에 "강력한"참조주기는 처리 할 수 ​​없습니다.

특성이 보장되는 경우 개별 언어의 사양에 따라 달라지며, 따라서 어떤 구현을 준수 구현에 사용할 수 있습니까?


4
참조 횟수와 GC를 결합 할 수도 있습니다. 그런 다음 언어는 객체가 참조되지 않은 즉시 (이 형식 또는 다른 형식의 참조를 포함하는) 소멸자가 실행되었다는 것을 문서화 할 수 있으며 참조주기는 결국 소멸됩니다 (일부 GC 형식). 또는 소멸자가 실행될 때 언어 (파이썬과 참조 구현의 경우 IIRC)를 보장하지는 않지만 구현 속성이 될 수 있습니다.
Gilles 'SO- 악의를 멈춰라

1

Swift라는 언어를 사용하여 이름을 "Swift with ARC"로 바꿀 수 있습니다. 그런 다음 정확히 같은 구문으로 "Swift with GC"라는 새 언어를 만들 수 있지만 개체 할당이 해제되는 시점에 대한 보장은 줄어 듭니다.

ARC를 사용하는 Swift에서 참조 횟수가 0이면 객체가 이동합니다. 가비지 수집을 사용하면 약한 참조가있는 한 해당 약한 참조를 강한 참조에 할당하여 개체를 "복구"할 수 있습니다. (Swift에서 참조 카운트가 0이면 약한 참조는 nil입니다); 그것은 큰 차이입니다.

물론 SRC는 ARC를 사용하여 마지막 참조 카운트를 죽이면 객체를 즉시 할당 해제합니다. 예를 들어, 같은 파일에 동시에 존재하는 두 개의 인스턴스를 가질 수없는 FileWriter 클래스가있을 수 있습니다. ARC를 사용하는 Swift에서는 oldWriter = nil; newWriter = FileWriter (...)이고 새 FileWriter는 이전 파일을 삭제 한 후에 만 ​​생성됩니다 (다른 참조를 유지하지 않는 한). GC를 사용하는 Swift에서는 작동하지 않습니다.

또 다른 차이점은 "ARC와 스위프트"에 만 강한 참조주기를 통해 참조, 실제로 도달하지 않은 객체가된다는 것입니다 보장 할당이 해제되지 않을 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.