문제

Fixnum 질문 내가 오랫동안 궁금해했던 다른 질문에 내 마음을 가져 왔습니다.

쓰레기 수집에 관한 많은 온라인 자료는 런타임 유형 정보를 구현할 수있는 방법에 대해서는 알려주지 않습니다. 그러므로 나는 모든 종류의 쓰레기 수집가에 대해서는 많이 알고 있지만 실제로 어떻게 구현할 수 있는지에 관한 것은 아닙니다.

Fixnum 솔루션은 실제로 매우 훌륭합니다. 어떤 값이 포인터이고 그렇지 않은지는 매우 분명합니다. 유형 정보를 저장하기 위해 일반적으로 사용되는 다른 솔루션은 무엇입니까?

또한 Fixnum에 대해 궁금합니다. 그것이 모든 배열 인덱스에서 FixNums로 제한된다는 것을 의미하지 않습니까? 아니면 전체 64 비트 정수를 얻기위한 일종의 해결 방법이 있습니까?

도움이 되었습니까?

해결책

기본적으로 정확한 마킹을 달성하려면 포인터로 사용되는 단어와 그렇지 않은 단어를 나타내는 메타 데이터가 필요합니다.

이 메타 데이터는 EMACS와 마찬가지로 참조 당 저장 될 수 있습니다. 언어/구현의 경우 메모리 사용에 대해별로 신경 쓰지 않으면 단어보다 참조를 더 크게 만들 수 있으므로 모든 참조가 유형 정보와 하나의 단어 데이터를 전달할 수 있습니다. 이렇게하면 참조 비용으로 모두 64 비트 인 32 비트 포인터의 전체 크기를 고정 할 수 있습니다.

또는 메타 데이터는 다른 유형 정보와 함께 저장 될 수 있습니다. 예를 들어, 클래스에는 일반적인 기능 포인터 테이블뿐만 아니라 데이터 레이아웃의 단어 당 하나의 비트가 포함될 수 있습니다. 언어가 가상 호출이있는 경우 이미 객체에서 사용할 기능을 수행 할 수있는 수단이 있어야합니다. 따라서 동일한 메커니즘을 사용하면 사용할 데이터를 사용하여 추가로 비밀 포인터를 추가 할 수 있습니다. 런타임 유형을 구성하는 클래스를 가리키는 모든 단일 객체의 시작. 분명히 특정 동적 언어를 사용하면 지적한 유형 데이터는 수정 가능하기 때문에 복사해야합니다.

스택은 유사하게 수행 할 수 있습니다 - 정확한 마킹 정보를 코드 자체의 데이터 섹션에 저장하고 쓰레기 수집가가 저장된 프로그램 카운터를 검사하고 스택의 포인터 및/또는 기타 정보를 목적을위한 코드, 각 스택의 각 비트와 관련된 코드를 결정하고 어떤 단어가 포인터인지를 결정합니다. 가벼운 예외 메커니즘은 코드에서 시도/캐치가 발생하는 위치에 대한 정보를 저장하는 데 유사한 일을하는 경향이 있으며, 물론 디버거도 스택을 해석 할 수 있어야하므로 다른 많은 것들과 함께 접을 수 있습니다. 가비지 컬렉션이 내장 된 언어를 포함하여 모든 언어를 구현하기 위해 이미 수행하고 있습니다.

쓰레기 수집이 반드시 정확한 마킹이 필요하지는 않습니다. 실제로 모든 단어가 포인터로 취급 할 수 있습니다. 실제로 여부에 관계없이 쓰레기 수집가의 "큰 목록"에서 아직 표시되지 않은 개체를 참조 할 수 있는지 여부와 따라서 그것을 그 대상에 대한 참조로 취급하십시오. 이것은 간단하지만 물론 비용은 GC가 조회에 사용하는 데이터 구조에 따라 "매우 느린"과 "매우 느린"사이에 있다는 것입니다. 더욱이, 때로는 정수가 수집되지 않은 객체의 주소와 동일한 값을 가지며 수집해야 할 모든 물체를 유지하게합니다. 따라서 그러한 쓰레기 수집가는 수집되지 않은 물체에 대해 강력한 보장을 제공 할 수 없습니다. 장난감 구현 또는 첫 번째 작업 버전에는 적합하지만 사용자에게 인기가 없을 것입니다.

예를 들어, 혼합 된 접근 방식은 물체를 정확하게 표시 할 수 있지만, 특히 털이 많은 스택 영역은 아닙니다. 예를 들어, 참조 된 객체 주소가 일반적인 스택 슬롯이 아닌 레지스터에만 나타나는 코드를 생성 할 수있는 JIT를 작성하는 경우 OS가 레지스터를 저장 한 스택 영역을 정확하게 따라야 할 수도 있습니다. 쓰레기 수집가를 실행하기 위해 해당 스레드를 교정했습니다. 아마도 상당히 어리 석으므로 합리적인 접근 방식 (잠재적으로 느린 코드를 초래할 수 있음)은 JIT가 항상 정확하게 표시된 스택에서 사용하는 모든 포인터 값의 사본을 보관하도록 요구하는 것입니다.

다른 팁

Squeak (또한 계획과 다른 많은 역동적 인 언어)에서 당신은 가지고 있습니다. SmallInteger, 서명 된 31 비트 정수의 클래스 및 임의로 큰 정수를위한 클래스, 예를 들어 LargePositiveInteger. 다른 표현, 64 대 비트 정수는 전체 물체 또는 "I 'm a I'm a Pointer"플래그와 같은 몇 비트를 가지고있을 수 있습니다.

그러나 산술 메소드는 오버/하류를 처리하도록 코딩되어있어 SmallInteger maxVal, 당신은 2^30 + 1을 인스턴스로 얻습니다. LargePositiveInteger, 그리고 당신이 그것으로부터 하나를 빼면, 당신은 2^30으로 돌아갑니다. SmallInteger.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top