ScholarGate
Ассистент

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

Метапрограммирование рассматривает программы как данные, которые другие программы могут генерировать, инспектировать или преобразовывать, при этом макросы обеспечивают контролируемую синтаксическую абстракцию во время компиляции.

Найти тему в PaperMindСкороFind papers & topics
Tools & resources
Скачать слайды
Learn & explore
ВидеоСкоро

Definition

Метапрограммирование — это написание программ, которые производят, анализируют или преобразуют другие программы (или самих себя); макросы — это средство метапрограммирования, которое переписывает исходный синтаксис в расширенный код до или во время компиляции.

Scope

Эта тема охватывает методы, с помощью которых программы манипулируют программами: лексические и синтаксические макросы, гигиеническое расширение макросов, генерация кода во время компиляции, многостадийное программирование, рефлексия и шаблонные системы. В ней рассматривается, как эти механизмы расширяют синтаксис и абстракции языка, сохраняя при этом корректность, особенно в отношении захвата и связывания переменных.

Core questions

  • Как синтаксическая абстракция может расширить язык без небезопасного захвата имен?
  • Что отличает метапрограммирование во время компиляции от рефлексии во время выполнения?
  • Как многостадийное программирование разделяет генерацию программы и ее выполнение?
  • Когда метапрограммирование улучшает абстракцию, а когда вредит читаемости и инструментарию?

Key theories

Гигиеническое расширение макросов
Кольбеккер и его коллеги представили гигиенические макросы, которые автоматически переименовывают связанные переменные во время расширения, чтобы код, сгенерированный макросом, не мог случайно захватить или быть захваченным именами в месте использования.
Многостадийное программирование
Таха и Ширд формализовали стадийные вычисления с явными аннотациями, предоставив типизированное описание генерации и выполнения кода на различных этапах оценки.
Шаблонное метапрограммирование
Ширд и Пейтон Джонс добавили типизированное метапрограммирование во время компиляции в Haskell, позволяя программам строить и вставлять абстрактный синтаксис во время компиляции.

Clinical relevance

Макросы и метапрограммирование позволяют авторам библиотек создавать предметно-ориентированные абстракции, устранять шаблонный код и выполнять специализацию во время компиляции для повышения производительности. Дисциплина гигиены и стадийности делает эти мощные средства достаточно безопасными для повседневного использования.

History

Макросы появились в ранних версиях Lisp и ассемблера, но негигиеничные макросы Lisp были подвержены случайному захвату переменных. Гигиеническое расширение Кольбеккера 1986 года решило эту проблему, повлияв на синтаксические правила Scheme. Последующая работа формализовала многостадийное программирование (MetaML) и привнесла типизированное метапрограммирование во время компиляции в такие языки, как Haskell, Scala и Rust.

Debates

Мощность против понятности макросов
Разработчики языков взвешивают выразительную мощь неограниченной синтаксической абстракции против трудностей, которые она создает для читателей, отладчиков и инструментария, что мотивирует создание гигиеничных и дисциплинированных макросистем.

Key figures

  • Eugene Kohlbecker
  • Matthias Felleisen
  • Walid Taha
  • Tim Sheard
  • Simon Peyton Jones

Related topics

Seminal works

  • kohlbecker1986
  • taha2000
  • sheard2002
  • abelson1996

Frequently asked questions

Что делает макросистему гигиеничной?
Гигиеничная макросистема гарантирует, что идентификаторы, введенные макросом, не будут непреднамеренно захватывать или затенять идентификаторы в месте вызова, и наоборот, путем систематического переименования связанных переменных во время расширения.
Чем метапрограммирование отличается от обычных функций?
Обычные функции оперируют значениями времени выполнения, тогда как метапрограммирование оперирует представлениями программ, генерируя или преобразуя код, часто во время компиляции, до того, как появятся какие-либо значения времени выполнения.

Methods for this concept

Related concepts