Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТЯП, ТВП / ТЯПМТ / Пособие.doc
Скачиваний:
160
Добавлен:
11.05.2015
Размер:
2.37 Mб
Скачать

10.10. Ошибки, допускаемые во время прогона

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

  1. нахождение индекса массива вне области действия;

  2. целочисленное переполнение (вызванное, например, попыткой сложить два наибольших целых числа, допускаемых реализацией);

  3. попытка чтения за пределами файла.

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

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

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

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

10.11. Ошибки, связанные с нарушением ограничений

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

  1. на размер программы, которую можно скомпилировать;

  2. на число элементов в таблице символов или идентификаторов;

  3. на размер стека разбора или других стеков времени компиляции.

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

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

Контрольные вопросы

  1. Типы ошибок, возникающие при написании программ.

  2. Технология исправления ошибок. Режим переполоха.

  3. Технология исправления ошибок. Исключение символов. Включение символов.

  4. Правила для ошибок.

  5. Предупреждения и сообщения о синтаксических ошибках.

  6. Контекстно-зависимые ошибки.

  7. Ошибки времени прогона.

  8. Ошибки, связанные с нарушениями ограничений.

Список литературы

  1. Ахо А., Ульяман Дж. Теория синтаксического анализа, перевода и компиляции. – М.: Мир, 1978. - 612 с.

  2. Ханкер Р. Проектирование и конструирование компиляторов. – М.: Финансы и статистика, 1984 - 230 с.

  3. Райуорд-Смит В.Дж. Теория формальных языков. Вводный курс.-М.: Радио и связь, 1988.

  4. Льюис Ф., Розешкранц Д., Стирнз Р. Теоретические основы проектирования компиляторов. -М.: Мир, 1979.

  5. Вайгартен Ф. Трансляция языков программирования. - М.: Мир, 1977.

  6. Гросс М., Лантен А. Теория формальных грамматик. - М.: Мир, 1971.