Аспектно-ориентированное программирование

•Разделение функциональности для улучшения разбиения программы на модули.

Примеры:

1. Трассировка

2. Контрактное программирование, в частности проверка пред и пост условий

3. Обработка ошибок.

4. Реализация систем безопасности.

Динамические языки

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

•Больше подходят для быстрой разработки приложений.

•Phyton,PHP,Rudy,Javascript.

•Операция склеивания строк – конкатенация.

[Объектно-ориентированные языки программирования]

•Объект – объединяет в себе поля данных (атрибуты) и методы (выполняемые объектом действия).

•Программа – описание объектов, их свойств (атрибутов), совокупностей (классов), отношений между ними, способов их взаимодействий и операций над объектами (методов), при этом классы образуют иерархию.

•Наследование – Создание нового класса объектов путем добавления новых элементов (методов).

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

•Полиморфизм – Некоторые части (методы) родительского класса заменяются новыми реализующими специфические для данного потомка действия.

•Типизация – позволяет устранить ошибки на момент компиляции.

+Объекты, классы и методы могут быть полиморфными данными, следовательно гибкость и универсальность.

-Сложность адекватной формализации объектной теории, следовательно трудность тестирования и верификации ПО.

•С++, Ada, pascal, PHP.

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

•ОО программирование, при котором отсутствует понятие класса, а повторное использование (наследование) производится путем клонирования существующего экземпляра объекта программы.

Язык описания интерфейсов

•Похож на описание классов С++.

•Язык спецификаций.

Логическое программирование

•Раздел математической логики, изучающий методы и возможности этой парадигмы, основанная на выводе новых фактов из данных фактов согласно заданным логическим правилам.

•Программа – совокупность логических правил при высказывании.

•Используется в экспертных системах и системах принятия решений.

•Высокий уровень машинной независимости, возможность отката к предыдущей подцели при отрицательном результате анализа одного из вариантов.

•Prolog,Oz,Frill.

•Специфичность решаемых задач.

•Нелинейность структуры программы.

•Сложность эффективной реализации в системе реального времени.

Параллельное программирование

•Программы – совокупность описаний процессов, которые могут выполняться как в действительности одновременно, так и в псевдопараллельном режиме.

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

•Часто применяют в системах реального времени.

•Недостаток – высокие накладные расходы на разработку программ.

•Ada,MC#.

Язык сценариев (скриптовые)

•Программа состоит из сценариев, последовательностей операций.

•Скриптовые языки или языки сценариев пакетной обработки.

•bat,bash.

8. Унификация и хорновский клоз в логических языках программирования.

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

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

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

Унификация - При поиске решений для множеств ограничений мы используем идею, высказанную Хиндли (Hindley, 1969) и Милнером (Milner, 1978), кото- рая состоит в использовании унификации (unification) (Robinson, 1971) для проверки непустоты множества решений и, если это так, нахожде- ния «наилучшего» из его элементов в том смысле, что все остальные решения могут быть непосредственно получены из него.

Дизъюнкт Хорна (хорновский дизъюнкт, клоз Хорна) - дизъюнкция, в которой содержится не более одного положительного литерала.

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

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

Одним из наиболее важных аспектов программирования на Прологе является использование унификации (отождествления) и конкретизации переменных.

Пролог пытается отождествить термы при доказательстве, или согласовании, целевого утверждения. Например, в программе для согласования запроса ?- человек(Х) целевое утверждение человек(X) может быть отождествлено с фактом служащий(Иван), в результате чего переменная Х станет конкретизированной: Х= Иван.

Хорновский клоз (Ноrn clause) — это формула, в которой с помощью конъюнкции («и») элементарных формул выводится одиночная элементарная формула:

(s=>t)<=(t = tl||t2)^(s=>tl)

