Общее программирование - очень простая форма метакодирования, хотя обычно это не среда исполнения. Это больше похоже на препроцессор в C и больше относится к программированию шаблонов в большинстве случаев использования и базовых реализаций.
Вы часто найдете на типизированных языках, что вы создадите несколько реализаций чего-либо, где только тип, если он отличается. В таких языках, как Java, это может быть особенно болезненно, поскольку каждый класс и интерфейс определяют новый тип.
Вы можете сгенерировать эти классы, преобразовывая их в строковый литерал, а затем заменяя имя класса переменной для интерполяции.
Где обобщения используются во время выполнения, это немного отличается, в этом случае это просто переменное программирование, программирование с использованием переменных.
Способ предусмотреть, что это просто, взять в файлы, сравнить их и превратить что-то другое в переменную. Теперь у вас есть только один файл, который можно использовать повторно. Вам нужно только указать, что изменилось, отсюда и переменная имени.
Как возникли дженерики, что не все может быть изменено, как тип переменной, который вы ожидаете, или тип броска. Часто было много дублирования файлов, где единственной переменной, которая была переменной, были типы переменных. Это был очень распространенный источник дублирования. Хотя есть способы обойти это или смягчить, они не особенно удобны. Дженерики пришли как разновидность переменной, чтобы позволить переменную типа переменной. Поскольку тип переменной - это что-то, что обычно выражается на языке программирования, которое теперь может быть указано во время выполнения, это также считается метакодированием, хотя и очень простым.
Эффект отсутствия изменчивости там, где он вам нужен, заключается в том, чтобы развернуть ваши переменные, то есть вы вынуждены вместо того, чтобы иметь переменную, чтобы сделать реализацию для всех возможных значений переменной.
Как вы можете себе представить, это довольно дорого. Это было бы очень распространено при использовании любой библиотеки хранения объектов повторного использования. Они будут принимать любой объект, но в большинстве случаев люди хотят только ранить один тип objdct. Если вы добавите объект Shop, который расширяет Object, а затем хотите его получить, подпись метода на объекте хранения будет возвращать просто Object, но ваш код ожидает объект Shop. Это сломает компиляцию с понижением уровня объекта, если вы не вернете его обратно в магазин. Это вызывает еще одну загадку, так как без дженериков нет возможности проверить совместимость и гарантировать, что объект, который вы храните, является классом Shop.
Java избегает метапрограммирования и пытается упростить использование языка с использованием принципов полиморфизма ООП, чтобы сделать гибкий код. Однако есть некоторые насущные и повторяющиеся проблемы, которые через опыт представили и рассматриваются с добавлением минимальных средств метапрограммирования. Java не хочет быть языком метапрограммирования, но редко импортирует концепции оттуда, чтобы решить самые вопиющие проблемы.
Языки программирования, которые предлагают средства для метакодирования лаважа, могут быть значительно более производительными, чем языки, чем избегать его, запрещающего специальные случаи, отражение, полиморфизм ООП и т. Д. Однако для генерации un = nderstandable, maintaiable часто требуется гораздо больше навыков и знаний и код ошибки. Также часто наблюдается снижение производительности для таких языков, когда C++ является немного странным, потому что он скомпилирован в native.
Оффтоп лингвистический вопрос: v.s. или против? - "vs.s." против "против" :) –
@Armen: это также ставит вопрос: «vs.s. vs. vs.» vs. vs. vs.s. vs. "? – Claudiu
@ Claudiu: И пусть регрессия святой рекурсии! : D –