Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





Контроль исполнения программы, выполняемый программной средой, и его регулирование самой программой

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

 

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

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

1.         Проверка правильности выполнения операций ввода-вывода.
2.         Проверка переполнения при математических операциях.
3.         Проверка выхода за границы, определяемые типом данных.
4.         Проверка переполнения стека подпрограмм.

 

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

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

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

 

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

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

 

Использование директив переключения

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

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

 

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

1. Директива $I (локальная) задает или отменяет автоматическую генерацию кода, проверяющего правильность выполнения операций ввода- вывода. Например, операция Read (F, X) выполняется корректно только тогда, когда из файла F может быть прочитано значение и его тип совпадает с типом переменной X. Если операция не может выполниться корректно, то при использовании режима {$I+} программа завершает работу, выдавая сообщение об ошибке. Обычно по умолчанию (параметром компилятора) задается состояние, равносильное {$I+}.

Указание режима {$I-} отменяет системную проверку результата выполнения операций ввода-вывода. Некорректность их выполнения останется незамеченной, что, естественно, может привести к неверному исполнению всей программы. Рекомендуется применять задание {$1—} только перед теми операциями ввода-вывода, некорректность исполнения которых хочет проконтролировать сама пользовательская программа, чтобы задать собственную программную реакцию на такую ситуацию. После выполнения такой операции ввода-вывода необходимо снова установить режим системного контроля - {$I+}.

2. Директива $R (локальная) приводит в действие или отменяет генерацию кода проверки диапазонов значений. При указании {$R+} все значения индексов строк и массивов проверяются на нахождение внутри границ индексов, определенных их описаниями (соответствие индексов заданным диапазонам). Контролируется также выход за границу диапазона, определенного для порядкового типа скалярной переменной при вводе (оператором Read) и при присваивании (оператором присваивания) ей значения.

Только при задании режима {$R+} система гарантирует правильность ввода и присваивания значений переменным целочисленных типов.

Указание {$R—} отменяет контроль диапазонов значений. Задание проверки существенно замедляет работу программы и увеличивает ее размер, поэтому ее обычно используют только при отладке программы, а затем удаляют. Рекомендуется использовать включение контроля диапазонов на время отладки во всех учебных программах, использующих массивы и переменные интервальных типов. В частности, включение контроля диапазонов часто помогает "отловить" неинициализированные переменные.

3.         Директива $S (локальная) приводит в действие или отменяет генерацию кода с проверкой переполнения стека подпрограмм. При указании {$S+} компилятор генерирует в начале каждой процедуры или функции код, который проверяет, достаточно ли в стеке выделено места для ее локальных переменных. Если недостаточно, то при обращении к этой подпрограмме работа программы завершается с выдачей сообщения. При указании {$S—} такое обращение наиболее вероятно приведет к фатальной ошибке системы.

4.         Директива $F (локальная) управляет выбором типа вызова последовательно компилируемых процедур и функций в тексте программы. Подпрограммы, скомпилированные с использованием {$F+}, всегда используют дальний тип вызова, а с {$F—} - ближний тип вызова подпрограмм. Смысл понятия дальнего или ближнего типа вызова раскрывается в разделе "Распределение памяти". В качестве примера использования этой директивы отметим установку {$F+} перед текстами подпрограмм, подставляемых как фактические параметры других подпрограмм, и установку {$F-} (снятие дальнего вызова) - после них.

5. Директива $N (глобальная) задает режим генерирования кодов вычислений над числами с плавающей точкой. При указании {$N—} генерируется код для программного выполнения всех вычислений с вещественными числами с помощью вызова подпрограмм библиотеки системы Турбо Паскаль. При указании {$N+} генерируется код для выполнения операций с вещественными числами с помощью математического сопроцессора.

 

Средства ТурбоПаскаля для задания реакции программы на исключительные ситуации

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

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

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

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




 

Комментарии:


Добавить свой комментарий:


Введите значение:
 









   
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru