Оценка максимально достижимого параллелизма

Закон Амдала

• Всегда есть последовательные расчеты, которые не могут быть распараллелены.

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

• Ускорение процессора вычислений при использовании p процессоров ограничивается величиной:

Sp<=1/(f+(1-f)/p)<=S*=1/f

• Только алгоритм, вовсе не содержащий последовательных вычислений (f=0), позволяет получить линейный приоритет производительности с ростом количества вычислителей в системе.

Закон Густавсона-Барсиса

• Ускорение масштабирования

Sp=g+(1-g)*p=p+(1-p)*g

• g – доля последовательных рассчетов в программе.

• p – количество процессоров.

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

Масштабируемый алгоритм

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

37. Основные модели параллельного программирования.

Модели параллельного программирования.

1) Параллельная машина с произвольным доступом. Упрощенная теоретическая модель с N процессорами, которая использует общую глобальную память.

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

2) Модель клиент-сервер. 1 сервер – несколько клиентов.

3) Мультиагентные распределенные системы. Модель сети с равноправными узлами, в которой все компоненты имеют одинаковые права и при это у каждого компонента есть, что предложить другому.

Схемы параллелизма

Одна программа – много данных

(Sungle-program,Multiple-data(SPMD))

Одна программа, несколько потоков данных.

• Все процессоры выполняют одни и те же операции, но с разными данными.

• Запускается несколько копий одной и той же программы.

Множество программ – множество данных

(Multiple-programs,Multiple-Data(MPMD))

• Процессоры выполняют различные виды работы.

• При этом они вместе пытаются решить одну проблему.

• Каждому из них выдается свой аспект этой проблемы.

38. Оптимизатор. Основные функции оптимизатора.

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

ОПТИМИЗАТОР пытается улучшить код, убрать лишние операции, заменить медленные инструкции на более быстрые и т.д.

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

Виды оптимизации:

1. Оптимизация промежуточного представления #(4+x)(8-y)-(8-y)(3434x-2)=(8-y)(2+3435x)

2. Машинно-ориентированная оптимизация #регистры вместо оперативной памяти

3. Локальная оптимизация #замена нескольких команд одной, более эффективной

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

· Машинно-зависимая оптимизация - использование регистров процессора вместо оперативной памяти.

· Машинно-независимая оптимизация – оптимизация промежуточного представления программы.

· Локальная оптимизация – замена нескольких команд одной или более быстрой.

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

(Отладку лучше проводить при выключенной оптимизации, а тестирование – два раза ( и при включенной и при выключенной).)

39. Обработка исключительных ситуаций. Иерархия исключительных ситуаций. Виды исключительных ситуаций.

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

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

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

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

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

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

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

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

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

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

Таким образом, исключительные ситуации можно классифицироватьследующим образом:

1. Ошибки ограничений (Constrain_Error) – выход за пределы диапазона, возникает при нарушении допустимого диапазона значений или индексов.

2. Ошибки памяти (Storage_Error) – недостаточность памяти. 3. Программные ошибки (Program_Error) – нарушение правил языка или некорректное поведении программы (в языке выделяют два случая: Bounded_Error - выход поведения за допустимые границы; Erroneous_Execution - проявление причин, ведущих к неправильному выполнению).

4. Ошибки задачи (Tasking_Error) – ошибки, возникающие при взаимодействии задач, асинхронных процессов.

Типы исключительных ситуация:

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

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

Традиционные варианты обработки ошибки:

- Завершить программу, выдав сообщение об ошибке.

- Возвратить условленное значение, обозначающую ошибку.

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

- Вызвать функцию, предназначенную для вызова в случае ошибки.

Традиционно с оператором IF

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

Механизмы функционирования обработчиков исключений.

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

2) Обработка с возвратом типична для асинхронных исключений.

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

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

1) Структурное

2) Неструктурное

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

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

Семантика обработки исключений:

