int i; char c;
i=c;
Такая ошибка обнаружится во время компиляции с помощью таблицы символов и выдается сообщение вида
MODE char CANNOT BE COERCED TO int.
Это способствует идентификации ошибки, но вряд ли поможет начинающему программисту.
Особый случай составляют типы, создаваемые программистом, особенно с использованием указателей, поскольку в этом случае в описание одного типа может быть включен другой тип, определяемый пользователем (взаимно рекурсивный тип). Такие ошибки вообще нельзя обнаружить, пока все виды не будут полностью описаны. В этом случае сообщения об ошибках будут выдаваться между проходами компилятора.
Существуют и другие ошибки, связанные с контекстно-зависимыми аспектами типичных языков:
1) неправильное число индексов массива;
2) неправильное число параметров для вызова процедуры или функции;
3) несовместимость типа (или вида) фактического параметра в вызове с типом формального параметра;
4) невозможность определения знака операции по его операндам.
Обычно на такие ошибки компилятор может выдавать четкие сообщения.
11.10. Ошибки, допускаемые во время прогона
Во время прогона в программах могут возникать ошибки, которые нельзя предусмотреть в процессе компиляции. При прогоне могут возникать следующие типы ошибок:
1) нахождение индекса массива вне области действия;
2) целочисленное переполнение (вызванное, например, попыткой сложить два наибольших целых числа, допускаемых реализацией);
3) попытка чтения за пределами файла.
В языках с динамическими типами до времени прогона нельзя обнаружить более широкий класс ошибок (ошибки употребления типов, ошибки, связанные с присвоением и др.)
Обычно компиляторы стараются предотвратить возможность возникновения таких ошибок до прогона. Одно из решений – дать исчерпывающую формулировку задачи, например результат деления на ноль определить как ноль, выходящий за пределы области действия, индекс считать эквивалентным какому-нибудь значению в пределах области действия, при попытке чтения за пределами файла выполнять некоторое стандартное действие и т. д.
Однако такая исчерпывающая формулировка задачи имеет свои «подводные камни»: могут остаться незамеченными ошибки программирования или ошибки данных. Программисты обычно не ожидают, что во время прогона их программ произойдет деление на ноль, - им об этом нужно сообщить. Тем не менее, нежелательно, чтобы из-за этого прерывалось выполнение программы. Компромиссное решение – напечатать сообщение об ошибке времени прогона, когда она возникает, но позволить программе выполнить какие-либо стандартные действия, чтобы она могла продолжать работу и находить дальнейшие ошибки.
В случае ошибки, возникающей в процессе прогона, не всегда можно четко объяснить программисту, что именно неправильно. К этому моменту программа уже транслирована в машинный код, а программисту понятны только ссылки на исходный текст. Поэтому система, работающая при прогоне, должна иметь доступ к таблице идентификаторов и другим таблицам и следить за номерами строк в исходной программе. Таблицы, требуемые для диагностики, к началу прогона могут уже не находиться в основной памяти, но в случае ошибки должны туда загружаться и фиксировать профиль программы на это время. Эта информация позволяет локализовать место возникновения ошибки или, по крайней мере, блок (рамку), внутри которой возникла аварийная ситуация.
11.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.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |


