Т. Пратт, М. Зелковиц - Языки программирования - разработка и реализация (4-е издание_ 2002) (1160801), страница 159
Текст из файла (страница 159)
Синтаксис определения подтипа следующий: зоотуре иня подтипа >з иня базового типа ограничение; как, например, в зобсуре вгарь5са1е >з >птерег гвпйе -20..20: щЬЬуре Ехесозтуе >з Еир1оуеейес15а1агтеб); Подтип не определяет новый юш, он просто определяет подмножество объектов ггат> ых, принадлежащих базовому типу. В частш>сти, для объектов тк>дтнпа можно использовать те же операции, которые использу>отса для объектов базового типа, а объекты разных подтипов одного об>цсго базового типа можно сме>вивать в качестве операндов одного выражения.
Производные типы. Производный тип похож па подтпп, но оп является новым типом, отличшям от базового, Синтаксис определения производного типа следу>ощи »': Гуре иня производного типа >з пвч иня базового типа; где базовый тип можно определить с ограничениями (и, таким образом, в дейс~ вительностн это будет полтин). Например, лпикяо записать: туре Иетегз >з пен тптерег> Гуре Е!Ьегз >з пен >птевег> Производный тип позволяет использовать все те же операции, что и базовый тип (или подтип).
Однако, поскольку производный тип отличается от базового, операции не могут применяться к смеси операндов базового и производного типов. Например (возвра>цаясь к приведенным ранее опрсделсниям производных типов), поскольку операция ч- определена для базового типа > пге0ег, следовательно, опа определена и для производных тицоп г)егегз и Е > Еегз. ПД, Аца 573 Однако если х, у и Š— переменные типа )пСедег, Месегз и !.1сегз соответственно, то ни одну пару, составленную из этих переменных, нельзя между собой складывать (то есть запись х + ~ некорректна).
Таким образом, используя производные типы, программист защищается от случайного сложения двух переменных, представляющих различные виды данных, хотя основное представление данных может быть одинаковым (в данном примере все переменные представлены целыми числами). Иерархия подтипов Ада Все типы элементарные скалярные дискретные перечисления символьные булевы другие перечисления целые числа целые со знаком целые без знака вещественные с плавающей точкой с фиксированной точкой обычные десятичные ссылки ссылки на объекты ссылки на подпрограммы составные массив строка другие массивы недискриминантные записи дискриминантные записи задачи защищенные Числовые типы и неограниченные типы в зту иерархию не входят.
П.1.2. Управление последовательностью действий Выполнение программ на языке Ас)а является операторно-ориентированным, и в агом язык Аг)а похож на РОСТКА)д и Разов!. Выражения Для обычных бинарных арифметических и логических операций и операций отношения используется инфиксная запись. Префиксная запись используется для унарных операций (~, - и пот), а для вызовов функций используется обычное мате- 574 Приложение.
Обзоры языков матическое префиксное представление инд функции(список аргуиентов). При отсутствии скобок приоритеты распределены в следующей последовательности (сначала перечислены операции с наивысшим приоритетом): ** (возведение в степень) * l вод ген аЬз пот (унарный+ и - ) Ь (бинарный+ и — ) у= «= »= тп пос тп апб ог хог апа Епеп ог е1зе Операции с одинаковым приоритетом ассоциативны слева направо. Обратите внимание нато, что в языке Ас)а присутствуют булевы операции, вычисляемые по укороченной схеме, апб Ецеп и ог е1 зе, которые вычисляют тттлько свой первый операнд, если его значения достаточно лля вычисления значения всего выражения. Операции тп и под тп используются для проверки, принадлежит ли значение конкретному диапазону или удовлетворяет ли конкретным ограничениям. е1ье — последовательность операторов епб т Гт в которой любая из частей е1 616 или е1де может быть опутцена.
Оператор сазе. Общая форма оператора сазе имеет следующий вил: саве внраиение тв иьеп варивнт ) иьеп вариант ) ( вариант => последовательность операторов ( вариант -> последовательность операторов иден отдегв > последовательность операторов; епб саве: Операторы Операторные структуры, управляющие последовательностью действий, включа- ют в себя обычные условные операторы (т Е и саяе) и операторы цикла (1оор).
Пре- дусмотрено три формы оператора цикла, а оператор ех1т позволяет осуществить прямой выход из цикла. Также предоставляется ограниченная форма оператора доЕо. Все основные управляющие операторы заканчиваются ключевым словом епб, за которым следуст ключсвос слово, определяющее оператор (например, епб 1(, епб 1оор), так что для объслн пения опсраторов в одну программную единицу реп- ко требуется специальная нара 0ед п-епб. Присваивание. Оператор присваивания языка Ас)а похож на оператор присва- ивания языка Рааса). Также возможно присваивание полного набора значений пе- ременной типа запись, если использовать один из следующих способов: Мурду := ("0ЕС",30.19641, му0ау :- (теаг -> 1964 моптм => 'беГ .
0ау => 301. Оператор т б. Оператор 11 имеет общую форму: т 1 булево внраиение гаеп — последовательность операторов е1вт 1 булево вирвиение Слеп — последоватетъность оператооов е1втт булево вырвиение Слеп П.1. Ас1а 575 Каждый вариант является либо одиночным значениелп либо диапазоном значений, которые может принимать выражение, записанное в заголовке оператора.
Таким образом, вариант — это литеральное значение или подмножество целых чисел (или значения другого перечисляемого типа), например: саве згабесече1 т'в ыьеп >гель => операторы: ыьеп 5орь ! Лыпто -> операторы; ньен 5ептог - операторы: епб саве: Лолжно выполняться следующее требование: либо варианты выбора охватывают весь диапазон возможных значений выражения, либо имеется завершающая конструкция ыпеп ас1тегз для явного описания действий для всех пе указанных значений выражения.
Таким образом, в процессе выполнения программы исключается возможность возникновения ошибки, которая появляется, если для вычисленного значения выражения в операторе сазе не определено никаких лействий. Если же для некоторых значений выражения пе должно производиться никаких действий, соответствующая часть оператора сазе может содержать ключевое слово пы11. Оператор цикла. Основной итерапионный оператор имеет форму 1оор — поспедоватепвноств операторов епб тоор Поскольку в заголовке оператора цикла не указаны условия его окончания, данная форма цикла будет выполняться бесконечно, пока он не будет прерван либо явным оператором ех 1, 0осо или гегыгп, либо по причине возникновения исключительной ситуации. Контролируемый итерационный процесс может быть организован с помощью форм оператора цикла ыпт1е или 1ог.
Оператор чят11е имеет синтаксис ыы1е бупево выраиение а оператор бог бывает двух видов: тог иня переиенной тп дискретный диапазон тог иня перененной тп гечегзе дискретный диапазон где дискретный диапазон может быть некоторым диапазоном перечисляемого или целого типов (например, 1..10, или г ге511 .. 0ыптог), Ключевое слово гечегзе означает, что итерация начинается с конечного значения диапазона, присвоенного данной переменной, и продолжает работать, пока не достигнет начального значения. Примеры циклов Гог приведены в листинге П.1. Важной особенностью цикла бог является то, что имя переменной, записанное в заголовке цикла, не объявляется как обычная локальная переменная (как в языке Разов!).
Вместо етого она неявно об ьявляется в момент ее появления в операторе бог и ее люжно использовать только внутри зтого цикла Как только цикл заканчиваетт свою работу, такан переменная исчезает, и ее больше нельзя использовать. Зта структура позволяет компилятору языка Лс1а осутцествить несколько важных оптимизаций цикла. Оператор ехт1. Оператор ехт1 имеет следующий внд: емто ыьеп бупево выраиение; 576 Приложение, Обзоры языков или просто ех1(. При выполнении указанного в операторе ех10 булева условия управление передается в конец самого внутреннего цикла, включающего этот оператор. Альтернативная возможность заключается в использовании меток для операторов циклов, в этом случае оператор ех1с Лолжен содержать метку цикла, из которого следует выйти, например: ею( Опсегспор ньен А(1.3) - 0: Оператор доге.
В языке А((а имеется оператор доге, но его использование строго ограничено. Вообще, оператор досо может перелать управление только лругому оператору внутри той же подпрограммы либо тому же или внешнему уровню вложенных операторов, Ввод-вывол. В языке Аг(а не предусмотрены встроенные возможности вволавывола. Эти действия управляются перегруженными функциями из стандартных пакетов. Например, пакет Тех( 10 содержит определения простых функций вволавывола текстовых значений, необходимых для написания простых программ на языке Аг(а. Функция дес(агд) считывает числовой или строковый аргумент со стандартного устройства ввода (клавиатуры).
Функция рог(агд) записывает в стандартный вы вол. Функция рцг(агд. Ю записывает значение параметра агд в поле длиной Тн символов. Функция лен ! 1пе записывает символ конца строки. Преобразование между строковыми и числовыми ланными также можно осуществить с помощью функций дег и рцс. Функция де((1п Зсщод, Оцс лцп)Ьег. оцт 1азГ) присваивает переменной лцяЬег числовое значение первых 1..1азт символов строки эгщлд. Аналогично,функция рог(оць зьг1лд. 1и лип)ьег) присваивает строке зсг(лд значение переменной лцяЬег. Функции дег и рог можно также использовать для файлов данных. Файлы определяются как11ппсес рг1нзсе в компоненте рг!часе пакета, объявленного какопределениереализации. Функциюорел(1п оцс Г|!е Туре, 1п Г(1е Мо()е, 1л Г(1е Маее) можно использовать для открытия файла Г11е агаве в одном из режимов (1л Г!1е, Оцс Г)1е.
Аррелс Г11е),определяемом вторым параметром,афункциюс1озе(1п оис Г11е 1уре) — для закрытия файла. Указания компилятору. Оператор ргарпа используется лля перелачи информации компилятору. Этот оператор не рассматривается как часть языка. То есть если из правильной программы упш|ить все такие указания, программа должна по-прежнему компилироваться и иметь ту же семантику, что и раньше. Олнако эти указания сообщают транслятору значимую информацию о том, как выполнять компиляцию для конкретного приложения. Обычно полобное указание записывается следующим образом: ргадна ннн прагны (паранетрн) где ннп прагны либо предопределено в языке, либо определено реализацией.
Некоторые указания управляют функциями компилятора, такими как генерирование листинга программы (ргадоа С15Т). Однако большинство указаний прелназначено для управления структурами времени выполнения конкретных подпрограмм, Например, ргадва !МЕ!МЕ(слнсок лодпрогранн) определяет, что вызовы перечисленных подпрограмм везде, тле возможно, лолжны быть заменены встроенными последовательностями колов. Прагма ргадяа ОРТ1М!7Е(Т!МЕ ог 5РАСЕ) определяет, что пол- П. Ц Ас~а 577 программа, в которой присутствует зто указание, должна быть скомпилирована таким образом, чтобы минимизировать время ее выполнения (ПМЕ) или необходимую для ее выполнения палтять (5РАСЕ).
Исключительные ситуации. В конце каждой программной единицы (подпрограммы, блока, задачи или пакета) можно определить набор обработчиков исключительньтх ситуаций. Эти обработчики могут использоваться для обработки исключений, возникаютцих как внутри этой программной единицы, так и переданных из других подпрограмм, не имеюнвих своего обработчика ошибок.
Каждое исключение имеет свое имя. Существует небольшое число предопределенных исключений, таких как СОИ51РА! йТ ЕййОк (возникает, когда индекс выходит за обьявленный диапазон, когда при присваивании нарушается ограничение на диапазон значений и т. д.). Все остальные исключения объявляются следующим образом: иия исключения: ехсервиоп Обработчик исключений начинается с имен исключительных ситуаций, которые он обрабатывает, далее следует последовательность операторов, которые выполняют действия, необходимые для обработки исключения. Общий синтаксис обработчиков исключений следующий: ехсерттоп нпеп иня исключения ! . , ( иня исключения "> последовательность операторов.