Аналіз інструментів метапрограмування в мовах програмування загального призначення
Автор
Ставицький, П. В.
Войтко, В. В.
Романюк, О. Н.
Stavytskyi, P. V.
Voitko, V. V.
Romanyuk, O. N.
Дата
2022Metadata
Показати повну інформаціюCollections
Анотації
Розглянуто та проаналізовано сучасні методи метапрограмування, що використовуються у мовах загального призначення. Підхід метапрограмування використовується для багатьох сценаріїв роботи з кодом програм, важливим серед них є генерування вихідного коду. Кожна мова програмування включає окремий набір інструментарію для вирішення завдань метапрограмування. Одним з методів метапрограмування є побудова процесорів анотацій, проте тут не визначаються особливості генерування коду. Іншим методом є побудова плагінів компіляторів, що є можливим у мовах програмування типу Kotlin. Інтерфейс плагінів може надавати доступ до багатьох стадій компіляції програм, проте їх недоліком є підвищена складність програм, що значно впливає на швидкість розробки й на швидкодію роботи результуючого програмного забезпечення. Технології типу KotlinPoet та JavaPoet до-зволяють генерувати текст вихідних програм з частковим дотриманням безпечної типізації на рівні інструкцій. Недоліком таких технологій є значна відмінність коду програми, що виконує генерування, від вихідного згенерованого коду, що підвищує складність роботи з цим інструментом та загальне когнітивне навантаження. На противагу їм можна використовувати рядки з механізмом інтерполяції, що забезпечують декларативність, проте тут відсутня валідація типів. Мови програмування типу MetaOCaml, Scala реалізують механізми метапрограмування й багатоетапного програмування, зокрема, на рівні синтаксису з використанням конструкцій цитування і зрощування та механізмів вбудовування і макросів. Макроси присутні також у мовах С та С++, вони за допомогою директив препроцесора дозволяють виконувати попереднє перетворення коду перед основною стадією компіляції. Коректне поєднання елементів метапрограмування дозволить створити універсальний підхід до використання функціоналу декларативного метапрограмування, що надасть потужний інструментарій для масштабування обсягів генерованого коду і підвищить якість кінцевого програмного продукту. Modern methods of metaprogramming used in general-purpose languages are considered and analyzed. The metaprogramming approach is used for many scenarios of working with program code, but one of them is source code generation. Each programming language includes a unique set of tools for solving metaprogramming tasks. One of the methods of metaprogramming is the construction of annotation processors, however, they do not define the specifics of code generation. Another method is writing compiler plugins, which is possible in programming languages like Kotlin. The plugin interface can provide access to many stages of program compilation, but their disadvantage is the increased complexity of programs, which significantly affects the speed of development and the performance of the resulting software. Technologies such as KotlinPoet and JavaPoet allow generating the text of source programs with partial type safety at the level of statements. The disadvantage of such technologies is the significant difference between the code of the program that performs the generation and the original generated code, which increases the complexity of working with this tool and the overall cognitive load. In contrast to them, it is possible to use strings with an interpolation mechanism that provides declarativeness, but at the cost of type validation. Programming languages such as MetaOCaml and Scala implement mechanisms of metaprogramming and multi-stage programming, in particular, at the syntax level using quoting and splicing constructions and mechanisms of inlining and macros. Macros are also present in the C and C++ languages, they allow preprocessor directives to perform pre-transformation of the code before the main stage of compilation. The correct combination of metaprogramming elements will allow creating a universal approach to the use of a declarative metaprogramming functionality, which will provide a powerful toolkit for scaling the amount of generated code and increase the quality of the final software product.
URI:
http://ir.lib.vntu.edu.ua//handle/123456789/36540