Что такое мета-программирование ?
От: lseder lseder.livejournal.com
Дата: 01.11.11 16:49
Оценка:
Привет,
Что же такое мета-программирование ? Макросы для генерации кода ?
Можно ваше определение, для чего служит, как может выглядеть.
Re: Что такое мета-программирование ?
От: okman Беларусь https://searchinform.ru/
Дата: 01.11.11 18:19
Оценка: -1
Здравствуйте, 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, к примеру),
чтобы их легче было понять, увидев в списке ошибок.
Re: Что такое мета-программирование ?
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.11.11 18:47
Оценка: 1 (1) +1
Здравствуйте, lseder, Вы писали:

L> Что же такое мета-программирование ? Макросы для генерации кода ?

L>Можно ваше определение, для чего служит, как может выглядеть.

На подобные вопросы ответы лучше искать википедии:

Метапрограммирование — вид программирования, связанный с созданием программ, которые порождают другие программы как результат своей работы (в частности, на стадии компиляции их исходного кода), либо программ, которые меняют себя во время выполнения (самомодифицирующийся код).[источник не указан 813 дней] Первое позволяет получать программы при меньших затратах времени и усилий на кодирование, чем если бы программист писал их вручную целиком, второе позволяет улучшить свойства кода (размер и быстродействие).


Макросы — это один из вариантов. Самый продвинутый, но не принятых в статически типизированных мэйнстрим-языках.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Что такое мета-программирование ?
От: Skynin Украина skynin.blogspot.com
Дата: 02.11.11 05:48
Оценка: +1
Здравствуйте, lseder, Вы писали:

L>как может выглядеть.


Простой пример:
Нужен класс-обертка. Генерируем, а не пишем.

развитые IDE умеют такое делать, и выдают окончательный код
поэтому:

Сложный пример:
Есть реляционная база данных, есть потребность в UI к ней.
Пишем генераторы классов по структуре таблиц, (развитые RAD, CASE средства умеют частично это делать, и выдают код)
а в UI подсистеме пишем генераторы UI компонент для типичных отображений классов содержащих данные из БД.
(развитые RAD, CASE средства умеют частично это делать, и выдают код)
В итоге — уменьшаем количество кода, упрощаем его изменения. (развитые RAD, CASE средства умеют частично это делать, обычно если код не правился)
Потому что нам не нужно вносить изменения в "рабочий" код, у нас есть более краткий код, который генерирует этот рабочий код.
Re: Что такое мета-программирование ?
От: Sinclair Россия https://github.com/evilguest/
Дата: 07.11.11 04:26
Оценка:
Здравствуйте, lseder, Вы писали:

Пока что лучшее определение процитировал Влад.
Я бы обобщил — метапрограммирование, на мой взгляд, это возможность программной манипуляции элементами программ.

Ну, то есть "обычная программа" работает со, скажем, числами и строками. (намеренное упрощение).
Мы можем развивать способность языка по выражению операций над этими "пассивными объектами".
А можем ввести в язык/платформу управление фрагментами программного кода как первоклассными сущностями. Скажем, в большинство функциональных языков встроено метапрограммирование с самого начала — там можно определять функции высшего порядка.
В современных ОО-платформах мы имеем похожие возможности по программному манипулированию классами и методами.

Могут предоставляться разные по объему возможности — скажем, возможности читать метаданные традиционно называются рефлексией.
Платформа может предоставлять заведомо неудобные (Reflection.Emit) или неполные (System.CodeDom) возможности по порождению нового кода. А может — и более удобные.

В какой момент исполняется этот мета-код, собственно, не важно. Точно так же, как для обычного кода, мы ждём от хорошего компилятора умения вычислять всё, что можно, в компайл-тайме. Но можно делать то же самое и в ран-тайме, а некоторые вещи без ран-тайма сделать и не получится.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Что такое мета-программирование ?
От: lseder lseder.livejournal.com
Дата: 07.11.11 16:29
Оценка:
VD>На подобные вопросы ответы лучше искать википедии:
VD>

VD>Метапрограммирование — вид программирования, связанный с созданием программ, которые порождают другие программы как результат своей работы (в частности, на стадии компиляции их исходного кода), либо программ, которые меняют себя во время выполнения (самомодифицирующийся код).[источник не указан 813 дней] Первое позволяет получать программы при меньших затратах времени и усилий на кодирование, чем если бы программист писал их вручную целиком, второе позволяет улучшить свойства кода (размер и быстродействие).


) Спасибо, там в конце ссылка на ссылка на "Статья об ещё одном подходе к метапрограммированию", где главным смыслом
является — "Metaprogramming is the only known way to reduce the complexity significantly."
То есть мп, это единственный способ управления сложностью (в нашем случае — программирования).
Re[3]: Что такое мета-программирование ?
От: VladD2 Российская Империя www.nemerle.org
Дата: 07.11.11 22:33
Оценка:
Здравствуйте, lseder, Вы писали:

