Метапрограммирование и макросы
Метапрограммирование рассматривает программы как данные, которые другие программы могут генерировать, инспектировать или преобразовывать, при этом макросы обеспечивают контролируемую синтаксическую абстракцию во время компиляции.
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
- Что делает макросистему гигиеничной?
- Гигиеничная макросистема гарантирует, что идентификаторы, введенные макросом, не будут непреднамеренно захватывать или затенять идентификаторы в месте вызова, и наоборот, путем систематического переименования связанных переменных во время расширения.
- Чем метапрограммирование отличается от обычных функций?
- Обычные функции оперируют значениями времени выполнения, тогда как метапрограммирование оперирует представлениями программ, генерируя или преобразуя код, часто во время компиляции, до того, как появятся какие-либо значения времени выполнения.