Логическое программирование основано на том наблюдении, что, ограничивая формулы хорновскими клозами, мы получаем правильное соотношение между выразительностью и эффективностью вывода. Такие факты, как t => t, являются выводами, которые ниоткуда не следуют, т. е. они всегда истинны. Вывод также называется головой формулы, потому при записи в инверсной форме оно появляется в формуле первым.

Чтобы инициализировать вычисление логической программы, задается цель:

“wor” => "Hello world"?

Машина вывода пытается сопоставить цель и вывод формулы. В данном случае соответствие устанавливается сразу же: "wor" соответствует переменной s, a "Hello world" — переменной t. Это определяет подстановку выражений (в данном случае констант) для переменных; подстановка применяется ко всем переменным в формуле:

"wor" => "Hello world" <= ("Hello world" = tl || t2) ^ ("wor" => tl)

Теперь мы должны показать, что:

("Hello world" = t1|| t2) ^ ("wor" => tl)

является истинным, и это ведет к новому соответствию образцов, а именно попытке установить соответствие "Hello world" с tl || t2. Здесь, конечно, может быть много соответствий, что приведет к поиску. Например, машина вывода может допускать, чтобы tl указывало на "Не", a t2 указывало на "llо world"; эти подстановки затем проводятся во всем вычислении.

9. Модель вычислений функциональных языков программирования.

10. Языки программирования низкого уровня.

Язык программирования низкого уровня — язык программирования, близкий к программированию непосредственно в машинных кодах используемого реального или виртуального (например, Java, Microsoft .NET) процессора. Для обозначения машинных команд обычно применяется мнемоническое обозначение. Это позволяет запоминать команды не в виде последовательности двоичных нулей и единиц, а в виде осмысленных сокращений слов человеческого языка (обычно английских).

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

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

Низкоуровневое – программирование, основанное на прямом использовании возможностей и особенностей конкретной вычислительной системы.

Намечают три вида низкоуровневых языков

1 Машинный код

2 Мнемо код

3 Ассемблер , макроассемблер

Машина Кода программа представляется в виде последовательности чисел являющихся кодами команд процессора, адресами оперативной памяти, номерами регистров процессора и внешних устройств.

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

Ассемблеры от мнемо кодов отличаются обширным набором директив транслятора. В первую очередь директивами программ в виде логически законченных элементов.

Макроассемблеры является расширением ассемблера за счет включения макросредств.

11. Средства разработки графического интерфейса пользователя. Эргономические свойства человеко-машинного интерфейса.

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

• эргономичность — интегральный показатель степени выполнения эргономических требований;

• показатели качества деятельности оператора (время решения задачи, производительность, число ошибок, состояние здоровья и т.д.);

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

• эффективность СЧМ;

• напряжённость и экстремальность деятельности и т.д.

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

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

Человеко-машинный интерфейс условно можно разделить на 3 подгруппы:

текстовый (командные строки) интерфейс;

смешанный (псевдографический) интерфейс

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

графический интерфейс

