Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 400107.doc
Скачиваний:
5
Добавлен:
30.04.2022
Размер:
568.32 Кб
Скачать
      1. Логическое программирование

Появление prolog’a открыло новую область исследований - логическое или реляционное программирование, где практические результаты зачастую предшествуют их теоретическому осмыслению и обоснованию.

Центральным понятием в логическом программировании является отношение. Программа представляет собой совокупность определений отношений между объектами (в терминах условий или ограничений) и цели (запроса). Процесс выполнения программы трактуется как процесс установления общезначимости логической формулы, построенной из программы по правилам, установленным семантикой того или иного языка. Результат вычисления является побочным продуктом этого процесса. В реляционном программировании нужно только специфицировать факты, на которых алгоритм основывается, а не определят последовательность шагов, которые требуется выполнить. Это свидетельствует о декларативности языков логического программирования. Она выражена в формуле “алгоритм = логика + управление”

Языки логического программирования характеризуются:

- сверхвысоким уровнем;

- жесткой ориентацией на символьные вычисления (числовая обработка затруднена);

- возможностью инверсных вычислений (переменные в вызовах “процедур” не делятся на входные и выходные), что является уникальной чертой реляционного программирования, хотя недавно разработан аналогичный подход и для функциональных языков;

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

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

Логические программы отличаются принципиально низким быстродействием, так как вьтчисления осуществляются методом проб и ошибок (по средством поиска с возвратами), а также высокой степенью параллелизма

Однако организация параллельного исполнения затруднительна и требует чрезвычайно много ресурсов компьютера.

Языки логического программирования играли центральную роль в проектах компьютеров пятого поколения. Разработан и разрабатывается ряд архитектур с целью аппаратной поддержки реляционного программирования.

      1. Объектно-ориентрованное программирование

Прототипом объектно-ориентированного программирования послужил ряд средств, содержащихся в языке simula-67. Но оформилось оно в самостоятельный стиль программирования в связи с появлением языка Smalltalk, первоначально предназначенного для реализации функций машинной графики.

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

Основными особенностями объектно-ориентированных языков являются:

- наличие активных объектов;

- формирование объектов путем наследования свойств;

- посылка сообщений от объекта к объекту как механизм организации вычислительного процесса.

Суть данного стиля программирования выражается формулой “объект = данные + процедуры”.

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

Концепция объекта опирается на методы структурного программирования и методы разработки программ, основанные на абстракции данных.

Структурное программирование связано с функциональной декомпозицией и предполагает проектирование программного продукта сверху - вниз.

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

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

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

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

Алан Кей, которого называют отцом ООП, считает следующие положения фундаментальными характеристиками ООП:

1. Все является объектом.

2. Вычисления осуществляются путем взаимодействия (обмена данными) между объектами, при котором один объект требует, чтобы другой объект выполнил некое действие. Объекты взаимодействуют. посылая и получая сообщения. Сообщение - это запрос на выполнение действия, дополненный набором аргументов, которые могут понадобиться при выполнении действия.

3. Каждый объект имеет независимую память, которая состоит из других объектов.

4. Каждый объект является представителем класса, который выражает общие свойства объектов (таких, как целые числа или списки).

5. В классе задается поведение (функциональность) объекта. Тем самым, объекты, которые являются экземплярами одного класса, могут выполнять одни и те же действия.

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

По мере того, как программные проекты становились все сложнее, было замечено интересное явление. Задача, для решения которой одному программисту требовалось два месяца, не решалась двумя программистами за месяц. Причиной такого нелинейного поведения явилась сложность. В частности, взаимосвязи между программными компонентами стали сложнее, и разработчики вынуждены были постоянно обмениваться между собой значительными объемами информации. Порождает сложность не просто большой объем рассматриваемых задач, а уникальное свойство программных систем, разработанных с использованием традиционных подходов, - большое число перекрестных ссылок между компонентами. Перекрестные ссылки в данном случае обозначают зависимость одного фрагмента кода от другого.

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

от процедур к модулям,

далее к абстрактным типам данных и

наконец к объектам.