|
. 1. Дайте толкование следующих терминов: авост, план распре-деления памяти, эхо-проверка, стопоры ошибок, детерминированность, таблица перекрестных ссылок, потеря разрядов, брандмауэры, общее недоверие, МЗМП, ключи прерывания, утверждения, клинч. j
2. Составьте дневник ошибок. Так называется список программных ошибок, с которыми вам приходится сталкиваться в повседневной работе.
3. Обсудите достоинства и недостатки, присущие методам отладки, рассмотренным в данной главе.
4. Какие еще методы отладки вам известны?
5. Когда следует использовать стандартный оператор TRACE и в каких случаях необходимо вводить в программу специальные операторы слежения?
6. Какие отладочные средства вы предпочитаете использовать? Какие из них для вас доступны?
7. Рассмотрите раздел "Ошибки общего характера". Полон ли приведенный список? Можете ли вы предложить какие-либо изменения и дополнения?
8. Используя в качестве исходной информации данные раздела "Ошибки специального вида", внесите соответствующие дополнения и составьте свой индивидуальный список таких ошибок.
9. В гл. 4 перечислено несколько типов ошибок, которые компилятор не в состоянии обнаружить. Назовите хотя бы пять других типов аналогичных ошибок.
10. Что такое пространственное и временное измерения программы? Как осуществляется ее проверка в каждом из этих измерений при отладке?
П. Назовите несколько причин, по которым использование стандартных подпрограмм упрощает отладку.
12. В чем состоит различие между синтаксическими ошибками и ошибками исполнения? Перечислите по семь примеров ошибок того и другого типа.
ЗАДАНИЯ
13. Установите доску объявлений и поместите на ней короткие программные сегменты, в которых имеются труднообнаруживае-мые ошибки. Начните с некоторых из программ, приведенных ниже. Предложите своим коллегам выявить имеющиеся ошибки и попросите их представить свои собственные программы, содержащие ошибки. Если в вашем вычислительном центре выпускается "информационный листок", опубликуйте в нем некоторые из собранных вами материалов.
14. Редактирование входных данных. Файл, формируемый посредством ввода данных с перфокарт, характеризуется следующими полями:
позиции 1—9 —регистрационный номер в системе социального страхования, позиции 10—30 —фамилия и имя, позиция 31 —пол (1 или 2), позиции 32—50 — номер дома и название улицы, позиции 51—68 —город и штат, позиции 69—74 — почтовый индекс, позиции 75—80 —дата рождения (ЧЧ ММ ГГ).
Опишите детально, как должны редактироваться эти данные, чтобы гарантировать их достоверность. Легко ли это сделать на используемом вами языке программирования?
15. Предположим, кто-то принес вам информацию, выданную одной из ваших программ (этот факт установлен достоверно); однако распечатка программы отсутствует, а текст не содержит никаких идентифицирующие ее признаков. Как бы вы ответили в Данном случае на следующие вопросы:
а) Какая версия программы была использована?
б) Какой массив данных обрабатывался?
в) Завершилось ли выполнение программы или она незадолго до конца вышла из строя?
г) Сколько записей было обработано?
Что надо сделать, чтобы иметь в программах информацию, необходимую для ответа на эти вопросы? Можете ли вы привести примеры ситуаций, в которых такая информация оказалась бы чрезвычайно полезной?
16. Различают синтаксические ошибки локального характера (относящиеся к единственному оператору) и глобального характера (для выявления которых требуется анализ нескольких операторов). Примером глобальной ошибки является указание в операторе СЮ ТО не той метки. Подберите еще примеры глобальных и локальных синтаксических ошибок.
17. Псевдоотладка. При отладке своей программы попросите кого-нибудь из коллег внести в нее пару ошибок. После этого, зная о наличии искусственных ошибок и о времени, необходимом для их обнаружения, оцените, как долго вам придется искать другие, настоящие ошибки.
18. Припомните какую-нибудь ошибку, которая появилась в. начале эксплуатации вашей программы. Какие отладочные средства могли бы в свое время помочь выявить эту ошибку? Что вам следовало сделать для того, чтобы такая ошибка не возникла или была обнаружена до начала функционирования программы в рабочем режиме?-
19. Займитесь изучением своих ошибок. Для этого примите за правило ведение дневника ошибок, в который вы записываете информацию о встретившихся программных ошибках. По прошествии некоторого времени такой дневник сможет сообщить вам интересные сведения о том, какой тип ошибок для вас наиболее характерен. Используйте эту информацию при отладке других программ.
20. Какие проверки (подобные контролю индексов) вы хотели бы осуществить с помощью вашего компилятора на этапе выполнения программ?
21. Какие из перечисленных ниже средств отладки предусмотрены в используемом вами компиляторе?
а) Отслеживание хода выполнения алгоритма.
б) Включение и выключение средств слежения за логикой выполнения программы.
в) Отслеживание обращений к переменным.
г) Выборочное отслеживание обращений к переменным.
д) Отслеживание обращений к подпрограммам.
е) Распечатывание содержимого памяти.
ж) Воспроизведение имен и значений переменных.
22. Если в используемом вами компиляторе предусмотрена проверка области значений индексов, сумеет ли он обнаружить ошибку, заключающуюся в том, что вместо объявленной размерности массива А (3,4) будет указана размерность А (4,2)?
23. Имеется ли отладочный компилятор для того языка, на котором вы программируете? Если да, то оцените, оправданно ли его приобретение?
24. Если вы используете язык программирования, в котором имеются блоки операторов (например, DO, BEGIN), способен ли", компилятор устанавливать глубину вложения блоков?
25. Разработайте для своих программ таблицу сообщений об~, ошибках с указанием их вероятных причин по следующему образцу:
|
Сообщение об ошибке
|
Вероятная причина
|
|
Превышено отведенное
|
Зацикливание
|
|
время
|
|
|
Переполнение
|
Неопределенная переменная
|
26. Какие из перечисленных ниже проверок выполняются на этапе компилирования в используемом вами компиляторе?
1) Упорядоченность исходной колоды перфокарт.
2) Неиспользуемые метки.
3) Неиспользуемые операторы.
4) Неиспользуемые переменные.
5) Потеря разрядов при пересылках.
6) Оператор, передающий управление самому себе.
7) Передача управления в середину цикла ВО (РОЯ).
8) Соответствие типа переменной спецификации формата. -
9) Несоответствие типа аргумента характеру функции.
10) Попытка рекурсивного использования нерекурсивной подпрограммы.
11) Попытка использования подпрограммы как функции ш наоборот.
12) Неправильное число индексов.
13) Запрещенная последовательность битов.
14) Правильность описателей операций сравнения.
15) Совместимость присвоений.
Расположите перечисленные виды проверок в порядке их важности для вас. Проведения каких других видов проверок вам хотелось бы от вашего компилятора? Позволит ли логическая структура компилятора их осуществить?
27. Какие из перечисленных ниже проверок осуществляются вашим компилятором на этапе выполнения оттранслированной программы?'
1) Использование переменной, для которой не задано начальное значение.
2) Запрещенный индекс.
3) Переполнение при операциях над действительными числами.
4) Потеря значимости при операциях над действительными числами.
5) Переполнение при операциях над целыми числами.
6) Переполнение порядка числа.
7) Потеря значимости порядка числа.
8) Деление на нуль.
9) Неопределенность вида 0**0.
10) Правильность указанного количества параметров подпрограммы.
Л) Правильность описателей параметров подпрограммы.
12) Нарушение ограничений по длине цепочки символов.
13) Ошибки преобразований.
14) Проверка соблюдения границ действия операторов, если они строги.
Расположите указанные виды проверок в порядке их важности для вас. Какие еще виды проверок вы хотели бы обеспечить с помощью вашего компилятора? Позволит ли логическая структура компилятора их осуществить?
28. Предусмотрены ли в вашем компиляторе перечисленные ниже средства, облегчающие отладку?
а) Список всех переменных, упорядоченный по алфавиту (план распределения памяти), б) Список всех используемых констант.
в) Таблица описателей переменных.
г) Список используемых функций.
д) . Список используемых подпрограмм.
е) Полный список переменных с указанием всех операторов, в которых используется каждая из них (таблица перекрестных ссылок).
ж) Полный перечень используемых меток с указанием всех операторов, обращающихся к каждой из них.
Расположите перечисленные средства в порядке их значимости для вас. Какие еще средства вы желали бы иметь? Позволит ли логическая структура компилятора их реализовать?
29. Что такое глитч? Известны ли вам примеры ошибок этого вида? Поинтересуйтесь у других программистов, знают ли они, что такое глитч?
30. В программе можно использовать множество ухищрений. Например:
DIMENSION X (25), Y (20) DO 10 1= 1, 45 X(I) = 0.0 10 CONTINUE
При выполнении этой программы будет присвоено нулевое значение как массиву X, так и массиву Y, поскольку они расположены один за другим. Однако если в дальнейшем будут изменены размеры одного из них, то возникает серьезное затруднение, так как факт присвоения нулевых значений массиву Y скрыт от глаз пользователя программы. Подобный трюк осуществим во многих языках программирования. Попробуйте применить его в своей программе. Найдите ряд других примеров программистских ухищрений. В каких случаях их применение оправданно, если оно вообще допустимо. Возникновения проблем какого характера следует при этом ожидать программисту, если впоследствии он захочет модифицировать программу?
31. Самомодифицирующиеся программы. В большинстве языков программирования имеются команды, позволяющие изменять исходную программу в процессе ее выполнения. Например,
ФОРТРАН:
ASSIGN 16 ТО I GO ТО I
КОБОЛ:
PARAGRAPH-1.
GO ТО BYPASS-PARAGRAPH.
ALTER PARAGRAPH-1 TO PROCEED TO PARAGRAPH-OTHER.
Того, кто должен читать программу, содержащую подобные блоки, ожидает неприятная работа, связанная с попытками разобраться, какая же ветвь была выполнена в действительности. Поэтому введение операторов, модифицирующих программу, не находит горячей поддержки у специалистов по программированию. Согласны ли вы с тем, чтобы исключить эти операторы из языка? Когда, по вашему мнению, подобные операторы необходимы?
32. Выявив очередную труднообнаруживаемую ошибку в од-ной из своих программ, проанализируйте, каким образом возникла эта ошибка. Сделайте краткое описание ошибки и проследите путь ее появления.
33. Существует мнение, что число ошибок в программе пропорционально количеству содержащихся в ней меток. Какова ваша точка зрения относительно справедливости этого утверждения?
34. Занимаясь поиском ошибки, фиксируйте последовательность своих действий, направленных на ее выявление. Со временем вы сможете получить четкое представление о своей стратегии отладки. Если подобный анализ вас интересует, прочтите статью Дж. Гоулда "Психологические аспекты процесса отладки людьми машинных программ"1.
Gould J. D, Some Psychological Evidence on How People Debug Computer ams, International Journal of Man-Machine Studies, № 7, 151—182 (1975).
35. Допустим, что вы захотели перепроектировать некоторую ЭВМ таким образом, чтобы высказывание Х=У было истинным не только в случае равенства, но и тогда, когда обе переменные отличаются лишь последним младшим разрядом. Как, по-вашему, хороша ли эта идея? Если ее реализовать, то будет ли из ра-шенств а = Ь и Ь = с следовать тот факт, что а = с? Приведите по нескольку примеров утвердительного и отрицательного ответов на зтот вопрос.
ПРОГРАММЫ
36. Напишите небольшую программу (не более 50 строк). Посоревнуйтесь с другими своими коллегами в части написания программы без ошибок и посмотрите, при компилировании чьей программы машиной будет выдано наибольшее количество сообщений об ошибках.
37. Составьте небольшую программу (не более 50 строк), которая будет проходить этап компилирования без синтаксических ошибок, но производящую аварийный останов, прежде чем завершится ее выполнение. Тривиальный способ добиться такого результата— вызвать действие, подобное делению на нуль. Укажите, каким образом вы можете это сделать.
38. Отдайте вышеупомянутую программу кому-нибудь из своих коллег и попросите его обнаружить ошибку.
39. Возьмите небольшую программу и модифицируйте ее так, чтобы результат оказался заведомо неправильным. После этого отдайте программу кому-нибудь для использования и проследите, обнаружит ли пользователь вашу ошибку.
40. Напишите небольшую программу с неправильной записью некоторых служебных слов. Сколько различных типов сообщений об ошибках может быть вызвано таким дефектом?
41. Напишите программу, в которой некоторый массив использовался бы без объявления. Сколько различных типов сообщений об ошибках появится в результате такого нарушения правил? Укажет ли хоть какое-нибудь из них на причину ошибки?
42. Напишите программу, которая приводила бы к максимально возможному количеству выдаваемых компилятором различных сообщений об ошибках. Выданные сообщения классифицируйте по типам, например:
а) Ошибка обнаружена, и сообщение правильно ее идентифицирует.
б) Ошибка обнаружена, но печатается неправильное сообщение о ней.
в) Ошибка отсутствует, но сообщение о ней выдается: Встретились ли вам явные ошибки, не сопровождавшиеся выдачей соответствующих сообщений?
43. Напишите ряд программ, в ходе выполнения которых возникали бы перечисленные ниже ситуации, и проанализируйте действия, которые они вызовут в используемом вами языке программирования.
а) Деление на нуль.
б) Переполнение и потеря значимости.
в) Превышение размерности массива. (Начните с незначительного превышения, затем постепенно увеличивайте его. Например," можно объявить массив размерностью 10 элементов и попытаться присвоить нулевые значения сначала 11 элементам, а потом— 1000. Что при этом произойдет?)
г) Рекурсивный вызов нерекурсивной программы.
д) Указание недостаточного или избыточного количества параметров вызываемой подпрограммы.
е) Несогласованность типов переменных, например использование в программе действительного числа вместо целого.
44. Пусть ¥2= 1,36103. Проведите 100 раз с одной и той же точностью вычисление функции
Р2 = (Р2*1.66673)/1.66673
Какой должен быть выдан ответ? Проделайте то же самое 1000, 10 000 и 100 000 раз, обращая внимание на печатаемый результат. Ошибки отбрасывания значащих разрядов будут сказываться на нем лишь в том случае, если точность машины не превышает семи разрядов. Для ЭВМ, обладающих большей точностью, попробуйте увеличивать число значащих разрядов в константах приведенного примера.
45. Выясните, каковы максимальное и минимальное значения целых чисел, которые могут быть представлены в используемой вами ЭВМ. Проделайте то же самое в отношении действительных чисел, определив максимальное и минимальное значения отдела но для мантиссы и порядка. Напишите программу, позволяющую обнаруживать факт выхода обрабатываемых чисел за допустимые пределы.
46. На основе использования логических операторов постройте программы, способные выполнять следующие проверки:
^а) При всех ли значениях X справедливо равенство Х°=Х0(Г=
б) При всех ли значениях X справедливо равенство БОИТШ^
в) При всех ли значениях X справедливо равенство Х=Х1 = %2о ^И БСех ЛИ значениях % справедливо равенство X* Х=Х2=* ^д) При всех ли значениях X справедливо равенство Х*Х*Х*=*
е) При всех ли значениях X и У справедливо равенство Х/У*У=Х ж) При всех ли значениях X справедливо равенство $т2Х+ +соз2Х=1.
1000
з) Справедливо ли равенство 1000*(1.0/5.0) =2(1.0/5.0).
Используйте только действительные значения X и У. Придумайте другие примеры подобных "логически правильных" утверждений л проверьте их.
47. Напишите программу вычисления выражения
У=А+В+С где А =—2 500 000, 00; 5 = 0,01; С=2 500 001, 00. Правильный ли ответ выдает машина? Если нет, то почему? Можете ли вы изменить последовательность действий таким образом, чтобы результат получался правильным?
48. На основе применения логических операторов постройте программы, способные выполнять следующие проверки:
а) При всех ли значениях А и В имеет место равенство А+В— —Л = В.
б) При всех ли значениях А, В, С справедливо утверждение А(В-С)=АВ—АС.
в) При всех ли значениях А, В, С справедливо утверждение (А—В)/С=А/С—В/С.
г) При всех ли значениях А, В, С справедливо утверждение (А+В)+С=А + (В+С).
Используйте только действительные значения А, В и С.
49. Напишите программу, выполняющую следующие операции:
а) Суммирование 0,1 десять раз.
б) Суммирование 0,01 сто раз.
в) Суммирование 0,001 тысячу раз.
г) Суммирование 0,0001 десять тысяч раз.
д) Суммирование 0,000001 миллион раз.
Выдавайте на печать максимально возможное число значащих разрядов. Насколько близки к 1 результаты проведенных вычислений? Почему некоторые из результатов неточны?
1000
50. Запрограммируйте вычисление 2 1/д3 посредством последовательного суммирования чисел от п=1 к п=1000 и в обратном порядке. Какая из сумм оказалась ближе к точному ответу?
51. Многие математические функции имеют соответствующие им обратные выражения. Иногда при вычислении обратной функции вследствие отбрасывания значащего разряда не обеспечивается получение исходного значения. Напишите программу, позволяющую установить, всегда ли в результате выполнения указанных ниже действий получается исходное значение переменной (значения X выбираются случайным образом):
а) У=5<№Т(Х) и затем Х=У Y б) У=ЬСЮ(Х) и затем Х = ЕХР(У)
в) У=8Ш(Х) и затем Х=АИ5Ш(У)
г) У=С05(Х) изатемХ=АНС05(У)
Можете ли вы продолжить список функций, для которых возможны аналогичные проверки? Есть ли какая-нибудь общая особенность в результатах всех проведенных вычислений? С какими числами возникает больше затруднений: с большими (либо близкими к числу я) или- с малыми?
52. Напишите программу для вычисления каждой из следующих сумм:
 Заметьте, что все эти выражения представляют сооой одну и ту же сумму. Почему тогда ответы получаются разными? Какой из результатов правилен?