L>) Спасибо, там в конце ссылка на ссылка на "Статья об ещё одном подходе к метапрограммированию", где главным смыслом

L>является — "Metaprogramming is the only known way to reduce the complexity significantly."
L>То есть мп, это единственный способ управления сложностью (в нашем случае — программирования).

Да, нет. Есть и другие пути. Тут ключевое слово significantly.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Что такое мета-программирование ?
От: 0x7be СССР  
Дата: 08.11.11 10:00
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>

VD>Метапрограммирование — вид программирования, связанный с созданием программ, которые порождают другие программы как результат своей работы (в частности, на стадии компиляции их исходного кода), либо программ, которые меняют себя во время выполнения (самомодифицирующийся код).[источник не указан 813 дней] Первое позволяет получать программы при меньших затратах времени и усилий на кодирование, чем если бы программист писал их вручную целиком, второе позволяет улучшить свойства кода (размер и быстродействие).

Какое-то не очень полное определение. А верификация или трансформация программ на этапе компиляции разве не является метапрограммированием?
Re[3]: Что такое мета-программирование ?
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.11.11 14:24
Оценка: +1
Здравствуйте, 0x7be, Вы писали:

VD>>

VD>>Метапрограммирование — вид программирования, связанный с созданием программ, которые порождают другие программы как результат своей работы (в частности, на стадии компиляции их исходного кода), либо программ, которые меняют себя во время выполнения (самомодифицирующийся код).[источник не указан 813 дней] Первое позволяет получать программы при меньших затратах времени и усилий на кодирование, чем если бы программист писал их вручную целиком, второе позволяет улучшить свойства кода (размер и быстродействие).

0>Какое-то не очень полное определение. А верификация или трансформация программ на этапе компиляции разве не является метапрограммированием?

Верификация — не является. Трансформация — является, и полностью подпадает под определение.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Что такое мета-программирование ?
От: LaptevVV Россия  
Дата: 08.11.11 14:32
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, lseder, Вы писали:


S>Пока что лучшее определение процитировал Влад.

S>Я бы обобщил — метапрограммирование, на мой взгляд, это возможность программной манипуляции элементами программ.
S>В какой момент исполняется этот мета-код, собственно, не важно. Точно так же, как для обычного кода, мы ждём от хорошего компилятора умения вычислять всё, что можно, в компайл-тайме. Но можно делать то же самое и в ран-тайме, а некоторые вещи без ран-тайма сделать и не получится.
Под таким углом зрения метапрограммирование = смешанные вычисления.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[4]: Что такое мета-программирование ?
От: 0x7be СССР  
Дата: 08.11.11 16:03
Оценка:
Здравствуйте, VladD2, Вы писали:

0>>Какое-то не очень полное определение. А верификация или трансформация программ на этапе компиляции разве не является метапрограммированием?

VD>Верификация — не является.
Программа, получающая на вход другую программу и выдающая вердикт разве не является метапрограммой?
Re: Что такое мета-программирование ?
От: IT Россия linq2db.com
Дата: 08.11.11 16:20
Оценка:
Здравствуйте, lseder, Вы писали:

L>Можно ваше определение, для чего служит, как может выглядеть.


А как выглядит мета-мета-программирование?
Если нам не помогут, то мы тоже никого не пощадим.
Re[3]: Что такое мета-программирование ?
От: Sinclair Россия https://github.com/evilguest/
Дата: 08.11.11 17:00
Оценка:
Здравствуйте, LaptevVV, Вы писали:

S>>Я бы обобщил — метапрограммирование, на мой взгляд, это возможность программной манипуляции элементами программ.

S>>В какой момент исполняется этот мета-код, собственно, не важно. Точно так же, как для обычного кода, мы ждём от хорошего компилятора умения вычислять всё, что можно, в компайл-тайме. Но можно делать то же самое и в ран-тайме, а некоторые вещи без ран-тайма сделать и не получится.
LVV>Под таким углом зрения метапрограммирование = смешанные вычисления.
Да ну откуда же?
Смешанные вычисления — это автоматизированное получение из программы А, определённой на множестве Д, программы A', определённой на множестве Д', причём Д' входит в Д.
Причём процесс получения этой программы может являться вполне себе статическим.