1. Если исключительная ситуация не обработана внутри процедуры, попытка ее выполнения оставляется, и исключительная ситуация снова возбуждается в точке вызова.

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

3. Возможен выбор: возбудить то же самое исключение или другое в точке вызова. Базовая технология обработки исключений заключается в использовании триады try…throw…catch (в зависимости от конкретного языка программирования операторы могут отличаться).

Нормальная ситуация обрабатывается кодом, следующим за ключевым словом try, а код, располагающийся за ключевым словом catch (в некоторых языках except, resque), выполняется только в исключительных случаях.

Выбрасывание осуществляется с помощью оператора throw (в некоторых языках raise). При выбросе исключения выполнение блока try останавливается и начинается выполнение блока catch (обработчика исключения).

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

Оператор finally (в некоторых языках ensure) – это обработчик завершения, который предоставляет удобные возможности для закрытия дескрипторов, освобождения ресурсов, восстановления масок и выполнения иных действий, направленных на восстановление известного состояния системы после выхода из блока.

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

В Java есть пять ключевых слов для работы с исключениями:

1. try- данное ключевое слово используется для отметки начала блока кода, который потенциально может привести к ошибке.

2. catch- ключевое слово для отметки начала блока кода, предназначенного для перехвата и обработки исключений.

3. finally- ключевое слово для отметки начала блока кода, которое является дополнительным. Этот блок помещается после последнего блока 'catch'. Управление обычно передаётся в блок 'finally' в любом случае.

4. throw- служит для генерации исключений.

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

Finally: Иногда требуется гарантировать, что определенный участок кода будет выполняться независимо от того, какие исключения были возбуждены и перехвачены. Для создания такого участка кода используется ключевое слово finally. Даже в тех случаях, когда в методе нет соответствующего возбужденному исключению раздела catch, блок finally будет выполнен до того, как управление перейдет к операторам, следующим за разделом try. У каждого раздела try должен быть по крайней мере или один раздел catch или блок finally. Блок finally очень удобен для закрытия файлов и освобождения любых других ресурсов, захваченных для временного использования в начале выполнения метода. Ниже приведен пример класса с двумя методами, завершение которых происходит по разным причинам, но в обоих перед выходом выполняется код раздела finally.

При ошибке в try скрипт не «падает», и мы получаем возможность обработать ошибку внутри catch.

Проброс исключения

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

Конечно, может! Код – это вообще мешок с ошибками, бывает даже так что библиотеку выкладывают в открытый доступ, она там 10 лет лежит, её смотрят миллионы людей и на 11-й год находятся опаснейшие ошибки. Такова жизнь, таковы люди.

Блок catch в нашем примере предназначен для обработки ошибок, возникающих при некорректных данных. Если же в него попала какая-то другая ошибка, то вывод сообщения о «некорректных данных» будет дезинформацией посетителя.

Ошибку, о которой catch не знает, он не должен обрабатывать.

Такая техника называется «проброс исключения»: в catch(e) мы анализируем объект ошибки, и если он нам не подходит, то делаем throw e.

При этом ошибка «выпадает» из try..catch наружу. Далее она может быть поймана либо внешним блоком try..catch (если есть), либо «повалит» скрипт.

41. Схема обработки исключительных ситуаций Б. Мейера.

Корректная схема обработки исключительных ситуаций была предложена Бертаном Мейером:

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

Обработчик исключительной ситуации, в свою очередь, имеет две возможности:

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

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

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

42. Элементарные типы данных.

Типы данных

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

Зависит он от разрядности процессора.

Простые типы данных:

