У вас вопросы?
У нас ответы:) SamZan.net

программистов так и со стороны разработчиков трансляторов поскольку на основе этого понятия должны строит

Работа добавлена на сайт samzan.net: 2016-03-13

Поможем написать учебную работу

Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 5.4.2025

ОТНОШЕНИЯ МЕЖДУ ТИПАМИ

Наиболее широко обсуждаемой неточностью авторского описания языка Паскаль после его публикации было упомянутое в одном из разделов “Сообщения” понятие идентичных типов данных. Что такое “идентичность” автор не пояснял, очевидно, подразумевая под этим некоторое интуитивно ясное понятие. Однако неформальная трактовка понятия вызвала нарекания как со стороны теоретиков-программистов, так и со стороны разработчиков трансляторов, поскольку на основе этого понятия должны строится взаимоотношения между типами.

При этом само понятие распалось на два: именную и структурную идентичность. В первом случае подразумевалось, что типы идентичны, если они имеют одинаковые имена, во втором – если совпадают “формулы” их определения. Например, при описании типов:

type

Time=1 ..100;

Volume=1 ..100:

var 

T : Time;

V : Volume;

Long : 1 ..100; {тип описан в определении переменной}

возникает вопрос о корректности выражения: Long := Long +V+T  в силу именнго несовпадения типов переменных.

С другой стороны нельзя однозначно ответить на вопрос, можно ли рассматривать типы W и Vec как структурно-идентичные при описании:

type

Index=1 ..100;

A=array[Index] of Integer;

B=array[Index] of Integer;

var 

W : A;

Vec : B;

или определить, какие типы (A и B, A, B и C или A,B,C и D) идентичны в соответствии с описанием:

type

A=record I : integer; J : real end;

B=record I : integer; J : real end;

C=record K : integer; L : real end;

D=record K: real; L : integer end;

В принципе, и математику, и разработчику транслятора, которому в соответствии с концепцией типов языка Паскаль необходимо обеспечить контроль их применения в тексте программы, такая задача не кажется тривиальной. Кроме того от “глубины” контроля типов существенно зависят потери времени выполнения.

Попытка “переписать” в более точной форме язык Паскаль была предпринята в работе А. Аддимана и др. “Draf Description of Pascal”, в которой (помимо других уточнений) определялись отношения между типами. Оставив в стороне этику такой попытки, можно отметить, что определение А. Аддимана было принято за основу при разработке систем программирования Borland Pascal и применительно к современным расширенным версиям языка сводится к следующему.

Между двумя типами возможны отношения трех видов: тождество (идентичность), совместимость и совместимость по присваиванию.

 

Тождественность типов

Тождественность типов требуется только для переменных фактических и формальных параметров при вызове процедур и функций.

Два типа T1 и T2, являются тождественными, если является истинным одно из следующих утверждений:

T1 и T2 представляют собой один и тот же идентификатор типа;

T1 описан как тождественный типу, который в свою очередь является тождественным T2 (условие транзитивности).

Описание типов:

type

T1=Integer;

T2=T1; {транзитивность относительно integer}

T3=Integer;

T4=T2;

. . .

означает, что T1, T2, T3, T4 и integer являются тождественными типами;

. . .

T5=set of Integer;

T6=set of Integer;

. . .

не определяет T5 и T6 как тождественные типы, поскольку set of integer не является именем типа.

Две переменные, описанные как:

var

V1, V2 : set of Integer;

. . .

имеют тождественный тип, поскольку их описания не разделены, а описания:

. . .

V3 : set of Integer;

V4 : set of Integer;

V5 : Integer;

V6 : Integer;

означают, что V5 и V6 имеют тождественный тип, поскольку Integer – это имя типа, а V3 и V4 – нет (set of Integer, как упоминалось выше, не является именем типа).

Совместимость типов 

Совместимость типов требуется в выражениях и операциях сравнения и является важной предпосылкой для совместимости по присваиванию.

Совместимость типов имеет место, если выполняется по крайней мере одно из следующих условий:

 

оба типа являются тождественными;

один тип является поддиапазоном другого;

оба типа являются отрезками одного и того же базового типа;

оба типа являются множественными типами с совместимыми базовыми типами;

один тип является строковым типом, а другой – строковым типом, упакованным строковым типом или типом PChar;

один тип – это тип pointer, а другой – любой ссылочный тип;

один тип является типом PChar, а другой – символьным массивом с нулевой базой вида array[0..X] of Char (действует только при разрешении директивой {$X+} расширенного синтаксиса);

оба типа являются указателями идентичных типов (действует только при разрешении указателя с проверкой типа директивой {$X+}; см. фирменную документацию);

оба типа являются процедурными с идентичными типами результатов, одинаковым числом параметров и соответствием между параметрами (см. раздел 8).

Совместимость по присваиванию 

Совместимость по присваиванию необходима, если имеет место присваивание значения, например, в операторе присваивания или при передаче значений параметров. Значение типа T1 является совместимым по присваиванию с типом T2 (т. е. допустим оператор T1:=T2), если выполняется одно из следующих условий:

