Будь умным!


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

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

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


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

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

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

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. Theme nd the rheme Theme rheme trnsition
3. Корыстно-насильственная преступность в вооруженных силах.html
4. Work s contrct crpenter or freelnce photogrpher for exmple cn estblish sole proprietorship
5. Введение Общая характеристика страховой компании Документальное и программное обеспечение страхов
6. РЕФЕРАТ дисертації на здобуття наукового ступеня кандидата економічних наук Київ
7. реферату- Організація життєзабезпечення населення в надзвичайних ситуаціяхРозділ- БЖД Організація життєз
8. Сага о Гуннлауге Змеином Языке
9. Значення творчості Т Г Шевченка
10. Гражданское производство по делам с участием иностранных лиц
11. Общие понятие кражи.html
12. выраженное в акте компетентного государственного органа решение освободить лицо совершившее уголовно нак
13. КОНТРОЛЬНАЯ РАБОТА Вариант 1 Приведён фрагмент журнала технического нивелирования
14. экология с греческого переводится как наука- Е
15. Петербург 2003 г. Составитель Л
16. Тема- Принципы трудового права Вопросы- Понятие принципов трудового права Общая характеристика осн
17. Феномен антинауки как альтернатива модерну Дж Холтон
18. Объектно-ориентированное программирование в языке Java
19.  Походження і функції банків 2
20.  протонаучный или преднаучный представлен традициями древнего востока Шумерия Вавилон Египет ~ 4000 до н