МЕТОД ДИНАМІЧНИХ ВИКЛИКІВ В .NET ШЛЯХОМ ГЕНЕРАЦІЇ ВИХІДНОГО КОДУ НА ЕТАПІ КОМПІЛЯЦІЇ
DOI:
https://doi.org/10.35546/kntu2078-4481.2025.2.2.13Ключові слова:
метапрограмування, .NET, рефлексія, генерація коду, Source GeneratorsАнотація
У статті розглядається метод здійснення динамічних викликів в .NET шляхом генерації коду на етапі компіляції. Проаналізовано традиційний механізм здійснення динамічних викликів у .NET, що базується на використанні рефлексії. Визначено, що ключовим недоліком такого підходу є швидкодія, що обумовлює необхідність пошуку альтернативного рішення для здійснення динамічних викликів. Проведено огляд останніх публікацій на тему оптимізації динамічних викликів у .NET. У результаті аналізу визначено, що низка існуючих рішень описує лише сам процес здійснення виклику, але не розглядає зберігання згенерованих функцій та структуру, яка б дозволила забезпечити їх повторне використання. Розглянуто рішення, що опирається на генерацію метаданих на етапі компіляції та асоціацію цих метаданих з відповідними статичними викликами. Запропоновано рішення, що також базується на генерації метаданих під час компіляції та їх асоціації зі статичними викликами.Перевагою запропонованого рішення над існуючими є можливість здійснення динамічних викликів для об’єктів, які приведені до одного з базових типів, що розширює перелік сценаріїв застосування. Досягнути цього вдалося за рахунок використання структури метаданих, яка є подібною до рефлексії. Генерація метаданих реалізована з використанням Incremental Source Generators, що дозволяє забезпечити ефективну генерацію коду. Метод передбачає використання комбінації з двох генераторів коду, один з яких відповідає за генерацію самих метаданих, а інший – за генерацію коду об’єднання цих метаданих в одну структуру. Для визначення типів даних, для яких необхідно виконувати генерацію, запропоновано використовувати як атрибути метаданих, так і спеціально визначені методи, що в якості аргументів приймають тип даних. Це дозволило використання запропонованого методу як для типів даних, визначених у контексті поточного синтаксичного дерева, так і для типів даних, що належать до зовнішніх бібліотек. Швидкодію розробленого методу було перевірено з використанням бібліотеки Benchmark.NET, у результаті чого встановлено, що запропонований метод має вищу швидкодію в порівнянні з рефлексією.
Посилання
Bock J., Hazzard K. Metaprogramming In.NET. Manning Publications Co. LLC, 2012.
Ingebrigtsen E. Metaprogramming in C#: Automate Your.NET Development and Simplify Overcomplicated Code. Packt Publishing, Limited, 2023.
Beaumont A., Bakhtiari Bastaki B. An Investigation into the Prevalence of Reflection Techniques in Distributed Microsoft.Net NuGet Artefacts. ICSCA 2022: 2022 11th International Conference on Software and Computer Applications, м. Melaka Malaysia. New York, NY, USA, 2022. URL: https://doi.org/10.1145/3524304.3524329
Warren M. Why is reflection slow?. URL: https://mattwarren.org/2016/12/14/Why-is-Reflection-slow/ (дата звернення: 17.05.2025).
Haytam Z. C# Expression Trees: Property Getters. URL: https://blog.zhaytam.com/2020/11/17/expression-trees-property-getter/ (дата звернення: 17.05.2025).
Ricardo Peres. Using Generated Methods Instead of Reflection. URL: https://weblogs.asp.net/ricardoperes/using- generated-methods-instead-of-reflection (дата звернення: 17.05.2025).
Silin S. Reflection via source generators. URL: https://dev.to/byme8/aot-reflection-4ijb (дата звернення: 17.05.2025).
Microsoft. Introducing C# Source Generators. URL: https://devblogs.microsoft.com/dotnet/introducing-c-source-generators/ (дата звернення: 17.05.2025).
Reflekt: a Library for Compile-Time Reflection in Kotlin / A. Birillo та ін. 2022 IEEE/ACM 44th International Conference on Software Engineering: Software Engineering in Practice (ICSE-SEIP), м. Pittsburgh, PA, USA, 22–24 трав. 2022 р. 2022. URL: https://doi.org/10.1109/icse-seip55303.2022.9793932
Gerr P. Incremental Roslyn Source Generators In.NET 6. URL: https://www.thinktecture.com/net/roslyn-source-generators-introduction/ (дата звернення: 17.05.2025).
BenchmarkDotNet. URL: https://benchmarkdotnet.org/index.html (дата звернення: 17.05.2025).
##submission.downloads##
Опубліковано
Номер
Розділ
Ліцензія

Ця робота ліцензується відповідно до Creative Commons Attribution 4.0 International License.