1) Целочисленный тип данных. Числа со знаком представляются в виде дополнительного кода. Положительные – 0 и двоичный код, отрицательные – инверсия + 1. Самое большое положительное число 2^(w-1)-1. Самое маленькое это байт. 0-255. Машинно-независимые языки в них количество байт соответствующих им ячеек памяти строго фиксировано, не зависят от процессора на котором исполняется программа, и компилятора, который создал машинный код. Машинно-зависимые – кол-во ячеек памяти зависит от платформы, под которую компилируется. Операции над целыми числами + - * /. Получаемые значения ограничены диапазоном типа данных. Переполнение – полученное значение выходит за границы допустимого диапазона. Отбросит кратное число. Операция деления в современных языках программирования разделена на операцию получения целой части и получении остатка от деления. Операция умножения требует большего времени обработки на процессоре, чем остальные. Кроме того сохраняет результат в двух ячейках памяти, только потом обрезает до нужного типа данных.

2) Символьный тип – полный аналог целочисленного типа. Char 256 символов. Для того чтобы сопоставить числам символы используются таблицы кодировки. Операции те же.

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

4) Булев тип – можно считать частным случаем перечисления, где значению false сопоставлен целочисленный 0, а все остальные числа трактуются как true.

5) Подтипы – типы, значения которых ограничены некоторым диапазоном.

6) Вещественные числа – 2 подхода 2ичного представления вещественных чисел.

a. Согласно двоичной арифметике.

b. Кодировать цифры числа как целое число дополняя информацию о позиции десятичного разделителя.

7) Числа с фиксированной точкой (формат определяет что число содержит не более заданного кол-ва цифр n, в том числе не более заданного кол-ва цифр m после запятой). Для представления в памяти достаточно сохранить его целочисленное представление включая один бит знака и номер позиции десятичной точки. Достоинство – кол-во знаков после запятой определяет абсолютную погрешность. Недостатки – относительная погрешность есть переменная. Некоторые числа нельзя вписать в этот формат. Применяется когда точность заранее определена.

Числа с плавающей точкой. Х – вещественное число от 0 до 1. Кол-во знаков мантиссы определяет относительную погрешность. Очень широкий диапазон чисел. Низкая относительная погрешность.

Некоторые операции может произойти переполнение, или потеря значимости.

<Типы данных и типизации>

Типы данных

1. Для хранения используются ячейки памяти

2. Объем одной ячейки=8бит=1байт

3. Машинное слово – минимальный для процессора объем одной ячейки.

4. Тип данных – механизм классификации данных.

Типы данных:

ü Простые ( Целочисленные, вещественные, символьные, логические, перечисления)

ü Сложные(составные) (Массивы, структуры и записи, строки, множества, кортежи, списки, классы)

Машинно-независимые – занимают определенное количество памяти. (char занимает 1 байт всегда)

Машинно-зависимые – размер занимаемых ими ячеек зависит от платформы, под которую компилируется.( int – ровно одно машинное слово. 32-битная платформа – 4 байта, 64 –битная - 8 байт)

Подтипы данных

Это тип, определенный на основе уже существующего типа.

Значения просто ограничены некоторому диапазону.

<Составные типы данных.>

Массивы.

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

В состав входят:

• Количество элементов - указывается косвенно, путем задания диапазона изменения индексов.

• Тип данных для каждого элемента - он одинаков для всех элементов.

• Список значений индексов, применяемый для выбора элементов - задается в виде набора целых чисел, первое из которых соответствует первому элементу и т.д.

Фундаментальное свойство массива – время доступа к любому его элемента A[i] не зависит от значения индекса i.

Индекс первого элемента называется нижней границей, а индекс последнего - верхней границей массива.

Различают компоновку массива и размещение массива в памяти.

• При компоновке задаются относительные адреса элементов массива (относительно адреса 1 элемента), вычисляются формулы для адресации элементов.

• При размещении определятся действительные машинные адреса элементов и выделяется память.

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

Если base – адрес начала массива, w –длина элемента массива, то адрес i-того элемента массива равен:

A[i]=(base-low*w)+ i*w

Low- нижняя граница

В языке С первый элемент массива имеет индекс 0, поэтому адрес i-го элемента массива равен:

A[i]= base + i*w

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

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

Некоторые языки предусматривают средства для инициализации массивов во время их размещения в памяти. Языки С, С++, ява, С#:

