다음을 통해 공유


의미 체계 작업

구문 트리는 소스 코드의 어휘 및 구문 구조를 나타냅니다. 이 정보만으로 원본의 모든 선언 및 논리를 설명하기에 충분하지만 참조되는 것을 식별하는 데 충분한 정보가 아닙니다. 이름은 다음을 나타낼 수 있습니다.

  • 형식
  • 필드
  • 메서드
  • 지역 변수

이러한 각각은 고유하게 다르지만 식별자에서 실제로 참조하는 것을 결정하는 데 종종 언어 규칙에 대한 심층적 이해가 필요합니다.

소스 코드에서 표현되는 프로그램 요소가 있으며 프로그램은 어셈블리 파일에서 패키지된 이전에 컴파일된 라이브러리를 참조할 수도 있습니다. 어셈블리에서 사용할 수 있는 소스 코드, 구문 노드 또는 트리가 없음에도 불구하고 프로그램은 여전히 내부의 요소를 참조할 수 있습니다.

이러한 작업의 경우 의미 체계 모델이 필요합니다.

소스 코드의 구문 모델 외에도 의미 체계 모델은 식별자를 참조되는 올바른 프로그램 요소와 올바르게 일치시키는 쉬운 방법을 제공하여 언어 규칙을 캡슐화합니다.

컴파일

컴파일은 어셈블리 참조, 컴파일러 옵션 및 원본 파일을 포함하는 C# 또는 Visual Basic 프로그램을 컴파일하는 데 필요한 모든 항목의 표현입니다.

이 정보는 모두 한 곳에 있기 때문에 소스 코드에 포함된 요소를 더 자세히 설명할 수 있습니다. 컴파일은 기호로 각 선언된 형식, 멤버 또는 변수를 나타냅니다. 컴파일은 소스 코드에서 선언되었거나 어셈블리에서 메타데이터로 가져온 기호를 찾거나 관련시키는 데 도움이 되는 다양한 메서드를 포함합니다.

구문 트리와 마찬가지로, 컴파일은 변경할 수 없습니다. 컴파일을 만든 후에 사용자나 공유하는 사용자가 변경할 수 없습니다. 그러나 그렇게 수행하는 대로 변경 내용을 지정하여 기존 컴파일에서 새 컴파일을 만들 수 있습니다. 예를 들어 추가 원본 파일 또는 어셈블리 참조를 포함할 수 있는 것을 제외하고 기존 컴파일과 모든 방식에서 동일한 컴파일을 만들 수 있습니다.

기호

기호는 소스 코드에 의해 선언되거나 메타데이터로 어셈블리에서 가져온 고유한 요소를 나타냅니다. 모든 네임스페이스, 형식, 메서드, 속성, 필드, 이벤트, 매개 변수 또는 지역 변수는 기호로 표시됩니다.

Compilation 형식의 다양한 메서드 및 속성은 기호를 찾는 데 도움이 됩니다. 예를 들어 일반적인 메타데이터 이름별로 선언된 형식에 대한 기호를 찾을 수 있습니다. 전역 네임스페이스로 루트된 기호의 트리로 전체 기호 테이블에 액세스할 수도 있습니다.

기호는 또한 컴파일이 다른 참조된 기호와 같은 원본 또는 메타데이터에서 결정하는 추가 정보를 포함합니다. 각 종류의 기호는 컴파일러에서 수집한 정보를 자세히 설명하는 고유한 메서드 및 속성이 있는 각 ISymbol에서 파생된 별도 인터페이스로 표시됩니다. 이러한 속성의 상당수는 다른 기호를 직접 참조합니다. 예를 들어 IMethodSymbol.ReturnType 속성은 메서드가 반환하는 실제 형식 기호를 알려 줍니다.

기호는 소스 코드와 메타데이터 간의 네임스페이스, 형식 및 멤버의 일반적인 표현을 제공합니다. 예를 들어 소스 코드에 선언된 메서드 및 메타데이터에서 가져온 메서드는 모두 동일한 속성이 있는 IMethodSymbol로 표시됩니다.

기호는 System.Reflection API로 표시된 CLR 형식 시스템과 개념상 비슷하지만 형식 이상을 모델링하므로 더 다양합니다. 네임스페이스, 지역 변수 및 레이블은 모두 기호입니다. 또한 기호는 CLR 개념이 아닌 언어 개념의 표현입니다. 겹치는 경우가 많지만 의미 있는 차이도 많습니다. 예를 들어 C# 또는 Visual Basic의 반복기 메서드는 단일 기호입니다. 그러나 반복기 메서드가 CLR 메타데이터로 번역되는 경우 이는 형식 및 여러 메서드입니다.

의미 체계 모델

의미 체계 모델은 단일 원본 파일에 대한 모든 의미 체계 정보를 나타냅니다. 다음 검색에 사용할 수 있습니다.

  • 원본의 특정 위치에서 참조되는 기호
  • 모든 식의 결과 형식
  • 오류 및 경고인 모든 진단
  • 원본 영역 내부 및 외부의 변수 흐름 방식
  • 더 가상적인 질문에 대한 대답