Главная » Просмотр файлов » М. Бен-Ари - Языки программирования. Практический сравнительный анализ (2000)

М. Бен-Ари - Языки программирования. Практический сравнительный анализ (2000) (1160781), страница 37

Файл №1160781 М. Бен-Ари - Языки программирования. Практический сравнительный анализ (2000) (М. Бен-Ари - Языки программирования. Практический сравнительный анализ (2000)) 37 страницаМ. Бен-Ари - Языки программирования. Практический сравнительный анализ (2000) (1160781) страница 372019-09-19СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 37)

Объявление пакета

Пакет состоит из двух частей: спецификации и тела. Тело инкапсулирует вы­числительные ресурсы, а спецификация определяет интерфейс для этих ре­сурсов. Пакет из следующего примера предназначается для представления компонента системы управления воздушным движением, который хранит описание всех самолетов в контролируемом воздушном пространстве. Специ­фикация пакета объявляет тип и две подпрограммы интерфейса:

package Airplane_Package is

type Airplane_Data is

record

ID:String(1 ..80);

Speed: Integer range 0.. 1000;

Altitude: Integer range 0..100;

end record;

procedure New_Airplane(Data: in Airplane_Data; I: out Integer);

procedure Get_Airplane(l: in Integer; Data: out Airplane_Data);

end Airplane_Package;

Спецификация пакета содержит не тела, а только объявления процедур, заканчивающиеся точкой с запятой и вводимые зарезервированным словом is. Объявление служит только в качестве спецификации вычислительного ре­сурса, который предоставляет пакет.

В теле пакета должны быть обеспечены все ресурсы, которые были заявле­ны. В частности, для каждого объявления подпрограммы должно существо­вать тело подпрограммы с точно тем же самым объявлением:

package body Airplane_Package is

Airplanes: array(1..1000) of Airplane_Data;

Current_Airplanes: Integer range O..Airplanes'Last;

function Find_Empty_Entry return Integer is

begin

end Find_Empty_Entry;

procedure New_Airplane(Data: in Airplane_Data; I: out Integer) is

Index: Integer := Find_Empty_Entry;

begin

Airplanes(lndex) := Data;

I := Index;

end New_Airplane;

procedure Get_Airplane(l: in Integer; Data: out Airplane_Data) is

begin

Data := Airplanes(l);

end Get_Airplane;

end Airplane_Package;

Чего мы добились? Структура, применяемая для хранения данных о самоле­тах (здесь это массив фиксированного размера), инкапсулирована в тело па­кета. Правило языка Ada состоит в том, что изменение в теле пакета не требует изменений ни спецификации пакета, ни любого другого компонента про­граммы, использующего пакет. Более того, не нужно даже их перекомпилиро­вать. Например, если впоследствии вы должны заменить массив связанным списком, не нужно изменять никаких других компонентов системы при усло­вии, что интерфейс, описанный в спецификации пакета, не изменился:

package body Airplane_Package is

type Node;

type Ptr is access Node;

type Node is

record

Info: Airplane_Data;

Next: Ptr;

end record;

Head: Ptr; . -- Начало связанного списка

procedure New_Airplane(Data: in Airplane_Data; I: out Integer) is

begin

… -- Новая реализация

end New_Airplane;

procedure Get_Airplane(l: in Integer; Data: out Airplane_Data) is

begin

… -- Новая реализация

end Get_Airplane;

end Airplane_Package;

Инкапсуляция делается не только для удобства, но и для надежности. Пользо­вателям пакета не разрешен непосредственный доступ к данным или внутрен­ним подпрограммам (таким, как Find_Empty_Entry) тела пакета. Таким обра­зом, никакой другой программист из группы не может случайно (или предна­меренно) изменить структуру данных способом, который не был предусмот­рен. Ошибка в реализации пакета обязательно локализована внутри кода тела пакета и не является результатом некоторого кода, написанного членом груп­пы, не ответственным за пакет.

Спецификация и тело пакета — это разные модули, и их можно компили­ровать раздельно. Однако в терминах объявлений они рассматриваются как одна область действия, например, тип Airplain_Data известен внутри тела па­кета. Это означает, конечно, что спецификация должна компилироваться пе­ред телом. В отличие от языка С, здесь нет никакого понятия «файла», и объ­явления в языке Ada существуют только внутри такой единицы, как подпро­грамма или пакет. Несколько компилируемых модулей могут находиться в од­ном файле, хотя обычно удобнее хранить каждый модуль в отдельном файле.

