Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
43
Добавлен:
23.03.2015
Размер:
860.67 Кб
Скачать

6. Понятие о типе данных в языках программирования (яп).

Понятие о типе данных.

Тип данных понимается как класс переменных, которые могут заменять друг друга в некоторых контекстах.

Понятие типовой безопасности: Цель контроля типов состоит в том, чтобы гарантировать, что фактическое использование объектов, как данных совместимо с установленным для них поведением, ассоциированных с типом их объекта.

Контроль типов должен обеспечит надежность программ.

Тип данных определяется по существу двумя свойствами:

  • поведением объекта, рассматриваемого типа;

  • структурным описанием,  определяет представление объектов этого типа;

  • (не обязательно) множество объектов рассматриваемого типа;

Под типом объекта понимается:

  • само множество объектов;

  • существенные свойства, т.е. представление объектов этого множества;

  • набор операций обеспечивающий доступ к объектам и позволяющий использовать их свойства;

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

  • напоминает, что представление типов данных (в период компиляции) извлеченное из спецификации этого типа имеет решающее значение для эффективности (в период компиляции) контроля типов;

  • дает удобную основу для классификации механизмов типов данных в Я.В.У.

Тип данных ::=<множество допустимых значений, набор операций, внутреннее представление>

Встроенные типы данных определяют следующие основные операции:

  • описание переменных;

  • взятие значений и присваивание;

  • сравнение значений;

  • обозначение констант;

  • выбор компонент (для структурированных типов).

Классификация средств определения данных в Я.В.У.

1) Средства структурирования данных (Алгол-60, Фортран);

Типичный набор типов данных включает:

  • cкалярные типы (integer, real, boolean, char, …)

  • структурные (array, record, union, pointer)

В представлении структ. Объектов очевиден их недостаток – поведение неочевидно.

2) Средства определения нового типа (Паскаль, Алгол-68);

Type имя типа = <описание типа>

Преимущества:

- удобное сокращение.

- можно связывать разные типы с одним и тем же представлением.

Недостатки:

- поведение не очевидно

3) Абстрактные типы данных (АТД).

АТД – это, по существу, определение нового понятия в виде класса (одного или более) объектов с некоторыми свойствами и операциями.

(CLU, Modula, Ada)

Эта идея родилась у Morris, B. Liskov.

Выбираем представление объекта и на нем реализуем поведение. Скрываем представление после выполнения реализации выполнения. АТД предусматривает инкапсуляцию – защита представления от несанкционированного доступа.

4) Средства ООП.

ООП – это методология программирования, которая основана на представлении программы в виде совокупности объектов, каждый из которых является реализацией некоторого класса, а классы образуют иерархию на принципах наследуемости.

Элементы ООП:

  • объекты;

  • каждый объект является реализацией некоторого класса;

  • классы организованы иерархически;

Поколения языков программирования.

Первое поколение ЯП: массивы, записи – не имели средств определения новых типов данных (Алгол-60, Фортран);

Второе поколение ЯП: появились средства определения новых типов данных, но не было средств связанных абстрактных типов (Алгол-68, Пасколь);

Третье поколение ЯП: связано с появлением АТД (Симула-67, Concurrent Pascal, CLU, Hephard, Modula);

Четвертое поколение ЯП: появились ООП языки (С++, Object Pascal).

3. ПОНЯТИЕ О ТИПЕ ДАННЫХ. КЛАССИФИКАЦИЯ СРЕДСТВ ОПРЕДЕЛЕНИЯ ДАННЫХ

Вопрос о типовой безопасности тесно связан с понятием типа данных, точный смысл которого, как оказалось, довольно трудно уловить. На самом деле врзможны и полезны разные подходы, зависящие от выбранной точки зрения. Математик может рассматривать данные как отображение множества имен во множество значений и считать тип данных множеством значений. Проектировщик аппаратуры вычислительной машины может рассматривать тип данных главным образом с точки зрения эффективности его аппаратного представления.

Исследователь в области языков высокого уровня (ЯВУ) может попытаться унифицировать некоторое множество точек зрения с помощью единого понятия "тип данных". Например, тип данных можно рассматривать как класс переменных, представители которого могут заменять друг друга в некоторых контекстах.

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

