AOP_Tom1 (1021736), страница 53
Текст из файла (страница 53)
Но если такое использование пространства памяти является слишком расточительным, то можно использовать другую схему — присвоить ячейкам имена ТЕИР1, ТЕИР2 и т. д. Нумерация внутри подпрограммы начинается с ТЕИР~, где ~ на единицу больше, чем наибольший номер, который был использован какой-либо вложенной подпрограммой этой подпрограммы. Шаг 3 1Повторная проверка). Результатом шага 2 должна быть практически рабочая программа, но вполне возможно, что ее удастся улучшить. Для этого существует хороший метод — снова сменить направление, исследуя для каждой подпрограммы все сделанные по отношению к ней вызовы. Может оказаться, что подпрограмму необходимо несколько расширить, чтобы она выполняла распространенные операции, которые всегда осуществляет внешняя программа непосредственно перед использованием подпрограммы или после него.
Возможно, несколько подпрограмм следует объединить в одну; а может быть, некоторая подпрограмма вызывается только один раз и из нее вообще не стоит делать подпрограмму. (Случается и такое: подпрограмма не вызывается нн разу и можно вообще обойтись без нее.) На этом этапе очень часто имеет смысл выбросить все, что было сделано, и снова начать с шага 1! Я вовсе не шучу; время, потраченное на то, чтобы добраться до этого места, не пропало даром, так как вы достаточно глубоко изучили поставленную задачу. Впоследствии (уже после запуска программы), скорее всего, станет ясно, что в общу ю схему программы необходимо было внести некоторые улучшения.
Поэтому нет причин бояться возврата к шагу 1 — намного легче снова пройти шаги 2 и 3 сейчас, когда аналогичная программа уже готова. Скажу еше больше: вполне возможно, что время, которое будет затрачено на переписывание всей программы, с лихвой окупится впоследствии при отладке, Некоторые лучшие нз когда-либо написанных компьютерных программ своим успехом во многом обязаны тому, что примерно на этом этапе вся работа была случайно потеряна и авторам пришлось все начать сначала.
С другой стороны, вероятно, в принципе не может наступить момент, когда сложную компьютерную программу нельзя каким-либо образом улучшить. Поэтому шаги 1 и 2 не следует повторять до бесконечности. Когда совершенно очевидно, что можно внести значительное улучшение, имеет смысл потратить дополнительное время на то, чтобы начать все сначала.
Но в конце концов наступает стадия "насыщения", когда сколько-нибудь существенные изменения внести уже нельзя и результатом их воплощения является лишь незначительный прогресс. Шаг 4 (Отладка). После окончательной 'шлифовки'" программы, к которой, видимо, относится распределение памяти и другие последние приготовления, самое время посмотреть на нее под еще одним углом зрения, отличным от тех, которые использовались на шагах 1, 2 и 3. Тенерь мы будем исследовать элементы программы в том порядке, в котором нх будет выполнять компьютер. Это можно сделать вручную илн, конечно, с помощью компьютера. Автор пришел к выводу, что на даннол» этапе очень полезно использовать системные программы, которые прослеживают каждую кбманду, когда она выполняется первые два раза. Очень важно заново продумать идеи, лежащие в основе программы, и убедиться в том, что все действительно происходит так, как ожидалось.
Отладка †э искусство, которое требует дальнейшего изучения, и способ ее проведения в значительной» степени зависит от имеющихся на компьютере устройств. Хорошим началом эффективной отладки во многих случаях может стать подготовка соответствующих тестовых данных. Самыми эффективными, похоже, являются те методы отладки, которые предназначены для конкретной программы и встроены именно в нее.
Многие из лучших программистов современности почти половину своих программ посвятили тому, чтобы облегчить отладку программ из другой половины. "Первая половина", которая обычно состоит из достаточно простых программ, отображающих соответствующую информацию в удобном для чтения виде, в конце концов выбрасывается, но в итоге это дает удивительный выигрыш в производительности. Кще один хороший метод отладки состоит в том, чтобы вести учет всех сделанных ошибок. Конечно, это нелегко, но подобная информация является бесценной для каждого, кто пытается отладить программу; она также поможет в дальнейшем избежать множества ошибок. Замечание.
Большинство предыдущих комментариев было написано авторол» в 1964 году, после того как он успешно завершил несколько программных проектов среднего масштаба, но до того квк он приобрел зрелый стиль программирования. Впоследствии, в ВО-х годах, он понял, что, вероятно, еще более важным является метод, который называется структурным документированием илн грома»пнмм г»рограммированием. Анализ современных представлений об оптимальных способах написания всевозможных программ содержится в книге Б»сегасе Ргоуаттшб (Са»пЬг»»[ке [)»»»х. Ргевв), впервые опубликованной в 1992 году. Кстати, в главе 11 этой книги приведен подробный перечень всех ошибок, которые были устранены из программы ТЕХ в период между 1978 н 1991 годами. 2)о некотооого момента лучше допустить наличие ошибок в программе, чем потратить на ее разработку столько времени, сколько необходимо дяя устранения всех ошибок (сколько десятилетий на это потребуется?).
— А. Л4. Т»ь»С»РИНГ, Ргоровэ»з Гог АСЕ (1945) УПРАЖНЕНИЯ 1. [10[ Сформулируйте характеристики подпрограммы (5). В качестве образца используйте (4), где даются характеристики подпрограмл»ы 1.3.214. 2. [10[ Предложите код, заменяющий (6). Не используйте команду 151. 3. [М15[ Дополните информацию, которая дана в (4), точно указав, что происходит с регистром 3 и флагом сравнения при выполнении подпрограммы. Определите также, что происходит в случае, когда в регистре 11 содержится неположительное число.
4. [х1[ Напишите обобщающую НАХН подпрограмму нахождения максимального зиачения для последовательности Х[а), Х[а+ г), Х[а+ 2г),, Х[п), где г и и — параметры, в а- — наименьшее положительное число, для которого а щ и (по модулю г), т, е. а = 1 + (и — 1) шод г. Предусмотрите специальный вход для случая г = 1. Перечислите характеристики новой подпрограммы, взяв эа образец (4). 5.
[21] Предположим, в машине М11 иет регистра 3. Придумайте способ связи подпрограмм, ие использующий регистр 3. Проиллюстрируйте свое изобретение на примере, написав подпрограмму МАХ100, фактически эквивалентную (1). Сформулируйте характеристики этой подпрограммы аналогично тому, как это сделано в (4). (Придерживайтесь принятых для М11 соглашений о самомодифицируюшемся коде.) 6. [2б] Предположим, в М11 нет оператора МОЧЕ.
Напишите подпрограмму с именем МОЧЕ, такую, чтобы ее последовательность вызова ")МР МОЧЕ; МОР А,1(Р)" давала такой же эффект, как и "МОЧЕ А,1(Р)", если бы последнее было допустимо. Единственные отличия должны заключаться в воздействии иа регистр 3 и в том, что время выполнения подпрограммы несколько увеличится. Т. [20] Почему к самомодифицируюшемуся колу сейчас относятся неодабрительноу 1.4.2. Сопрограммы Подпрограммы — это частные случаи более общих программных компонентов, называемых сопрограммами.
В противоположность несимметричной связи мелсду главной программой и подпрограммой, между сопрограммами, которые выгываюгл одна другую, существует полная симметрия. Чтобы понять, что представляет собой сопрограмма, давайте посмотрим на подпрограммы с другой стороны. В предыдущем разделе мы придерживались той точки зрения, что подпрограмма — это некая аппаратная реализация, которая используется для сокращения количества строк в программе.
Это, конечно, правильно, но возможна и другая точка зрения. Можно рассматривать главную программу и подпрограмму как группу программ, причем каждый член группы должен выполнять определенную работу. Главная программа в процессе своей работы активизирует подпрограмму, последняя выполняет собственную функцию, а затем активизирует главную программу. Мы можем выйти за узкие рамки своих представлений и вообразить, что с точки зрения подпрограммы, когда она осуществляет выход, именно ана вызывает главную программу. Главная программа продолжает выполнять свои обязанности, а затем "выходит" в подпрограмму. Подпрограмма работает, а затем снова вызывает главную программу.
Эта несколько надуманная философия нв самом деле полностью отражает ситуацию с сопрограммами, для которых невозможно определить, где главная программа, а где подпрограмма. Предположим, имеются сопрограммы А и В. Программируя А, можно считать, что  — это подпрограмма; в свою очередь, программируя В, как подпрограмму можно рассматривать уже А. Таким образом, в сопрограмме А команда "ЗМР В" использу.ется для активизации сопрограммы В, В сопрограмме В команда адМР А" применяется для того, чтобы снова активизировать сопрограмму А. Каждый раз при активизации сопрограмма возобновляет выполнение своей программы с той точки, в которой действие было приостановлено в прошлый раз.
Сопрограммами А и В могут быть, например, две программы, играющие в шахматы. Их можно скомбинировать так, чтобы они играли одна против другой. В М1Х подобная связь между сопрограммами А и В осуществляется путем включения в программу следующих четырех команд. А Я'Л ВХ АХ ЗМР А1 В ЯТЗ АХ ВХ ЗМР В1 (2) А2ВБЕ3426Р00ЕУ9321ОРЦ89В.