Соглашение для написания программ на языке С, предложенное в преды­дущем разделе, пытается имитировать инкапсуляцию, которая предостав­ляется пакетами в языке Ada. Включаемые файлы, содержащие внешние объявления, соответствуют спецификациям пакета и с помощью записи static для всех глобальных переменных и подпрограмм в файле достигается эффект тела пакета. Конечно, это всего лишь «бюрократический» прием, и его легко обой-ти, но это хороший способ структурирования программ в языке С.

Использование пакета

Программа на языке Ada (или другой пакет) может получить доступ к вычис- лительным ресурсам пакета, задав контекст (context clause) перед первой стро­кой программы:

with Airplane_Package;

procedure Air_Traffic_Control is

A: Airplane_Package.Airplane_Data;

Index: Integer;

begin

while... loop

A :=...; -- Создать запись

Airplane_Package. New_Airplane(A, Index):

-- Сохранить в структуре данных

end loop;

end Air_Traffic_Control;

With-конструкция сообщает компилятору, что эта программа должна компи­лироваться в среде, которая включает все объявления пакета Airplain_Package. Синтаксис для именования компонентов пакета аналогичен синтаксису для выбора компонентов записи. Поскольку каждый пакет должен иметь уни­кальное имя, компоненты в разных пакетах могут иметь одинаковые имена, и никакого конфликта не возникнет. Это означает, что управление пространст­вом имен, т. е. набором имен, в программном проекте упрощено, и необходи­мо осуществлять контроль только на уровне имен пакетов. Сравните это с языком С, где идентификатор, который экспортируется из файла, видим во всех других файлах, потому недостаточно только обеспечить различие имен файлов.

With-конструкция добавляет составные имена к пространству имен ком­пиляции; также можно включить use-конструкцию, чтобы открыть про­странство имен и разрешить прямое именование компонентов, встречающих­ся в спецификации:

with Airplane_Package;

use Airplane_Package;

procedure Air_Traffic_Control is

A: Airplane_Data; -- Непосредственно видима

Index: Integer; begin

New_Airplane(A, Index): -- Непосредственно видима

end Air-Traffic-Control;

Одна трудность, связанная с use-конструкциями, состоит в том, что вы може­те столкнуться с неоднозначностью, если use-конструкции для двух пакетов открывают одно и то же имя или если существует локальное объявление с тем же самым именем, что и в пакете. Правила языка определяют, каким в случае неоднозначности должен быть ответ компилятора.

Важнее, однако, то, что модуль, в котором with- и use-конструкции связа­ны с множеством пакетов, может стать практически нечитаемым. Такое имя, как Put_Element, могло бы исходить почти из любого пакета, в то время как местоположение Airplane_Package.Put_Element вполне очевидно. Ситуация аналогична программе, написанной на языке С, в которой много включаемых файлов: у вас просто нет удобного способа отыскивать объявления, и единст­венное решение — использовать внешний программный инструмент или со­глашения о наименованиях.

Программистам, пишущим на языке Ada, следует использовать преимуще­ства самодокументирования модулей за счет with, a use-конструкции применять только в небольших сегментах программы, где все вполне очевид­но, а полная запись была бы чересчур утомительна. К счастью, можно поместить use-конструкции внутри локальной процедуры:

procedure Check_for_Collision is

use Airplane_Package;

A1: Airplane-Data;

begin

Get_Airplane(1, A1);

end Check_for_Collision;

В большинстве языков программирования импортирующий модуль автомати­чески получает все общие (public) ресурсы импортированного модуля. В неко­торых языках, подобных языку Modula, импортирующему модулю разрешает­ся точно определять, какие ресурсы ему требуются. Этот метод позволяет из­бежать перегрузки пространства имен, вызванной включающим характером use-конструкции в языке Ada.

Порядок компиляции