T1 и T2 имеют тождественные типы, и ни один из них не является файловым типом или структурным типом, содержащим компоненту с файловым типом на одном из своих уровней;

T1 и T2 являются совместимыми перечисляемыми типами, и значения типа T2 попадают в диапазон возможных значений T1;

T1 и T2 являются вещественными типами, и значения типа T2 попадают в диапазон возможных значений T1;

T1 является вещественным типом, а T2 является целочисленным типом;

T1 и T2 являются строковыми типами;

T1 является строковым типом, а T2 является символьным типом (Char);

T1 является строковым типом, а T2 является упакованным строковым типом;

T1 и T2 являются совместимыми упакованными строковыми типами;

T1 и T2 являются совместимыми множественными типами, и все члены значения типа T2 попадают в диапазон возможных значений T1;

T1 и T2 являются совместимыми типами указателей;

T1 – это тип PChar, а T2 – это строковая константа (действует только при разрешении директивой {$X+} расширенного синтаксиса;

T1 является типом PChar, а T2 – символьным массивом с нулевой базой вида array[0..X] of Char (действует только при разрешении директивой {$X+} расширенного синтаксиса);

T1 и T2 являются совместимыми процедурными типами;

T1 представляет собой процедурный тип, а T2 – процедура или функция с идентичным типом результата, идентичным числом параметров и соответствием между типами параметров (см раздел 8);

объектный тип T2 совместим по присваиванию с объектным типом T1, если T2 является потомком T1 (см раздел 9);

тип указателя Р2, указывающий на объект типа Т2, совместим по присваиванию с типом указателя P1, указывающим на объект T1, если T2 является потомком T1 (см раздел 9);

На этапе компиляции и выполнения выдается сообщение об ошибке, если совместимость по присваиванию предписана в тексте программы, а ни одно из условий предыдущего списка не выполнено.

Тождество и совместимость в общем случае являются симметричными отношениями: если тип T1 идентичен (или совместим) с типом T2, то тип T2 идентичен (или совместим) с типом T1. Совместимость по присваиванию не симметрична и определяется в контексте выражения и описания типа. Тождественность и совместимости всегда могут быть проверены фазе трансляции, а вопрос о том, имеет ли место совместимость по присваиванию, может оставаться невыясненным вплоть до фазы выполнения программы. Например, в случае:

type

T=1 ..100;

var

X : Integer;

Y : T;

begin

. . .

X:=Y; { всегда может быть успешно выполнен}

Y:=X  {невыполним, если значением X будет, например 101}

end.

ПРИВЕДЕНИЕ И ПРЕОБРАЗОВАНИЕ ТИПОВ

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

var

с: char;

b: byte;

begin

 c:=' s ';

b := с;   // Для этой строки компилятор выдаст сообщение об ошибке

end.

В приведенном выше примере необходимо преобразовать переменную с к типу byte. Фактически, выполнение приведения типа явно указывает компилятору, что программист точно знает, что он делает, требуя преобразовать один тип данных в другой:

var

с: char;

b: byte;

begin

с := 's';

b := byte(с); // Теперь компилятор не обнаружит ошибки в этой строке end.

Кроме того. используя записи с вариантами, особое внимание следует обратить на тот факт, что в селекторе полей, относящихся к вариантной части метка варианта отсутствует. Это один из существенных недостатков, связанный с неоднозначностью синтаксической конструкции, который, к сожалению, присутствует в языке Паскаль. Так, например, в приведенной ниже программе нет синтаксических ошибок и результатом вывода будет символьное значение, соответствующее коду 140 в таблице ASCCI. Тем не менее, подменяя стандартную функцию chr (140), такая программа противоречит концепции типов языка и вообще здравому смыслу.

program BadStyle;

type

BadTyhe =record case Boolean of

true : (Int : Integer);

false : (Chr :Char)

end;

var

BType : BadTyhe;

begin

BType.Int :=140;

Write (BType.Chr)

end.

Отсутствие ошибок в программе обусловлено тем, что транслятор в случае записи с вариантами  “не знает”, какое значение имеет поле в контексте каждого оператора, и поэтому не будет включать в программу автоматическое преобразование типов. Просто содержимое соответствующей полю BType.Int ячейки памяти будет рассматриваться как поле BType.Chr в операторе Write.




1. Эффективность разведения овец мясошерстного направления
2. ПРАКТИКУМ Утверждено редакционноиздательским советом университета в качестве учебного пособия
3. ТЕМАТИКИ ПРИКЛАДНЫЕ РАЗДЕЛЫ МАТЕМАТИКИ Контрольная работа 2 по дисциплине и методи
4. фекальных и производственных сточных вод при соответствующей системе наружной канализации и при условии их
5. Пополнение знаний интеллектуальных систем на основе казуально-зависимых рассуждений
6. ДГП 19 ДЗМ Москва ул
7. Туризм І семестр 20132014 н.
8. Какие есть виды углов Сделайте рисунки
9. Задание1
10. ИВЦ Минфина 2006