(это система средств для взаимодействия пользователя с компьютером, основанная на представлении всех доступных пользователю системных объектов и функций в виде графических компонентов экрана (окон, значков, меню, кнопок, списков и т.п.) К этому виду интерфейсов относятся такие системы как, Mac OS, Solaris, GNU/Linux, Microsoft Windows, NeXTSTEP

12. Процедурные языки программирования. Основные отличия от других типов языков.

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

К процедурным языкам относятся Basic, Cobol, Fortran, Pascal, C и Ada.

Преимущества:

- маленькие модули можно написать легко и быстро;

- модули общего назначения можно использовать неоднократно, что приведет к ускорению времени разработки новых программ;

- модули можно отлаживать и тестировать независимо от всей программы.

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

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

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

Примеры: паскаль, С, Бейсик, Ада, Фортран.

13. Обоснование выбора языка программирования.

Для реализации алгоритма в качестве основного был выбран язык программирования С++, который стал едва ли не стандартом для написания любых достаточно сложных программ.

Язык программирования служит двум связанным между собой целям: он дает программисту аппарат для задания действий, которые должны быть выполнены, и формирует концепции, которыми пользуется программист, размышляя о том, что делать. Первой цели идеально отвечает язык, который настолько «близок к машине», что всеми основными машинными аспектами можно легко и просто оперировать достаточно очевидным для программиста образом. С таким умыслом первоначально задумывался C. Второй цели идеально отвечает язык, который настолько «близок к решаемой задаче», чтобы концепции её решения можно было выражать прямо и коротко. С таким умыслом предварительно задумывались средства, добавленные к C для создания С++.

Главным образом выбор языка программирования зависит от

1. Решаемой задачи

2. Операционной системы

3. Возможностей языка программирования

4. Цена программного обеспечения

5. Обучение

6. Сопровождение

7.Удобство

8. Возможности и условия дальнейшего распространения готового продукта

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

Недостатки:

• Язык компилируется в момент исполнения кода. Каждый раз, когда вы открываете сайт, javascript код начинает компилироваться. Как минимум увеличивается время выполнения программы.

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

• Не привычная для многих программистов объектная модель. Классы и наследование классов присутствует, но оно сильно отличается от привычной многим реализаций в языках программирования C++/C#/Java.

Достоинства:

• JavaScript предоставляет большое количество возможностей для решения самых разнообразных задач. Гибкость языка позволяет использовать множество шаблонов программирования применительно к конкретным условиям. Изобретательный ум получит настоящее удовольствие;

• Популярность JavaScript открывает перед программистом немалое количество готовых библиотек, которые позволяют значительно упростить написание кода и нивелировать несовершенства синтаксиса;

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

14. Перегрузка в языках программирования.

Перегрузка процедур и функций — возможность использования одноимённых подпрограмм: процедур или функций в языках программирования.

Перегрузка. Использование одного и того же имени для обозначения разных объектов/вариантов применения оператора вобщей области действия.

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

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

Чтобы дать возможность определять и переопределять операции в язык вводятся различные синтаксические конструкции.

Перегружать операции имеет смысл только в том случае, если вновь вводимые операции аналогичны предопределенным.

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

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

• Компилятор однозначно идентифицирует функцию по ее имени и набору аргументов. Для компилятора функция с одинаковыми именами, но различными параметрами аргументов – разные функции.

Int add_values(int a, int b)

{ return(a + b);}

Int add_values(int a, int b, int c)

{ return(a + b+c);}

Int add_values(float a, float b)

{ return(a + b);}

Void main(void)

{cout<<”200+800=”<< add_values (200,800);

cout<<”100+200+800=”<< add_values (100,200,800);

cout<<”0.5+0.2=”<< add_values (0.5,0.2);}

Механизм реализации в языке:

+ Улучшает удобочитаемость программ/

- Идентификация – сложность выбора конкретной реализации в случае, если нет точного совпадения типов для аргументов.

• Варианты решения:

1. Требовать однозначный проходящий вариант перегруженной функции.

2. Предоставить выбор компилятору. Выберется вариант, не приводящий к потере информации при преобразовании типов. Если существует более одного варианта – выдать ошибку.

• Приоритет и ассоциативность – порядок выполнения и следование операторов.

• Если они определены жестко – это может быть неудобно и не соответствовать предметной области (например, для операций с множествами приоритеты отличаются от арифметических).

• Если они могут быть заданы программистом – это становится дополнительным источником ошибок.

Пример: операция a+b все нормально для чисел, но для строк важен порядок, т.к. это конкатенация и a+b!=b+a

15. Логические языки программирования. Основные положения и понятия. Отличия от других типов языков программирования.

Логические языки – все операции представлены в виде логических формул. В программе допустимы логические причинно следственные связи. Таким образом логические программы базируются на классической логике и применимы для систем логического вывода.

Преимущества

1) Высокий уровень машинной независимости

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

Недостатки

1) Специфичность класса решаемых задач.

2) Сложность эффективной реализации для принятия решения в реальном времени.

