метапрограммированиe - ponyatov/nimbook GitHub Wiki

Метапрограммирование

https://wasm.in/blogs/meta-programmirovanie-nim-i-obfuskacija.706

Метапрограммирование -- программы которые пишут программы

Это вид программирования, связанный с созданием

  • программ, которые порождают другие программы как результат своей работы
    • на стадии компиляции исходного кода: компиляторы Nim поддерживают compile time execution: когда часть кода запускается, и получает доступ к данным компилятора с возможностью их модификации
      • язык шаблонов и генерики С++ (не надо распространять их на значение термина "метапрограммирование" в общем)
    • генерация кода на произвольном целевом языке программирования: выбор инструментального и целевого языков произволен, поэтому кодогенерация является самым мощным и гибким способом метапрограммирования
      • желательна реализация и использование специализированного языка, который заточен исключительно на работу с исходным кодом как со структурой данных;
        • в качестве примера можно привести Лисп, но он слишком низкоуровневый (списки), и имеет читаемый синтаксис (((((с((сс((скобки))))(())())))
        • для представления исходного кода лучше всего подходят атрибутные графы (частный случай деревьев),
          • в которых любой узел может одновременно хранить как именованные параметры (атрибуты, слоты), так и упорядоченный набор ссылок на другие подграфы
          • см. дерево AST, атрибутные грамматики
  • либо программ, которые меняют себя во время выполнения (самомодифицирующийся код).

Порождающее (генеративное) программирование

Порождающее программирование: программисты выражают то, что они хотят, в абстрактных понятиях, а генератор кода производит заданную систему или компонент .

Порождающее программирование методы, инструменты, применение by Айзенекер У., Чарнецки К. (z-lib.org).djvu

Достоинства подхода

  • разработка ПО ведется исключительно в терминах предметной области:
  • для каждой задачи предпочтительна разработка специализированного языка для ёё описания:
    • DSL: Domain Specific Language -> Языково-ориентированное программирование
    • чтение и изменение DSL-кода доступно прикладным специалистам без навыков программирования: сложные детали по построению исполняемого кода из высокоуровневого описания берет на себя DSL-транслятор, и программист который его поддерживает
    • синтаксис и семантика DSL выбирается произвольно, по вкусам и навыкам команды разработки (императивный/функциональный/декларативный код, привычки по синтаксису других языков)
  • для одного DSL-описания можно сгенерировать
    • любое количество реализаций с учётом индивиуальных требований каждого заказчика или даже пользовтеля
    • код на произвольных целевых языках программирования, для разных стеков (JVM, десктоп, Linux, мобильное устройство)
    • с учётом всех тонкостей платформ, на которых будет выполняться спроектированная система
  • значительное снижение затрат и времени разработки
    • гомоиконичные средства разработки, применяющие подход код программы = данные, позволяют:
      • автоматически генерироать и адаптировать программу
      • пользователю адаптировать и дорабатывать ПО без пересборки всей системы
    • ориентация на обобщенное представление знаний, объединяющее данные и способы их обработки (программы, алгоритмы)
      • значительно уменьшает объем и сложность legacy кода, требующего модификации (ядро системы не изменяется, при изменении требований переписывается только высокоуровневая DSL-часть)

Ссылки