Roslyn SyntaxNodes는 재사용됩니까?
나는 Roslyn CTP를 살펴 보았고 Expression tree API 와 비슷한 문제를 해결하는 동안 둘 다 불변이지만 Roslyn은 매우 다른 방식으로 그렇게합니다.
Expression
노드는 부모 노드에 대한 참조가 없으며 a를 사용하여 수정되므로ExpressionVisitor
큰 부분을 재사용 할 수 있습니다.반면 Roslyn 's
SyntaxNode
는 부모에 대한 참조를 가지므로 모든 노드는 사실상 재사용이 불가능한 블록이됩니다. 방법은 좋아Update
,ReplaceNode
등, 수정을 위해 제공됩니다.
이것이 어디에서 끝나는가? Document
? Project
? ISolution
? API는 버튼 업 대신 트리의 단계별 변경을 촉진하지만 각 단계에서 전체 사본을 작성합니까?
그들은 왜 그런 선택을 했습니까? 내가 놓친 흥미로운 트릭이 있습니까?
업데이트 :이 질문은 2012 년 6 월 8 일 내 블로그의 주제였습니다 . 좋은 질문 감사합니다!
좋은 질문입니다. 오랫동안 제기 한 문제에 대해 토론했습니다.
우리는 다음과 같은 특징을 가진 데이터 구조를 원합니다.
- 불변.
- 나무의 형태.
- 자식 노드에서 부모 노드에 저렴하게 액세스
- 트리의 노드에서 텍스트의 문자 오프셋으로 매핑 할 수 있습니다.
- 지속적 .
에 의해 지속성 내가 할 수있는 능력을 의미 트리에서 기존 노드의 대부분을 다시 편집은 텍스트 버퍼에 이루어질 때를. 노드는 변경할 수 없으므로 재사용에 장애가 없습니다. 성능을 위해서는 이것이 필요합니다. 키를 누를 때마다 파일의 거대한 문제를 다시 파싱 할 수 없습니다. 편집의 영향을받은 트리 부분 만 재분석하고 재분석해야합니다.
이제 5 가지를 모두 하나의 데이터 구조에 넣으려고하면 즉시 문제가 발생합니다.
- 처음에 노드를 어떻게 구축합니까? 부모와 자식은 서로를 참조하고 불변이므로 어떤 것이 먼저 만들어 집니까?
- 당신이 그 문제를 해결할 수 있다고 가정 해보자. 어떻게 그것을 지속 시키는가? 다른 부모에서 자식 노드를 재사용 할 수 없습니다. 자식 노드에 새 부모가 있음을 알리기 때문입니다. 그러나 아이는 불변입니다.
- 이 문제를 해결한다고 가정합니다. 새 문자를 편집 버퍼에 삽입하면 해당 지점이 변경된 후 위치에 매핑되는 모든 노드 의 절대 위치가 변경됩니다. 편집하면 대부분의 노드 범위를 변경할 수 있기 때문에 영구적 인 데이터 구조를 만들기가 매우 어렵습니다!
그러나 Roslyn 팀에서는 일상적으로 불가능한 일을합니다. 실제로는 두 개의 구문 분석 트리 를 유지하여 불가능을 수행합니다 . "녹색"트리는 변경 불가능하고 영구적이며 상위 참조가없고 "하단"으로 작성되며 모든 노드는 너비를 추적 하지만 절대 위치 는 추적 하지 않습니다 . 편집이 발생하면 편집에 영향을받은 그린 트리 부분 만 재구성합니다. 일반적으로 트리의 총 구문 분석 노드 중 O (log n) 정도입니다.
"빨간색"나무는 녹색 나무 주위에 건축 된 불변 외관 입니다. 요청시 "하향식 (top-down)" 으로 제작 되며 모든 편집시 폐기됩니다. 이 트리는 맨 위에서 트리를 통해 내려갈 때 필요에 따라이를 참조하여 상위 참조를 계산합니다 . 내려 가면서 너비에서 다시 계산하여 절대 위치를 제조합니다.
사용자는 빨간 나무 만 볼 수 있습니다. 그린 트리는 구현 세부 사항입니다. 구문 분석 노드의 내부 상태를 살펴보면 실제로 다른 유형의 다른 구문 분석 노드에 대한 참조가 있음을 알 수 있습니다 . 이것이 그린 트리 노드입니다.
또한 이것을 "빨간색 / 녹색 나무"라고합니다. 이는 디자인 회의에서 데이터 구조를 그리는 데 사용한 화이트 보드 마커 색이기 때문입니다. 색상에는 다른 의미가 없습니다.
이 전략의 장점은 불변성, 지속성, 부모 참조 등과 같은 모든 위대한 것들을 얻는 것입니다. 비용은이 시스템이 복잡하고 "빨간색"파사드가 커지면 많은 메모리를 소비 할 수 있다는 것입니다. 우리는 현재 혜택을 잃지 않고 일부 비용을 줄일 수 있는지 실험하기 위해 실험을하고 있습니다.
참고 URL : https://stackoverflow.com/questions/10417169/are-roslyn-syntaxnodes-reused
'IT story' 카테고리의 다른 글
디스플레이 : 인라인 vs 디스플레이 : 블록 (0) | 2020.07.17 |
---|---|
키-값 튜플 목록을 사전으로 변환하는 방법? (0) | 2020.07.17 |
Hindley-Milner 란 무엇입니까? (0) | 2020.07.16 |
ls -l 다음에 나오는 첫 번째 줄의 "전체"는 무엇입니까? (0) | 2020.07.16 |
Eclipse 작업 공간에서 저장된 프로젝트 목록은 어디에 있습니까? (0) | 2020.07.16 |