3) Нелинейность структуры программы.

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

Первым языком логического программирования был язык Planner, в котором была заложена возможность автоматического вывода результата из данных и заданных правил перебора вариантов (совокупность которых называлась планом). Planner использовался для того, чтобы понизить требования к вычислительным ресурсам (с помощью метода backtracking) и обеспечить возможность вывода фактов, без активного использования стека. Затем был разработан язык Prolog, который не требовал плана перебора вариантов и был, в этом смысле, упрощением языка Planner.

Логическая программа состоит из предикатов, представляющими собой функции, вырабатывающие логические значения – любой предикат содержит вычисления, которые могут быть либо истинными, либо ложными. При этом результаты вычисления предикат возвращает только если вычисления истинны. Предикаты состоят из правил (предложений), описывающих вычисления и соединенных между собой логическими операторами И/ИЛИ, при этом логическому И соответствует оператор запятая, а ИЛИ – оператор точка. Программы на языке Prolog могут содержать также переменные (их имена обязательно должны начинаться с большой буквы – этим они отличаются от других объектов), однако одним из базовых в логическом и функциональном программировании является принцип однократного присваивания, в соответствии с которым переменная может получить значение лишь один раз, все остальные попытки присваивания будут работать как проверка на равенство. Следствием принципа однократного присваивания является отсутствия циклических конструкций в Prolog – вместо них везде применяется рекурсия, что не снижает скорость работы программы, т.к. хвостовая рекурсия также эффективна, как и цикл.

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

· Задача программиста – описание логической модели предметной области в терминах объектов, их свойств и отношений между ними (без деталей): описание данных и логики их обработки ~ аналогия с ООП.

· Удобство описания отношений между объектами (реляционная модель).

· Компактность кода (обработка структурированных данных, лог. правила).

· Возможность перебора и поиска различных решений, заложенная в язык.

· Легкость понимания (описание отд. правил), отладки программ (trace).

· Легкость описания сложных структур данных (деревья, списки и т.п.).

· Эффективный метод вычислений – рекурсия.

· Отсутствие указателей, операторов присваивания и безусловного перехода.

· Множество областей для применения: автоматический перевод, обработка текстов, экспертные системы, САПР, Data-minig системы, автоматическое управление, СУБД, символьные вычисления.

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

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

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

Преимущества

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

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

3) Использование раннее разработанных библиотек объектов и методов, что снижает трудозатраты и временные затраты.

4) Объекты классы и методы могут быть полиморфными, что делает программное обеспечение более гибким и универсальным.

Недостаток

1) Сложность адекватной т.е. непротиворечивой, полной формализации объектной теории, рождает трудности тестирования и верификации созданного программного обеспечения.

<Объектно-ориентированное программирование (ООП)>

• Описывает статическую структуру системы, показывая ее классы, их атрибуты и методы, и также взаимосвязи этих классов.

• (ООP) (объектно-ориентированное программирование) – это методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определенного класса, а классы образуют иерархию наследования.

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

• (OOA) (Объектно-ориентированный анализ) – это методология, при которой требования к системе воспринимаются с точки зрения классов и объектов, выявленных в предметной области.

Связь: OOA→OOP→OOD

• На результатах OOA формируются модели, на которых основывается OOD, OOD в свою очередь создает фундамент для окончательной реализации системы с использованием методологии ООП.

ОО ЯП

•Язык программирования является объектно-ориентированным тогда и только тогда, когда выполняются следующие условия:

1) Поддерживаются объекты, т.е. абстракции данных, имеющие интерфейс в виде именованных операций и собственные данные, с ограничением доступа к ним.

2) Объекты относятся к соответствующим типам (классам).

3) Типы (классы) могут наследовать атрибуты супер типов (суперклассов).

Преимущества объектной модели:

+Позволяет использовать возможности ОО языка программирования.

+Повышает уровень унификации разработки и пригодность для повторного использования программ и проектов.

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