1) поведением объектов рассматриваемого типа и

2) структурным описанием, которое определяет представление объектов этого типа.

Иногда в качестве третьей существенной характеристики типа данных включается

3) множество объектов этого типа.

Эта характеристика особенно существенна в таких приложениях как базы данных, где время существования объекта представляет непосредственный интерес.

В связи с этим можно предложить такое определение:

"Под типом данных понимается само множество объектов, существенные свойства (т.е. представление) объектов этого множества и набор операций, обеспечивающих доступ к объектам и позволяющих использовать их свойства." Почему это понятие такое неточное?

Проблема состоит в том, что "тип данных" - это в основном атрибут, а трибуты

в значительно меньшей степени поддаются изучению, чем объекты, которые ими

обладают. Более точными понятиями, например, являются

процедура - ее можно выполнить;

переменная - имеет время существования.

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

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

1) напоминает, что представление типа данных (в период компиляции), извлеченное из спецификации этого типа, имеет решающее значение для эффективности (в период компиляции) контроля типов;

2) дает удобную основу для классификации механизмов типов данных в ЯВУ.

3.1. КЛАССИФИКАЦИЯ СРЕДСТВ ОПРЕДЕЛЕНИЯ ДАННЫХ

Несмотря на широкое разнообразие средств определения данных, дрступных в ЯВУ, основные механизмы, обеспечивающие эти средства, можно разбить на три общие категории:

1) средства структурирования данных (ФОРТРАН, АЛГОЛ 60, КОБОЛ, ПЛ/I).

Каждый из этих языков содержит множество встроенных типов и обеспечивает средства структурирования составных объектов. Типичный набор встроенных типов включает:

integer (целый);

real (вещественный);

character (символьный);

boolean (логический).

Средства структурирования:

array (массив);

record (запись);

union (объединение);

pointer (указатель).

В языке, обеспечивающем такое структурирование данных, понятие типа данных и типовой безопасности проявляют тенденцию к относительной расплывчатости. Хотя представление структурированных объектов очевидно, поведение - нет.

Ключевой вопрос - когда два объекта имеют олин и тот же тип - может оказаться весьма сложным, особенно при наличии в языке записей. Например, в языке ПЛ/I используется сложная система правил совместимости структур, а в КОБОЛе единственным требованиеми при передаче параметра является необходимость того, чтобы фактический и формальный параметры занимали область памяти одной и той же длины.

2) Средства определения типа (АЛГОЛ 68, ПАСКАЛЬ).

Эти ЯВУ позволяют пользователю ассоциировать с обращением к операции структурирования данных некоторое имя. В этом случае средства структурирования могут рассматриваться как генераторы типов, которые будучи снабжены типами в качестве параметров, дают новые типы данных. Имя, присваиваемое такому типу программистом, можно использовать с целью контроля, т.к. имя может фигурировать (вместо операции структурирования) в описаниях переменных или параметров.

Это дает два преимущества:

удобное сокращение;

можно создавать различные типы с одним и тем же представлением

(для контроля совместимости).

3) Средства создания абстрактных типов данных (А. Т. Д.).

А.Т.Д. - это, по существу, определение некоторого понятия в виде класса (одного или более) объектов с некоторыми свойствами и операциями.

По этому признаку все языки программирования (ЯП) можно разбить на следующие

поколения:

I-ое поколение: АЛГОЛ 60, ФОРТРАH.

Имели простейшие средства структурирования (массивы).

II-ое поколение: ПАСКАЛЬ, АЛГОЛ 68, ПЛ/I.

Имеют более мощные средства структурирования данных, появились средства

определения новых типов данных, но еще не имели средств А.Т.Д.

III-е поколение: СИМУЛА 67 (прародитель всех этих языков), CLU, ALPHARD,

МОДУЛА, АДА.

Имеют средства А.Т.Д.

3.1.1. ВСТРОЕННЫЕ ТИПЫ ДАННЫХ

Тип определяется тройкой < множество допустимых значений, перечень допустимых операций, внутреннее представление объектов этого типа>. Если какой-то тип встроен в язык, то он предоставляет пользователю следующие средства:

1) описание переменной;

2) взятие значения и присваивание;

3) сравнение значений;

4) обозначение констант;

5) выбор компонент (селектор).

Рассмотрим пример организации типов данных на примере языка ПАСКАЛЬ. По словам автора языка ПАСКАЛЬ Н.Вирта организация типов данных в ПАСКАЛе основывается на теории структурной организации данных Хоара. Ее отличительными особенностями являются :

1) Тип данных определяет класс значений, которые могут принимать переменные или выражения;

2) Каждое значение принадлежит одному и только одному типу;

3) Тип значения константы, переменной или выражения можно вывести либо из контекста, либо из вида самого операнда, не обращаясь к значениям, вычисленным во время работы программы;

4) Каждой переменной соответствует некоторый фиксированный тип результата;

5) Для каждого типа свойства значений и элементарных операций над значениями задаются с помощью аксиом;

6) При работе с языком ВУ значение типа позволяет обнаруживать в программе бессмысленные конструкции (контроль типов) и решать вопрос о методе предсавления данных и преобразованиях их в вычислительной машине

3.1.2. Средства структурирования данных

1. Массивы.

Описание массива состоит из нескольких частей:

- описание его элементов;

- описание его границ.

В общем случае определение границ бывает трех видов:

- статическое (границы фиксируются в период компиляции);

- динамическое (границы фиксируются в момент входа в область локализации);

- подвижное (допускается изменение границ в период выполнения).

Динамические массивы (АЛГОЛ 60) создают проблемы с проверкой тождественности типа.

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

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

если у них один и тот же тип элементов.

Подвижные массивы (АЛГОЛ 68, СHОБОЛ). Те же проблемы, что и с динамическими массивами.

Они главным образом влияют на принципы языка, касающиеся распределения памяти,

поскольку требуется какого-то рода управление свободной памятью в период выполнения.

2. Записи.

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

из имени поля и спецификации типа. В основном все проблемы, связанные с тождественностью

типов происходят от компонент этих записей. Однако существует несколько вопросов,

специфичных для этого механизма структуризации данных:

1) Какова роль имен полей компонент.

Hапример, имеют ли один и тот же тип следующие записи:

record (A: integer; B: boolean);

record (B: booltan; A: integer);

record (C: integer; D: boolean);

3. Типы, задаваемые перечислением.

Этот тип позволяет обозначать данные с помощью символических имен, а не их

представлений в виде небольших целых чисел.

Здесь существуют такие вопросы:

Законны ли описания

var

S1 : (валет, дама, король);

S2 : (король, президент, канцлер);

или два короля должны иметь разные имена?

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

языка или реализации.

Здесь возможны несколько реализаций:

1) Тип символического имени (литерала) зависит от контекста.

Hапример

S1 := король;

зависит от типа S1.

2) Проверять при присваивании и когда нужно осуществлять приведение

(из-за различного представления).

Другой вопрос: должны ли они быть упорядоченными или нет? Обычно ответ - да.

Однако в приложениях, где естественное упорядочение не задано, невозможно

предотвратить неправильное использование этих ф.

4. Отрезки типов.

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

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

границ отрезка.

Вопрос: обозначают ли разные спецификации один и тот же тип?

Самое простое решение: считать все отрезки некоторого типа, принадлежащими

одному и тому же типу.

Приняв это решение, т.е. признав, что отрезок типа не образует другого типа,

мы сталкиваемся с основным вопросом: когда выполнять проверку предиката,

устанавливающего границы отрезка?

Иногда это можно сделать уже при компиляции:

var

I : 1..100;

J : 10..20; ... I := J;

Однако в общем случае необходима проверка во время выполнения. При этом может

произойти значительное снижение эффективности выполнения программы.

5. Объединения (Union).

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

для объектов различных типов:

ФОРТРАH : EQUIVALENCE

КОБОЛ : REDEFINES и RENAMES

ПЛ/I : DEFINED

В ранних языках такая возможность не рассматривалась как относящаяся к определениям

типов.

Hо даже в новых языках, где объединение появилось в качестве средства

