Аналіз інструментів метапрограмування в мовах програмування загального призначення
Павло Ставицький, Вікторія Войтко, Олександр РоманюкРозглянуто та проаналізовано сучасні методи метапрограмування, що використовуються у мовах загального призначення. Підхід метапрограмування використовується для багатьох сценаріїв роботи з кодом програм, важливим серед них є генерування вихідного коду. Кожна мова програмування включає окремий набір інструментарію для вирішення завдань метапрограмування. Одним з методів метапрограмування є побудова процесорів анотацій, проте тут не визначаються особливості генерування коду. Іншим методом є побудова плагінів компіляторів, що є можливим у мовах програмування типу Kotlin. Інтерфейс плагінів може надавати доступ до багатьох стадій компіляції програм, проте їх недоліком є підвищена складність програм, що значно впливає на швидкість розробки й на швидкодію роботи результуючого програмного забезпечення. Технології типу KotlinPoet та JavaPoet дозволяють генерувати текст вихідних програм з частковим дотриманням безпечної типізації на рівні інструкцій. Недоліком таких технологій є значна відмінність коду програми, що виконує генерування, від вихідного згенерованого коду, що підвищує складність роботи з цим інструментом та загальне когнітивне навантаження. На противагу їм можна використовувати рядки з механізмом інтерполяції, що забезпечують декларативність, проте тут відсутня валідація типів. Мови програмування типу MetaOCaml, Scala реалізують механізми метапрограмування й багатоетапного програмування, зокрема, на рівні синтаксису з використанням конструкцій цитування і зрощування та механізмів вбудовування і макросів. Макроси присутні також у мовах С та С++, вони за допомогою директив препроцесора дозволяють виконувати попереднє перетворення коду перед основною стадією компіляції. Коректне поєднання елементів метапрограмування дозволить створити універсальний підхід до використання функціоналу декларативного метапрограмування, що надасть потужний інструментарій для масштабування обсягів генерованого коду і підвищить якість кінцевого програмного продукту
Використані джерела
[1] Juarez-Martinez, U., & Olmedo-Aguirre, J.O. (2008). A join point model for fine-grained aspects. In Proceedings of the 2nd conference on European computing conference (ECC'08) (pp. 126-131). Stevens Point: World Scientific and Engineering Academy and Society (WSEAS).
[2] Lureau, G. (2020). Ktlint: a great 1st experience. Retrieved from https://www.glureau.com/2020/05/26/Ktlint-Moshi-Introduction.
[3] Theodoridis, T., Grosser, T., & Su, Z. (2022). Understanding and exploiting optimal function inlining. In 27th ACM international conference on architectural support for programming languages and operating systems (ASPLOS '22) (pp. 977-989). New York: Association for Computing Machinery.
[4] Medeiros, F., Ribeiro, M., Gheyi, R., Apel, S., Kästner, C., Ferreira, B., Carvalho, L., & Fonseca, B. (2018). Discipline matters: Refactoring of preprocessor directives in the #ifdef Hell. IEEE Transactions on Software Engineering, 44, 453-469.
[5] Kiselyov, O. (2014). The design and implementation of BER MetaOCaml. In M. Codish & E. Sumii (Eds.), Functional and logic programming. FLOPS 2014. Lecture notes in computer science (Vol 8475, pp 86-102). Cham: Springer. doi: 10.1007/978-3-319-07151-0_6
[6] Larjani, P. (2010). On meta programming and code generation in F. Retrieved from https://imps.mcmaster.ca/pouyalarjani/fscodegen.pdf.