with-конструкции определяют естественный порядок компиляции: специфи­кация пакета должна компилироваться перед телом и перед любым модулем, ко­торый связан с ней через with. Однако упорядочение является частичным, т. е. порядок компиляции тела пакета и единиц, которые используют пакет, может быть любым. Вы можете исправить ошибку в теле пакета или в использующей его единице, перекомпилировав только то, что изменилось, но изменение спецификации пакета требует перекомпиляции как тела, так и всех использу­ющих его единиц. В очень большом проекте следует избегать изменений спе­цификации пакетов, потому что они могут вызвать лавину перекомпиляций: Р1 используется в Р2, который используется в РЗ, и т. д.

Тот факт, что компиляция одной единицы требует результатов компиля­ции других единиц, означает, что в языке Ada компилятор должен содержать библиотеку для хранения результатов компиляции. Библиотека может быть просто каталогом, содержащим порожденные файлы, или сложной базой данных. При использовании любого метода библиотечный администратор является центральным компонентом реализации языка Ada, а не просто не­обязательным программным инструментом. Библиотечный администратор языка Ada проводит в жизнь правило, согласно которому при изменении спе­цификации пакета необходимо перекомпилировать тело и использующие его единицы. Таким образом, компилятор языка Ada уже включает инструмент сборки программы (make) с перекомпиляцией измененных модулей, который в других средах программирования является необязательной утилитой, а не частью языковых средств.

13.4. Абстрактные типы данных в языке Ada

Airplane_Package — это абстрактный объект данных. Он является абстракт­ным, потому что пользователь пакета не знает, реализована ли база данных са­молетов как массив, список или как дерево. Доступ к базе данных осуществ­ляется только через объявленные в спецификации пакета интерфейсные процедуры, которые позволяют пользователю абстрактно создавать и отыски­вать значение типа Airplane_Data, не зная, в каком виде оно хранится.

Пакет является объектом данных, потому что он действительно содержит данные: массив и любые другие переменные, объявленные в теле пакета. Пра­вильно рассматривать Airplane_Package как особую* переменную: для нее должна быть выделена память и есть некоторые операции, которые могут из­менить ее значение. Это объект не первого класса", потому что он не имеет всех преимуществ обычных переменных: нельзя делать присваивание пакету или передавать пакет как параметр.

Предположим теперь, что мы нуждаемся в двух таких базах данных: одна для смоделированного пульта управления воздушным движением и одна для администратора сценария моделирования, который вводит и инициализирует новые самолеты. Можно было бы написать два пакета с незначительно отли­чающимися именами или написать родовой пакет и дважды его конкре­тизировать, но это очень ограниченные решения. Что мы действительно хоте­ли бы сделать, так это объявить столько таких объектов, сколько нам нужно, так же как мы объявляем целые числа. Другими словами, мы хотим иметь воз­можность конструировать абстрактный тип данных (Abstract Data Type — ADT), который является точно таким же, как и абстрактный объект данных, за исключением того что он не содержит никаких «переменных». Вместо это­го, подобно другим типам, ADT определяет набор значений и набор операций на этих значениях, а фактическое объявление переменных этого типа может быть сделано в других компонентах программы.

ADT в языке Ada — это пакет, который содержит только объявления кон­стант, типов и подпрограмм. Спецификация пакета включает объявление типа так, что другие единицы могут объявлять один или несколько объектов типа Airplains (самолеты):

package Airplane_Package is

type Airplane_Data is ... end record;

type Airplanes is

record

Database: array( 1.. 1000) of Airplane_Data;

Current_Airplanes: Integer O..Database'Last;

end record;

procedure New_Airplane(

A: in out Airplanes; Data: in Airplane_Data: I: out Integer);

procedure Get_Airplane(

A: in out Airplanes; I: in Integer; Data: out Airplane_Data);

end Airplane_Package;

Тело пакета такое же, как и раньше, за исключением того что в нем нет ника­ких глобальных переменных:

package body Airplane_Package is

function Find_Empty_Entry... ;

procedure New_Airplane...;

procedure Get_Airplane...;

end Airplane_Package;

Программа, которая использует пакет, может теперь объявить одну или не­сколько переменных типа, поставляемого пакетом. Фактически тип является обычным типом и может использоваться в последующих определениях типов и как тип параметра:

with Airplane_Package;

procedure Air_Traffic_Control is

Airplane: Airplane_Package.Airplanes;

-- Переменная ADT

Характеристики

Тип файла
Документ
Размер
2,54 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6363
Авторов
на СтудИзбе
310
Средний доход
с одного платного файла
Обучение Подробнее