Р.У. Себеста - Основные копцепции языков программирования (2001) (1160794), страница 141
Текст из файла (страница 141)
Предположим, что две задачи А и В должны совместно использовать переменную ВБГ Я12В. Задачад добавляет2 к переменной В!)Г В12В, а залача В вычитает из нее !. Предположим также, что зтн арифметические операции выполняются в виде трехэтапного процесса: извлечение текущего значения, выполнение арифметической операции и возвращение нового значения назад. В отсутствие синхронизации конкуренции какова возможная последовательность событий и какие значения являются результатами этих операций? Предполагается, что начальное значение переменной В!)1' В2ЕЕ равно 6. 1О. Сравните механизмы синхронизации конкуренции в языках 5ача и Ада.
11. Сравните механизмы синхронизации взаимодействия в языках 1ача и Ада. 12. Что произойдет, если процедура монитора вызовет другую процедуру в том же самом мониторе? Упрсикиеиия гьФ Эдсгер Днйкстра, лауреат премии Тьюринга (АСМ, 1972), в настоящее время работает в университете г.Остин (шг.
Техас) (Опюегвйу о1 Техав-Ацвбп) в должности почетного профессора компьютерных наук (Зсйцпгос грег Сна) г (и Согпрц(ег Зсюпсе). Он был членом команды, начавшей разработку системы под названием "Тнв Мо)йргойгагпгп)пй Зузгепг", ставшей первой в мире операционной системой с параллельнымн процессами. Эта структура позволяла доказывать отсутствие опасности взаимной блокировки н другие факты, свидетельствующие о правильной работе системы. В 1976 году Дейкстра написал книгу "Наука программирования' ("А Оморйпе о1 Ргойгагпгпгпй"). Обработка исключительных ситуаций В этой главе сначала описываются основные понятия, связанные с обработкой исключительных ситуаций, в частности, исключительные ситуации, обнаруживаемые аппаратным и программным обеспечением; обработчики исключительных ситуаций и возбуждение исключительных ситуаций.
Затем формулируются и обсуждаются вопросы обработки исключительных ситуаций, в частности, связывание исключительных ситуаций с их обработчиками, продолжение выполнения, встроенные обработчики исключительных ситуаций и блокирование исключительных ситуаций. В оставшейся части главы описываются и анализируются средства обработки исключительных ситуаций в четырех языках программирования: Р1/1, Ада, С++ и 1ача. 13.1. Введение в обработку исключительных ситуаций Большинство компьютерных систем способны обнаружить некоторые ошибки выполнения программ, например, переполнение памяти при вычислениях с плавающей точкой. Многие языки программирования разрабатываются и реализуются таким образом, чтобы программа пользователя либо обнаруживала, либо пыталась обработать такие ошибки. В этих языках возникновение подобных ошибок просто приводит к прекращению выполнения программы и передаче управления операционной системе.
Обычной реакцией операционной системы на ошибку выполнения программы является вывод диагностического сообщения, которое может быть либо очень содержательным, либо очень загадочным, после чего следует прекращение выполнения программы. При операциях ввода-вывода, однако, ситуация иногда отличается от описанной выше. Например, оператор КЕА0 в языке РОКТКАХ может перехватывать ошибки ввода и условия достижения конца файла, которые обнаруживаются устройством ввода. В обоих случаях оператор КЕА0 может указать метку некоторого оператора в программе пользователя, который обрабатывает эти ошибки.
В случае достижения конца файла совершенно ясно, что данное условие не всегда рассматривается как ошибка. Во многих случаях это не более, чем признак того, что один вид обработки данных завершен и следует начать другой. Несмотря на очевидную разницу между достижением конца файла и событиями, которые всегда являются ошибками, например, неудавшийся ввод данных, в языке РОКТКАН такие ситуации обрабатываются одним и тем же механизмом. Рассмотрим следующий оператор КЕА0 языка РОКТКАХ: КЕА0(0И1Т=5, РИТ=1000, ЕКК=100, ЕЫ0=999) ХЕ16НТ Раздел ЕКК указывает, что управление должно быть передано оператору с меткой 100, если в операторе чтения возникнет ошибка. Раздел ЕН0 указывает, что управление должно быть передано оператору с меткой 999, если при выполнении операции чтения будет достигнут конец файла.
Таким образом, язык РОКТКА1Ч использует простые ветви и для ошибки ввода, и при достижении конца файла. Есть категория серьезных ошибок, которые не могут быть найдены аппаратным обеспечением, но ма~от обнаруживаться кодом, сгенерированным компилятором. Например, ошибки, заключающиеся в выходе индекса массива за пределы допустимого диапазона, почти никогда не диагностируются аппаратным обеспечением (было лишь несколько компьютеров, действительно обнаруживавших ошибки, связанные с выходом индекса за пределы допустимого диапазона, с помощью аппаратного обеспечения), однако они Глава 13. Обработка исключительных ситуаций приводят к фатальным ошибкам, которые часто выявляются только в процессе выполнения программы.
Обнаружение ошибок, связанных с выходом индекса массива за пределы допустимого диапазона, иногда необходимо при разработке языка. Например, компиляторы языков Риса! и 5ача должны генерировать код для проверки правильности каждого выражения, содержашего индексы. В языке С проверка выхода индекса массива за пределы допустимого диапазона не производится, поскольку стоимость такой проверки не компенсируется выгодами от обнаружения подобных ошибок. В некоторых компиляторах некоторых языков проверка выхода индекса массива за пределы допустилюго диапазона может быть выбрана при необходимости либо программой. либо в команде.
выполняемой компилятором. Многие современные языки программирования обеспечивают механизмы, которые могут действовать, лишь когда выполняются некоторые условия, обнаруживаемые аппаратным или программным обеспечением. Они также позволяют программисту самостоятельно определять другие необычные события и использовать те же механизмы для их обработки. Совокупность этих механизмов называется обработкой исктючительиых ситуаций. Возможно, основная причина, по которой некоторые языки программирования не содержат обработки исключительных ситуаций, — сложность их включения в язык. 13.1.1. Основные понятия Мы будем называть и ошибки, обнаруживаемые аппаратным обеспечением, например ошибки чтения диска, и необычные ситуации. например достижение конца файла (которые также обнаруживаются аппаратным обеспечением), исключительными ситуациями.
Далее мы расширим понятие исключительной ситуации, отнеся к ней также ошибки или необычные условия, обнаруживаемые программным обеспечением. Соответственно, мы будем называть исключительной ситуацией (ехсербоп) любое необычное событие, ошибочное или нет„обнаруживаемое либо аппаратным, либо программным обеспечением, которое может потребовать особой обработки.
Особая проверка, которая может потребоваться при обнаружении исключительной ситуации, называется обработкой исключительной ситуации (ехсерйоп Ьапд)(пй). Эта обработка выполняется программным модулем, называемым обработчиком исключительной ситуации (ехсерйоп Ьапд!ег). Исключительная ситуация возбуждается (га1зед), когда происходит связанное с ней событие.
Обработчики исключительных ситуаций обычно различаются по типам исключительных ситуаций. Достижение конца файла почти всегда требует некоторого специального действия программы. Однако, очевидно, что это действие может не подходить для обработки исключительной ситуации, связанной с переполнением памяти при вычислениях с плаваюшей точкой. В других случаях единственным результатом может быть генерация сообщения об ошибке с дальнейшим прекрашением выполнения программы. Иногда следует проигнорировать определенные исключительные ситуации на некоторое время.
Это можно сделать с помошью блокирования исключительной ситуации. Заблокированную исключительную ситуацию позднее можно разблокировать. Отсутствие отдельных или особенных средств для обработки исключительных ситуаций в языке не препятствует обработке определенных пользователем и обнаруживаемых программным обеспечением исключительных ситуаций. Такие исключительные ситуации, обнаруживаемые в программном модуле, часто обрабатываются модулем, вызвавшим его. Один из способов обработки исключительных ситуаций — пересылка вспомо- 13.1. Введение в обработку исключительных ситуаций гательного параметра, который используется в качестве переменной состояния.
Переменной состояния в вызываемом модуле присваивается некоторое значение, соответствующее правильному и/или нормальному его выполнению. Непосредственно после возврата из вызванного модуля вызывающий молуль проверяет переменную состояния. Если эта переменная указывает, что возникла исключительная ситуация, может активизироваться обработчик, находящийся в вызывающем модуле.
Во многих библиотечных функциях языка С применяется именно этот подход, состоящий в том, что возвращаемое значение используется в качестве индикатора ошибки. Второй способ — перелача в подпрограмму метки в качестве параметра. Конечно. это можно сделать только в языках, допускающих использование меток в качестве параметра. Передача метки позволяет вызываемому модулю передать управление в другую точку вызывающего модуля, если возникает исключительная ситуация. Как и в первом случае, обработчиком часто является сегмент кода вызывающего модуля.
Такое использование меток является общепринятым в языке ЕОКТКА1ч'. Третий способ — создать обработчик в виде отдельной подпрограммы. передаваемой в качестве параметра в вызываемый модуль. В этом случае полпрограмма-обработчик предоставляется вызывающим модулем, а вызываемый модуль вызывает обработчик, если возбуждается исключительная ситуация. Одна из проблем, связанных с таким подходом, заключается в том, что передачу подпрограммы-обработчика следует выполнять при каждом вызове, независимо от того, желательно это или нет.