Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ответы на ЯП.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
661.54 Кб
Скачать

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

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

(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 байт)