Н. Джехани - Язык Ада (1988) (1160771), страница 46
Текст из файла (страница 46)
Программы часто начинают разрабатывать методом нисходяшего программирования, а при кодировании и тестировании используют восходящий подход. 7.3. Примеры В качестве примеров рассмотрим две программы. Первый пример иллюстрирует возможности языка программирования Ада для восходящей разработки программ, а второй — средства поддержки нисходящей разработки. В книге везде при написании примеров программ использовался нисходящий метод, но окончательный вариант программ не всегда точно отражал структуру ее разработки.
Во втором приведенном здесь примере структура программы отражена полностью с использованием средств, предоставляемых языком Ада. Первая программа вычисляет некоторые статистические данные о последовательности чисел. Эта программа использует некоторые написанные ранее программы. Вторая программа — зто пакет, следяший за самолетами в радарной системе наблюдения. Содержащиеся в пакете некоторые следы тел и соответствующие им тела разработаны позднее.
Эта программа также иллюстрирует динамическое создание задач (используя ссылочные типы), неконтролируемое освобождение памяти, взаимное исключение и взаимодействие между исключениями и задачами. ггв Гпава 7 7.3.1. Метод восходящей разработки В качестве иллюстрации метода восходящей разработки рассмотрим программу, которая считывает последовательность по меньшей мере 500 целых чисел и вычисляет их среднее значение, медиану и моду (наиболее часто встречающееся значение).
Настраиваемые подпрограммы 1ХБЕКТ1ОХ ЯОКТ О, ЧЕСТОК ОРЕКАТ1ОХ являются доступными библиотечными модулями (см. разд. 6.7.2 и 6.7.5.!) вместе с настраиваемой версией подпрограммы МОРЕ, которая имеет следующую спецификацию: яепег(с !уре ЕЬЕМ !в рг!гаге; гуре ЧЕСТОК !в аггау(1ХТЕОЕК ганне < >) оГ Е1.ЕМ; ргосеоаге МОРЕ О(А: ЧЕСТОК; МЧ: ЕЬЕМ; МЕ: оа! 1ХТЕОЕК); Процедура ЯТАТ1БТ1СБ, которая выполняет требуемые подсчеты и осуществляет свой собственный ввод-вывод, использует конкретизации этих настраиваемых процедур: и!!ЫХБЕКТЮХ БОКТ О, ЧЕСТОК ОРЕКАТ1ОХ, МОРЕ О; и!!й ТЕХТ 1О; пзе ТЕХТ 1О; ргосе)пге ЯТАТ1ЯТ1СБ 1з рас!гайе 1О 1ХТЕОЕК 1з пеи 1ХТЕОЕК 1О(ХЫМ >1ХТЕОЕК); аве 10 1ХТЕОЕК; !уре 1ХТ АККАДА !в актау(1ХТЕОЕК каппе < >) оГ!ХТЕОЕК; А: 1ХТ АККАУ(1..500); МЧ, МР: 1ХТЕОЕК; — значения моды и частоты Х: 1ХТЕОЕК: 0; -- количество считанных чисел ргосег3аге БОКТ гз пеи 1ХБЕКТЮХ БОКТ О(Е1.ЕМ > 1ХТЕОЕК, ЧЕСТОК > 1ХТ АККАУ); йщсг!оа Я)М !в аеп ЧЕСТОК ОРЕКАТ1ОХ(ЕЬЕМ > 1ХТЕОЕК, 1ХРЕХ > 1ХТЕОЕК, ЧЕСТОК > 1ХТ АККАДА, г > "+"); ргосеоаге МОВЕ !в пеп МОРЕ О(Е1.ЕМ > 1ХТЕОЕК, ЧЕСТОК > 1ХТ АККАУ); Ьей!п -- читать значения пЫ!е по! ЕХР Ор ЕГЬЕ(ЗТАХРАКР 1ХРЫТ) !оор Х: Х+1; ОЕТ(А(Х)); 229 Ст к я л отявлеиия л яммы и рл ельиая компиляция епе 1еер; 11 Х / 0 (веп БОКТ(А(1..Х)); -- обратите внимание, что для отрезка не создаются -- копии элементов массива; эти элементы массива пере-- даются как параметр; здесь будут отсортированы только -- элементы отрезка А (1..Х) массива А РЬ[Т(«Количество считанных значений = »); РЬ[Т(Х); ХЕК[ ЫХЕ; Р()Т(«Среднестатистическое значение = »); РОТ(В()М(А(1..Х))/Х); ХЕ% 1-1ХЕ, Р()Т(«Значение медианы = »); РЬ[Т(АИХ+1)/2)); ХЕзт[ ЫХЕ; МООЕ(А(1..Х), МР, М з[); РЬ[Т(«Значения моды и частоты равны»); РЬ[Т(МУ); РЬ[Т(" "); РЬ[Т(МР); е)яе Р(ЗТ(«Нет данных — нет результата»); епе' 1Е ХЕ% Ь1ХЕ; еве БТАТ1БТ1СВ; 7.3.2.
Метод нисходящей разработки Задача состоит в том, чтобы написать пакет РЬАХЕ ТКАСКЕК, составляющий часть радарной системы наблюдения, работающей в режиме реального времени и следящей за курсом самолета 'з. Этот пакет должен управлять 512 самолетами одновременно. В подпрограммах должны быть предусмотрены возможности опроса и корректировки положения самолета и его скорости (трехмерный вектор скорости с направлением). Другие задачи радарной системы наблюдения будут взаимодействовать с этим пакетом. Во время ожидания новых данных о положении и скорости самолета пакет должен корректировать положение каждого самолета в поле видимости системы, используя его старые координаты и скорость.
Всякий раз, когда радарная система обнаруживает новый самолет, пакету РЬАХЕ ТКАСКЕК дается распоряжение начать следить за ним. Пакет Р1.АХЕ ТКАСКЕК также получает информацию о том, что самолет ушел из поля зрения радара, и наблюдение за ним необходимо прекратить. РЬАХЕ ТКАСКЕК обязан сообщать пользователю с помощью аппарата исключений о том, что пакет не может управлять ббльшим количеством самолетов или что самолет вышел из-под наблюдения. » Эта залача заимствована из работы [00[З79б[.
Глава 7 7.3.2.1. Решение При разработке этой программы используются поддерживаемые языком Ада возможности нисходящей разработки программ. Помимо раздельной компиляции программа иллюстрирует динамическое создание задачи, освобождение памяти, взаимное исключение параллельного выполнения операций, возбуждение и распространение исключений при взаимодействии задач. Хотя и возможен одновременный запрос на координаты самолета двумя и более задачами, в предложенном решении рассматривается возможность обращения только со стороны одной задачи в данный момент времени.
Основной возможностью взаимодействия задач является механизм рандеву, который позволяет одновременно взаимодействовать друг с другом только одной паре задач. Чтобы разрешить параллельные запросы о местоположении самолета из различных задач, данные, связанные с самолетом, вместо того чтобы являться частью задачи слежения, могут находиться вне ее вместе с управляюшей задачей, которая дает разрешение на доступ к этим данным и следит за доступом к этим данным. Теперь к данным одновременно может обращаться более чем одна задача, но, конечно, только одна задача может в конкретный момент времени скорректировать эти данные. Всякий раз, когда новый самолет появляется в поле зрения радара, динамически размещается и инициализируется новая задача с полученными координатами и скоростью.
Резервируется память для одновременного слежения за 512 самолетами (т.е. этой памяти достаточно для размещения одной задачи слежения для каждого самолета). Запрос на слежение более чем за 512 самолетами приводит к возбуждению исключения БТОКАОЕ ЕККОК. Это исключение обрабатывается внутри пакета РЬАХЕ ТКАСКЕК, а исключение ТОО МАХУ РЬАХЕЯ возбуждается и распространяется на пользователя. Запросы и изменения положения самолета направляются задаче, следящей за самолетом.
С интервалом приблизительно в одну секунду эта задача корректирует положение самолета, используя старые данные о его координатах, скорости и истекшем времени. Задача прекращает работу, если нет больше необходимости следить за самолетом. В случае попытки запроса или корректировки информации о несуществующем самолете или о самолете, слежение за которым не производится, возбуждается исключение ТАБК1ХО ЕККОК. Это исключение обрабатывается внутри пакета РЬАХЕ ТКАСКЕК, а исключение 1ЬЬЕОАЬ РЬАХЕ передается пользователю. Пользователь должен сам позаботиться о внешней идентификации каждого самолета.
Ссылочное значение, определяющее ту область памяти, где находится. задача, используется для внутренней идентификации самолета. Это значение не используется для внешней идентификации из-за следующей проблемы. Предположим, что больше нег необходимости следить за самолетом А, и, следовательно, освобождается область памяти, которую занимала ранее задача слежения. Освободившаяся область может быть распределена для новой задачи слежения за самолетом В. Тогда ссылки на самолет А, которые теперь незаконны становятся автоматически ссылками на самолет В, а проверить это невозможно. Во избежание этих проблем значения внешних имен или внешних идентификаций выбираются из большого множества значений, так чтобы значения повторялись только спустя длительное время.
Подобное решение позволяет обнаружить незаконные Ст к л ммы и здельиля комлиля ия ссылки. Соответствие между внешними и внутренними именами устанавливается пакетом АСТ1ЧЕ Р1.АХЕБ (который также задает внешние имена). Спецификация РЬАХЕ ТКАСКЕК воспринимается компилятором с языка Ада как библиотечный модуль, так что остальные части программы радарного наблюдения могут компилироваться без тела Р1.АХЕ ТКАСКЕК.
Спецификация Р1.АХЕ ТКАСКЕК имеет вид и!!!з САЬЕХОАК; рас)саяе Р1.АХЕ ТКАСКЕК !в !уре М11.ЕБ !в пем РЬОАТ; гуре Р1.АХЕ 1ХГО !в гесаб Х, У, к.: МП.ЕБ; ЧХ, ЧУ, ЧУ: М1ЬЕБ; -- для удобства скорость также имеет тип М1ЬЕБ; -- фактически она должна иметь тип М1ЬЕБ РЕК НО()К Т: САЬЕХ1)АК.Т1МЕ; епо' гесогд; !уре Р1.АХЕ 1О !в!!вя!!м! рг(га!е; ргосеоиге СКЕАТЕ РЬАХЕ(1: РЬАХЕ 1ХГО; 1Ен оо! РЬАХЕ 1Р)„' ргосеооге КЕМОЧЕ РЬАХЕ(1Ен !п оп! РЬАХЕ 1О); ргосе3пге Ь)РРАТЕ РЬАХЕ(1Пч РЬАХЕ 10; 1: РЬАХЕ 1ХГО); 1ппсг!оп КЕА)з Р1.АХЕИО: Р1.АХЕ ПЭ) ге!ига Р1.АХЕ 1ХГО; -- читать самое последнее положение самолета!О 1ЬЬЕОАЬ РЬАХЕ, ТОО МАХУ Р1.АХЕБ: ехсербоп; — исключение 1ЬЬЕОАЬ РЬАХЕ возбуждается, если осушествляется ссылк -- на несушествуюший самолет нли самолет вне поля видимости; -- исключение ~ТОО МАХУ РЬАХЕБ возбуждается, если -- осушествляется запрос на обработку 513-го самолета рига ге гуре Р1.АХЕ 11) !в пеи 1ХТЕОЕК; епо РЬАХЕ ТКАСКЕК; Тело РЬАХЕ ТКАСКЕК компилируется самостоятельно.
Различные следы тела используются для определения субмодулей, которые будут передаваться на компиляцию позже. Тело РЬАХЕ ТКАСКЕК описывается как и!1Ы)ХСНЕСКЕО !УЕАЬЬОСАТ1ОХ; — - освободить память, занятую уже завершенной -- или ненужной задачей гзг Глава 7 расйайе $ни)у РЬАХЕ ТКАСКЕК $в МАХ Р1.АХЕЯ: сопввапг: 512; — максимальное число самолетов в любой момент времени гав)г $уре ТКАСКЕК $в -- Каждый экземпляр следит за одним самолетом ел!ту 1Х1Т1АЬГУЕ(1: РЬАХЕ 1ХРО); епвгу Р1Е; епггу $)Р$)АТЕ(1: РЬАХЕ 1ХРО); ел!ту КЕАР(1: оп! РЬАХЕ 1ХРО); ев$ ТКАСКЕК; вуре РЬАХЕ $в асеева ТКАСКЕК; рас)гане АСТ1ЧЕ РЬАХЕЯ 1в -- следит за всеми активными самолетами и -- обеспечивает соответствие между внутренними и внешними именами, -- т.
е. между РЬАХЕ и РЬАХЕ,1$). -- Самолеты появляются и исчезают по одному. -- Взаимные исключения достигаются за счет использования задач. ргосеопге А$)0(Р: РЬАХЕ; 1$): оп! РЬАХЕ 1$)); -- К множеству активных самолетов побавляется новый -- самолет. Может быть обработано только МАХ Р1.АХЕЯ -- самолетов. Возврашает внешнее имя для самолета. -- Значения булут повторяться очень редко. ргосейпге РЕЬЕТЕ(1Ен РЬАХЕ 1$)) „ Гипс!)оп 1ХТЕКХАЬ ХАМЕ(10: РЬАХЕ 1$)) ге!ага РЬАХЕ; -- исключение 1ЬЬЕОАЬ РЬАХЕ возбуждается, если $$) -- не соответствует активному самолету епа АСТ1ЧЕ Р1.АХЕЯ; аве АСТ)ЧЕ Р1.АХЕЯ; Гог РЬАХЕ ЯТОКАОЕ Я1УЕ пве МАХ РЬАХЕЯвТКАСКЕК'ЯТОКАОЕ Я1УЕ; - — резервируется память для максимального числа самолетов; -- это резервирование памяти обсуждается в следующей главе.
гав)с $нн)у ТКАСКЕК $в верагаге; рас)гане $ии)у АСТ1ЧЕ Р1.АХЕЯ $в верагаве; ргосе)пге СКЕАТЕ РЬАХЕ(1: РГ.АХЕ 1ХРО; П): оо! РЬАХЕ 1Р) $в вериги!с; ргосеч)пге КЕМОЧЕ РЬАХЕ(1$): $п оп! РЬАХЕ П)) $в ворога!с; ргосеч)пге $)Р$)АТЕ РЬАХЕ(1Ек Р1.АХЕ 1$); 1: Р1.АХЕ ГХРО) 1в 233 Стр кт ра прог аммм и аадельиая компиляция Ьеа!п 1ХТЕКХАЬ ХАМЕ(11)) ЛЗР!)АТЕ(1); ехсербоп пЬеп ТАНК!ХО ЕККОК > га!ве 1ЬЬЕОАЬ РЬАМЕ; спи 13Р!)АТЕ Р1.АХЕ; !пас!!оп КЕАР РЬАХЕ(1Вч Р1.АХЕ 11)) ге!пгп РЬАХЕ 1ХРО гв 1: Р1.АХЕ 1МРО; Ьеа!п 1ХТЕКХАЬ МАМЕ(1!)).КЕА0(1); гегпгп 1; ехсербоп пЬеп ТАНК!ХО ЕККОК > га!ве 1ЬЬЕОАЬ Р1.АМЕ; епт) КЕА!) РЬАХЕ; епо РЬАХЕ ТКАСКЕК; Процедура инициализации слежения за самолетом СКЕАТЕ.