다음을 통해 공유


.NET Compiler Platform SDK 모델 이해

컴파일러는 종종 사람이 코드를 읽고 이해하는 방식과 다른 구조적 규칙을 따라 작성하는 코드를 처리합니다. 컴파일러에서 사용되는 모델에 대한 기본적인 이해는 Roslyn 기반 도구를 빌드할 때 사용하는 API를 이해하는 데 반드시 필요합니다.

컴파일러 파이프라인 기능 영역

.NET Compiler Platform SDK는 기존의 컴파일러 파이프라인을 미러링하는 API 계층을 제공하여 소비자로서 사용자에게 C# 및 Visual Basic 컴파일러의 코드 분석을 노출합니다.

steps of the compiler pipeline processing source code to object code

이 파이프라인의 각 단계는 별도 구성 요소입니다. 첫째로, 구문 분석 단계는 원본 텍스트를 언어 문법 뒤에 오는 구문으로 토큰화하고 구문 분석합니다. 둘째로, 선언 단계는 원본 및 가져온 메타데이터를 분석하여 명명된 기호를 형성합니다. 다음으로 바인딩 단계는 코드의 식별자를 기호와 일치시킵니다. 마지막으로 내보내기 단계는 컴파일러로 생성된 모든 정보와 함께 어셈블리를 내보냅니다.

compiler pipeline api provides access to each step that is part of the compiler pipeline

이러한 각 단계에 해당하여 .NET Compiler Platform SDK는 해당 단계에서 정보에 액세스할 수 있는 개체 모델을 노출합니다. 구문 분석 단계는 구문 트리를 노출하고, 선언 단계는 계층적 기호 테이블을 노출하고, 바인딩 단계는 컴파일러의 의미 체계 분석 결과를 노출하고, 내보내기 단계는 IL 바이트 코드를 생성하는 API입니다.

the language services available from the compiler api at each step of the compiler pipeline

각 컴파일러는 단일 엔드투엔드 전체로 이러한 구성 요소를 하나로 결합합니다.

이러한 API는 Visual Studio에서 사용하는 API와 동일합니다. 예를 들어 코드 개요 및 서식 지정 기능은 구문 트리를 사용하고, 개체 브라우저 및 탐색 기능은 기호 테이블을 사용하며, 리팩터링 및 정의로 이동은 의미 체계 모델을 사용하고, 편집하며 계속하기는 내보내기 API를 포함하여 이러한 모든 것을 사용합니다.

API 계층

.NET 컴파일러 SDK는 컴파일러 API, 진단 API, 스크립팅 API, 작업 영역 API 등 여러 개의 계층으로 구성되어 있습니다.

컴파일러 API

컴파일러 계층은 구문 및 의미 체계 모두의 컴파일러 파이프라인의 각 단계에서 노출되는 정보에 해당하는 개체 모델을 포함합니다. 컴파일러 계층은 어셈블리 참조, 컴파일러 옵션 및 소스 코드 파일을 포함하는 컴파일러 단일 호출의 변경할 수 없는 스냅샷도 포함합니다. C# 언어 및 Visual Basic 언어를 나타내는 두 개의 고유한 API가 있습니다. 두 개의 API는 모양이 유사하지만 개별 언어에 대한 충실도가 높게 조정되었습니다. 이 계층에는 Visual Studio 구성 요소에 대한 종속성이 없습니다.

진단 API

해당 분석의 일환으로 컴파일러는 구문, 의미 체계, 한정된 할당 오류에서 다양한 경고 및 정보 진단에 이르는 모든 항목을 포함하는 진단 정보 세트를 생성할 수 있습니다. 컴파일러 API 계층은 사용자 정의 분석기를 컴파일 프로세스에 연결할 수 있도록 하는 확장 가능한 API를 통해 진단을 노출합니다. StyleCop 같은 도구에서 생성된 진단 등의 사용자 정의 진단을 컴파일러 정의 진단과 함께 생성할 수 있습니다. 이러한 방식으로 진단을 생성하면 정책을 기반으로 한 빌드 중지 및 편집기에서 라이브 물결선 표시 및 코드 수정 사항 제안과 같은 환경 진단을 사용하는 MSBuild 및 Visual Studio와 같은 도구와 자연스럽게 통합되는 이점이 있습니다.

스크립팅 API

호스팅 및 스크립팅 API는 컴파일러 계층 위에 빌드됩니다. 스크립팅 API를 사용하여 코드 조각을 실행하고 런타임 실행 컨텍스트를 누적할 수 있습니다. C# 대화형 REPL(읽기 평가 인쇄 루프)은 이러한 API를 사용합니다. REPL을 사용하면 C#을 스크립트 언어로 사용하여 코드를 작성할 때 대화형으로 코드를 실행할 수 있습니다.

작업 영역 API

작업 영역 계층은 코드 분석을 수행하고 전체 솔루션을 통해 리팩터링하는 시작 지점인 작업 영역 API를 포함합니다. 파일을 구문 분석하고, 옵션을 구성하거나 프로젝트 간 종속성을 관리하지 않고도 컴파일러 계층 개체 모델에 대한 직접 액세스를 제공하여 솔루션의 프로젝트에 대한 모든 정보를 단일 개체 모델로 구성하는 데 도움을 줍니다.

또한 작업 영역 계층은 코드 분석을 구현하고 Visual Studio IDE와 같은 호스트 환경 내에서 작동하는 도구를 리팩터링할 때 사용되는 API 집합을 나타냅니다. 모든 참조 찾기, 서식 지정 및 코드 생성 API를 예로 들 수 있습니다.

이 계층에는 Visual Studio 구성 요소에 대한 종속성이 없습니다.