Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

특수화

TODO: Chalk는 어디에 해당합니까? 여기에서 이를 언급하거나 논의해야 합니까?

specialize 모듈에 정의되어 있습니다.

기본 전략은 일관성 검사 중에 특수화 그래프를 빌드하는 것입니다(일관성 검사는 겹치는 impl을 찾습니다). 그래프에 삽입할 때 특수화 계층 구조에서 impl을 넣을 올바른 위치를 찾습니다. 올바른 위치가 없는 경우(부분적으로 겹치지만 포함 관계가 없는 경우)에는 겹침 오류가 발생합니다. impl을 선택할 때는 (당연히) 특수화를 참조하며, 특수화 계층 구조 아래로 기본값을 전파할 때는 그래프를 참조합니다.

선택 과정, 즉 실제로 특수화를 수행할 때 특수화 그래프가 사용될 것이라고 예상할 수도 있습니다. 그렇게 하지 않는 데에는 두 가지 이유가 있습니다.

  • 이는 단지 최적화일 뿐입니다. 적용 가능한 후보 집합이 주어지면, 그래프를 참조하지 않고도 후보들을 특수화 관점에서 직접 비교하여 가장 특수화된 후보를 결정할 수 있습니다. 선택 결과도 캐시한다는 점을 고려하면, 이 최적화의 이점은 의문스럽습니다.

  • 애초에 특수화 그래프를 빌드하려면 선택을 사용해야 합니다(한 impl이 다른 impl을 특수화하는지 판단해야 하기 때문입니다). 이러한 재진입을 처리하려면 선택에 추가적인 모드 전환이 필요합니다. 어차피 그래프를 사용해야 할 강력한 이유가 없어 보이므로, 선택에서는 더 단순한 접근 방식을 유지하고 그래프는 기본 구현을 전파하는 데에만 사용합니다.

트레이트 impl 선택은 여러 impl이 적용될 수 있는 경우에도, 그 impl들이 같은 특수화 계열에 속하기만 하면 성공할 수 있습니다. 이 경우 선택이 성공하면 하나의 impl을 반환합니다. 이는 적용된다고 알려진 impl 중 가장 특수화된 impl입니다. 그러나 추론 변수가 관여하는 경우, 반환된 impl이 코드 생성 시점에 실제로 사용할 impl이 아닐 수도 있습니다. 따라서 (1) 연관 타입이 default를 사용하지 않아 재정의될 수 없거나 (2) 모든 입력 타입이 구체적으로 알려진 경우가 아니라면, 연관 타입을 프로젝션하지 않도록 특별히 주의합니다.

추가 자료

@sunjay의 이 발표가 유용할 수 있습니다. 이 발표는 문제와 해결책에 대한 대략적인 개요만 제공한다는 점을 유념하십시오(이 발표는 @sunjay의 작업이 절반쯤 진행되었을 때 이루어졌습니다). 또한 이 발표는 2018년 6월에 진행되었으므로, 시청하는 시점에는 일부 내용이 바뀌었을 수 있습니다.