53. Перед записью в память ЭВМ константы, являющиеся действительными числами, представленными в десятичной системе счисления, должны быть переведены в систему счисления, используемую в машине. В некоторых компиляторах в случае большого количества значащих разрядов в преобразуемом числе результаты чтения и записи констант оказываются неодинаковыми. Попробуйте на любом языке выполнить следующую программу:
А1 = 1111111111.111 READ А2 WRITE Al, А2 END
$DATA 1111111111.111
Напишите свою программу, аналогичную представленной здесь, и попытайтесь поработать с константами, имеющими большие значения. Всегда ли для А1 и А2 будут печататься одинаковые числа?
54. При пользовании стандартными подпрограммами в различных языках часто дает о себе знать одна особенно неприятная* ошибка. Приведем следующую программу.
ФОРТРАН:
CALL SUBA (2,К) WRITE (6,10) К 1 = 2
WRITE (6,10) I 10 FORMAT (1X.I5) STOP END
SUBROUTINE SUBA(L, M)
L=L+L
M =L
RETURN
END
-а) Внимательно ознакомьтесь с программой и определите, какие значения должны выдаваться на печать.
б) Отперфорируйте программу и проверьте, как она работает. Соответствует ли печатаемый ею результат тому, который вы ожидали?
в) Если фактический результат отличается от ожидавшегося, то чем вы можете это объяснить? Каким образом можно избежать ошибок подобного типа?
55. Ниже приводятся программа и ее выходной результат.
а) Разберите текст программы и определите, какие результаты должны ею выдаваться в действительности. Правилен ли ответ, приведенный в конце программы?
б) Почему печатаемый результат может быть неверен? Если вам не удается найти ошибку, отперфорируйте программу и отладьте ее.
FACTOR: PROCEDURE OPTIONS (MAIN); /* FIND FACTORIAL OF 5 */
FACT: PROCEDURE(N) RECURSIVE;
IF (N> 1) THEN RETURN (N*FACT(N—1)); ELSE RETURN(l);
END FACT; M = 5;
X — FACT(M); PUT DATA(X); END FACTOR; Выданный результат:
X mm 5.00000E + 00;
56. Использование оператора присваивания, который одной и той же переменной присваивал бы сразу два значения, нежелательно. Такой оператор мог бы иметь следующий вид:
(А,А) = (2, 3)
Можете ли вы предложить какой-нибудь другой способ реализации такого присваивания в используемом вами языке программирования, подобный приводимому ниже:
CALL SUBA (А.В.А)
PRINT А
STOP
END
SUBROUTINE SUBA (X,Y,Z) X = 1.0 Y = 2.0 Z = 3.0 RETURN
END
Как вы думаете, какое значение переменной А будет выдаваться на печать в этой программе? Запрограммируйте те же операции на языке, с которым вы предпочитаете работать.
57. Какой результат будет выдаваться на печать по окончании следующей программы?
А =2
CALL SUBA(A,A) ' WRITE(6,10) А 10 F0RMAT(1X, 'А = \ F5.1) STOP END
SUBROUTINE SUBA(A,B) A = A -f- B**3 IF (A .LT. SQRT(B) ) В=5.15 RETURN
END
Если вы можете согласиться с правильностью выдаваемого результата, запрограммируйте ту же задачу на наиболее удобном для вас языке.
58. Ниже приводится программа и выдаваемый ею результат, а) Разберите текст программы и определите, какие результаты должны ею выдаваться в действительности. Правилен ли ответ, приведенный в ее конце?
б) Почему приведенный результат может быть неверен? Если вам не удается найти ошибку, отперфорируйте программу и отладьте ее.
LOOP: PROCEDURE OPTIONS (MAIN); DECLARE X(10) DECIMAL FLOAT; DO Y = 0.1 ТО 1.0 BY 0.1; I = 10*Y; X©-Y; END;
PUT EDIT ((X(I) DO I " 1 ТО 10)) (SKIP, F(8,2)); END LOOP;
Выданный результат:
0.20 0.30 0.40 0.50 0.60 0.70 0.80 0.90 1.00 29312.00
ПРОЕКТЫ
59. Ранее было отмечено, что отладка облегчается, если программы имеют небольшой объем. Но насколько малыми они должны быть? Ведь каждый отдельный оператор можно сделать самостоятельной программой. Однако с увеличением количества программ увеличивается и число необходимых интерфейсов между ними, а отсюда, вероятно, и количество ошибок. Можете ли вы внести какие-либо предложения относительно рационального числа подпрограмм и общего объема программы? Решение этой задачи гораздо сложнее, чем может показаться на первый взгляд.
60. Напишите программу, которая анализировала бы программу на входном языке и затем выводила бы на печать все неиспользуемые операторы, метки и неопределенные переменные.
61. Исследуйте, какие типы и разновидности средств отладки, предусмотренных используемым вами языком программирования, доступны на вашем вычислительном комплексе (очевидными являются такие средства, как отладочные компиляторы, программы выявления перекрестных ссылок, программы-профилировщики и отладочные системы). Подготовьте техническую документацию в форме простого описания, в котором излагались бы существующие в вашем вычислительном центре возможности отладки программ.
62. Для любого языка программирования можно разработать набор правил, позволяющих избежать программных ошибок. Создайте такую сводку правил для используемого вами языка. Покажите ее своим коллегам и посмотрите, найдутся ли у вас единомышленники.
63. В этой главе описана программа выявления перекрестных ссылок. Напишите аналогичную программу для вашего языка программирования.
64. Наиболее легкий (но и наиболее рациональный) путь выполнения предыдущего задания состоит в том, чтобы найти соответствующую готовую программу, пригодную для используемого вами языка. Если вам удастся это сделать, тщательно проверьте такую программу и сделайте ее общедоступной для всех пользователей вашей машины.
65. Программное обеспечение, поставляемое изготовителями ЭВМ, всегда содержит ошибки. Часто составляют целые списки возможных тупиковых ситуаций с указанием обстоятельств их возникновения. Такие списки никогда не называют "Списком ошибок" или "Дефектными ведомостями". Фирма IBM, например, присвоила им такие названия, как "Заблаговременные предупреждения" и "Памятка по системе программирования". Фирма Digital Equipment называет списки ошибок "Примечаниями к программному обеспечению". Отыщите несколько таких списков по какой-нибудь из фирм и путем сравнительного анализа установите, увеличивается, сокращается или остается постоянным количество ошибок со временем. Если вы можете узнать также и количество команд в тех или иных пакетах программ, то имеет смысл вычислить для различных элементов программного обеспечения показатель "плотности ошибок", разделив общее количество ошибок на число команд.
66. В любом языке программирования определенные свойства языка порождают частые ошибки, называемые характеристическими. Так, например, в ФОРТРАНе в отличие от АЛГОЛа не всегда требуется описание переменных. Поэтому на основании выражения
MISTAKE=MISTEAK+1
переменные MISTAKE и MISTEAK в ФОРТРАНе будут рассматриваться как разные, и ошибка останется не обнаруженной. В АЛГОЛе же в связи с тем, что описание переменных — условие обязательное, ошибка будет обнаружена. Выявите некоторые ошибки, свойственные используемому вами языку программирования.
67. Стандартизация диагностических сообщений и сообщений об ошибках. В любой нетривиальной программе обычно выявляются те или иные синтаксические или семантические ошибки. Современные компиляторы обнаруживают подавляющее большинство таких ошибок, однако нет двух компиляторов, которые оповещали бы о них одинаковым способом. Сравните диагностические средства двух каких-нибудь компиляторов либо для одного и того же языка, либо для различных языков. После этого разработайте ряд правил для стандартизации диагностических сообщений по содержанию и по форме. Установите также, как и где должны предусматриваться диагностические сообщения.
68. Пакеты отладки. Изучите какие-либо отладочные пакеты, примерами которых в КОБОЛе фирмы IBM является оператор DEBUG, а в ФОРТРАНе той же фирмы —оператор AT. С другими пакетами отладки можно ознакомиться в книге Растина [11]!, посвященной методам отладки больших систем программного обеспечения. Сделайте обзор существующих пакетов отладки для общедоступных программ, найдите в них общие черты и определите, какими дополнительными возможностями обладают некоторые из них. Установите, какой отладочный пакет наиболее подходит для ваших целей. Разработайте ряд условий, которым должна, на ваш взгляд, удовлетворять хорошая система отладочных средств.
69. Подпрограммы обработки ошибок. Изучите доступные в современных компиляторах подпрограммы обработки ошибок. Примерами подобных программных средств являются в языке ПЛ/1 переход по оператору ON, а в языке БЕЙСИК, разработанном для машины PDP-11 фирмой Digital Equipment, переход по оператору ON ERROR. Наличие таких средств (подпрограмм) предоставляет пользователю широкие возможности для того, чтобы эффективно справляться с самыми различными ситуациями, возникающими в результате появления ошибок при выполнении программы. Сделайте обзор существующих подпрограмм обработки ошибок и попытайтесь выработать основные требования к ним.
70. Соберите статистические данные относительно того, с какими свойствами языков программирования связано наибольшее количество программных ошибок. Один из возможных способов решения этой задачи — анализ большого числа забракованных листингов с последующей классификацией обнаруженных в них ошибок.
71. Легко написать вспомогательную программу, которая будет считывать основную программу на входном языке и выявлять в пей всевозможные грубые ошибки кодирования, такие, как а) необъявленные переменные, б) непонятные коды, в) неиспользуемые переменные или метки, г) переменные, использованные только один раз. Составьте список грубых ошибок кодирования, которые могла бы отмечать указанная программа. Основой этого списка может послужить классифицированное множество ошибок из предыдущего задания.
72. Более труднообнаруживаемыми ошибками кодирования па сравнению с перечисленными в п. 71 являются ошибки вида
Г= (арифметическое выражение)
Здесь размещены операторы, не содержащие обращения к Т, которые являются правильной частью программы Т= (другое арифметическое выражение).
Поскольку в данном случае Т переопределено, не будучи ни разу использованным, налицо ошибка. Как, по-вашему, важно ли для программиста, чтобы компилятором выявлялись ошибки подобного рода? Принимая во внимание такие ошибки и ошибки, рассмотренные в п. 71, составьте их список, упорядоченный по степени важности обнаружения соответствующих ошибок компилятором, и определите возможность реализации необходимых для этого проверок.
73. Отладка программы не ее автором. Зачастую программист не сам отлаживает собственную программу, а это делает кто-либо другой. Одно из преимуществ подобного метода работы состоит в том, что программисты, зная о предстоящей отладке их программы другим лицом, обращают особое внимание на ее удобочитаемость и полноту документирования. Эти свойства программы облегчают и ее дальнейшую эксплуатацию. Выберите для себя и предложите выбрать кому-нибудь из своих коллег некоторые из заданий, помещенных в данной книге, запрограммируйте соответствующие задачи и затем выполните отладку программ Друг друга. Составьте краткий отчет о результатах этого эксперимента.
74. Ограничения на использование компилятора. Любой компилятор имеет определенные ограничения по применению. Обычно границы использования настолько широки, что их редко принимают в расчет. Так, например, один из широко распространенных компиляторов допускает использование в пределах одного оператора порядка 400 круглых скобок. Представляет интерес отыскание подобных ограничений в компиляторе, которым пользуетесь вы, например:
а) максимально допустимого количества круглых скобок в одном операторе;
б) максимально допустимого размера одномерного массива и максимально возможной размерности массива;
-£99
в) максимально возможной длины литералов или разрядности цифровых констант;
г) максимально допустимой длины отдельного оператора;
д) максимально возможной длины одного комментария или максимального количества следующих подряд комментариев;
е) максимально допустимого числа вложений операторов DO, блоков операторов или условных операторов IF THEN ELSE;
ж) максимально возможного количества подпрограмм в программе (или вложенных обращений к подпрограммам);
з) максимально допустимого числа аргументов подпрограммы;
и) максимально возможного количества рекурсивных вызовов. Попытайтесь дополнить этот список ограничений. (Указание: проанализируйте список сообщений об ошибках, предусмотренных в используемом вами компиляторе.)
⇐4.37. Советы программисту4 || Оглавление || Литература4⇒
|