+Уменьшает риск разработки сложных систем. ОО проектирование – это единственная методология, позволяющая справиться со сложностью, присущей большим системам.

+Ориентирована на человеческое восприятие мира.

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

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

· Данные и операции вместе образуют определенную сущность и они не «размазываются» по всей программе, как это нередко бывает в случае процедурного программирования.

· Локализация кода и данных улучшает наглядность и удобство сопровождения программного обеспечения.

· Инкапсуляция информации защищает наиболее критичные данные от несанкционированного доступа.

Недостатки:

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

17. Полиморфизм в объектно-ориентированном программировании. Виртуальные функции. Таблицы виртуальных функций.

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

Полиморфизм – Некоторые части (методы) родительского класса заменяются новыми реализующими специфические для данного потомка действия.

Полиморфизм – это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.

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

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

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

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

• Виртуальные функции - применяются для реализации динамического полиморфизма

• Чистая виртуальная функция – это функция-член, которая объявлена со спецификатором = 0 вместо тела:

• Чистая виртуальная функция не имеет определения и не может быть непосредственно вызвана.

• Чистая виртуальная функция применяется для создания абстрактных классов.

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

• Функция – член объявляется чистой виртуальной тогда, когда ее определение для базового класса не имеет смысла.

Механизм работы virtual

• Если определена хотя бы одна виртуальная функция, то для каждого полиморфного класса (базового и всех производных) создается таблица виртуальных функций – одномерный массив указателей на функции.

• Количество элементов в массиве равно количеству виртуальных функций в массиве.

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

• Помимо создания таблицы виртуальных функций, в базовом классе объявляется поле __vfptr – указатель на vtable. Этот указатель наследуется всеми производными классами. __vfptr указывает на vtable класса, которому принадлежит объект.

• Если процессор видит, что метод виртуальный, то ищет в таблице нужную запись. Адрес таблицы он узнает через __vfptr.

Абстрактный класс

• Абстрактный класс – такой, у которого есть хотя бы одна не переопределенная чистая виртуальная функция – член.

• Экземпляры таких классов создавать запрещено, абстрактные классы могут использоваться только для порождения новых классов путем наследования.

• Если в классе- потомке абстрактного класса не переопределены все унаследованные чистые, то класс также является абстрактным и на него распространяются все указанные ограничения.

Виртуальный деструктор

• Основное правило: если у вас в классе присутствует хотя бы одна виртуальная функция, деструктор также следует сделать виртуальным.

• При этом не следует забывать, что деструктор по умолчанию виртуальным не будет, поэтому следует объявить его явно.

• Если этого не сделать, в программе будут утечки памяти.

Полиморфи́зм (от греч. πολὺ- — много, и μορφή — форма) в языках программирования — возможность объектов с одинаковой спецификацией иметь различную реализацию.

Возможность объектов с одинаковой спецификацией иметь различную реализацию.

Предполагает использование одного объекта языка, для выполнения различных действий.

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

Различают полиморфизм статический и динамический.[ В статическом полиморфизме множественные формы разрешаются на этапе компиляции.

1) Преобразование типов

2) Перегрузка

3) Родовой настраиваемый сегмент – параметризованный шаблон подпрограммы, использующийся для создания различных конкретных экземпляров подпрограммы. ]Динамический полиморфизм – структурная неопределенность остается до этапа выполнения.

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

2. Диспетчеризация во время выполнения (динамич диспетчеризация – механизм, посредством которого разрешение обращения к переопределенному методу осуществляется во время выполнения, а не во вр компиляции. Этот полиморфизм поддерживается методом виртуальных функций.

Таблица виртуальных функций – это одномерный массив указателей на функции. Количество элементов в массиве равно количеству виртуальных функций в классе.

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

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

18. Структура языка программирования. Синтаксис и семантика языков программирования. Расширенная форма Бэкуса-Наура.

{Основные элементы языка программиро<

Наши рекомендации