-c1E
+\/d
Г Л А В А VIII. НЕКОТОРЫЕ ВОПРОСЫ МЕТОДОЛОГИИ ОТЛАДКИ ПРОГРАММ
-
-
+\/d-
Я услышал и забыл.
Я увидел и запомнил.
Я сделал и понял!
- Гленн М. Клейман.
-
-
+ Г.Клейман
О т л а д к а = О б н а р у ж е н и е ошибки + ее И с п р а в л е н и е
└─────────────▲─────────────┘
│
│ программы ошибки │
└─────────────────────────────────────────────────────┘
-
VIII.1 ОШИБКИ ПРИ ПРОГРАММИРОВАНИИ
-
- Какую бы программу вы ни писали, Какую бы программу вы ни писали,
- любая ошибка, которая может в любая ошибка, которая не может в
- нее вкрасться, - вкрадется! нее вкрасться, - тоже вкрадется!
- Следствие Еще одно следствие
- первого закона Чизхолма первого закона Чизхолма
-
-
+ Какую бы программу вы ни писали,
+ любая ошибка, которая может в
+ нее вкрасться, - вкрадется!
+ Следствие первого
+ закона Чизхолма
Будем говорить, что "в программе имеется о ш и б к а, если ее выполне-
ние не оправдывает ожиданий пользователя" [50, 51].
Напомним, что при решении задач с использованием компьютера под о т-
ных аппаратными средствами, составляет ничтожный процент.
Так, согласно одному из определений "ПЭВМ - это вычислительная машина
с надежностью военной аппаратуры и ценой изделия бытовой электроники"[58].
+
┌───────────────────────────────────────────────────────────────────────┐
│Таким образом,в ошибочных ответах компьютера виноваты,как правило,люди!│
└───────────────────────────────────────────────────────────────────────┘
ся выявить на этапе ручной проверки, потому что при машинном выполнении
программы они могут "исчезнуть" лишь для того,чтобы снова появиться позже.
В некотором смысле достаточно сложная программа напоминает карточный
-домик: тот факт что домик стоит, еще не гарантирует, что он не рассыплет-
+домик: тот факт, что домик стоит, еще не гарантирует, что он не рассыплет-
ся в следующее мгновение. Программы опровергают опыт нашей жизни. Обычно,
если что-то работает, то оно работает! Если новый стул выдержал Вас, он
выдержит Вас и в следующий раз; если сошедший с конвейера автомобиль про-
ных в массив, когда значение индекса вышло за допустимые пределы. Если,на-
пример, Вы присваиваете начальное значение элементу массива T(J), а значе-
ние индекса J должно находиться в границах от 1 до 100, но J случайно ока-
-залось в какой-то момент больше 100, либо меньше 1,то Вы, разумеется,полу-
+залось в какой-то момент больше 100 либо меньше 1,то Вы, разумеется,полу-
чите не тот результат, который хотели. Если Вы часто совершаете ошибку та-
кого рода, Вам полезно написать несколько операторов, которые будут прове-
рять значения каждого индекса перед его использованием и фиксировать его
│ Принцип Компетентности по Питеру │
└───────────────────────────────────────────────────────────────┘
-
-
VIII.2. НЕКОТОРЫЕ КЛАССИЧЕСКИЕ ПРИЕМЫ ТЕСТИРОВАНИЯ ПРОГРАММ
-
Самая коварная уловка дьявола состоит в том,
чтобы убедить нас, будто его не существует.
- Шарль Бодлер
-
-
+ Ш.Бодлер
Известно, что в процессе разработки программы работы по доказательству
(д е м о н с т р а ц и и) правильности разрабатываемой программы равно-
значны работам по ее изготовлению (алгоритмизации и написанию), что можно
ся делом несравнимо более легким, чем разработка н а с т о я щ е й про-
граммы (особенно если программист и не думает о предстоящей отладке!).
-
-
VIII.2.1. Р у ч н а я п р о в е р к а
-
Если вам кажется, что ситуация улучшается,
значит, вы чего-то не заметили!
Второе следствие второго закона Чизхолма
-
Отладку любой программы никогда не следует начинать с прогона програм-
мы на компьютере, т.к. экспериментально установлено, что "ручными" метода-
ми (т.е. без помощи компьютера) удается обнаруживать от 30 до 70% програм-
мом программой на печать или на экран дисплея?
-
VIII.2.2. Р у ч н а я п р о к р у т к а. М е т о д и ч е с к и е
у к а з а н и я п о е е п р о в е д е н и ю
-
Программисту не всегда нужна ЭВМ, иногда по-
лезнее удобное кресло и спокойная обстановка.
А.Архангельский
-
-
После окончания ручной проверки проведите несколько раз р у ч н у ю
п р о к р у т к у ("walkthrough" - "сквозной контроль") отдельных частей
Вашей программы. Иногда ее называют "с у х о й" п р о к р у т к о й ("dry
на обычную ручную проверку и возвращаться на режим прокрутки при начале
проверки логически сложных блоков.
Исходные данные, влияющие на логику программы, должны выбираться так,
-чтобы минимизировать прокрутку программы.Но,с другой стороны, данные долж-
-ны быть такими, чтобы в прокрутку вовлеклось большинство ветвей программы
-и чтобы прокрутка отразила типичный характер ее работы.
+чтобы минимизировать прокрутку программы. Но данные должны быть и такими,
+чтобы в прокрутку вовлеклось большинство ветвей программы и чтобы прокрут-
+ка отразила типичный характер ее работы.
Кроме того, в ходе прокрутки необходимо проверить работу программы и
для особых случаев (например, для экстремальных значений параметров).
Многократные повторные прокрутки какого-либо участка программы можно
с л е д н и х одного-двух (проверка выхода из цикла).
Прокрутка бывает необходимой и в том случае, когда программист не в со-
стоянии вполне четко представить себе логику проверяемой программы, осо-
-бенно ┌────────────────────────────────────────────────────────────┐
+бенно
+ ┌────────────────────────────────────────────────────────────┐
│ если программа написана не им и нет хорошего описания │ .
└────────────────────────────────────────────────────────────┘
+
При первом же пробном запуске вычислительной машины МЭСМ (первая в
СССР ЭВМ, 1951 г.) произошел показательный случай. Первую программу для
МЭСМ перед запуском прокрутили вручную два квалифицированных математика и
│ 1987 │ ша прямоугольная.
└─────────┘
Если доски нет, ручную прокрутку можно вести и на бумаге. При этом таб-
-лицу имен (блоков) приходится изображать немножко по-другому потому, что
+лицу имен (блоков) приходится изображать немножко по-другому, потому что
стирать старые значения на бумаге неудобно, лучше их зачеркивать, а рядом
писать новые значения.
Ручную прокрутку лучше всего проводить в д в о е м с приятелем. Вы-
сматриваемой программы,что невозможно без глубокого и крепкого знания его
в течение всего длительного времени проведения отладки.
- VIII.2.3. М е т о д к о н т р о л ь н ы х т е с т о в
+ VIII.2.3. М е т о д к о н т р о л ь н ы х т е с т о в
+
Никогда не берите на корабль два хронометра, берите
один или, если есть возможность, три, но не два.
Наставление мореплавателям начала ХIХ века
когда нельзя быть уверенным,что может быть найдена
и первая ошибка. Р.Лингер, Х.Миллс, Б.Уитт
-
Как бы ни была тщательно проверена и "прокручена" программа за столом,
решающим этапом, устанавливающим ее пригодность для работы, является конт-
роль программы по результатам ее выполнения на компьютере.
└──────────────────────────────────────────────────────────────────┘
-
VIII.2.3.1. С т р а т е г и я т е с т и р о в а н и я
-
Вы должны радоваться, что мост разрушился,-
я планировал построить еще тринадцать по
тому же проекту.
- Замечание, приписываемое Х.К.Брюнелю,
+ Замечание, приписываемое Х.Брюнелю,
адресованное дирекции Большой запад-
ной железной дороги
-
Перечислим основные принципы тестирования [50]. Эти принципы интересны
тем, что в основном они интуитивно ясны, но в то же время на них часто не
обращают должного внимания.
ные данные, обладают большей обнаруживающей способностью, чем тесты, соот-
ветствующие корректным входным данным.
5. Необходимо проверять не только, делает ли программа то,для чего она
-предназначена, но и не делает ли она того, что не должна делать.
+предназначена, но и ни делает ли она то, что не должна делать.
Обязательно проверяйте программу на нежелательные побочные эффекты.
6. Не следует выбрасывать тесты, даже если программа уже не нужна.
Необходимость в использованных тестах наиболее часто возникает в интерак-
│ У д а ч н ы м является тест, который обнаруживает еще не │
│ выявленную ошибку. │
└───────────────────────────────────────────────────────────────────┘
+
"На закуску" рекомендуем выполнить следующий простой тест.Задача состо-
ит в том, чтобы проверить программу,которая по трем заданным числам печа-
тает сообщение о том, является ли треугольник со сторонами, длины которых
Приступайте к работе...
Следующий шаг состоит в оценке эффективности Вашей проверки. Оказывает-
ся, что программу труднее написать, чем это могло показаться вначале.Были
-изучены различные версии данной программы и составлен список общих ошибок.
+изучены различные версии данной программы,и составлен список общих ошибок.
Оцените Ваш набор тестов, попытавшись с его помощью ответить на приведен-
ные ниже вопросы. За каждый ответ "да" присуждается одно очко.
1. Составили ли Вы тест, который представляет правильный неравносторон-
-ний треугольник? (Заметим, что ответ "да" на тесты,со значениями 1,2,3, и
+ний треугольник? (Заметим, что ответ "да" на тесты со значениями 1,2,3, и
2,5,10 не обоснован, т.к. не существует треугольников, имеющих такие сто-
роны.)
2. Составили ли Вы тест,который представляет правильный равносторонний
рых Вами испытаны все три перестановки (например: 1,2,4; 1,4,2 и 4,1,2)?
11. Составили ли Вы тест, в котором все стороны треугольника имеют дли-
ну, равную нулю (т.е. 0,0,0)?
- 12. Составили ли Вы по крайней мере один тест,содержащий нецелые значе-
-ния?
+ 12. Составили ли Вы, по крайней мере, один тест,содержащий нецелые зна-
+чения?
13. Составили ли Вы хотя бы один тест, содержащий неправильное число
значений (например, два, а не три целых числа)?
Конечно, нет гарантий, что с помощью набора тестов, который удовлетво-
Выполненное упражнение показывает, что тестирование даже тривиальных
программ, подобных приведенной, - не простая задача.
-
-
VIII.2.3.2. Т а к т и к а т е с т и р о в а н и я
-
Перевести программу из хорошего состояния в
отличное неизмеримо труднее, чем из плохого
в удовлетворительное.
Программистский фольклор
-
-
Поговорим о методах тестирования.
При н е у п о р я д о ч е н н о м тестировании ("smoke test" - "гру-
бая проверка работоспособности простым запуском", "дымовой тест") исход-
мой программы, так и ограниченность человеческих возможностей при проведе-
нии такого доказательства [49].
П р о х о д у ч а с т к о в. Каждый линейный участок программы должен
-быть обязательно пройден при выполнении по крайней мере, одного теста.
+быть обязательно пройден при выполнении, по крайней мере, одного теста.
Очевидно, что в противном случае никакой гарантии в правильности работы
всей программы дать будет нельзя.
В том случае, когда выполнение некоторого участка программы меняет по-
ты, с тем, чтобы можно было действительно удостовериться в правильности
работы блока.
Дело в том, что величины, входящие в проверяемое арифметическое выраже-
-ние, в зависимости от соотношения их значений и характера производимых
+ние в зависимости от соотношения их значений и характера производимых
над ними операций, вносят различный вклад в результат. Поэтому может ока-
заться, что неправильно запрограммированное выражение для некоторых тесто-
вых значений величин, входящих в него, будет иметь я к о б ы правильное
ленными или такими, чтобы при проверке выражений некоторые их слагаемые,
уже проверенные ранее, обращались в нуль.
Д о с т о в е р н о с т ь э т а л о н о в. Нужно обратить внимание и
-на достоверность процесса получения эталонных результатов. По возможности,
-они должны вычисляться не самим программистом, а кем-то другим, с тем,что-
+на достоверность процесса получения эталонных результатов. По возможности
+они должны вычисляться не самим программистом, а кем-то другим, с тем что-
бы одни и те же ошибки в понимании задания не проникли и в программу, и в
эталонные результаты. Если тесты готовит сам программист, то эталоны нуж-
но вычислять до получения на компьютере соответствующих результатов.В про-
тивном случае имеется опасность невольной подгонки вычисляемых значений
под желаемые, полученные ранее на компьютере. В качестве эталонных резуль-
татов часто используют и данные,полученные при ручной прокрутке программы.
-
П л а н и р о в а н и е.
┌───────────────────────────────────────────────────────────────────┐
│ При отсутствии планового подхода тестирование обычно сводится │
Для устранения такого рода недоразумений нужно тщательно проверять на-
бор тестов ("тестировать" тесты).
-
-
VIII.2.3.3. Т и п ы т е с т о в
-
О несчастном случае мой подзащитный впервые
узнал лишь тогда,когда этот случай произошел.
Из речи адвоката
-
-
О с н о в н ы м т е с т о м мы будем называть тест, проверяющий ос-
новные функциональные возможности программы. Однако существует опасность,
что после успешного окончания основного тестирования "на радостях" обыч-
применить следуюшие типы тестов.
В ы р о ж д е н н ы й тест. Этот тест затрагивает работу отлаживае-
мой программы в самой минимальной степени. Обычно тест служит для провер-
-ки правильности выполнения самых внешних функций программы, например, об-
-ращения к ней и выхода из нее.
+ки правильности выполнения самых внешних функций программы, например обра-
+щения к ней и выхода из нее.
Т е с т г р а н и ч н ы х з н а ч е н и й, или "с т р е с с о в ы й
тест"("high-low bias checking","twin check"). Тест проверяет работу про-
граммы для граничных значений параметров, определяющих вычислительный про-
β) сортируемый массив содержит только один элемент;
γ) все элементы в сортируемом массиве одинаковы;
δ) массив уже отсортирован.
- Лоуренс Питер приводит следующий поучительный пример. Компьютер одной
-компании по страхованию автомобилей выслал проживающему в Сент-Луисе кли-
-енту счет на сумму 0.00 долларов. Когда же компьютер направил ему "послед-
-нее уведомление" с угрозой расторгнуть договор, этот челевек обратился за
-помощью к своему финансовому агенту. Тот пришел к выводу, что лучший спо-
-соб уладить дело - отправить компьютеру чек на 0.00 долларов. Это было
-сделано, и в ответ пришло подтверждение с благодарностью и заверением,что
-договор остается в силе!
+ Л.Питер приводит следующий поучительный пример. Компьютер одной компа-
+нии по страхованию автомобилей выслал проживающему в Сент-Луисе клиенту
+счет на сумму 0.00 долларов. Когда же компьютер направил ему "последнее
+уведомление" с угрозой расторгнуть договор, этот челевек обратился за по-
+мощью к своему финансовому агенту. Тот пришел к выводу, что лучший способ
+уладить дело - отправить компьютеру чек на 0.00 долларов. Это было сде-
+лано, и в ответ пришло подтверждение с благодарностью и заверением,что до-
+говор остается в силе!
А в а р и й н ы й т е с т. Тест проверяет реакцию программы на возник-
новение разного рода аварийных ситуаций в программе, в частности вызван-
ных неправильными исходными данными, то есть проверяется диагностика, вы-
маются".
-
VIII.3. М е т о д ы л о к а л и з а ц и и о ш и б о к
-
Если Вы думаете, что разработка и кодирова-
ние программы - вещь трудная, то Вы еще ни-
чего не видели.
Популярный афоризм
-
После того как установлено, что в программе или в конкретном ее блоке
имеется ошибка, возникает задача ее л о к а л и з а ц и и, то есть уста-
новления точного места в программе, где она находится. Можно считать, что
└──────────────────────────────────────────────────────────────┘
2. Используйте средства отладки только как вспомогательные.Не применяй-
те эти средства вместо того, чтобы обдумывать задачу.
- ┌────────────────────────────────────────────────────────────────────┐
- │ Ясно, что такие средства как трассировка (п.VIII.3.1) и │
- │ аварийная печать (п.VIII.3.2) отражают случайный подход к отладке.│
- └────────────────────────────────────────────────────────────────────┘
+┌──────────────────────────────────────────────────────────────────────┐
+│ Ясно, что такие средства как трассировка (раздел VIII.3.1) и ава- │
+│ рийная печать (раздел VIII.3.2) отражают случайный подход к отладке. │
+└──────────────────────────────────────────────────────────────────────┘
Эксперименты показали, что программисты, избегающие применения средств
отладки, даже при отлаживании незнакомых им программ выполняют ее лучше,
чем те, кто пользуется этими средствами.
кинофильма. Если Вы не можете локализовать ошибку в приемлемые сроки(пред-
положительно за 30 минут для небольших программ и за несколько часов для
больших), прекратите поиски и займитесь каким-нибудь другим делом,так как
-эффективность Вашей работы, во всяком случае, значительно снизится. Проб-
-лему следует "забыть" до тех пор, пока Вы либо подсознательно не найдете
-ее решения,либо отдохнете и будете готовы вновь рассмотреть симптомы ошиб-
-ки.
+эффективность Вашей работы значительно снизится. Проблему следует "забыть"
+до тех пор, пока Вы либо подсознательно не найдете ее решения, либо отдох-
+нете и будете готовы вновь рассмотреть симптомы ошибки.
+
И наконец,
┌────────────────────────────────────────────────────────────────────────┐
│ если Вы окончательно зашли в тупик, то изложите задачу кому-нибудь еще.│
└────────────────────────────────────────────────────────────────────────┘
Сделав это, Вы, вероятно, обнаружите что-то новое. Часто случается так,
-что, просто пересказав задачу хорошему слушателю,Вы вдруг найдете решение
+что просто пересказав задачу хорошему слушателю,Вы вдруг найдете решение
без какой-либо помощи с его стороны.
Далее мы рассмотрим некоторые, ставшие уже классическими, способы по-
лучения программистом промежуточных результатов, вырабатываемых отлаживае-
мой программой.
- VIII.3.1. Т р а с с и р о в к а
+ VIII.3.1. Т р а с с и р о в к а
Всякий необходимо причиняет пользу, упот-
ребленный на своем месте. Напротив того:
танцах глупы.
Козьма Прутков
-
Т р а с с и р о в к а ("tracе" - "след") представляет собой пошаговое
выполнение программы в автоматическом режиме. Если Вы создали сложную по
логике программу, и она выполняется неправильно, а по информации, выводи-
-мой на экран нельзя установить, где ошибка, то оператор
- TRON
+мой на экран, нельзя установить, где ошибка, то оператор
+ TRON ,
где TRON ("TRacing ON" - "установить трассировку") - служебное слово,
поможет Вам произвести трассировку программы во время ее выполнения.
Выполнение оператора TRON приводит к последовательному выводу номеров
то Вы легко увидите, по каким"ветвям" выполняется Ваша программа, поэтому
анализ полученной трассы, как правило, позволяет локализовать ошибку.
Отменяется режим трассировки оператором
- TROFF
+ TROFF ,
где TROFF("TRacing OFF" - "отменить трассировку") - служебное слово.
+
Итак, если Вам непонятна работа какого-то участка программы, то в нача-
ле участка надо поставить оператор TRON, а в конце - оператор TROFF.
Например: 249 TRON
│ │
П о д у м а й т е, п о ч е м у ?!
-
П р и м е р 2. 10 TRON:INPUT A,B:PRINT A;B
───────────── 20 IF A*B<99 THEN 100 ELSE TROFF
100 PRINT A+B;A-B
5 6 10 10
[20][100] 11 -1 [20] 20 0
Ok Ok
-
Отметим, что команда RUN в ее простейшем виде не отменяет режима TRON,
так что использование оператора TRON ведет к выполнению трассировки всех
последующих программ до тех пор, пока не встретится оператор TROFF.
└───────────────────────────────────────────────────────────────────┘
Операторы TRON и TROFF можно использовать и в режиме прямого выполне-
ния команд.
-
П р и м е р 3. Ok
───────────── TRON
Ok
[20][100] 1
[110]
Ok
-
Этими операторами нужно пользоваться избирательно и крайне осторожно -
иначе Вы "утонете" в протоколах трассировки.Поэтому стремитесь ограничить
область действия операторов TRON и TROFF в тексте Вашей программы!
-
VIII.3.2. А в а р и й н а я п е ч а т ь
-
Щелкни кобылу в нос - она махнет хвостом.
Козьма Прутков
-
Под а в а р и й н о й п е ч а т ь ю ("dump" - "дамп" , "разгрузка
памяти","выдача") понимается печать значений переменных в программе в тот
момент ее выполнения, когда в ней возникает ошибка,препятствующая дальней-
получает доступ к тем значениям переменных, которые они имели в момент
возникновения аварийной ситуации. Изучение и сопоставление таких значений
обычно позволяет программисту достаточно точно локализовать ошибку в про-
-грамме, и иногда и не одну.
-
+грамме, а иногда и не одну.
П р и м е р. 10 PRINT 1/SIN(X)
─────────── run
Division by zero in 10
0 ◀── Вот теперь все ясно!
Ok
-
- Вам известны мои методы. Примените их!
- Конан Дойль. Собака Баскервилей
-
+ А.Конан Дойль. Собака Баскервилей
Эффективным методом локализации ошибки для небольших программ является
прослеживание в обратном порядке логики выполнения программы с целью обна-
от ожидаемого).
-
VIII.3.3. Л о к а л и з а ц и я с т о ч к а м и
о с т а н о в а
-
Разделяй и властвуй!
Людовик XI
-
-
Трассировка хороша только для коротких программ; более универсальным
способом является п е ч а т ь в у з л а х ("snapshot" - "моментальный
снимок") или л о к а л и з а ц и я с т о ч к а м и о с т а н о в а .
Если Вы будете внимательны, то услышите и предупредительный звонок,как
и при выполнении оператора BEEP.
После останова по оператору STOP вычисления могут быть возобновлены ко-
-мандой CONT
+мандой CONT ,
которая должна быть выполнена в режиме непосредственного счета.
┌────────────────────────────────────────────────────────────┐
│ Однако ни в коем случае не изменяйте, не добавляйте и │
│ не исключайте в этот момент строки Вашей программы! │
└────────────────────────────────────────────────────────────┘
-
П р и м е р. Программа, осуществляющая вычеркивание R-й буквы из сло-
─────────── ва P$ и запись полученного после вычеркивания слова в
слово Q$.
в Вашу программу, только, разумеется, программную строку, в которой прои-
зошло прерывание, Вам будет трудно угадать!
Заметим, что во время прерывания Вы можете изменять значения перемен-
-ных. Однако учтите, что, если "что-либо"(например, оператор CLEAR) дела-
+ных. Однако учтите, что если "что-либо" (например, оператор CLEAR) дела-
ет продолжение программы, прерванной по оператору STOP, бессмысленным, то
любая попытка выполнить команду CONT приводит к сообщению
"? Can't CONTINUE"
ко точек останова, как и при обычной отладке с точками останова.
-
VIII.3.4. П р о г р а м м н а я о б р а б о т к а о ш и б о к
-
Don't worry, computer bugs don't byte.
Из программистского фольклора
-
-
Кроме сбоев в работе компьютера из-за неисправностей каких-либо его уз-
-лов, имеется достаточно много причин, по которым происходит прерывание вы-
+лов имеется достаточно много причин, по которым происходит прерывание вы-
числений по программе и при нормально работающем компьютере.Перечислим не-
которые из них:
1) компьютеру "предложено" поделить на нуль;
RESUME m .
Разумеется, старайтесь не возвращаться "внутрь" цикла, минуя заголовок,
и "внутрь" другой подпрограммы!
-
П р и м е р ы:
─────────────
1) 10 ON ERROR GOTO 50:INPUT M 2) 10 ON ERROR GOTO 70:INPUT W
? 30
Осуществлен переход на оператор GOSUB 40!
Ok
-
Подпрограмма обработки ошибок должна заканчиваться операторами RESUME,
END или STOP, в противном случае последует сообщение об ошибке:
"No RESUME in ∗∗∗∗"
│ &H801F │ &H41 │ Код символа "A" │
└───────────┴────────────┴─────────────────────────────────┘
В подпрограммах обработки ошибок обычно используются функции:
- α) ERR
+ α) ERR ,
где ERR ("ERRor") - служебное слово, которое возвращает код последней
ошибки, и
- β) ERL
+ β) ERL ,
где ERL ("ERror Line"-"ошибочная строка") - служебное слово,которое воз-
вращает номер строки, где произошла ошибка.
-
П р и м е р ы:
─────────────
4) 10 Z=1/0 5) 10 ON ERROR GOTO 100
print peek(&HF6B3)+256*peek(&HF6B4)
1000
Ok
- Далее, оператором ERROR α
+ Далее, оператором ERROR α ,
где: ERROR - служебное слово;
α - арифметическое выражение;
можно искусственно вызвать (имитировать!) ошибку с кодом, равным INT(α)
50 250 Уже три попытки. Хватит!
Завтра Ok
Ok
-
Отметим, что обработка ошибок пользователем действительна и в непосред-
ственном режиме: Вы можете выполнить в непосредственном режиме команду
ON ERROR GOTO ,а затем ввести команду,которая вызовет обрабатываемую ошиб-
бок оператора:
IF err=X AND erl=Y THEN on error goto 0:resume next
ELSE X=err:Y=erl:resume next
-
П р и м е р 8. 10 ON ERROR GOTO 50
───────────── 20 PRINT MAX
30 END
71 до 255 для MSX-DISK BASIC (и с номерами от 60 до 255 для MSX-BASIC).
Если Вам потребуется ввести свои коды ошибок, то сделайте это по анало-
гии с фрагментом программы:
-
П р и м е р 9. 10 ON ERROR GOTO 150
───────────── 20 INPUT X
30 IF X<0 THEN ERROR 250
Если код ошибки, стоящей в операторе ERROR α, не определен,то будет вы-
дано сообщение об ошибке: "Unprintable error", и программа будет прервана.
+
VIII.3.5. Н е к о т о р ы е п р и ч и н ы, о с л о ж н я ю щ и е
п о и с к о ш и б о к [57]
-
Следствие 17: некомпетентность не знает
преград ни во времени, ни в пространстве.
Л.Питер
-
1. При отладке достаточно сложных программ, использующих большой набор
обрабатываемых данных, иногда трудно вообще установить факт наличия оши-
бок в программе, так как программист лишь приблизительно представляет, ка-
туация схожа с ситуацией, имеющей место в физике микромира: использование
какого-либо прибора для наблюдения процесса полностью изменяет этот про-
цесс.
- 8. Иногда, изменяя программу методом проб и ошибок, можно устранить
+ 8. Иногда, изменяя программу, методом проб и ошибок можно устранить
ошибку, т.е. она перестает как-либо проявлять себя. При этом остается аб-
солютно непонятным, в чем же она заключалась.
-
-
9. Происходит не просто нечто более странное, чем
мы предполагали:странность происходящего превы-
шает и то, чего мы не смели предположить.
Принцип Ожидаемого по Питеру
-
-
В ходе отладки программист нередко допускает просчет, необоснованно
принимая некоторые предположения о возможных источниках ошибок.
Например, используя стандартную библиотечную подпрограмму,он полностью
повторил свой приказ. Паук снова побежал. Затем юный экспериментатор отор-
вал пауку ноги и, снова положив его на стол, скомандовал: "Бегом!".Но на
сей раз паук остался неподвижен. "Вот видите, - заявил торжествующий маль-
-чик, - стоило пауку оторвать ноги, как он сразу оглох.
- А "окончив" отладку, вспомните, что, когда известного датского скульп-
+чик, - стоило пауку оторвать ноги, как он сразу оглох".
+ А "окончив" отладку, вспомните, что когда известного датского скульп-
тора Торвальдсена (1768 или 1770-1844) спросили мнение об одной из его
скульптур, он ответил: "Я не вижу в ней недостатков, из чего заключаю,что
у меня хромает воображение".
-
VIII.4. ПРИНЦИПЫ ИСПРАВЛЕНИЯ И АНАЛИЗА ДОПУЩЕННЫХ ОШИБОК
-
Программа, свободная от ошибок, есть
абстрактное теоретическое понятие.
Д.Ван Тассел
-
-
- Ясно, что процесс отладки складывается из двух этапов: определение мес-
+ Ясно, что процесс отладки складывается из двух этапов: определения мес-
тонахождения ошибки и последующего ее исправления. Поговорим о принципах
исправления ошибок по Майерсу [51].
┌────────────────────────────────────────────────────────┐
ки должно быть выполнено повторное тестирование, позволяющее установить,
не внесена ли новая ошибка.
-
Когда кто выходит из дому, пусть поразмыслит о
том, что намерен делать, а когда снова войдет
в дом, пусть поразмыслит о том, что сделал.
Древнегреческий мыслитель Клеобул
-
Укажем один старый прием исправления ошибок, заключающийся в использо-
вании так называемых "з а п л а т" ("patch" - "заплата", "вставка в прог-
рамму").
VIII.5. ОСНОВНЫЕ ПОНЯТИЯ СТРУКТУРНОГО ПРОГРАММИРОВАНИЯ
-
Высокое качество программ может достигаться "безошибочным" программиро-
ванием ("п а с с и в н ы м и" методами) и выявлением и устранением ошибок
("а к т и в н ы м и" методами). Активные методы мы уже кратко описали.
VIII.5.1. М о д у л ь н о с т ь п р о г р а м м [49]
М о д у л ь н о й называют программу, составляемую из таких частей -
-м о д у л е й, что их можно независимо друг от друга програмировать, тран-
+м о д у л е й, что их можно независимо друг от друга программировать,тран-
слировать, отлаживать (проверять, исправлять). Предполагается, что модули
имеют небольшие размеры, четко определенные функции и, кроме того, их свя-
зи между собой максимально упрощены, в частности, предполагается,что моду-
ли имеют лишь одну точку входа (в начале модуля). Разбиение программы на
-модули при ее написании, хотя и является весьма непростым делом,позволяет
+модули при ее написании хотя и является весьма непростым делом,позволяет
существенно облегчить в дальнейшем работу над программой на других этапах.
После того как в алгоритме выявлены мало зависимые друг от друга час-
ти, составление программы упрощается, так как при программировании каждой
│ чительно ускоряет составление программы и облегчает ее отладку. │
└─────────────────────────────────────────────────────────────────────┘
-
VIII.5.2. С т р о е н и е п р о г р а м м [49]
Не претендуя на полноту классификации, строение программ можно охарак-
ми, к которым необходимо стремиться при разработке программы. Допустимыми
вариантами являются иерархически-хаотическое и, может быть, монолитно-мо-
дульное.
- Помимо модульности, другим свойством, которое содействует предупрежде-
+ Помимо модульности другим свойством, которое содействует предупрежде-
нию появления в программе ошибок, является структурированность.
Обычно с т р у к т у р и р о в а н н о й называется программа, логи-
ческая структура которой отвечает некоторым жестко установленным требова-
структурированной, поскольку от модульной программы требуется, например,
чтобы она состояла только из модулей с одним входом.
-
VIII.5.3. С т р у к т у р н о е п р о г р а м м и р о в а н и е
-
Структура (от лат. "structura" - "строение, распо-
ложение, порядок"),совокупность устойчивых связей
объекта, обеспечивающих его целостность и тождест-
свойств при различных внешних и внутренних измене-
ниях.
Советский Энциклопедический Словарь
-
-
Впервые основные идеи структурного программирования были высказаны
Эдсгером Дейкстрой в 1965 году и позже опубликованы в его работе [55]. Ос-
новная задача, которую Э.Дейкстра решал, разрабатывая идеи структурного
вают, что применение методов структурного программирования позволяет
увеличить это число в 5÷6 раз по сравнению с традиционными способами про-
граммирования.
- Заметим, между прочим, что при структурном программировании становится
+ Заметим между прочим, что при структурном программировании становится
излишним вычерчивание б л о к - с х е м. Блок-схема вполне структуриро-
ванной программы настолько тривиально проста, что о программе можно ска-
зать больше по тексту, чем по блок-схеме.
линейная цепочка блоков может быть сведена к одному блоку, то любая про-
грамма может в конечном итоге рассматриваться как единый функциональный
блок с одним входом и одним выходом.
-
Перечислим теперь основные п р и н ц и п ы и м е т о д ы структур-
ного программирования.
-
Вы говорите, что я повторяюсь.
Но я повторю.
- Т.С.Эллиот
-
+ Т.Эллиот
┌────────────────────────────────────────┐
I. │ Как можно меньше переходов GOTO ! │
└────────────────────────────────────────┘
│ Предложения │ Неформальное │ Соответствующая последо- │
│ структурного │ описание │ вательность операторов │
│ программирования │ │ на языке MSX-BASIC │
-│────────────────────┼─────────────────────┼───────────────────────────│
-│ │ Если условие истинно│ │
-│ │ выполнить предложе-│ │
-│IF C THEN S1 ELSE S2│ ние S1; │ IF C THEN S1 ELSE S2 │
+├────────────────────┼─────────────────────┼───────────────────────────┤
+│ │ Если условие истин-│ │
+│ │ но, то выполнить │ │
+│IF C THEN S1 ELSE S2│ предложение S1; │ IF C THEN S1 ELSE S2 │
│ │ в противном случае │ │
│ │ выполнить предложе-│ │
│ │ ние S2 │ │
-│────────────────────┼─────────────────────┼───────────────────────────│
+├────────────────────┼─────────────────────┼───────────────────────────┤
│ │ Повторить предложе-│ │
│ │ ние S, пока условие │ GOTO n │
│ WHILE C DO S │ С останется истинным│ m: S │
│ │ (0 или более раз) │ n: IF C THEN GOTO m │
│ │ │ │
-│────────────────────┼─────────────────────┼───────────────────────────│
+├────────────────────┼─────────────────────┼───────────────────────────┤
│ │ Повторять последова-│ │
│ │ тельность S (один │ │
│ REPEAT S UNTIL C │ или более раз) до │ m: S │
│ │ тех пор, пока усло-│ IF NOT C THEN GOTO m │
│ │ вие С не станет ис-│ │
│ │ тинным │ │
-│────────────────────┼─────────────────────┼───────────────────────────│
+├────────────────────┼─────────────────────┼───────────────────────────┤
│ │ Выполнить предложе-│ │
-│ CASE K OF │ ние Si(только, если │ ON K GOTO N1,N2,...,Nm:│
+│ CASE K OF │ ние Si (только если │ ON K GOTO N1,N2,...,Nm:│
│ 1: S1 │ значение K=i,причем │ GOTO s │
│ 2: S2 │ i равно либо 1, │ N1:S1:GOTO s │
│ ··· │ либо 2, │ N2:S2:GOTO s │
│ без оператора перехода, логическая структура которой тем не менее │
│ будет неудачной. И, наоборот, существуют ситуации, в которых пере- │
│ ход является лаконичным, простым и ясным средством, в то время как │
-│ другие подходы сравнительно неудачны │
+│ другие подходы сравнительно неудачны. │
└──────────────────────────────────────────────────────────────────────┘
Например, правила структурного программирования часто предписывают по-
вторять одинаковые фрагменты программы в разных участках модуля, чтобы из-
II. Другой метод улучшения качества программирования заключается в при-
менении н и с х о д я щ е г о п р о е к т и р о в а н и я, ("top-down
-programming" - "программирование "сверху-вниз"").
+programming" - "программирование "сверху вниз"").
┌───────────────────────────────────────────────────────────────┐
│ Оператор GOSUB является о с н о в н ы м инструментом │
│ с т р у к т у р н о г о программирования. │
ре необходимости подпрограммы более низкого уровня. Этот последовательный
процесс продолжается, пока программа не будет завершена и проверена.
При другом методе - в о с х о д я щ е м п р о е к т и р о в а н и и
-(программировании "снизу-вверх") - Вы вначале пишете подпрограммы нижнего
+(программировании "снизу вверх") - Вы вначале пишете подпрограммы нижнего
уровня и тщательно их тестируете и отлаживаете. Далее Вы добавляете под-
программы более высокого уровня, которые вызывают подпрограммы нижнего
уровня, и так до тех пор, пока Вы не достигнете программы самого верхнего
-уровня. Метод проектирования "снизу-вверх" пригоден при наличии больших
+уровня. Метод проектирования "снизу вверх" пригоден при наличии больших
библиотек стандартных подпрограмм.
Учтите, что иногда лучшим является гибрид двух методов. Однако в обо-
-их случаях каждая подпрограмма должна быть небольшой, так, чтобы можно бы-
+их случаях каждая подпрограмма должна быть небольшой, так чтобы можно бы-
ло охватить одним взглядом всю ее логику (для персональных компьютеров же-
лательно, чтобы и основная программа,и подпрограммы ц е л и к о м поме-
щались в пределах 20÷30 строк экрана дисплея!)
Всякий велосипедист хорошо знает, что ехать сверху вниз быстрее и удоб-
нее, чем снизу вверх. В программировании дело обстоит примерно так же:
-"сверху-вниз" писать программы удобнее потому,что при таком методе мы точ-
+"сверху вниз" писать программы удобнее потому,что при таком методе мы точ-
но знаем, какие подпрограммы описывать.
Но есть у этого метода и недостаток: на верхнем уровне не всегда видно,
куда спускаться, то есть как разделить решение задачи на такие части, каж-
дую из которых было бы легко описать отдельной процедурой. У опытных про-
граммистов вырабатывается своеобразное чутье: они сразу видят, какие нуж-
ны процедуры, а новичкам иногда приходится туго.
- Метод "снизу-вверх", хотя и требует большого труда, бывает очень поле-
+ Метод "снизу вверх", хотя и требует большого труда, бывает очень поле-
зен на первых порах. Пусть даже половину составленных Вами подпрограмм
придется потом "выбросить", но зато Вы хорошо почувствуете, какие подпро-
граммы для исходной задачи необходимы. Да и отлаживать каждую написанную
подпрограмму можно сразу: ведь все, что "под ней", уже описано (а обычно
и отлажено). Словом, любишь кататься "сверху вниз" - люби и саночки во-
зить (в обратном направлении). Опытные программисты иногда применяют ме-
-тод "снизу-вверх" для того, чтобы заранее заготовить для новой задачи на-
+тод "снизу вверх" для того, чтобы заранее заготовить для новой задачи на-
бор подпрограмм, которые могут понадобиться в различных случаях. Так что
"возить саночки" приходится не только новичкам!
вательности шагов, требуемых для решения задачи, записываются на обычном
языке или на п с е в д о к о д е (см. ниже).
2. На уровне 2 в общих терминах детализируется описание шагов, введен-
-ных на этапе 1).В детализированное описание может входить обозначение цик-
+ных на этапе 1. В детализированное описание может входить обозначение цик-
лических структур,в то время как действия внутри циклов могут по-прежнему
оставаться неясными. Таким образом, выполняются только общие эскизы слож-
ных действий.
3) конец цикла.
Это описание можно немедленно перевести на MSX-BASIC следующим образом:
300 FOR I=1 TO N:PRINT A(I)/M:NEXT I
+
У р о в е н ь 2.
────────────────
Он включает в себя три детализованные выше части, из которых только
много уровней, чтобы довести все модули до такого состояния, при котором
они окажутся готовыми для программирования.
-
Известно, что отладка в два раза сложнее
написания программы. Поэтому, если Вы бы-
ли предельно хитроумны при написании прог-
раммы, то что же Вы будете делать при ее
отладке?
Б.Керниган, Ф.Плоджер
-
-
┌────────────────────────────────────────────────┐
IV. │ Никаких трюков и заумного программирования! │
└────────────────────────────────────────────────┘
ютера и чувствовать себя свободно. Из-за своей необычности трюки, как пра-
вило, реализуются только на языках ассемблерного типа или непосредственно
в машинных кодах.
- Однако, никогда не используйте трюков там, где можно использовать про-
+ Однако никогда не используйте трюков там, где можно использовать про-
стые методы. Заметим,что э л е г а н т н о е решение задачи - это такое
-решение, которое одновременно и просто, и оригинально. Простые решения
+решение, которое одновременно и просто и оригинально. Простые решения
всегда желательны, но вопрос о том, всегда ли приемлемы оригинальные реше-
ния (трюки), остается открытым.
Под о р и г и н а л ь н о с т ь ю решения подразумевается его неоче-
О р и г и н а л ь н о с т ь очевидна, но э л е г а н т н ы м этот при-
ем можно считать, лишь принимая во внимание особенности конкретной задачи.
Он, очевидно, не эффективен, когда используется вне рассматриваемого кон-
-текста, например, для перестановки элементов многомерного массива в обыч-
+текста, например для перестановки элементов многомерного массива в обыч-
ной программе, и к тому же может привести к ошибке округления, если А и В
описаны как вещественные числа. Например:
10 INPUT A,B:A=A-B:B=A+B:A=B-A:PRINT A;B
Ответ прост:
┌─────────────────────────────────────────────────────────────────────┐
│ задача может потребовать бригадной организации ее решения, потому │
- │ что она слишком трудна, или слишком велика, или слишком разнородна │.
+ │ что она слишком трудна или слишком велика, или слишком разнородна │.
└─────────────────────────────────────────────────────────────────────┘
- В 1971г. Г.Д.Миллз предложил схему организации программистской деятель-
+ В 1971г. Г.Миллз предложил схему организации программистской деятель-
ности, известную как б р и г а д а г л а в н о г о п р о г р а м м и с-
т а.Этот подход успешно использовался при разработке и реализации несколь-
ких крупных программных проектов.
Поэтому а к т и в н ы е методы поиска и устранения ошибок дополняют
пассивные в процессе достижения заданного качества программ.
+
VIII.6. О СТИЛЕ ПРОГРАММИРОВАНИЯ [57]
Мыслям просторно.
Н. Некрасов
-
Трудно дать исчерпывающее определение понятия "с т и л ь программиро-
вания". Попытаемся охарактеризовать его, рассмотрев с различных точек зре-
ния. Главный тезис состоит в том, что с т и л ь п р о г р а м м и р о -
лишь немногие могут с такой же легкостью написать на иностранном языке да-
же небольшую статью. Таким образом, от знания языка до владения языком ле-
жит "дистанция огромного размера". Но даже овладев языком программирова-
-ния в совершенстве, мы лишь незначительно приблизимся к обладанию стилем
+ния в совершенстве, мы лишь незначительно приблизимся к грамотному стилю
программирования.
К сожалению, взгляд на стиль программирования как на стиль мышления
еще не всеми и не до конца осознан. Очень часто стиль программирования
сводится к технологии программирования. За последние годы мы пережили не-
сколько вспышек увлечения модными методологиями и технологиями программи-
-рования, такими, например, как структурное программирование. Но в главном
+рования, такими например, как структурное программирование. Но в главном
все они ориентируются на внешние факторы, характеризующие программу. Кста-
ти сказать, жертвой структурного программирования чуть было не стали
FORTRAN и BASIC с их неструктурными операторами. Но очевидно, что плохо
что даст.
Подводя итог сказанному, приведем некоторые рекомендации, которые, как
мы надеемся, при осознанном и неформальном их использовании помогут Вам
-выработать свой стиль программирования. Большинство рекомендаций имеет до-
+выработать свой стиль программирования. Большинство рекомендаций имеют до-
статочно общий характер и могут быть использованы при программировании не
только на BASIC, но и на многих других языках программирования. Эти реко-
мендации не являются исчерпывающими. Много подобных советов читатель мо-
для понимания, отладки и модернизации.
Объем вычислений можно уменьшить различными методами. Прежде всего не-
обходимо исключить лишние вычисления. Следует убедиться, что одно и то же
-значение не вычисляется в программе многократно. Вот,что иногда можно уви-
+значение не вычисляется в программе многократно. Вот что иногда можно уви-
деть в программе: 10 FOR I=1 TO N:FOR J=1 TO 1000
20 K=I+3
···
│ Однако основной метод уменьшения времени выполнения состоит в │
│ кодировании программы на языке ассемблера или на машинном языке!│
└─────────────────────────────────────────────────────────────────┘
- Тем не менее, игнорируйте все предложения по повышению эффективности,
+ Тем не менее игнорируйте все предложения по повышению эффективности,
пока программа не будет правильной.Худшее,что может быть сделано,- это на-
чать беспокоиться о быстродействии программы до того, как она начнет рабо-
тать правильно. Быстродействующая, но неправильная программа бесполезна;
медленнодействующая, но правильная всегда имеет некоторую ценность, а мо-
жет оказаться и вполне удовлетворительной.
"1. Если программа неверна, то ее быстродействие не имеет значения. Убе-
-дитесь в ее правильности, прежде, чем Вы начнете ее "улучшать".
+дитесь в ее правильности прежде, чем Вы начнете ее "улучшать".
2. Сохраняйте программу ясной и понятной, не пытайтесь повысить ее бы-
стродействие в процессе кодирования. Преждевременная оптимизация - корень
всех бед.
слятор делает это за Вас.
4. Беспокойтесь об алгоритме, а не о деталях программы. Помните, что
структура данных может существенно повлиять на то,как будет реализован ал-
-горитм..." Керниган Б., Плоджер Ф.
+горитм..." Б.Керниган, Ф.Плоджер
Вейнберг [68] рассказывает забавную историю о новой программе, которая
из-за слишком большой сложности оказалась совершенно ненадежной. Был вы-
зван новый программист, который нашел лучшее решение и за две недели сде-
│ могу написать такую, которой хватает одной миллисекунды на перфокарту".│
└────────────────────────────────────────────────────────────────────────┘
-
-
VIII.7. НЕДОСТАТКИ ЯЗЫКА ПРОГРАММИРОВАНИЯ BASIC [59]
-
- Меня вы научили говорить Взирая на солнце,прищурь глаза свои
- На вашем языке. Теперь я знаю, и ты смело разглядишь в нем пятна.
- Как проклинать, - спасибо и за это. Козьма Прутков
- Пусть унесет чума обоих вас
+ Меня вы научили говорить
+ На вашем языке. Теперь я знаю,
+ Как проклинать, - спасибо и за это.
+ Пусть унесет чума обоих - вас
И ваш язык.
- У.Шекспир. Буря (пер.М.Донского)
-
-
+ У.Шекспир
+ Взирая на солнце,прищурь глаза свои
+ и ты смело разглядишь в нем пятна.
+ Козьма Прутков
Школьный курс информатики преследует две цели:
1. О б щ е т е о р е т и ч е с к а я ц е л ь .
Овладение алгоритмическим стилем мышления, который включает в себя уме-
│ школе, является - показать, как фундаментальные алгоритмические │
│ конструкции (конструкции школьного алгоритмического языка) при- │
│ обретают свойственную конкретному языку программирования форму, │
- │ сохраняя свое содержание │ .
+ │ сохраняя свое содержание. │
└────────────────────────────────────────────────────────────────────┘
Программа преподавания информатики предоставляет учителю свободу выбо-
ра языка программирования, но большинство останавливается на BASIC и Ра-
алгоритмическом языке задачи,которые можно сразу сделать на BASIC.В итоге
они получают навык программирования, а не мышления, и главная цель остает-
ся не достигнутой.
- Почему же, несмотря на столь серьезную опасность BASICa, он так популя-
+ Почему же, несмотря на столь серьезную опасность BASIC, он так популя-
рен?
- Перечислим основные аргументы, выдвигаемые его зашитниками и попытаем-
+ Перечислим основные аргументы, выдвигаемые его зашитниками, и попытаем-
ся их прокомментировать.
1) BASIC прост в изучении. Это единственное достоинство языка как тако-
вого. Но это та самая простота, которая хуже воровства, "простота орудий
-каменного века". BASIC прост, потому, что в нем нет сложных элементов (в
+каменного века". BASIC прост потому, что в нем нет сложных элементов (в
первую очередь вспомогательных алгоритмов и некоторых алгоритмических кон-
струкций), без овладения которыми поставленные цели не достигаются.
2) При работе на BASIC диалог с компьютером происходит быстро и просто.
│ мирования высокого уровня! │
└───────────────────────────────────────────────────────────────────┘
+
VIII.8. С р а в н и т е л ь н а я х а р а к т е р и с т и к а
я з ы к о в п р о г р а м м и р о в а н и я
-
Карл Пятый, римский император, говаривал, что
ишпанским языком с богом, французским - с дру-
зьями, немецким - с неприятельми, италиянским
ная Виргилиева важность, Овидиево приятное ви-
тийство не теряют своего достоинства на рос-
сийском языке...
- М.В. Ломоносов. Российская грамматика
-
+ М.Ломоносов. Российская грамматика
Идеальный язык програмирования имеет следующие свойства:
1) он легок для начинающих;
Разработчики языка ВАSIC выделяют в качестве наиболее важных критериев
1 и 5.
Разработчики языка Pascal оценивают свойство 4 как наиболее важное,
-и считает важными также позиции 3 и 10.
+и считают важными также позиции 3 и 10.
Разработчики языка Ада охватили свойство 7, и это заставило их пойти
на компромиссы со многими другими желательными критериями.
Разработчики языка С выделяют критерии 10, 6 и 2 как наиболее важ-
│ литературы │ 5 │ 3 │ 3 │ 4 │ 4 │ 2 │ 1 │
├────────────────┼──────────┼───────┼────────┼───────┼─────┼─────┼──────┤
│ Поддержка фир- │ │ │ │ │ │ │ │
-│ мами разработ- │ │ │ │ │ │ │ │
+│ мами-разработ- │ │ │ │ │ │ │ │
│чиками микропро-│ 5 │ 4 │ 4 │ 4 │ 4 │ 3 │ 4 │
│ цессорных │ │ │ │ │ │ │ │
│ систем │ │ │ │ │ │ │ │
│ средств │ 3 │ 3 │ 3 │ 3 │ 5 │ 3 │ 3 │
│ отладки │ │ │ │ │ │ │ │
└────────────────┴──────────┴───────┴────────┴───────┴─────┴─────┴──────┘
-
В заключение три цитаты:
-
1) "Практически невозможно научить хорошему программированию студентов,
ориентированных первоначально на бейсик; как потенциальные программисты
они умственно оболванены без надежды на исцеление"
- Э.В.Дейкстра, ASMSIGPLAN Notice, 1982, 7, P.13-15
-
+ Э.Дейкстра, ASMSIGPLAN Notice, 1982, 7, P.13-15
2) "...коль уж становиться программистом, то программистом хорошим; та-
кого программиста отличает постоянное желание стать еще лучшим программис-
том, а единственно верный путь для этого - стремиться в совершенстве овла-
те, довольно хорошие программисты, которые, став слишком самодовольными
или консервативными, полагают, что язык, которым они пользуются, во всех
смыслах является последним словом" Б.Мик
-
┌───────────────────────────────────────────────────────────┐
3) │ "Предмет, достойный целого курса лекций, вы превратили │
- │ в собрание р а с с к а з и к о в . │
- │ Конан Дойль. Медные буки │
+ │ в собрание р а с с к а з и к о в ". │
+ │ А.Конан Дойль. Медные буки │
└───────────────────────────────────────────────────────────┘