Здравствуйте, lseder, Вы писали:
L>Привет, L> Что же такое мета-программирование ? Макросы для генерации кода ? L>Можно ваше определение, для чего служит, как может выглядеть.
Программирование на этапе компиляции.
Разные языки программирования имеют разные для этого возможности.
К примеру, вот код на C++ для вычисления факториала:
#include <iostream>
template <int n>
struct factorial
{
enum
{
value = n * factorial<n - 1>::value
};
};
template <>
struct factorial<1>
{
enum
{
value = 1
};
};
int main()
{
std::cout << "Factorial of 10 is " << factorial<10>::value << std::endl;
return 0;
}
Factorial of 10 is 3628800
factorial<10>::value вычисляется на этапе компиляции, а не в рантайме.
Из наиболее очевидных применений — написание разнообразных статических проверок.
К примеру, есть следующий класс:
template <typename T_Type>
class foo
{
// ...
};
Допустим, по каким-то причинам нам понадобилось запретить использование foo<T_Type>,
когда T_Type является указателем.
Попробуем написать такую специализацию, которая при инстанциировании заставила бы
компилятор сгенерировать ошибочный код:
template <typename T_Type>
class foo<T_Type *>;
Вот и все ! Этот пустой тип будет "срабатывать" каждый раз, когда T_Type будет указателем.
foo<bool>, foo<int>, foo<some_class> или даже foo<foo<foo<some_class> > > являются допустимыми формами.
А вот при написании foo<int *> или foo<char *> получим ошибку на стадии компиляции.
Обычно такие классы-стражи именуются соответствующим образом (must_not_be_pointer, к примеру),
чтобы их легче было понять, увидев в списке ошибок.
Здравствуйте, lseder, Вы писали:
L> Что же такое мета-программирование ? Макросы для генерации кода ? L>Можно ваше определение, для чего служит, как может выглядеть.
Метапрограммирование — вид программирования, связанный с созданием программ, которые порождают другие программы как результат своей работы (в частности, на стадии компиляции их исходного кода), либо программ, которые меняют себя во время выполнения (самомодифицирующийся код).[источник не указан 813 дней] Первое позволяет получать программы при меньших затратах времени и усилий на кодирование, чем если бы программист писал их вручную целиком, второе позволяет улучшить свойства кода (размер и быстродействие).
Макросы — это один из вариантов. Самый продвинутый, но не принятых в статически типизированных мэйнстрим-языках.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, lseder, Вы писали:
L>как может выглядеть.
Простой пример:
Нужен класс-обертка. Генерируем, а не пишем.
развитые IDE умеют такое делать, и выдают окончательный код
поэтому:
Сложный пример:
Есть реляционная база данных, есть потребность в UI к ней.
Пишем генераторы классов по структуре таблиц, (развитые RAD, CASE средства умеют частично это делать, и выдают код)
а в UI подсистеме пишем генераторы UI компонент для типичных отображений классов содержащих данные из БД.
(развитые RAD, CASE средства умеют частично это делать, и выдают код)
В итоге — уменьшаем количество кода, упрощаем его изменения. (развитые RAD, CASE средства умеют частично это делать, обычно если код не правился)
Потому что нам не нужно вносить изменения в "рабочий" код, у нас есть более краткий код, который генерирует этот рабочий код.
Пока что лучшее определение процитировал Влад.
Я бы обобщил — метапрограммирование, на мой взгляд, это возможность программной манипуляции элементами программ.
Ну, то есть "обычная программа" работает со, скажем, числами и строками. (намеренное упрощение).
Мы можем развивать способность языка по выражению операций над этими "пассивными объектами".
А можем ввести в язык/платформу управление фрагментами программного кода как первоклассными сущностями. Скажем, в большинство функциональных языков встроено метапрограммирование с самого начала — там можно определять функции высшего порядка.
В современных ОО-платформах мы имеем похожие возможности по программному манипулированию классами и методами.
Могут предоставляться разные по объему возможности — скажем, возможности читать метаданные традиционно называются рефлексией.
Платформа может предоставлять заведомо неудобные (Reflection.Emit) или неполные (System.CodeDom) возможности по порождению нового кода. А может — и более удобные.
В какой момент исполняется этот мета-код, собственно, не важно. Точно так же, как для обычного кода, мы ждём от хорошего компилятора умения вычислять всё, что можно, в компайл-тайме. Но можно делать то же самое и в ран-тайме, а некоторые вещи без ран-тайма сделать и не получится.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
VD>Метапрограммирование — вид программирования, связанный с созданием программ, которые порождают другие программы как результат своей работы (в частности, на стадии компиляции их исходного кода), либо программ, которые меняют себя во время выполнения (самомодифицирующийся код).[источник не указан 813 дней] Первое позволяет получать программы при меньших затратах времени и усилий на кодирование, чем если бы программист писал их вручную целиком, второе позволяет улучшить свойства кода (размер и быстродействие).
) Спасибо, там в конце ссылка на ссылка на "Статья об ещё одном подходе к метапрограммированию", где главным смыслом
является — "Metaprogramming is the only known way to reduce the complexity significantly."
То есть мп, это единственный способ управления сложностью (в нашем случае — программирования).
Здравствуйте, lseder, Вы писали:
L>) Спасибо, там в конце ссылка на ссылка на "Статья об ещё одном подходе к метапрограммированию", где главным смыслом L>является — "Metaprogramming is the only known way to reduce the complexity significantly." L>То есть мп, это единственный способ управления сложностью (в нашем случае — программирования).
Да, нет. Есть и другие пути. Тут ключевое слово significantly.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
VD>Метапрограммирование — вид программирования, связанный с созданием программ, которые порождают другие программы как результат своей работы (в частности, на стадии компиляции их исходного кода), либо программ, которые меняют себя во время выполнения (самомодифицирующийся код).[источник не указан 813 дней] Первое позволяет получать программы при меньших затратах времени и усилий на кодирование, чем если бы программист писал их вручную целиком, второе позволяет улучшить свойства кода (размер и быстродействие).
Какое-то не очень полное определение. А верификация или трансформация программ на этапе компиляции разве не является метапрограммированием?
VD>>Метапрограммирование — вид программирования, связанный с созданием программ, которые порождают другие программы как результат своей работы (в частности, на стадии компиляции их исходного кода), либо программ, которые меняют себя во время выполнения (самомодифицирующийся код).[источник не указан 813 дней] Первое позволяет получать программы при меньших затратах времени и усилий на кодирование, чем если бы программист писал их вручную целиком, второе позволяет улучшить свойства кода (размер и быстродействие).
0>Какое-то не очень полное определение. А верификация или трансформация программ на этапе компиляции разве не является метапрограммированием?
Верификация — не является. Трансформация — является, и полностью подпадает под определение.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, lseder, Вы писали:
S>Пока что лучшее определение процитировал Влад. S>Я бы обобщил — метапрограммирование, на мой взгляд, это возможность программной манипуляции элементами программ. S>В какой момент исполняется этот мета-код, собственно, не важно. Точно так же, как для обычного кода, мы ждём от хорошего компилятора умения вычислять всё, что можно, в компайл-тайме. Но можно делать то же самое и в ран-тайме, а некоторые вещи без ран-тайма сделать и не получится.
Под таким углом зрения метапрограммирование = смешанные вычисления.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, VladD2, Вы писали:
0>>Какое-то не очень полное определение. А верификация или трансформация программ на этапе компиляции разве не является метапрограммированием? VD>Верификация — не является.
Программа, получающая на вход другую программу и выдающая вердикт разве не является метапрограммой?
Здравствуйте, LaptevVV, Вы писали:
S>>Я бы обобщил — метапрограммирование, на мой взгляд, это возможность программной манипуляции элементами программ. S>>В какой момент исполняется этот мета-код, собственно, не важно. Точно так же, как для обычного кода, мы ждём от хорошего компилятора умения вычислять всё, что можно, в компайл-тайме. Но можно делать то же самое и в ран-тайме, а некоторые вещи без ран-тайма сделать и не получится. LVV>Под таким углом зрения метапрограммирование = смешанные вычисления.
Да ну откуда же?
Смешанные вычисления — это автоматизированное получение из программы А, определённой на множестве Д, программы A', определённой на множестве Д', причём Д' входит в Д.
Причём процесс получения этой программы может являться вполне себе статическим.
Метапрограммирование не ограничивается вопросами оптимизации при сужении области определения.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, 0x7be, Вы писали:
0>Здравствуйте, VladD2, Вы писали:
0>>>Какое-то не очень полное определение. А верификация или трансформация программ на этапе компиляции разве не является метапрограммированием? VD>>Верификация — не является. 0>Программа, получающая на вход другую программу и выдающая вердикт разве не является метапрограммой?
Нет. Контр пример: программа grep которая получила на вход cs файл с программой на C#.
Здравствуйте, hardcase, Вы писали:
0>>Программа, получающая на вход другую программу и выдающая вердикт разве не является метапрограммой? H>Нет. Контр пример: программа grep которая получила на вход cs файл с программой на C#.
Хм. А программа sed является инструментом метапрограммирвоания? Формально она подходит: может получить на вход cs и выдать модифицированный cs.
Здравствуйте, 0x7be, Вы писали: H>>Нет. Контр пример: программа grep которая получила на вход cs файл с программой на C#. 0>Хм. А программа sed является инструментом метапрограммирвоания? Формально она подходит: может получить на вход cs и выдать модифицированный cs.
Формально говоря — да. Но попытка опуститься до такого уровня ничего хорошего нам не даст: с точки зрения машины Тьюринга, нет отличий между метапрограммированием и программированием. То же самое имеем с точки зрения архитектуры фон Неймана.
Поэтому под метапрограммированием обычно подразумевают нечто большее, чем возможность получить сырой текст программы или сырой бинарный код, и произвести какие-то манипуляции. Хочется возможности выражать мета-конструкции относительно компактно и понятно. Вот в Лиспе, скажем, пошли по простому пути: метапрограммирование очень низкоуровневое, но там и программирование низкоуровневое. Поскольку синтаксиса нет, то не нужно заморачиваться со сложными AST. Для метапрограммирования достаточно уметь обрабатывать списки.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, IT, Вы писали:
IT>А как выглядит мета-мета-программирование?
Очевидно, это программирование тех, кто занимается метапрограммированием.
Ты наблюдаешь его прямо сейчас в этом топике.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>Поэтому под метапрограммированием обычно подразумевают нечто большее, чем возможность получить сырой текст программы или сырой бинарный код, и произвести какие-то манипуляции. Хочется возможности выражать мета-конструкции относительно компактно и понятно. Вот в Лиспе, скажем, пошли по простому пути: метапрограммирование очень низкоуровневое, но там и программирование низкоуровневое. Поскольку синтаксиса нет, то не нужно заморачиваться со сложными AST. Для метапрограммирования достаточно уметь обрабатывать списки.
Ок, рассмотрим другой пример: Microsoft Code Analysis, встроенный в студию (бывший FxCop) — это метапрограмма или нет?
Здравствуйте, 0x7be, Вы писали:
0>Ок, рассмотрим другой пример: Microsoft Code Analysis, встроенный в студию (бывший FxCop) — это метапрограмма или нет?
Да. И любой компилятор — это метапрограмма.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
0>>Ок, рассмотрим другой пример: Microsoft Code Analysis, встроенный в студию (бывший FxCop) — это метапрограмма или нет? S>Да. И любой компилятор — это метапрограмма.
Вот мы с Владом и поспорили на этот счет.
Он считает, что программа, верифицирующая другие программы, метапрограммой не является.
А я считаю, что является.