WikiProject Информатика | (Номинальный C-класс, Средняя важность) |
---|---|
WikiProject Computing / Программное обеспечение / CompSci | (Номинальный C-класс, Низкая важность) |
---|---|
Метапрограммирование ... то, что нефункциональные программисты называют функциональным программированием ...
Если вы понимаете функциональное программирование с функциями как первоклассными типами данных, вы знаете, что нет никакой разницы между кодом и данными (или алгоритмами и структурами данных). Так что в таком понятии / термине, как «метапрограммирование», нет смысла. Все данные. Все в коде. Тогда код может естественным образом измениться. А данные - это просто язык с определенным синтаксисом, который может обрабатывать другой код. Это обобщение всего этого - функциональное программирование.
«Метапрограммирование» - это действительно слово, которым пользуются те, кто не был знаком с полномасштабным функциональным программированием или не понял его. :)
- 94.220.250.151 ( разговорное ) 09:13, 23 ноября 2009 г. (UTC)
- На самом деле неправда. Функциональный язык Haskell имеет особую языковую функцию для метапрограммирования: Template Haskell. - greenrd ( talk ) 03:47, 25 октября 2010 г. (UTC)
- Я согласен с тем, что функциональное программирование - это не метапрограммирование. Ключевое отличие состоит в том, что внутренняя структура функционального значения не может быть проверена самой программой. Мета-программирование требует, чтобы можно было наблюдать и манипулировать внутренней частью фрагментов метапрограммирования. Таким образом, можно, например, выразить логику для кода следующим образом: «если эта функция (лямбда x -> x + 0), то измените ее на (лямбда x -> x + 2), но если это (лямбда x -> x-0), затем измените его на (лямбда x -> x-2) ». Такое изменение, которое зависит от кода функции, а не от семантики, не может быть выражено с помощью функций более высокого порядка на функциональном языке. - Крисроуз ( разговор ) 21:34, 27 июня 2014 г. (UTC)
Метапрограммирование метаязыка
- Основное определение не касается функционального программирования. Также не требуется иметь возможность изменять себя во время работы.
- «Это означает, что программа может быть разработана для чтения, генерации, анализа и / или преобразования других программ и даже для изменения самой себя во время работы».
- Компилятор был бы примером метапрограммирования. Он читает исходный код программы и генерирует объектную программу.
- Отмечу, что некоторые метаязыки метакомпиляторов являются языками функционального программирования специального назначения.
термин = коэффициент $ (('*': MPY | '/': DIV) коэффициент! 2);
- - это логическая функция, вызывающая другие логические ( факторные ) функции, возвращающая успех или неудачу. Его вход - это поток символов исходного кода программы. В случае успеха ввод продвигается по количеству совпадающих символов, преобразовывая их в абстрактное синтаксическое дерево в стеке пар. Термин правило вызывает фактор правило , которое также создает абстрактный синтаксис поддерево. Т.е.
MPY [ фактор , фактор ] DIV [ фактор , фактор ] или просто фактор MPY DIV / \ / \ фактор фактор фактор фактор
- В термин правило определяет (распознает и разбирает) часть языка программирования конструкции построения абстрактного синтаксического дерева языковой конструкции распознан. Это, построение дерева, побочный эффект - строго определенная часть правила. делая его более читабельным. «термин» является частью арифметики. выражение. Выходное поддерево помещается в стек синтаксического анализа при успешном возврате. Вышеупомянутый фактор будет поддеревом, распознаваемым правилом фактора. Операции: MPY или: DIV создают узел дерева и! оператор строит дерево. Номер следующий! количество ветвей. ! 2 создает дерево с двумя ветвями.
- Правила синтаксиса - это метапрограммирование. Не потому, что они могут измениться во время бега. Но потому, что они работают с исходной программой, преобразуя ее во что-то еще функционально эквивалентное.
Steamerandy ( разговор ) 18:44, 12 декабря 2014 (UTC)
Сборка и LISP
Если вам нужно получить примеры метапрограммирования, почитайте о программировании на ассемблере и LISP .. Особенно об использовании указателей и о том, как инструкции и данные представлены в ЦП. Вы можете понять кое-что глубокое об историческом программировании, которое делает метапрограммирование относительно обычным ..
Новый пример
Я просто включил пример метапрограммирования компилятора в мгновение ока, возможно, кто-то другой (или я) сможет сделать это намного лучше позже. --Анон
Тонкости метапрограммирования - что есть, а что нет
Метапрограммирование - довольно тонкое понятие. Иногда это зависит от намерения программиста, а не от формы программы. Например, напишите такую программу:
- DIM Radius AS Одинарный
- DIM Area AS Single
- ПЕЧАТЬ "Расчет площади круга"
- ВВОД «Введите радиус окружности:», Радиус
- LET Area = 3,141592 * Радиус * Радиус
- ПЕЧАТЬ «Площадь круга»; Область
- КОНЕЦ
не является примером метапрограммирования, когда программа передается интерпретатору. Однако это так, когда программа загружается в компилятор.
Также обратите внимание, что другие методы программирования можно рассматривать как метапрограммирование. Например, метод генетического программирования или автоматическое создание утилиты просмотра / редактирования интерфейса БД из модели данных. - Дерек Росс
- Я не понимаю, как указанная выше программа может быть метапрограммой. Насколько я понимаю, метапрограмма - это программа, которая манипулирует другими программами или рассуждает о них. Программа выше этого не делает. С другой стороны , компилятор или интерпретатор - это метапрограммы.
- Использует ли dll метапрограммирование? такое многопоточное метапрограммирование? - Tim32 09:28, 1 ноября 2007 г. (UTC)
Эффективность
Я думаю, что меня не устраивает утверждение, что «это позволяет программистам создавать больший объем кода и делать больше за то же время, которое им потребовалось бы для написания всего кода вручную». Это относится к тому же классу, что и многие другие утверждения, игнорирующие тот факт, что правильно выполненное программирование увеличивает функциональность экспоненциально, а не линейно, с объемом написанного кода.
Я думаю , что претензий , что писать в (FORTRAN, C, 4GL, что угодно) умножает производительность труда программиста , потому что «каждая строка FORTRAN компилирует в десять строк на ассемблере» или что (хотя, по некоторым причинам, коэффициент утверждал , что почти неизменно десять). Да, и как только вы написали подпрограмму, однострочный вызов подпрограммы вызывает выполнение десяти строк кода.
Мне кажется, что относительные преимущества написания подпрограмм (макросов) (многоразовые объекты) (что угодно); по сравнению с изобретением более высоких языковых уровней (FORTRAN, Smalltalk, VB и т. д.); по сравнению с различными формами генерации кода очень тонкий и не должен рассматриваться как множитель строк кода, а на основе того, подходит ли улучшенная среда программирования лучше для а) когнитивной модели программиста и б) проблемная область.
Я бы добавил, что системы, в которых создаются видимые строки кода, особенно подвержены рекламной шумихе; Хотел бы я вспомнить объявления несколько лет назад, на которых была страница с зеленой полосой, где большинство строк было выделено желтым, и пояснение: «Желтые строки - это строки кода, которые XYZ написал для вас».
В большинстве случаев мне кажется, что эффект от большинства этих методов состоит в том, чтобы дать вам огромный, но постоянный дополнительный старт и очень маленький - возможно, слишком маленький, чтобы измерить - множитель производительности . - Dpbsmith 18:15, 8 января 2004 г. (UTC)
- Он достаточно большой, чтобы его можно было измерить. Меня учили, что для любой данной комбинации программист / язык время, необходимое для решения проблем с фрагментом кода, зависит от квадрата его размера в символах по следующим причинам: вероятность того, что программист совершит ошибку, варьируется примерно линейно. количество символов в коде и сложность нахождения проблемы примерно линейно зависели от количества символов в коде. Если это правда, то есть очевидное преимущество во всем, что резко уменьшает количество символов, которые программист должен написать, чтобы указать программу. Эффект становится более заметным даже при небольшом уменьшении размера, когда рассматриваются более крупные программы.
- Конечно, я заметил значительное увеличение производительности, когда я перешел от написания отчетов по базам данных на VB к использованию "самодельного" генератора отчетов по базам данных, который пишет те же типы отчетов на VB для меня. Время, необходимое для отчета, сократилось с трех дней до трех часов. Основная причина в том, что у меня гораздо меньше шансов случайно включить ошибки из-за опечаток, потому что теперь я «метапрограммирую» относительно короткую спецификацию отчета, а не «программирую» довольно крупную программу на VB. - Дерек Росс
- Dpbmith прав. Вы ошибались. Числовые строки кода не так важны, как их учат в школе. Хороший программист должен хорошо представлять себе, в какой программе проблема связана с симптомами ошибки. Разработка модульного кода сокращает объем отлаживаемого кода до мелких частей. Планирование и наличие четко определенных модулей позволяли многим программистам работать над крупными проектами. Чем больше кода, тем больше возможных ошибок при вводе. Но большинство опечаток будет обнаружено во время компиляции. Я запрограммировал больше на ассемблере, чем на языках высокого уровня, и иногда я тратил больше времени на изучение языка высокого уровня, чтобы делать то, что я хотел. Однажды я потратил несколько дней, пытаясь заставить C ++ статически загружать константную структуру, которая потребовала бы менуэтов для кодирования на ассемблере. И на самом деле разница в количестве строк кода была бы небольшой.
- Программирование и кодирование - это не одно и то же. Хорошее программирование происходит из хорошо продуманных алгоритмов. Кодирование алгоритмов с использованием хороших практик кодирования определяет простоту кодирования, отладки и ремонтопригодность кода.
- Программист FORTRAN, с которым я работал, утверждал, насколько проще было программировать на FORTRAN, чем на ассемблере. Ему была назначена простая программа отчетов. Бьюсь об заклад, на обед я мог написать его быстрее в сборке и выиграл. Если бы он работал менее чем за 2 часа. Принял его больше двух дней. В моей сборке было намного больше строк кода. В десять-двадцать раз больше строк кода. Ассемблер выловил все мои опечатки. А их было довольно много. Но это сработало при первом запуске. Программист FORTRAN все еще работал над правильным форматированием. Отличный пример использования неправильного языка для задачи. COBOL был бы лучшим выбором для написания отчета.
- С другой стороны, я потратил месяцы из-за неправильного понимания инструкций включения и отключения прерывания сборки. Под моим руководством другой программист написал переключатель задач для разрабатываемой нами операционной системы. Инструкции включения и выключения прерывания были поменяны местами. Мне показалось, что другие компьютеры, на которых я работал, использовали похожую мнемонику операционного кода. Но на этой машине флаг прерывания имел противоположный эффект. Прерывания с поддержкой CLI. Интересно то, что он разбивается примерно раз в три месяца. Удерживание прерываний до начала критической кодовой последовательности увеличивало вероятность их возникновения до первой критической кодовой инструкции, уменьшая вероятность того, что они возникнут во время короткой критической кодовой последовательности. Теперь это прямо противоположно заявленным программным ошибкам, пропорциональным количеству кода. Критический код (чувствительный к прерываниям) - это кратчайшие кодовые последовательности, которые могут сократить время отключения прерываний. И здесь когда-либо обнаруживались ошибки, и их было очень трудно найти, что приводило к возникновению проблемы раз в три месяца. Большинство было связано с критическими изменениями ссылок менее чем с 10 инструкциями по сборке. Я все время не обращал внимания на интерфейс командной строки, думая, что он отключает прерывания. Чтобы быть справедливым, нужно было посмотреть руководство по оборудованию, чтобы понять CLI. В руководстве по сборке сказано, что флаг разрешения прерывания снят. В руководстве по аппаратному обеспечению объясняется, что прерывания должны быть разрешены, когда флаг разрешения прерывания равен 0. Прерывания запрещены SEI.
- Использование языка программирования, подходящего для решения проблемы, снижает затраты на разработку и ремонтопригодность. Языки, специфичные для предметной области, делают это, если правильно спроектированы. Однако, если язык нелегко читать и понимать, его будет нелегко поддерживать. Пишите, когда языки подходят для одноразового использования. Текстовые редакторы, такие как teco, являются хорошим примером языка однократной записи, который не следует использовать для общего программирования.
- Самомодифицирующийся код встречается с самого начала программирования. Программную логику таких программ сложно уследить.
- Steamerandy ( разговор )
Примеры: предложение
Может быть интересно: показать пример программы в
- Ява
- C или C ++
- другие языки
Может быть интересно: показать небольшой пример программы, которая делает «что-то полезное».
Дополнение
У меня есть хороший пример метапрограммирования с использованием макросов Lisp: [1]
Такими примерами можно дополнить статью (и это коррелирует с идеей метапрограммирования компилятора ).
Метапрограммирование: предлагаемое определение
Вот определение предложения.
- Метапрограммирование - это написание программы программистом, предназначенная для генерации или вывода кода с целью облегчения необходимости писать код, который будет сгенерирован программой.
Это исключает такие случаи, как
- компиляторы: не программирование программистом, предполагаемый вывод кода не является кодом
- компиляторы-компиляторы: не программа, вывод - это не код
Мысли? - Диспрозия, 09:34, 11 марта 2005 г. (UTC)
- На самом деле, я думаю, это слишком конкретно. Метапрограммирование вовсе не ограничивается генерацией кода. В некоторых случаях он расширяет возможности языка - например, вы можете выполнять задачи, используя отражение, форму метапрограммирования, которую вы не могли бы выполнить без него, в том числе многие, которые вообще не включают генерацию кода. Мне сложно придумать хорошее определение, потому что это своего рода движущаяся цель - вчерашнее метапрограммирование часто больше не считается метапрограммированием сегодня. Лучшее, что я могу придумать, - это сказать, что этот термин используется для описания многих, но не всех технологий программирования, которые работают с программами. - Деку, 10:37, 11 марта 2005 г. (UTC)
- Могу я получить пример использования отражения? Возможно, приведенное выше определение еще можно спасти. Обратите внимание, что нам действительно нужно четкое определение того, что такое метапрограммирование, или оно позволяет всему термину вырождаться, если кто-то говорит, что использование компилятора является метапрограммированием, это фактически означает, что все программирование является метапрограммированием и / c. - Диспрозия 10:56, 11 марта 2005 г. (UTC)
- Хммм, ваше определение еще не исключает компиляторы или компиляторы компиляторов, я думаю:
- Код вывода компилятора (это определение компилятора). Компиляторы пишут программисты.
- Компиляторы компиляторов - это программы, которые выводят компиляторы, которые являются программами.
- + Комментарий: «Программистом» является избыточным, поскольку все программирование выполняется программистами. Это может даже сбивать с толку, поскольку суть метапрограммирования состоит в том, что часть работы по кодированию автоматизируется и, таким образом, выполняется машиной.
- (здесь удален текст по истории метапрограммирования)
- Обратите внимание, что я не согласен с тем, что текущее определение гласит: «Все программирование - это метапрограммирование», поэтому я не понимаю, почему его нужно менять. Но я хочу посмотреть, что вы можете придумать. :-)
- Хммм, ваше определение еще не исключает компиляторы или компиляторы компиляторов, я думаю:
- Кстати, спасибо, что действительно искали и пытались. Это показывает, что VfD иногда все еще работает. :-) - Ким Брюнинг 12:15, 11 марта 2005 г. (UTC)
- Я объяснил, почему текущее определение делает это, поскольку оно включает компиляторы.
- Re: компиляторы: вы упускаете из виду «чья предполагаемая цель - генерировать или выводить код», поэтому простое использование компилятора не будет считаться метапрограммированием, но написание компилятора будет (обязательно ли это желательно?)
- Повторные компиляторы-компиляторы: входные данные для компилятора-компилятора - это определение грамматики, а не программа, которая выводит код. - Диспрозия, 00:16, 12 марта 2005 г. (UTC)
- Но цель состоит в том, чтобы манипулировать кодом, и написание компилятора действительно будет считаться метапрограммированием, как и должно быть. :-) Значит ли это, что мы все время были в согласии? ;-) - Ким Брюнинг, 13:06, 12 марта 2005 г. (UTC)
- Я не знаю ... Я думаю, что метапрограммирование должно служить какой-то самореференциальной цели; то есть одна метапрограмма, чтобы избежать необходимости писать код, который в любом случае пришлось бы писать без нее, поэтому, если автор компилятора использует методы метапрограммирования для написания компилятора, тогда это будет метапрограммирование, но если автор компилятора просто напишет компилятор для черт возьми, это не так. Я думаю, что метапрограммирование во многом связано с намерением и объектом создаваемого кода. Но такой аспект метапрограммирования менее ясен. - Диспрозия, 23:06, 13 марта 2005 г. (UTC)
- Давайте рассмотрим пример: мне нужно написать много кода, но в этом коде есть какая-то закономерность. Поэтому для рефакторинга я пишу отдельный код, который создает эти шаблоны, и я пишу отдельный файл для подачи в эту программу, в котором указывается, какие шаблоны я хочу конкретно. Как, по-вашему, называется этот акт? - Ким Брунинг, 23:37, 13 марта 2005 г. (UTC)
- Лучше всего провести сравнение напрямую, без необходимости угадывать, какой смысл вы пытаетесь донести;) Я предполагаю, что вы говорите, что это то, что делают компиляторы. Но все же вы не рассмотрели аспект намерения. Если я напишу компилятор, чтобы помочь мне написать компилятор, я бы сказал, что это метапрограммирование. Но если я напишу компилятор для написания программы базы данных, то это, вероятно, тоже будет метапрограммированием, поскольку он пишет программу для генерации кода, который помогает мне в проекте, над которым я работаю, но если я пишу компилятор, это немного особый случай, поскольку для того, чтобы действие помогло тому, что я делаю, оно должно помочь написать компилятор. Яснее? - Диспрозия, 08:27, 14 марта 2005 г. (UTC)
- Виновен по обвинению! :-) Я пытаюсь понять, какая часть написания компилятора делает его неметапрограммированием, по вашему мнению. Думаю, важно понять ваше мнение, прежде чем я попытаюсь убедить вас в своем или нет. :-) - Ким Брюнинг, 09:11, 14 марта 2005 г. (UTC)
- Как я уже сказал, намерение и цель использования техники метапрограммирования для меня будут определять, будет ли это метапрограммирование или нет. Если кто-то утверждает, что написание компилятора - это метапрограммирование, тогда нужно будет посмотреть на намерение. Если бы компилятор был написан для помощи в написании компилятора, это было бы метапрограммированием. Иначе бы не было. - Диспрозия, 01:38, 15 марта 2005 г. (UTC)
В ряде известных алгоритмов действительно используется метод «метапрограммирования». Например, рассмотрим алгоритм Кнута-Морриса-Пратта . Вы обнаружите, что для любой поисковой строки конечный автомат обязательно создается для работы с вводом для поиска совпадающих строк. При работе с базой данных для поиска набора результатов запроса за разумное время создается план выполнения запроса . Мне часто приходится задаваться вопросом, что отличает эти техники от техник, упомянутых здесь, и есть ли настоящая разница, или это переименование концепции.
Работа Валида Таха (Metaml / Meta Ocaml), безусловно, уникальна, поскольку можно сказать, что его модель программирования допускает (надеюсь, легкое) метапрограммирование, мета-мета-программирование, мета-мета-мета-программирование и т. Д. До бесконечности. Но многие другие, похоже, не сильно отличаются от встраивания какого-либо компилятора в язык и его использования. Root4 (one) 05:59, 26 ноября 2006 г. (UTC)
Я предпочитаю более прямое определение
- Мета-программирование - это написание программ, которые манипулируют другими программами, как если бы они были данными.
С этой точки зрения программист, который пишет компилятор, занимается метапрограммированием, потому что код, который они пишут - компилятор - манипулирует абстрактным синтаксическим деревом (AST) некоторой программы и переводит его в другую структуру данных, представляющую последовательность инструкций ассемблера ( например) целевой программы. (Пользователи компилятора не занимаются метапрограммированием, потому что программа, которую они пишут и компилирует, сама по себе не управляет кодом как данными.) - Крисроуз ( выступление )
- Я согласен, кроме случаев использования компилятора для написания компилятора. Например, большинство компиляторов C написаны на C. Это может быть очевидно для большинства, но для тех немногих, кто любит компьютерную работу над тем, что было заявлено, также необходимо указать исключение.
Steamerandy ( разговор ) 22:44, 12 декабря 2014 (UTC)
история метапрограммирования
Хорошая статья, поздравляем всех авторов!
Одним из полезных дополнений может быть история метапрограммирования. Я приехал сюда с интересом узнать, когда эта идея впервые начала проявляться (идея метапрограммирования, ориентированного на человека, а именно: не сам компилятор). Например, в статье о C ++ говорится, что шаблоны были добавлены в какой-то момент после 1990 года (и я уверен, что C ++ также не был первым языком, обеспечивающим явную поддержку метапрограммирования). - Джон Доуланд, 09:18, 8 сентября 2005 г. (UTC)
- Lisp - гораздо более ранний пример (шестидесятые годы). - MarSch 12:46, 12 декабря 2006 г. (UTC)
Четвертый
Следует обсудить язык программирования Forth, который имеет встроенную поддержку метапрограммирования с помощью CREATE и DOES> и другими словами. Функции, используемые для построения функций, обычно доступны пользователю, и новые определенные слова просто помечают, чтобы они действовали как метапрограммы времени компиляции, а не как слова для компиляции. sigfpe 5 декабря 2005 г.
- На самом деле, FORTH язык состоит из слов в своем словаре. Определение новых слов - это расширение языка, создание нового диалекта языка, что было бы (я думаю) метапрограммированием. Фанаты FORTH думают, что FORTH - это метакомпилятор только потому, что он сам компилируется. (создание нового экземпляра самого себя). Полное игнорирование того, что компилирование самого себя - это просто компилятор с собственным хостом. Ничем не отличается от компилятора C, написанного на C. Таким образом, если он будет принят, это будет означать, что каждый автономный компилятор будет метакомпилятором. Но, с другой стороны, четвертое программирование расширяет язык. Создание диалекта (или производных) FORTH. Таким образом, по сути, программирование в FORTH - это метапрограммирование, а далее будет языком метапрограммирования. Я бы никогда не подумал о метакомпиляторе . У меня возник спор с создателем темы о метакомпиляторе из-за того, что он использовал определение метакомпилятора FORTH. Я написал очень продвинутый метакомпилятор, который расширил CWIC, добавив язык определения машинного ассемблера, позволяющий определять синтаксис операнда инструкции ассемблера и расширять инструкцию в битовые поля. Инструкция или генерируется в разделах памяти с побитовой адресацией. Он был использован для написания кросс-компилятора COBOL, работающего на DEC-System-10 (машина 36-битных слов), производящего код для TI-990 (8-битный) байтовый миникомпьютер с 16-битным словом. Итак, вы можете понять мою предвзятость в отношении определения метакомпилятора. Если смотреть на FORTH в терминах метапрограммирования, это специализированный компилятор / интерпретатор метаязыка, который с каждым новым определением слова расширяет его словарный запас и создает новый диалект FORTH. - Steamerandy ( доклад ) 18:02, 19 ноября 2014 г. ( УНИВЕРСАЛЬНОЕ ГЛОБАЛЬНОЕ ВРЕМЯ)
Вспышка
Вам следует посетить эту страницу: http://www.flare.org . Речь идет о языке программирования, специально предназначенном для метапрограммирования.
PHP и тому подобное
Мне кажется, что PHP, ASP, JSP, HTML :: Mason и т.п., обычно называемые «системами веб-шаблонов», являются формой метапрограммирования. Программист пишет код на одном языке - PHP, VB, Java, Perl и т. Д. - который генерирует HTML, вместо того, чтобы писать HTML напрямую. Вы можете возразить, что HTML - это не язык программирования, а просто язык разметки. Тем не менее, процесс во многом такой же. Кроме того, эти инструменты также могут вставлять JavaScript в HTML, и это определенно язык программирования.
Обратите внимание, что создаваемый ими файл может начинаться с «языка высокого уровня» на самом внешнем уровне и переходить на язык разметки или наоборот. Эти два подхода по сути эквивалентны.
Я собираюсь добавить что-нибудь на страницу, описывающую этот типичный пример.
- Я склонен с этим согласиться. Довольно часто нужно включить генерацию javascript в приложение asp.net, и на самом деле, если провести какое-то исследование, метод довольно распространен ... Но на самом деле я думаю, что это прикосновение злоупотребляют. Часто вы можете найти код asp.net, который генерирует javascript, который может быть лучше сгенерирован как вызовы определенных функций javascript, включенных в отдельные файлы javascript. Гораздо проще определить нужную вам функциональность, разместить ее за несколькими функциями, протестировать указанные функции, а затем вызывать или размещать вызовы там, где это необходимо. Если у вас уже нет огромной библиотеки javascript для использования, создание javascript не всегда имеет смысл.
- В наши дни любой сгенерированный javascript находится на довольно низком уровне и скрыт за несколькими абстракциями. Но он все еще генерируется. Root4 (one) 05:24, 26 ноября 2006 г. (UTC)
Внешняя ссылка?
Я хотел бы предложить эту статью как релевантную внешнюю ссылку. Но, что ж, я автор этого, поэтому я подумал, что было бы более уместно, чтобы кто-то еще действительно добавил его (если вы сочтете это актуальным) LotLE × talk 06:53, 29 июня 2006 (UTC)
- Дэвид Мертц . «Учебник по программированию метаклассов Python» . ONLamp . Проверено 28 июня 2006 года .
- За исключением слова «мета», это кажется совершенно не связанным с метапрограммированием. - MarSch 11:33, 1 ноября 2007 г. (UTC)
Вирусы
Не следует ли включать в статью компьютерные вирусы , поскольку они манипулируют исполняемыми файлами, чтобы скопировать себя? - Теодор Клоба ( выступление ) 21:24, 28 апреля 2008 г. (UTC)
Метапрограммирование на C ++ с помощью Qt
Можно ли добавить « компилятор метаобъектов Qt (moc)» в качестве примера метапрограммирования? Он генерирует больше кода C ++ на основе содержимого файла .h . Vdboor ( разговор ) 10:33, 17 сентября 2009 г. (UTC)
Компиляция / время выполнения
... или которые выполняют часть работы во время компиляции, которая в противном случае выполнялась бы во время выполнения.
Это имеет смысл наоборот.
- Сина ( разговор ) 13:10, 24 октября 2010 г. (UTC)
- Нет, это правильный путь. - greenrd ( talk ) 03:44, 25 октября 2010 г. (UTC)
- Пожалуйста, объясните, потому что метапрограммирование дает нам больше контроля во время выполнения . Это также то, что подразумевается под « программами, которые изменяют сами себя. «Программы модифицируются во время выполнения.
- Даже в случае макросов можно написать программу, которая генерирует другие программы во время компиляции, это правда. Однако, если расширение макроса не выполняется во время компиляции, оно, безусловно, не будет выполнено и во время выполнения. В этом случае работа будет выполняться программистом, который должен жестко запрограммировать программу, которая в противном случае была бы сгенерирована. Сина ( разговор ) 01:52, 28 октября 2010 (UTC)
- Я думаю, что ключевое слово здесь - или . Это одно из преимуществ или вариантов использования метапрограммирования, но не единственное . Примером этого может быть создание некоторых никогда не меняющихся данных, таких как первые 10 000 простых чисел, во время компиляции и сохранение их в массиве. Это означает, что вам не нужно генерировать числа при запуске программы. И вам также не нужно хранить числа в исходном коде, который занимает место и оставляет открытой возможность того, что программист может случайно нажать клавишу, изменив одно из чисел, и не заметить своей ошибки! Я прекрасно понимаю, что метапрограммирование можно выполнять во время выполнения, но это не обязательно. - greenrd ( разговор ) 08:25, 28 октября 2010 г. (UTC)
- Спасибо за разъяснение. Или действительно то, что я не увидел. Сина ( разговор ) 03:14, 24 августа 2011 (UTC)
Отсутствует определение рефлексии или несогласие с темой рефлексии вики.
Он просто утверждает, что отражение - это способность программы изменять себя. Однако отражение в вики утверждает, что это способность изменять себя во время выполнения.
Эти две темы должны совпадать. Steamerandy ( разговор ) 16:59, 23 декабря 2014 (UTC)
Метакомпилятор
Метакомпилятор долгое время определялся как берущий программу на языке программирования и транслирующую ее в компилятор.
метакомпилятор из руководства XDS 940 TREEMETA (1968):
- Метакомпилятор в самом общем смысле этого слова - это программа, которая считывает программу на метаязыке как ввод и переводит эту программу в набор инструкций. Если входная программа представляет собой полное описание формального языка, перевод представляет собой компилятор для этого языка.
Определение метакомпилятора, как указано в документах CWIC (компилятор для написания и реализации компиляторов) (1969-1985):
- Метакомпилятор - это программа, входные данные которой представляют собой описание синтаксиса языка программирования плюс описание его семантики, т. Е. Или его эквивалент в терминах машинного языка. Язык, на котором закодировано такое описание, называется метаязыком. Результатом работы метакомпилятора является компилятор для описываемого языка. Затем этот компилятор можно использовать для обработки программы, написанной на этом языке, т. Е. Для проверки ее синтаксической правильности и для перевода на машинный язык или его эквивалент.
Теперь в теме метапрограммирования у нас есть:
- Способность языка программирования быть собственным метаязыком называется отражением или рефлексивностью.
Теперь это соответствует метакомпилятору, написанному на его собственном метаязыке, который компилируется сам. Он представляет собой особый случай отражения, эквивалентный компилятору с собственным хостом. Правильно ли я объясняю, что метакомпилятор компилируется как:
- Процесс компиляции себя метакомпилятором, написанным на его собственном метаязыке, называется отражением, термином метапрограммирования, который в данном случае эквивалентен компилятору с собственным хостом.
Я занимался программированием в 1965 году и написал много коммерческих компиляторов. Мой компьютерный жаргон немного устаревший. Может ли кто-нибудь здесь проверить тему метакомпилятора. Я переделал его, основываясь на терминологии метапрограммирования (надеюсь).
Я сделал RFC, потому что первоначальный автор определил способ метакомпилятора во многом как определение FORTH «Написано на собственном языке, компилируется таким образом», что делает его метакомпилятором. Когда исторически некоторые метакомпиляторы были написаны на других языках (ассемблер, LISP, CL / 1 и PL / 1) и, конечно, не компилировались сами. Когда я в последний раз смотрел FORTH, его не называли метакомпилятором. - Steamerandy ( разговор ) 22:29, 19 ноября 2014 г. (UTC)
метаязык
Заявление:
- Язык, на котором написана метапрограмма, называется метаязыком.
Несоответствует определению метаязыка.
Метапрограммирование - это программирование, которое обрабатывает программы как данные. Написание компилятора - это метапрограммирование. Компиляторы могут быть написаны практически на любом языке программирования. Метаязык используется для описания других языков или разговора о них. Компилятор может быть написан на метаязыке. Но, например, метапрограммирование может быть выполнено на C ++. Будет ли тогда c ++ метаязыком?
Steamerandy ( разговор ) 02:41, 27 ноября 2014 (UTC)
- Я знаю, что приведенный выше вопрос очень старый, но я тем не менее прокомментирую, чтобы другие люди, заинтересованные в этом вопросе, могли увидеть ответ.
- В статье нет противоречия. Определение метаязыка: «Язык, который используется для описания другого языка (объектный язык)». Кажется, вы думаете, что существует четко определенный набор метаязыков, а язык - это либо метаязык, либо объектный язык. Это не так. Из определения следует, что язык может быть и тем, и другим - в зависимости от того, для чего он используется. Итак, в случае компилятора C ++, который сам написан на C ++, C ++ является одновременно метаязыком и объектным языком, поскольку C ++ используется для описания C ++. ʘχ ( разговор ) 07:32, 13 апреля 2021 (UTC)
Качество статьи
... довольно плохо. И это согласуется со всей статьей, а не только с некоторыми вещами здесь и там. К сожалению, я ничего не знаю об этой теме, поэтому просто помечу ее и бегу. Дьякон Ворбис ( разговор ) 01:57, 22 января 2017 (UTC)
Считайте программы своими данными
Определение, данное во введении, очень ограничительное («обработка программ как данных»). Это означает, что метапрограммирование возможно только в пределах гомоиконных (следовательно, интерпретируемых) языков программирования. Затем в нем говорится о метапрограммировании C ++, которое является чисто статическим, что создает тревожный уровень несогласованности в статье. Винсент Лекстрейт ( разговор ) 01:17, 30 декабря 2017 (UTC)
- Это старый вопрос, на который я, тем не менее, хочу ответить, чтобы другие люди могли извлечь из него пользу.
- Ваше утверждение неверно. «Обработка программ как данных» не означает, что метапрограммирование возможно только в пределах интерпретируемых языков. Компиляторы - хороший пример: они принимают программу как данные и что-то с ними делают. Например, вы можете написать программу на C ++, которая модифицируется, генерируя код на другом языке, будь то C ++, Rust или что-то еще, компилируя его и динамически связывая. Ваша программа также может анализировать свой собственный машинный код и изменять его, если вы того пожелаете.
- Важный момент: в принципе, метапрограммирование - это математическая концепция, не зависящая от деталей реализации, поэтому интерпретация или компиляция не имеют значения, по крайней мере, не в формальном смысле. ʘχ ( разговор ) 07:43, 13 апреля 2021 (UTC)
р
R допускает метапрограммирование, в нем нет макросов и шаблонов, но есть функция-заменитель, которая позволяет передавать выражение в функцию и предотвращать оценку. Я думаю, вы можете написать макросистему на этом языке. В R все оценивается в обратном порядке (ленивая оценка). Функция получает выражения в качестве аргументов, и только когда они используются, они оцениваются. Вот почему вы можете прекратить оценку, изменить код и оценить по-своему. Это мощное метапрограммирование, в котором вы можете определить совершенно новый синтаксис или новые операторы, которые не поддерживаются языком. (так библиотеки purrr, dplyr и т. д. определяют новый синтаксис для обработки данных).
jcubic ( обсуждение ) 14:23, 22 апреля 2020 (UTC)