Int list[]={3,4,8,79};

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

Разновидности массивов.

Статические

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

Статические массивы достаточно эффективны, поскольку отсутствуют затраты времени как на динамическое размещение в памяти, так и на удаление из нее.

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

В языках С и С++ статистическими являются массивы, которые объявляются в функциях со спецификатором static.

Явные стековые массивы - массив со статическим связыванием по диапазонам индексов и таким размещением в памяти, которое происходит по итогам обработки объявления в ходе выполнения программы.

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

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

К недостатку следует отнести дополнительные затраты времени на размещение и удаление массива из памяти.

Массивы, объявленные в функциях С и С++ без спецификатора static, считаются явными стековыми массивами.

Стековые - массив с динамическим связыванием по диапазонам индексов и динамическим размещением в памяти, которое происходит в ходе обработки объявления.

Связанность диапазонов индексов и размещение массива в памяти сохраняются в течении всей жизни переменной.

Главным преимуществом этой разновидности массивов по сравнению с двумя предыдущими считается гибкость – не нужно заранее знать (до момента использования) размер массива.

Явные динамические массивы - связывание и по диапазонам индексов, и по памяти происходит после размещения в памяти. (одноразовое)

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

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

Недостаток - на размещение в куче тратится времени больше, чем на размещение в стеке.

Языки С С++ используются стандартные библиотечные функции malloc (размещение), free (освобождение памяти), которые являются операциями для размещения в куче и удаления из нее соответственно.

Для управления кучей применяют операторы new и delete.

Динамические

Динамические массивы – массив с таким динамическим связыванием по диапазонам индексов и размещению в памяти, которое повторяется многократно в течение всего жизненного цикла массива.

+ Максимальная гибкость. Массив по мере необходимости может расти или сжиматься прямо в ходе выполнения программы.

- На многократное размещение (удаление) в куче тратится много времени (и все оно приходится на период вычислений).

Массивы в Perl

Имена всех массивов должны начинаться с символа @.

Но поскольку элементы массива являются скалярными величинами, их имена предваряются знаком $.

На элемент массива в Perl можно сослаться при помощи отрицательного индекса. Отрицательное значение индекса обозначает номер позиции элемента с конца. Индекс – 1 соответствует последнему элементу массива, -2 –предпоследнему.

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

Массивы в питоне, руби увеличивают или с помощью методов для добавления элементов, или путем соединения с другими массивами.

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

Операции для конкатенации массива и определения вхождения элемента.

Прямоугольный массив - это многомерный массив, в котором строки и столбцы имеют одинаковое количество элементов.

Массив массивов – многомерный массив, в котором не требуется, чтобы длины у строк были одинаковыми. Еще называют не выровненными массивами.

Int[][]jaggedarray2 = new int []

{ new int [] {1,3,4,5,6},

New int[] {2,3,4},

New int[] {2,7}};

Сечение – подструктура массива, которая сама является массивом.

Сечение для трехмерного массива - двумерный, для двумерного – одномерный.

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

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

Ассоциативные массивы в питоне называют словарями.

В РНР применяются как обычные, так и ассоциативные массивы. Язык обеспечивает функции как индексированного, так и хешированного доступа к элементам.

Строки

Строка – последовательность символов.

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

Различают 3 вида:

1. Строки фиксированной длины

2. Строки переменной длины, не превосходящей заданного максимума ( строки с ограниченной динамической длиной)

3. Неограниченные по длине строки (строки с неограниченной динамической длиной)

Строки фиксированной длины (со статической длиной) – поддержка на аппаратном уровне.

#String в java

Кортежи

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

Кортежи схожи с записями, но отличаются от них тем, что в записях элементы (поля) имеют имена, а в кортеже нет.

Списки

Это упорядоченная последовательность структуры данных.

• Первый элемент списка называют головой.

• Остальные элементы - хвостом списка.

• Типы элементов списка явно не объявляются

