метапрограммированиe - ponyatov/nimbook GitHub Wiki
Метапрограммирование
https://wasm.in/blogs/meta-programmirovanie-nim-i-obfuskacija.706
Метапрограммирование -- программы которые пишут программы
Это вид программирования, связанный с созданием
- программ, которые порождают другие программы как результат своей работы
- на стадии компиляции исходного кода: компиляторы Nim поддерживают
compile time execution: когда часть кода запускается, и получает доступ к данным компилятора с возможностью их модификации
- язык шаблонов и генерики С++ (не надо распространять их на значение термина "метапрограммирование" в общем)
- генерация кода на произвольном целевом языке программирования:
выбор инструментального и целевого языков произволен, поэтому кодогенерация является самым мощным и гибким способом метапрограммирования
- желательна реализация и использование специализированного языка, который заточен исключительно на работу с исходным кодом как со структурой данных;
- в качестве примера можно привести Лисп, но он слишком низкоуровневый (списки), и имеет читаемый синтаксис (((((с((сс((скобки))))(())())))
- для представления исходного кода лучше всего подходят атрибутные графы (частный случай деревьев),
- в которых любой узел может одновременно хранить как именованные параметры (атрибуты, слоты), так и упорядоченный набор ссылок на другие подграфы
- см. дерево AST, атрибутные грамматики
- желательна реализация и использование специализированного языка, который заточен исключительно на работу с исходным кодом как со структурой данных;
- на стадии компиляции исходного кода: компиляторы Nim поддерживают
compile time execution: когда часть кода запускается, и получает доступ к данным компилятора с возможностью их модификации
- либо программ, которые меняют себя во время выполнения (самомодифицирующийся код).
Порождающее (генеративное) программирование
Порождающее программирование: программисты выражают то, что они хотят, в абстрактных понятиях, а генератор кода производит заданную систему или компонент .
Достоинства подхода
- разработка ПО ведется исключительно в терминах предметной области:
- DDD: Domain-Driven Design = Предметно-ориентированное проектирование
- Microsoft. Введение в проблемно-ориентированное проектирование
- для каждой задачи предпочтительна разработка специализированного языка для ёё описания:
- DSL: Domain Specific Language -> Языково-ориентированное программирование
- чтение и изменение DSL-кода доступно прикладным специалистам без навыков программирования: сложные детали по построению исполняемого кода из высокоуровневого описания берет на себя DSL-транслятор, и программист который его поддерживает
- синтаксис и семантика DSL выбирается произвольно, по вкусам и навыкам команды разработки (императивный/функциональный/декларативный код, привычки по синтаксису других языков)
- для одного DSL-описания можно сгенерировать
- любое количество реализаций с учётом индивиуальных требований каждого заказчика или даже пользовтеля
- код на произвольных целевых языках программирования, для разных стеков (JVM, десктоп, Linux, мобильное устройство)
- с учётом всех тонкостей платформ, на которых будет выполняться спроектированная система
- значительное снижение затрат и времени разработки
- гомоиконичные средства разработки, применяющие подход
код программы = данные
, позволяют:- автоматически генерироать и адаптировать программу
- пользователю адаптировать и дорабатывать ПО без пересборки всей системы
- ориентация на обобщенное представление знаний, объединяющее данные и способы их обработки (программы, алгоритмы)
- значительно уменьшает объем и сложность legacy кода, требующего модификации (ядро системы не изменяется, при изменении требований переписывается только высокоуровневая DSL-часть)
- гомоиконичные средства разработки, применяющие подход