Метапрограммирование не ограничивается вопросами оптимизации при сужении области определения.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[5]: Что такое мета-программирование ?
От: hardcase Пират http://nemerle.org
Дата: 08.11.11 19:59
Оценка:
Здравствуйте, 0x7be, Вы писали:

0>Здравствуйте, VladD2, Вы писали:


0>>>Какое-то не очень полное определение. А верификация или трансформация программ на этапе компиляции разве не является метапрограммированием?

VD>>Верификация — не является.
0>Программа, получающая на вход другую программу и выдающая вердикт разве не является метапрограммой?

Нет. Контр пример: программа grep которая получила на вход cs файл с программой на C#.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[6]: Что такое мета-программирование ?
От: 0x7be СССР  
Дата: 08.11.11 20:36
Оценка:
Здравствуйте, hardcase, Вы писали:

0>>Программа, получающая на вход другую программу и выдающая вердикт разве не является метапрограммой?

H>Нет. Контр пример: программа grep которая получила на вход cs файл с программой на C#.
Хм. А программа sed является инструментом метапрограммирвоания? Формально она подходит: может получить на вход cs и выдать модифицированный cs.
Re[7]: Что такое мета-программирование ?
От: Sinclair Россия https://github.com/evilguest/
Дата: 09.11.11 03:55
Оценка:
Здравствуйте, 0x7be, Вы писали:
H>>Нет. Контр пример: программа grep которая получила на вход cs файл с программой на C#.
0>Хм. А программа sed является инструментом метапрограммирвоания? Формально она подходит: может получить на вход cs и выдать модифицированный cs.
Формально говоря — да. Но попытка опуститься до такого уровня ничего хорошего нам не даст: с точки зрения машины Тьюринга, нет отличий между метапрограммированием и программированием. То же самое имеем с точки зрения архитектуры фон Неймана.

Поэтому под метапрограммированием обычно подразумевают нечто большее, чем возможность получить сырой текст программы или сырой бинарный код, и произвести какие-то манипуляции. Хочется возможности выражать мета-конструкции относительно компактно и понятно. Вот в Лиспе, скажем, пошли по простому пути: метапрограммирование очень низкоуровневое, но там и программирование низкоуровневое. Поскольку синтаксиса нет, то не нужно заморачиваться со сложными AST. Для метапрограммирования достаточно уметь обрабатывать списки.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Что такое мета-программирование ?
От: Sinclair Россия https://github.com/evilguest/
Дата: 09.11.11 03:56
Оценка: :)))
Здравствуйте, IT, Вы писали:

IT>А как выглядит мета-мета-программирование?

Очевидно, это программирование тех, кто занимается метапрограммированием.
Ты наблюдаешь его прямо сейчас в этом топике.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[8]: Что такое мета-программирование ?
От: 0x7be СССР  
Дата: 09.11.11 17:10
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Поэтому под метапрограммированием обычно подразумевают нечто большее, чем возможность получить сырой текст программы или сырой бинарный код, и произвести какие-то манипуляции. Хочется возможности выражать мета-конструкции относительно компактно и понятно. Вот в Лиспе, скажем, пошли по простому пути: метапрограммирование очень низкоуровневое, но там и программирование низкоуровневое. Поскольку синтаксиса нет, то не нужно заморачиваться со сложными AST. Для метапрограммирования достаточно уметь обрабатывать списки.

Ок, рассмотрим другой пример: Microsoft Code Analysis, встроенный в студию (бывший FxCop) — это метапрограмма или нет?
Re[9]: Что такое мета-программирование ?
От: Sinclair Россия https://github.com/evilguest/
Дата: 10.11.11 04:04
Оценка:
Здравствуйте, 0x7be, Вы писали:

0>Ок, рассмотрим другой пример: Microsoft Code Analysis, встроенный в студию (бывший FxCop) — это метапрограмма или нет?

Да. И любой компилятор — это метапрограмма.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[10]: Что такое мета-программирование ?
От: 0x7be СССР  
Дата: 10.11.11 05:31
Оценка:
Здравствуйте, Sinclair, Вы писали:

0>>Ок, рассмотрим другой пример: Microsoft Code Analysis, встроенный в студию (бывший FxCop) — это метапрограмма или нет?

S>Да. И любой компилятор — это метапрограмма.
Вот мы с Владом и поспорили на этот счет.
Он считает, что программа, верифицирующая другие программы, метапрограммой не является.
А я считаю, что является.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.