소스 생성기 및 정규식 | Steven Giesel

제가 좋아하는 Steven Giesel님의 (어제는 온라인으로 커피를 사드렸습니다 ^^) Source Generators and Regular Expressions을 읽기 쉽도록 번역하였습니다.

소스 생성기는 점점 더 .NET 에코시스템에서 필수적인 부분이 되고 있습니다. 하지만 모두가 좋아하는 정규식과 어떻게 함께 사용할 수 있을까요?

이 블로그 게시물에서는 소스 생성기를 정규식과 함께 활용하여 디버깅이 가능하면서도 성능이 뛰어난 정규식을 실행하는 방법에 대해 자세히 알아보겠습니다!

소스 생성기 및 정규식

.NET 7부터는 정규식에 소스 코드 생성기를 사용할 수 있습니다. 첫 번째 질문은 소스 코드 생성기란 무엇인가요? 여기 공식 Microsoft 페이지를 인용할 수 있습니다.

… 소스 생성기를 사용하면 C# 개발자가 컴파일 중인 사용자 코드를 검사할 수 있습니다. 생성기는 사용자 컴파일에 추가되는 새 C# 소스 파일을 즉시 생성할 수 있습니다. 이렇게 하면 컴파일 중에 실행되는 코드를 갖게 됩니다. 프로그램을 검사하여 나머지 코드와 함께 컴파일되는 추가 소스 파일을 생성합니다.

간단히 말해서 소스 코드 생성기는 빌드 프로세스에 연결하여 추가 내용을 생성할 수 있습니다. 바로 이 지점에서 정규 표현식이 시작됩니다. 정규식을 정의하면 해당 정규식을 코드로 표현할 수 있습니다. 이것은 빌드 버튼을 누를 때 발생합니다.

기존 접근 방식에 비해 장점은 new Regex("...", RegexOptions.Compiled)와 동일한 성능과 Regex.CompileToAssembly의 시작 이점을 얻을 수 있지만 CompileToAssembly의 복잡성 없이도 가능하다는 것입니다. 코드가 생성되면 코드를 보고 디버깅할 수 있습니다.

따라서 이 코드 대신,

private static readonly Regex HelloOrWorldCompiled =
        new("Hello|World", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);

다음과 같이 작성할 수 있습니다.

[GeneratedRegex("Hello|World", RegexOptions.IgnoreCase | RegexOptions.CultureInvariant)]
private static partial Regex HelloOrWorldGenerator();

여기에는 두 가지가 필수적입니다.

  1. GeneratedRegexAttribute 을 사용하여 소스 코드 생성기가 어디에 연결해야 하는지 알려줘야 합니다.
  2. 이제 필드 대신 partial 메서드를 사용합니다. 그 이유는 소스 코드 생성기가 무언가를 확장해야 하기 때문입니다. 필드는 확장할 수 없지만 partial 메서드는 확장할 수 있습니다.

이제 생성된 버전에서 RegexOptions.Compiled 플래그를 생략한 것을 눈치채셨을 것입니다. 왜 그랬을까요? 이 플래그는 애플리케이션이 시작될 때 정규식을 컴파일하도록 .NET 런타임에 지시하기 때문입니다. 이제 이 플래그는 어셈블리의 일부가 되며, 새로운 소스 코드 생성기를 사용하면 항상 그렇게 됩니다. 더 이상 "즉석"은 없습니다.

사용법은 거의 동일합니다.

HelloOrWorldCompiled.Match(SomeText);

HelloOrWorldGenerator().Match(SomeText);

완전히 동일하게 작동하며 동일한 기능을 제공합니다. 한 가지 멋진 점은 소스 코드 생성기가 정확히 무엇을 하는지 설명하는 XML 문서도 생성한다는 점입니다.

image

결론

새로운 정규식 소스 코드 생성기는 .NET 에코시스템에 추가된 훌륭하고 편리한 기능입니다. 필요한 경우 직접 디버깅할 수도 있습니다.


3개의 좋아요