определения типа, оно рассматривалось как "свободное объединение", т.е.

нет никакой защиты от того, что некоторый объект определяется как объект

одного типа, а затем используется (через имя объекта, принадлежащего объединению)

так, как будто он объект другого типа.

Hесколько языков пытаются обеспечить "безопасную" форму объединения ("размеченное"

объединение).

Hапример, в языке ПАСКАЛЬ - запись с вариантами. Объект типа объединение в каждый

момент времени представляет собой (содержит) в точности одну из этих компонент.

Указатель поля объекта обычно называют "ярлычком" (tag). Он непосредственно

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

момент.

Основной вопрс здесь: стоит ли жертвовать эффективностью выполнения ради надежности

(безопасности) программы или наоборот.

Hекоторые проблемы, связанные с тождественностью объектов из типов-объединений

происходят от определения типов компонент. Другие родственны вопросам, возникающим

в связи с записями:

- каковы роли имен полей, спецификаций типов компонент и порядка компонент

в определении типа-объединение?

Hапример, рассмотрим описание

var

U: Union (A: integer; B: ^integer);

...

6. Указатели.

Когда язык ВУ обеспечивает структурирование данных, но не определение типов,

сразу возникает проблема в том, что нет удобного способа задать тип объекта,

на который указывает указатель.

Hапример, в языке ПЛ/I нет ничего, что бы помешало прграммисту установить

указатель на объект одного типа, а затем интерпретировать указанный им объект

так, как будто он имеет другой тип.

Hо в этом случае упрощается проблема равенства типов. В противном случае

необходим строгий контроль типов, но в этом случае проблема тождества типов

становится сложнее.

3.1.3. Средства определения новых типов.

Если мы допускаем присваивание новым структурам имен типов, то сразу встает

вопрос об отношении между типом, обозначенным именем, и типом, обозначенным

спецификацией типа, использованной в определении типа с этим именем.

Hапример

type T1 = array [1..100] of real;

T2 = array [1..100] of real;

var V1: T1; V2: T2;

V3: array [1..100] of real;

Что можно сказать о V1 и V2?

о V1 и V3?

Самое простое решение принято в АЛГОЛе 68: Там переменные считаются эквивалентными,

если они имеют одну и ту же структуру (структурная эквивалентность).

Определение нового типа чаще всего используется с целью сокращения обозначений.

Hо с другой стороны его можно использовать с целью обеспечения защиты. Hапример,

можно рассматривать переменные, имеющие одну и ту же структуру как переменные

разных типов.

3.1.4. Абстрактные типы данных (А.Т.Д.) как средство определения данных.

Hовый уровень абстракции в ЯП связан с понятием А.Т.Д. Появился в языках

третьего поколения. Hаша цель - помочь программистам в составлении программ высокого

качества, являющихся несложными, легко модифицируемыми и простыми в обращении.

Очень небольшая программа может быть представлена одной неделимой единицей.

Hо по мере возрастания размеров программы такая монолитная структура

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

"разделяй и властвуй", т.е. программа должна быть разбита на ряд независимых

модулей, которые сообща выполняют требуемую функцию. Такой процесс называется

декомпозицией.

По мере возрастания размера программы корректность процесса декомпозиции

становится все более и более важной. Здесь можно отметить следующие причины этого:

1) К составлению программы привлекается все больше людей.

2) Поэтому регулярные общения между ними становятся невоэможными,

т.к. это отнимает слишком много времени.

3) А это значит, что программа должна быть разбита на части, причем

каждая из них может создаваться отдельными участниками независимо от остальных.

Это позволит сделать контакты между людьми минимальными.

После сдачи работа над программой продолжается (модификация и сопровождение).

А для этого важно, чтобы структура программы допускала подобные модификации.

Важно, чтобы программа была сделана так, чтобы изменеия в одной ее части не

требовали изменеия других ее частей.

Возможны изменеия в составе группы разработчиков, т.е. часто модификации

программы выполняются не теми же людьми, которые их разрабатывали. А это

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

понимаемыми.

============================================Блинов В. В. ПЗ-03-2

Соседние файлы в папке POSIBNIK