Т. Пратт, М. Зелковиц - Языки программирования - разработка и реализация (4-е издание_ 2002) (1160801), страница 160
Текст из файла (страница 160)
нвеп овпегв .> последовательность операторов: где каждая последовательность операторов может обрабатывать одну или несколько именованных исключений. Обработчик оФегв других, не перечисленных ранее исключений, не обязателен. Однако если он присутствует, он обрабатывает все исключения, не перечисленные в предыдущих обработчиках. Исключение генерируется либо неявно элементарной опер щией, либо явно посредством выполнения оператора: гатве иия исключения Когда сгенерировано исключение, управление передается обработчику исключений текущей выполняемой программной единицы, если, конечно, зта програлтмная единица имеет соответствующий этому исключению обработчик, Если обработчика нет, тогда исключение передается по цепочке вызовов подпрограмм первой из них, в которой имеется соответствующий обработчик, или, в конце концов, если нет программно-определенного обработчика, исключение передается на обработку системно-определенному обработчику.
Исключения ие передаются из задач. Как только исключение обработано обработчиком, подпрограмма (или другая программная единица) нормально завершает свое выполнение и возвращает управление обратно в вызвавшую ее подпрограмму. Таким образом, обработчик исключений в языке Ат)а заверптаеют выполнение тела подпрограммы, которое было прервано, когда возникло исключение. Здесь не предусмотрено возобновление выполнения программной единицы, в которой возникло исключение. Обработчик может частично обработать исключение, а затем передать это же исключение назад по динамической цепочке, выполнив оператор гатзе без имени исключения. Задачи.
Задача — это подпрограмма, которая может выполняться параллельно с другими задачами. Более подробно задачи были рассмотрены в разделе 11.2. 578 Приложение. Обзоры языков Встроенные приложения. Поскольку язык Ада разрабатывался для запуска встроенных приложений, в нем часто требуется специальный доступ к аппаратной части, на которой выполняются эти приложения. Ниже описаны некоторые из таких возможностей.
Задание адреса. С помощью следующего оператора при выполнении программы может быть определен конкретный адрес памяти, по которому следует поместить объект данных, подпрограмму или задачу; тог кня обьектв ызе вт адрес памяти где адрес памяти задается как значение некоторого выражения. Листинг П.2. Структура задач в языке Аба твзк вня задачи зз - обьявлення точек входа епгд твзв Ьобу ння задачи з — последовательность обьявленнй Ьещ п - последовательность операторов ехсармоп — обработчики ксклоченнй епщ Прерывания.
В случае встроенных систем часто бывает важно, чтобы программа могла обрабатывать прерывания, генерируемые аппаратной частью пли внешними устройствами. С помощью следующей структуры можно связать прерывание с точкой входа задачи: Гог точка входа озе ат адрес прерывания Когда происходит прерывание, оно действует как вызов точки входа с наивысшим приоритетом для задачи с заданной точкой входа. Таким образом, задача, ответственная за обработку прерывания, может ответить немедленно, если она находится в состоянии ожидания при выполнении соответствующщ о оператора зссерЬ для втой точки входа. Стандартные функции В язык Ада включено множество стандартных пакетов, которые определяют обычные функции.
Ниже перечислены некоторые из них: две. Етппдв.ехес Функции строк фиксированной длины Аса.я!ппдв.воцпгзегз Функции строк переменной длины доа.8тппдв.0пЬоцпгвеп Функции строк неограниченной длины АсеЛ4иптепсв.бепепс Еептептвгу Гцпст!опв Тригонометрические функции Пакеты Пакеты языка Ада обеспечивают возможность инкапсуляции. Однако в язык Ада 95 добавлены дополнительные возлюжности для объектно-ориентированного наследования. Определение пакета состоит из двух частей: спецификации (состояззтей из видимой части и закрытой части) п тела. Спецификация содержит инфорлтапию, необходимую для правильного использования пакета, тело содержит как инкапсу- П.
т, Ааа 579 лированные локальные переменные и определения подпрограмм, так и тела подпрограмм, вызываемых извне пакета. В некоторых случаях пакет не нуждается в теле. Станлартпая форлта определения пакета привелена в листинге П.З. Листинг П.З. Спецификация пакета Ат1а расдаве иня ланета тв — обвявления видимых обвегпов данных ргтчаге - полное определение закрытых обвектов данных епщ расиаве Ьабу иня пакета 1в - определения обвектов данных и подпрограмм - обвявленных выше в части спецификации пакета Ьещп - операторы инициализации пакета - при первом создании его зкземпляра ехсергтоп — обработчики исключений епб: Вилпмая часть спецификации пакета (все, что прелшествуег ключевому слову ргт часе) опрелеляет, какие объекты данных внешний пользователь пакета может использовать в программе.
Если опрелеления типов даны в вилимой части, пользователь может объявлять переменные этого типа; если там определены переменные или константы, на них можно ссылаться и т. д. Если в пакете определяется абстрактный тип данных, гюльзователь может объявлять переменные, принадлежащие к этому абстрактному типу, но подробное описание типа не должно быть вилимым. В этом случае определение типа в вилимой части имеет вип туре иия типа тв ргтчате: а полное определение задается в закрытой части спецификации (например, строки 6-12 в листинге П.1), Казалось бы, логично поместить закрытые компоненты паке~а в его тело, а нс в спецификацию, чтобы спрятать такие имена от других пакетов. Олнако по соображениям, связанным с реализацией, это делается не так.
Более подробно этот момент обсуждается в разлеле 7.1, Ограниченные закрытые типы. Обычно желательно, чтобы элементарные операции присваивания и проверки на равенство и неравенство были автоматически доступны даже для обьектов закрытых типов, так что операция А = В была бы опрелелена для объектов А и В закрытого типа.
В языке Ат)а это елинствепные операции, которые прелусмотрены лля закрытых типов без явного определения программистом. Олнако во многих случаях лаже эги операции не должны быть заранее опрелелены для закрытого типа. Если программист описывает тип как Пппгеб ршуаье (ограниченный закрытый тип), то никакие операции вообще не будут заранес определены для этого типа. Общие пакеты. Спецификация общего пакета имеет параметры, задающие типы конкретных элементов пакета, размер конкретных массивов пакета и т, д, Например, общий пакет, который опрелеляет абстрактный тип зтаск, может иметь параметр, залаюший тип компонента, сохраняемого в стеке.
В общем случае это выглядит следующим образом: 880 Приложение. Обзоры языков расааде иия фактического пакета тя паи ммя общего пакета(параметры); Создание экзелтпляра пакета — это операция, выполтиемая компилятором. Во время компиляции в операторе, который создает экземпляр пакета, каждая ссылка на имя формального параметра в пакете заменяется фактическим параметром.
Получившийся пакет может быть скомпилирован так же, как и обычный пакет. Общий пакет и созданный его экземпляр не влияют на структуру времени выполнения, только результирующий пакет (после создания экземпляра) действительно компилируется в объекты данных времени выполнения и в выполняемый код. Однако, поскольку создание экземпляров обтцнх пакетов в языке Ат)а — достаточно часто встречающаяся операция, особенно в тех программах, в которых используются библиотечные пакеты, большинство компиляторов Ада различными способами оптимизируют эту операцию. Часто это осуществляется путем частичной предварительной компиляции общего пакета, когда не компилированными остаются лишь те части, которые напрямую зависят от параметров общего пакета и которые только и будут компилироваться при каждом создании экземпляра пакета.
Наследование Язык Ат)а 95 расширил концепцию пакета, включив возможность наследования. Ранее нужно было с помощью конструкции нтфй включать явные пакеты или ис- пользоватьь производные типы. В язык Ада 95 добавлено понятие расширение тика, которое осуществляется с помощью нового, названного поиеченныи (саййет)), типа. Например, если бы тип Муг1аса из листинга П,1 был бы описан как туре Иуоага тя Гаддеа гесоге тат: щуаггау: 52: тптедег:- 0: епо гесого: то можно было бы определить новый объект 0ооЫезбас1: туре Оооыеяхаск тя пои мурата итти гесогб Компаса, щуаггау, епе георга: Этот объект 0ооЫезласи имел бы унаследованные от типа Иубаса компоненты ча1 и зд Использование помеченных типов в языке Ада 95 позволяет создавать новые пакеты без необходимости повторной компиляции определений существу- ющих пакетов.
Каждый помеченный тип содержит атрибут с1 а за (например, с1а за в Иуоата ' с1а за или 0оцЫеэСас1'с1аэз, который может быть использован для динамического свя- зывания). Обьект 0оиЫ езтаса является членом того же класса, что и Иуоаса, посколь- ку произведен из него. Помеченные объекты также можно объявлять как абстрактные (абзсгасс).
На- пример, туре Иуеага тя абятгаст таддеп кттб по11 гесогб задает имя объекта, обозначение его класса, но не определяет способ представле- ния этого объекта в памяти. Определение объекта Мут1ала может быть заполнено с помощью расширения типа. Таким образом, создается шаблон для типа, а для использования объекта должны быть определены помеченные типы. Вызов элементарной операции с фактическим параметром помеченного типа приводит к связыванию во время выполнения с фактической подпрограммой, которая должна быть вызвана. Это обеспечивает наличие в А()а 95 существенных свойств динамической объектио-ориентированной модели выполнения, что и отличает А()а 95 от А()а 83.
Пример с пояснениями В листинге ПА приведен пример программы иа языке С, производящей суммирование элементов массива. В данном примере для входных данных 41234 0 программа напечатает: ! 234: 5ОН=!0 Листинг П.4. Пример программы суммирования элементов массива на языке С 1 Ояпс1цое <ягеяа.ь> 2 сопя[ япг вахюге=9. 3 ва(п() 4 [(пг а[ваха(ге): 5 япг ),Х; нт )е( (г=сапчегг(Оегсцаг())) '- О) [ у гог (3-0: 3<Ос 3+<) а[33 - санчес((9егспаг()): 8 Гог Ц-0: 3<к; 3<+) рг(пг[("та ".