• Применяют как однородные так и неоднородныесписки.

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

• Впервые списки появились в функциональном языке Lisp.

43. Перегрузка данных, операторов, методов.

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

<Перегрузка>

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

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

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

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

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

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

Процесс перегрузки данных – это реализация потока данных от единственного набора данных источника до одного или нескольких наборов данных

44. Составные типы данных.

Сложный (составной) тип — тип данных, объекты (переменные или постоянные) которого имеют внутреннюю структуру, доступную программисту.

Составной тип отличается от типов данных, входящих в его состав. Например массив элементов Integer не принадлежит к типу данных Integer.

В разных языках программирования набор базовых сложных типов может несколько отличаться (чаще по названию и деталям реализации). Есть, однако, объективные критерии — однотипность элементов и способ доступа, позволяющие выделить главные представители сложных типов (названия приводятся на примере Pascal, в котором Н.Вирт наиболее чётко сформулировал эти идеи).

• массив (array) — элементы только однотипные, доступ произвольный;

• запись (record) — элементы возможно разных типов, доступ произвольный;

• файл (file) — элементы однотипные, доступ последовательный (примечание: не путать с дисковым файлом!).

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

Очень важной идеей, также родившейся на границе 60-70-х годов XX века, является возможность произвольного конструирования нужных структур из небольшого набора предопределённых типов. Чем адекватнее программист смоделировал обрабатываемые данные в рамках такого "конструктора", тем безошибочнее и долговечнее будет разработанная программа.

<Составные типы данных.>

Массивы.

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

В состав входят:

• Количество элементов - указывается косвенно, путем задания диапазона изменения индексов.

• Тип данных для каждого элемента - он одинаков для всех элементов.

• Список значений индексов, применяемый для выбора элементов - задается в виде набора целых чисел, первое из которых соответствует первому элементу и т.д.

Фундаментальное свойство массива – время доступа к любому его элемента A[i] не зависит от значения индекса i.

Индекс первого элемента называется нижней границей, а индекс последнего - верхней границей массива.

Различают компоновку массива и размещение массива в памяти.

• При компоновке задаются относительные адреса элементов массива (относительно адреса 1 элемента), вычисляются формулы для адресации элементов.

• При размещении определятся действительные машинные адреса элементов и выделяется память.

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

Если base – адрес начала массива, w –длина элемента массива, то адрес i-того элемента массива равен:

A[i]=(base-low*w)+ i*w

Low- нижняя граница

В языке С первый элемент массива имеет индекс 0, поэтому адрес i-го элемента массива равен:

A[i]= base + i*w

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

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

Некоторые языки предусматривают средства для инициализации массивов во время их размещения в памяти. Языки С, С++, ява, С#:

Int list[]={3,4,8,79};

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

Разновидности массивов.

Статические

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

Статические массивы достаточно эффективны, поскольку отсутствуют затраты времени как на динамическое размещение в памяти, так и на удаление из нее.

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

В языках С и С++ статистическими являются массивы, которые объявляются в функциях со спецификатором static.

Явные стековые массивы - массив со статическим связыванием по диапазонам индексов и таким размещением в памяти, которое происходит по итогам обработки объявления в ходе выполнения программы.

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

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

К недостатку следует отнести дополнительные затраты времени на размещение и удаление массива из памяти.

Массивы, объявленные в функциях С и С++ без спецификатора static, считаются явными стековыми массивами.

Стековые - массив с динамическим связыванием по диапазонам индексов и динамическим размещением в памяти, которое происходит в ходе обработки объявления.

Связанность диапазонов индексов и размещение массива в памяти сохраняются в течении всей жизни переменной.

Главным преимуществом этой разновидности массивов по сравнению с двумя предыдущими считается гибкость – не нужно заранее знать (до момента использования) размер массива.

Явные динамические массивы - связывание и по диапазонам индексов, и по памяти происходит после размещения в памяти. (одноразовое)

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

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

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