컴파일러: 컴파일러는 한 프로그래밍 언어로 작성된 소스 코드(원본 언어)를 다른 프로그래밍 언어(대상 언어)로 변환하는 프로그램입니다. 컴파일은 소스 코드(보통 고수준 언어)에서 오브젝트 코드(보통 저수준 언어 또는 기계어)로 변환하는 과정으로, 컴퓨터나 가상 머신에서 직접 실행할 수 있습니다.
.NET 플랫폼에서는 모델 실행 단계가 다른 두 가지 컴파일러가 있습니다: 하나는 C#과 VB 코드를 어셈블리로 컴파일하는 Roslyn 컴파일러입니다. 다른 하나는 RyuJIT 컴파일러로, 어셈블리 내 IL(중간 언어) 코드를 기계어로 컴파일합니다.
이 글은 Roslyn 컴파일러부터 시작합니다. 우리는 그것이 어떻게 작동하는지 파고들 필요는 없지만, 그것이 어떻게 작동하는지 이해하고, 무엇에 사용될 수 있는지 알아야 합니다.
초기에는 C# 언어 컴파일러가 C++로 작성되었으나, 이후 Microsoft는 C# 자체로 작성된 새로운 컴파일러인 Roslyn을 도입했는데, 이는 부트스트랩 컴파일러입니다.
부트스트랩 컴파일러는 특정 프로그래밍 언어의 컴파일러가 그 언어 자체로 작성된다는 의미입니다. 각 부트스트랩 컴파일러 버전은 이전 버전과 함께 컴파일되지만, 첫 번째 버전은 C++로 작성된 컴파일러가 작성한 Roslyn의 첫 버전과 같이 다른 언어로 작성된 컴파일러에 의해 컴파일되어야 합니다. 많은 프로그래밍 언어가 성숙해져 C#, Go와 같이 해당 언어를 사용해 자체 컴파일러를 작성합니다.
.NET 플랫폼에서는 Roslyn 컴파일러가 C#과 VB 코드를 어셈블리로 컴파일하는 역할을 합니다.
기존의 대부분의 전통적인 컴파일러는 소스 코드를 실행 파일이나 라이브러리 파일로 변환하는 '블랙박스' 패턴이며, 그 사이에 무슨 일이 일어나는지 알 방법이 없습니다. Roslyn과 달리 Roslyn은 API를 통해 코드 컴파일 과정의 모든 단계에 접근할 수 있습니다.
작동 메커니즘은 파이프라인 기반이며, 네 단계로 구성되어 각 단계는 독립적인 모듈이고 각 모듈은 대응하는 API를 제공합니다. 통합 개발 환경(IDE)은 이러한 API를 활용하여 코드 하이라이트, 스마트 힌트, 리팩토링 도구, 성능 분석 도구 등 개발 효율성을 향상시키는 편리한 도구를 제공할 수 있습니다. 또한 Roslyn을 사용하면 개발자들이 자신의 프로그램에서 컴파일러를 서비스로 사용할 수 있습니다.
Roslyn이 제공하는 API를 활용해 동적으로 코드 샘플을 생성하세요
먼저, 새로운 ClassLibraryGenerator 라이브러리를 만들고 netstandard2.0 타겟 프레임워크 명칭(TFM)을 목표로 하는 .NET 표준 라이브러리 프로젝트를 만드세요. Microsoft.CodeAnalysis.Analyzers와 Microsoft.CodeAnalysis.CSharp 패키지를 추가하면, csproj는 다음과 같이 구성됩니다:
TestSourceGenerator.cs이라는 새로운 C# 파일을 만들어 다음 방식으로 자신만의 소스 생성기를 지정합니다:
컨텍스트 객체에서 컴파일된 진입점이나 Main 메서드에 접근할 수 있습니다. mainMethod 인스턴스는 메서드 또는 유사한 메서드(구성자, 디스트럭터, 연산자, 속성/이벤트 액세스 포함)의 심볼을 나타내는 IMethodSymbol입니다. Microsoft.CodeAnalysis.Compilation.GetEntryPoint 메서드는 프로그램의 진입점의 IMethodSymbol을 반환합니다. 다른 방법들은 프로젝트 내에서 어떤 메서드 기호든 찾을 수 있게 해줍니다. 이 객체에서는 네임스페이스(존재한다면)와 그 안에 포함된 타입을 추론할 수 있습니다. 이 예시의 소스는 생성할 소스 코드를 템플릿화하는 보간된 문자열이며, 보간된 빈틈이 포함된 네임스페이스와 타입 정보를 채웁니다. 프롬프트 이름과 함께 출처를 맥락에 추가하세요. 이 예시에서 빌더는 콘솔 애플리케이션에서 부분 메서드 구현을 포함하는 새로운 빌드 소스 파일을 생성합니다. 원하는 출처를 추가할 수 있는 소스 생성기를 작성할 수 있습니다.
다음 코드로 새로운 ConsoleApp4 콘솔 앱(최상위 문장 없음)을 생성하세요:
동시에 다음과 같이 ClassLibraryGenerator 프로젝트 참조를 추가하세요:
출력이 있는 콘솔 앱을 실행해 보세요:
Visual Studio에서 프로젝트 "Dependencies" - > "Analyzer" - > "ClassLibraryGenerator" - "ClassLibraryGenerator.TestSourceGenerator" > 클릭한 후, "Program.g.cs" 파일을 더블클릭하면 생성된 코드를 볼 수 있습니다.
프롬프트:빌더 코드를 수정하려면 Visual Studio를 재시작해야 볼 수 있습니다。
로슬린 GitHub 주소:하이퍼링크 로그인이 보입니다.
참조:
하이퍼링크 로그인이 보입니다.
하이퍼링크 로그인이 보입니다.
하이퍼링크 로그인이 보입니다. |