- •Преимущества
- •Связь: ooa→oop→ood
- •Механизм работы virtual
- •Абстрактный класс
- •Виртуальный деструктор
- •{Основные элементы языка программирования}
- •Основные подходы к семантике:
- •Формальное описание семантики:
- •Среда программирования
- •Объекты данных
- •Атрибуты объекта данных
- •Система типизации данных
- •Реализация типов данных
- •Типизация
- •Система типизации данных
- •Реализация типов данных
- •Связывание переменных
- •Контроль типов
- •Статистический контроль типов
- •Алгоритм статистического контроля типов
- •Динамический контроль типов
- •Параллелизм
- •Полиморфизм
- •Статический полиморфизм
- •Динамический полиморфизм
- •Преобразование типов
- •Связь: ooa→oop→ood
- •Среда программирования
- •Цель технологий параллелизма
- •Схемы параллелизма
- •Проблемы параллельного программирования
- •Показатели эффективности параллельного алгоритма Ускорение
- •Закон Густавсона-Барсиса
- •Масштабируемый алгоритм
- •Схемы параллелизма
- •Подтипы данных
- •Разновидности массивов. Статические
- •Кортежи
- •Разновидности массивов. Статические
- •Динамические
- •Атрибуты объекта данных
- •Операции над целыми числами
- •Вещественные числа
- •Числа с фиксированной точкой
- •Числа с плавающей точкой(float)
- •Ошибки вычислений с вещественными числами
- •Утечки памяти и повисшие указатели
- •Указатели на указатели
- •Типизированные указатели
- •Указатели на функции
- •[Отличия указателей и ссылок]
- •Параметры подпрограмм
- •Преимущества подпрограмм
- •Позиционное сопоставление
- •Сопоставление по имени
- •Методы передачи параметров:
- •Передача параметров по значению
- •Передача параметров по ссылке
- •Передача параметров по значению-результату
- •Параметр по результату
- •Стековые языки
- •Циклы и рекурсия
- •Циклы со счетчиком
- •Операторы циклы без заданного числа повторений (бесконечно)
- •Динамический полиморфизм
- •Родовые (настраиваемые) сегменты и шаблоны
Основные подходы к семантике:
1.Ориентированные на компиляцию ( семантика - множество преобразований над синтаксической моделью)
2.Ориентированные на интерпретацию( семантика – множество описанных на метаязыке преобразований синтаксически правильных языковых конструкций)
2.1 Операционные – смысл конструкций языка в терминах переходов абстрактной машины из одного состояния в другое
2.2 Пропозиционные – смысл конструкций языка в терминалах множества формул, описывающих состояния объектов программы.
2.3 Денотационные – смысл конструкций языка в терминах абстракции функций на состояниях программы.
Формальное описание семантики:
•Выполнение программы заключается в изменении значений, хранящихся в ячейках памяти. Обозначим через s состояние памяти в определнный момент времени. Тогда после выполнения следующей команды( обозначим ее S) состояние изменится на другое s’. Это воздействие опишем формулой:
s’=p(S,s), р- воздействие оператора на состояние
1 Формальное описание заключает я в четкой формулировке.
2 Формализованный подход к семантике языка дает возможность автоматизированного анализа программы – появляется возможность определять конечное состояние на выходе программы, зная ее состояние на входе и т.о доказать правильность программы, т.е верифицировать ее.
Среда программирования
•Это набор инструментов, используемых для преобразования символов в выполняемые вычисления.
Синтаксис - это набор правил, которые определяют, какие последовательности символов являются допустимыми.
Семантика - это смысл синтаксических категорий языка программирования.
Подпрограммы - участки исходного кода, которое можно неоднократно выполнять в разных местах программы, вызывая их по имени.
Синтаксис – это набор правил, определяющих какие последовательности символов допустимы. Задается с помощью формальной нотации.
Синтаксическая категория представляет собой ту конструкцию ЯП, которая описывается. Описание задают формальные правила. Для описания правил используют следующие обозначения:
1) прямой жирный текст – фактические символы
2) курсив – синтаксические категории
3) [A] – элемент А входит или не входит в описание синтаксиса
4) {А} – 0 или более повторений элемента А
5) (АВ) – группировка элементов
6) | - или
Семантика языков программирования - это смысл синтаксических категорий ЯП, это интерпретация (смысловое значение) абстрактного синтаксиса (допустимых конструкций языка), выраженная в терминах той или иной математически строгой модели. Семантика связана с используемой концепцией программирования.
Расширенная форма Бекуса-Наура используется для описания контекста свободных и формлаьных грамматик и представляет собой некоторые правила продукции(?):
Левая часть – нетерминальный символ. Правая – терминальный или нетерминальный. Правая часть определяет метод конструкции членов синтаксических категорий в терминах других синтаксических категорий или\и терминальных символах.
Форма Бэкуса-Наура (БНФ) была впервые применена при описании Алгола-60. БНФ совпадает по сути с нотацией КС-грамматик, отличаясь лишь обозначениями. Предусмотрены следующие метасимволы:
• — служат для выделения нетерминалов — понятий языка.
• | — «или». Разделяет альтернативные правые части правил.
• — «есть по определению». Заменяет стрелку, используемую при записи продукций КС-грамматик.
Терминальные символы записываются как есть, никаких специальных способов их выделения не предусмотрено. Вот пример определений на БНФ, взятый из спецификации Алгола-60 — «Модифицированного сообщения»:
• <простое арифметическое выражение> ::=
• <терм> 1 Окак операции типа сложения> <терм> |
• <простое арифметическое выражение>
• <знак операции типа сложения> <терм>
• <знак операции типа сложения> ::= + | -
Как видим, для выражения повторений используется рекурсия, причем повсеместно — левая. БНФ использована Н. Виртом при описании языка Паскаль. Хотя в нотацию были добавлены метаскобки {и}, обозначающие повторение, применены они лишь в отдельных случаях, в то время как, например, грамматика выражений леворекурсивна.
РБНФ
Синтаксис задается с помощью формального нотации. Самой распространенной аннотация - расширенная форма бэкуса-наура (РБНФ).
Описание программы в РБНФ представляет собой набор правил, определяющих отношение между терминальными символами (терминалами) и нетерминальные символами (нетерминальных ).
Терминальные символы - это минимальный элементы грамматики, не имеющие собственный грамматической структуры.
Нетерминальные символы - это элементы грамматики, имеющие собственные имена и структуру. Каждый нетерминальный символ состоит из одного и более терминальных и\или нетерминальных символов, Сочетание которых определяется правилами грамматики.
идентификатор = выражение.
где идентификатор — имя нетерминального символа, а выражение — соответствующая правилам РБНФ комбинация терминальных и нетерминальных символов и специальных знаков. Точка в конце — специальный символ, указывающий на завершение правила.
Семантика правила РБНФ — нетерминальный символ, заданный идентификатором слева от знака «равно», представляет собой определяемую выражением комбинацию терминальных и нетерминальных символов. ------------------------------------------------
Полное описание грамматики представляет собой набор правил, который последовательно определяет все нетерминальные символы грамматики так, что каждый нетерминальный символ может быть сведён к комбинации терминальных символов путём последовательного (рекурсивного) применения правил. В определении РБНФ нет никаких специальных предписаний относительно порядка записи правил, хотя такие предписания могут вводиться при использовании РБНФ программными средствами, обеспечивающими автоматическую генерацию программ синтаксического разбора по описанию грамматики.
19. Наследование в объектно-ориентированном программировании. Множественное наследование. Проблемы множественного наследования.
Наследование – это отношение, при котором один класс разделяет структуру и поведение, определенные в другом классе (одиночное наследование) и нескольких других классах (множественное наследование).
Наследование — это свойство системы, позволяющее описать новый класс на основе уже существующего с частично или полностью заимствующейся функциональностью. Наследование — это свойство системы, позволяющее описать новый класс на основе уже существующего с частично или полностью заимствующейся функциональностью. Класс, от которого производится наследование, называется базовым, родительским или суперклассом. Новый класс — потомком, наследником или производным классом.
Класс, от которого производится наследование, называется базовым, родительским или суперклассом. Новый класс — потомком, наследником или производным классом.
• Наследование – это свойство системы, позволяющее описать новый класс на основе уже существующего с частично или полностью заимствующей функциональностью.
• Класс, от которого производится наследование, называется базовым или родительским. Новый класс – потомком, наследником, производным классом.
• С помощью наследования можно определить новые классы как расширение, специализацию или комбинацию ранее определенных классов.
• Одиночное наследование – у потомка есть единственный родитель.
• Множественное наследование – у потомка два и более родителей.
Стрелочка от потомка к родительскому классу.
Проблемы множественного наследования
1. Конфликты имен между различными суперклассами.
В двух и более суперклассах определено поле или операция с одинаковым именем.
2. Повторное - класс наследует двум классам, а те в свою очередь порознь наследуют одному и тому же четвертому.
Ромбовидная решетка наследования.
В подклассе появятся копии полей и функций из обоих классов и потребуется явное указание происхождения каждой копии.
• Вывод – использование виртуальных базовых классов для запрещения дублирования повторяющихся структур.
20. Инкапсуляция в объектно-ориентированном программировании. Контроль доступа.
Инкапсуляция — это свойство системы, позволяющее объединить данные и методы, работающие с ними в классе, и скрыть детали реализации от пользователя.
Инкапсуляция выполняется посредством сокрытия данных.
Абстракция и инкапсуляция дополняют друг друга.
Абстрагирование направлено на наблюдаемое поведение объекта, а инкапсуляция занимается внутренним устройством. На практике это означает наличие у класса интерфейса и реализации.
• В языках программирования инкапсуля́ция имеет одно из следующих значений, либо их комбинацию:
• языковой механизм ограничения доступа к определённым компонентам объекта;
• языковая конструкция, способствующая объединению данных с методами (или другими функциями), обрабатывающими эти данные.
ИНКАПСУЛЯЦИЯ — процесс отделения друг от друга эл-ов объекта, определяющего устройство и поведения. Она выполняет посредством скрытия информации. Абстракция и инкапсуляция дополняют друг друга. Абстракция направлена на наблюдаемое поведение объекта, инкапсуляция занимается его внутренним устройством.
=> наличие в классе двух частей:
1. интерфейс.
2. реализация.
Контроль доступа
Поскольку методы класса могут быть как чисто внутренними, обеспечивающими логику функционирования объекта, так и внешними, с помощью которых взаимодействуют объекты, необходимо обеспечить скрытость первых при доступности извне вторых. Для этого в языки вводятся специальные синтаксические конструкции, явно задающие область видимости каждого члена класса. Традиционно это модификаторы public, protected и private, обозначающие, соответственно, открытые члены класса, члены класса, доступные внутри класса и из классов-потомков, и скрытые, доступные только внутри класса. Конкретная номенклатура модификаторов и их точный смысл различаются в разных языках.
Заключение данных и методов внутри классов в комбинации с осуществлением сокрытия (используя контроль доступа) часто называется инкапсуляцией.
21. Понятие класса и объекта в объектно-ориентированном программировании. Атрибуты, методы, конструктор и деструктор, статические члены класса.
Класс- абстрактный тип данных, снабженный некоторыми возможностями реализации.
Одновременно является и модулем и типом. Характеризуется атрибутами и методами.
Отношения между классами:
1. Ассоциация-
2. Агрегация
3. Композиция
• Полностью реализованный класс называется эффективным.
• Класс, который реализован лишь частично или не реализован вовсе, называется отложенным.
• Различают внутреннее представление класса (реализацию) и внешнее представление класса (интерфейс).
• Реализация класса описывает поведение класса. Она включает реализации всех операций, определенных в интерфейсе класса.
• Атрибуты класса определяют состав и структуру данных, хранимых в объектах этого класса. Каждый атрибут имеет имя и тип, определяющий, какие данные он представляет.
• Класс содержит объявления операций, представляющих собой определения запросов, которые должны выполнять объекты данного класса.
• Реализация операции в виде процедуры - метод, принадлежащий классу.
+ открытый класс виден для любого другого класса (public)
- закрытый не виден внешними классами и может использоваться только объектами, его содержащим (private)
# защищенный виден внутри самого класса, для потомков данного класса (protected)
~ пакетный виден для клиента класса, объявленного в том же пакете (package)
Атрибуты:
• Видимость Имя: Тип[множественность]=начальное значение {свойства}
Методы:
• Видимость Имя (список параметров):Возвращаемый Тип{свойства}
Параметры метода:
• Направление Имя: Тип = значение по умолчанию
• Если атрибут (операция) подчеркивается - его область действия является класс, иначе -
Реализация класса описывает поведение класса. Она включает реализации всех операций, определенных в интерфейсе класса.
Атрибуты класса определяют состав и структуру данных, хранимых в объектах этого класса. Каждый атрибут имеет имя и тип, определяющий, какие данные он представляет.
Класс содержит объявления операций, представляющих собой определения запросов, которые должны выполнять объекты данного класса. Реализация операции в виде процедуры – это метод, принадлежащий классу.
Специальные виды классов:
Абстрактный класс – это класс, который не может иметь экземпляров. В них присутствуют функции члены, которые объявлены, но не определены. Эти функции определяются в наследниках, которые уточняют данную абстракцию.
Интерфейс – это абстрактный класс, который содержит только объявление методов и статические константные поля.
Класс-утилита – это класс, в котором присутствуют только статические члены. Используются для группировки наиболее часто используемых алгоритмов.
• Конструктор - операция создания объекта и/или его инициализации;
• Деструктор - операция, освобождающая состояние объекта и/или разрушающая сам объект.
При объявлении класса данные-члены и функции-члены класса можно объявлять статическими с помощью ключевого слова static. Существует лишь один экземпляр статических данных-членов класса, разделяемый всеми объектами этого класса в программе. Статический член является не частью объектов класса, а отдельным объектом. Статический член класса будет существовать, даже если не создано ни одного объекта класса.
22. Диаграммы классов UML. Основные элементы и обозначения.
UML – это язык графического описания для объектного моделирования в области разработки программного обеспечения.
UML является языком широкого профиля, это открытый стандарт, использующий графические обозначения для создания абстрактной модели системы, называемой UML моделью.
Диаграмма, описывающая структуру системы, демонстрирующая классы системы, их атрибуты, методы и зависимости между классами.
Существуют разные точки зрения на построение диаграмм классов в зависимости от целей их применения:
• концептуальная точка зрения — диаграмма классов описывает модель предметной области, в ней присутствуют только классы прикладных объектов;
• точка зрения спецификации — диаграмма классов применяется при проектировании информационных систем;
• точка зрения реализации — диаграмма классов содержит классы, используемые непосредственно в программном коде (при использовании объектно-ориентированных языков программирования).
Диаграмма классов описывает статическую структуру системы, показывая её классы, их атрибуты и методы, и также взаимосвязи этих классов.
Отношения между классами:
• Ассоциация показывает структурные отношения между объектами-экземплярами класса, т.е. соединения между классами.
Когда класс участвует в ассоциации, он играет в этом отношении определенную роль.
•Мощность ассоциации бывает одного из трех типов:
-один-к-одному;
-один-ко-многим;
-многие-ко-многим
• Зависимость - это отношение, которое показывает, что изменение в одном классе (независимом) может влиять на другой класс (зависимый), который использует его.
С помощью зависимости уточняют, какая абстракция является клиентом, а какая — поставщиком определенной услуги.
Пунктирная стрелка зависимости направлена от клиента к поставщику.
• Агрегация обозначает отношения классов в иерархии «целое/часть». Говорят, что агрегация образует «part of»-иерархию классов (и объектов).
Агрегация обеспечивает возможность перемещения от целого (агрегата) к его частям (атрибутам).
Нефизическое включение – агрегация.
• Композиция – физическое включение.
Один класс без другого не может существовать.
• Реализация - это отношение между классами, в котором класс-приемник выполняет реализацию операций интерфейса класса-источника.
Класс Каталог должен реализовать интерфейс Обработчик каталога, то есть Обработчик каталога рассматривается как источник, а Каталог — как приемник.
• Обобщение — отношение между общей сущностью и специализированной разновидностью этой сущности.
Наследование - это отношение, при котором один класс разделяет структуру и поведение, определенные в одном другом (простое наследование) или во многих других (множественное наследование) классах.
23. Данные. Средства описания данных. Типизация языка.
Данные – сущности, над которыми выполняют вычисления программы и которые получаются в результате этих вычислений.
Данные: встроенные и собственные (пользовательские).
Типы данных – множество значений и операций над этими значениями.
Нетипизированные языка – языки, в которых в любые переменные можно записывать любые значения в любом месте программы.
Для хранения данных используются ячейки памяти. 1 ячейка = 8 бит. Для процессора минимальный объем ячейки – машинное слово. Оно зависит от разрядности процессора.
Простые типы данных:
Целочисленные типы данных. Integer. Числа со знаком представляются в виде дополнительного кода (инверсия битов и добавление 1)
Символьный тип – аналог целочисленного типа. 256 символов. Для того, чтобы сопоставить числам символы, нужно использовать таблицу кодировки.
Перечисление – тип данных. Операция выполняется в контексте порядкового номера, соответствующего обозначению в таблице. Многие яп требуют явной типизации значений типа перечислений при таких операциях.
Булевый тип – частный случай перечислений. 0 – «false», остальное трактуется как «true».
Подтипы – типы, значение которых ограничено некоторым диапазоном.
Вещественные числа. Существует 2 подхода кодировки: согласно 2ой арифметике и кодировка целого числа + дополнительная информация о позиции десятичного разряда.
1. Числа с фиксированной точкой. Число содержит не более заданного количества цифр N
и не более некоторого количества знаков M после запятой.
2. Числа с плавающей точкой. X * 10m, где x – мантисса, m – порядок экспоненты.
Составные типы данных:
Массив. Это тип данных, содержащий множество значений одного типа. Отдельные ячейки – элементы, порядковый номер – индекс. В памяти хранится последовательно. Основная операция – получение элемента по индексу. Основная ошибка – выход индекса за диапазон массива. Бывают одномерные и многомерные. Организация: реально двумерный массив (Паскаль) или массив массивов.
Записи. Набор данных, содержащих элементы разных типов. Элементы – поля. Доступ к полям производится путем сдвига адреса.
Строковый тип данных. Массив из целочисленных элементов. Для того, чтобы зафиксировать длину строки используют различные подходы:
1. Строка с признаком конца строки (транслятор автоматически подставляет «0»).
2. Строка со счетчиком (длина хранится в нулевом байте самой строки, массив имеет фиксированный размер).
3. Строка является указателем на строку символов в памяти.
•Типизация – позволяет устранить ошибки на момент компиляции.
<Типы данных и типизации>
Типы данных
1. Для хранения используются ячейки памяти
2. Объем одной ячейки=8бит=1байт
3. Машинное слово – минимальный для процессора объем одной ячейки.
4. Тип данных – механизм классификации данных.
Типы данных:
Простые ( Целочисленные, вещественные, символьные, логические, перечисления)
Сложные(составные) (Массивы, структуры и записи, строки, множества, кортежи, списки, классы)
Машинно-независимые – занимают определенное количество памяти. (char занимает 1 байт всегда)
Машинно-зависимые – размер занимаемых ими ячеек зависит от платформы, под которую компилируется.( int – ровно одно машинное слово. 32-битная платформа – 4 байта, 64 –битная - 8 байт)
