Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






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




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

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

Реализуется двумя основными методами:

Шаблоны (наиболее известные случаи применения — препроцессор Си и шаблоны в C++)

Решают задачу, если соблюдение «правил» сводится к вставке в программу повторяющихся (или почти повторяющихся) кусков кода. Помимо этого, обладают ещё рядом достоинств: например, помогают повторному использованию. См. также: полиморфизм

Синтаксические макросы. Позволяют генерировать код как шаблоны С++, но имеют больше возможностей для кодогенерации, так как умеют работать с объектной моделью программы, в отличие от шаблонов С++. Реализованы в нескольких языках программирования: Nemerle, Scala, Лисп и других.

Внеязыковые средства (пример: генераторы синтаксических и лексических анализаторов lex, yacc, bison)

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

В Perl существует понятие «source filters» («фильтров исходного кода») — метода переработки файлов с исходным кодом перед выполнением, позволяющего полностью менять синтаксис и семантику языка. Одним из известных примеров является модуль Lingua::Romana::Perligata, позволяющий писать код Perl на латыни.

В Форт программисту предоставляют встроенные в язык возможности по изменению своего синтаксиса и семантики. Это достигается определением архитектуры виртуальной машины и полного доступа к возможностям изменения её составляющих. Возможность изменять или дополнять себя во время выполнения превращает программу в виртуальную машину. Хотя такая возможность существовала уже давно на уровне машинных кодов (и активно использовалась, например, при создании полиморфных вирусов), с метапрограммированием обычно связывают перенос подобных технологий в высокоуровневые языки.

Основные методы реализации:

Интроспекция — представление внутренних структур языка в виде переменных встроенных типов с возможностью доступа к ним из программы.

Позволяет во время выполнения просматривать, создавать и изменять определения типов, стек вызовов, обращаться к переменной по имени, получаемому динамически и пр.

Пространство имён System.Reflection и тип System.Type в.NET; классы Class, Method, Field в Java; представление пространств имен и определений типов через встроенные типы данных в Python; стандартные встроенные возможности в Форт по доступу к ресурсам виртуальной машины; получение значения и изменение свойств почти любого из объектов в ECMAScript (с оговорками).

Интерпретация произвольного кода, представленного в виде строки.

Существует естественным образом во множестве интерпретируемых языков, например, eval() в PHP.

Компилятор Tiny C позволяет «на лету» компилировать и исполнять код на языке C, представленный в виде строки символов.

Для Форт использования процедуры интерпретации из строки EVALUATE.

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

 

Заключение

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

В императивном программировании при вызове одной и той же функции с одинаковыми параметрами, но на разных этапах выполнения алгоритма, можно получить разные данные на выходе из-за влияния на функцию состояния переменных. А в функциональном языке при вызове функции с одними и теми же аргументами мы всегда получим одинаковый результат: выходные данные зависят только от входных.

Структурное программирование ориентировано на общение с людьми, а не с машиной, способствует написанию программ, представляющих собой простое и ясное решение задачи. Важно, чтобы программист, еще только приступая к програм­мированию логики, мыслил в терминах основных базовых струк­турных конструкций.

Мышление в терминах автоматов (шагов и состояний) находит применение и при описании семантики некоторых языков программирования. Так, исполнение программы на языке Рефал представляет собой последовательность изменений поля зрения Рефал-машины или, иначе говоря, последовательность шагов Рефал-автомата, состоянием которого является содержимое поля зрения (произвольное Рефал-выражение, не содержащее переменных).

Средства обобщённого программирования реализуются в языках программирования в виде тех или иных синтаксических средств, дающих возможность описывать данные (типы данных) и алгоритмы (процедуры, функции, методы), параметризуемые типами данных. У функции или типа данных явно описываются формальные параметры-типы. Это описание является обобщённым и в исходном виде непосредственно использовано быть не может.

Основные парадигмы программирования существенно отличаются по своим приемам и средствам, а поэтому имеют различные области применения в практике программирования. Поскольку современные языки программирования все больше включают средства разных парадигм, необходимо включать изучение парадигм в основные курсы подготовки специалистов высшей школы в области информатики и программирования.

 

 






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных