Метапрограммирование


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

При этом подходе код программы не пишется вручную, а создаётся автоматически программой-генератором на основе другой программы.

Такой подход приобретает смысл, если при программировании вырабатываются различные дополнительные правила (более высокоуровневые парадигмы, выполнение требований внешних библиотек, стереотипные методы реализации определённых функций и пр.). При этом часть кода (или данных) теряет содержательный смысл и становится лишь механическим выполнением правил. Когда эта часть становится значительной, возникает мысль задавать вручную лишь содержательную часть, а остальное добавлять автоматически. Это и проделывает генератор.

Наиболее распространённым и наглядным примером первого случая являются GUI-построители, где метапрограмма нацелена на пользовательское программирование, позволяя не сведущим в программировании специалистам в области эргономики принимать непосредственное участие в разработке программных продуктов. В этом случае метапрограмма оказывается заведомо намного более сложной, крупной и трудоёмкой в разработке, чем порождаемый ею код, и её разработка оправдывается частотой её использования. Следует отметить, что на практике, как правило[источник не указан 3008 дней] (но не обязательно), такого рода метапрограммы пишутся на императивных языках для использования в императивных же языках, и поставляются в скомпилированном виде. Недостатком этого метода является невозможность повторного использования кода метапрограммы при разработке новых, более сложных метапрограмм.

Другим примером являются генераторы синтаксических и лексических анализаторов, такие как Lex, YACC, ANTLR, bison.

Второй случай представляет собой встраивание языка и реализуется тремя статическими методами c использованием макросредств языка или чистым встраиванием. В этом случае наработки, накопленные в процессе разработки метапрограмм, в дальнейшем могут интенсивно повторно использоваться для разработки новых метапрограмм[2].