Надіслати статтю
вул. Інститутська 11, м. Хмельницький, 29016

АНАЛІЗ ПІДХОДІВ ДО МЕТАПРОГРАМУВАННЯ В .N

ANALYSIS OF METAPROGRAMMING APPROACHES IN .NET

Сторінки: 262-267. Номер: №4, 2023 (323) 
Автори:
ПОЗУР МИХАЙЛО
Вінницький національний технічний університет
ORCID ID: 0009-0003-5225-2453
e-mail: mixalchik545@gmail.com
ВОЙТКО ВІКТОРІЯ
Вінницький національний технічний університет
ORCID: 0000-0002-3329-7256
e-mail: defakfki@i.ua
POZUR MYKHAYLO
Vinnytsia National Technical University
VOITKO VIKTORIIA
Vinnytsia National Technical University
DOI: https://www.doi.org/10.31891/2307-5732-2023-323-4-262-267

Анотація мовою мовою оригіналу

Розглянуто та проаналізовано сучасні підходи до метапрограмування, що використовуються в .NET. Одним із підходів є використання механізму рефлексії платформи .NET, що дозволяє працювати з метаданими програми в процесі виконання та підключати нові модулі. Такий підхід дозволяє узагальнити певний функціонал, що спрощує процес розробки, але використання рефлексії має негативний вплив на швидкодію додатку. Іншим підходом є використання функціоналу платформи .NET, що дозволяє генерацію коду під час виконання додатку. Для цього використовуються класи простору імен System.Reflection.Emit, які дозволяють генерувати CIL код. Проте такий підхід потребує знання CIL та особливостей роботи CLR, що ускладнює процес розробки і підтримки програми. В .NET є можливість генерації коду в процесі виконання додатку з використанням декларативного підходу за допомогою механізму виразів. Вирази в .NET являють собою окремі блоки, кожен з яких описує операцію над даними. Такі блоки об’єднуються в дерева виразів, що дозволяє описувати складні операції над даними. Дерево виразів може бути сформоване в процесі виконання додатку та скомпільоване, в результаті чого буде отримано лямбда функцію, що виконує описані виразами операції. Проте такий підхід не надає можливості контролювати процес генерації коду. Окрім генерації CIL, у .NET є механізми генерації вихідного коду різними мовами. В статті розглянуто генерацію коду мови програмування C#. Одним із підходів є використання класів простору імен System.CodeDom, що дозволяє генерацію та компіляцію вихідного коду в процесі виконання програми. Проте, компіляція опирається на використання .NET Framework компілятора, що робить неможливим повноцінне
використання такого підходу в нових версіях .NET. Підхід з використанням T4 дозволяє генерацію коду на основі шаблонів перед компіляцією додатку, що надає можливість виявляти синтаксичні помилки в згенерованому коді ще на етапі компіляції. Проте технологія T4 є частиною IDE Visual Studio, що робить її використання неможливим поза межами цієї IDE. Альтернативою T4 виступає технологія Source Generators, яка є частиною .NET Compiler Platform SDK. Оскільки Source Generators є частиною компілятора .NET, то процес генерації коду є складовою процесу компіляції додатку, що надає доступ до великої кількості метаданих. Проте використання Source Generators можливе лише в нових версіях .NET. Коректне поєднання підходів до метапрограмування дозволить створити ефективні інструменти для оптимізації процесу розробки .NET додатків.
Ключові слова: метапрограмування, .NET, C#, рефлексія, генерування коду, Reflection.Emit, Expression, System.CodeDom, T4, Source Generators, Roslyn.

 

Розширена анотація англійською   мовою

Modern approaches to metaprogramming used in .NET are reviewed and analyzed. One approach is to use the reflection mechanism of the .NET platform, which allows to work with application metadata at runtime and plug in new modules. This approach allows to generalize certain functionality, which simplifies the development process, but the use of reflection has a negative effect on the application performance. Another approach is to use the functionality of the .NET framework, which allows code generation in runtime. For this, the System.Reflection.Emit namespace classes are used, which allow generating CIL code. However, this approach requires knowledge of CIL and internals of CLR, which complicates the process of software development and maintenance. In .NET, it is also possible to generate code during the execution of the application using a declarative approach by utilizing the expression mechanism. Expressions in .NET are separate blocks, each of which describes an operation on data. Such blocks are combined into expression trees, which allows describing complex operation. Expression tree can be formed during the execution of the application and compiled, resulting in a lambda function that performs the operations described by the expressions. However, this approach does not provide an opportunity to control the code generation process. In addition to CIL generation, .NET has mechanisms for generating source code in various languages. The article deals with the generation of C# programming language code. One approach is to use classes in the System.CodeDom namespace, which allows source code to be generated and compiled at runtime. However, the compilation relies on the use of the .NET Framework compiler, which makes it impossible to fully use this approach in new versions of .NET. The approach using T4 allows the generation of code based on templates before compiling the application, which provides an opportunity to detect syntax errors in the generated code at the compilation stage. However, T4 technology is part of the Visual Studio IDE, which makes it impossible to use it outside of that IDE. An alternative to T4 is the Source Generators, which is part of the .NET Compiler Platform SDK. Since Source Generators are part of the .NET compiler, the code generation process is a component of the application compilation process that provides access to a large amount of metadata. However, using Source Generators is only possible in newer versions of .NET. The correct combination of approaches to metaprogramming will allow creating
effective tools for optimizing the development process of .NET applications.
Keywords: metaprogramming, .NET, C#, reflection, code generation, Reflection.Emit, Expression, System.CodeDom, T4, Source
Generators, Roslyn.

Post Author: Горященко Сергій

Translate