Ремонт принтеров, сканнеров, факсов и остальной офисной техники


назад Оглавление вперед




[2]

Алгол 68 хорошо известен своей причудливой формой приведения типов. Проблемы,которые здесь нужно решить очень схожи перегрузкой ,но в добавление есть некоторые споследствия времени выполнения.Двумерный массив только с одния рядом может быть преобразован в вектор ,и вектор только с одним компонентом може быть преобразован в скаляр. Условия для представления приведения типов ,могут быть распознаны во время выполнения ,а могут появлятся из программных ошибок. Пример Алгола 68 показал ,что привеление типов должно быть явным и эта точка зрения была реализована в более поздних языках.

Полиморфизм вклячения может быть обнаруженво многих языках ,в котрых Симула 67 это самый ранний пример. Классы Симулы это определенные пользователем классыорганизованные в просто наследовательной иерархии,где каждый класс имеет единственный суперкласс. Объекты и процедуры Симулы полиморфны , так как объекты подкласса могет появится там где требуется объект суперкласса.Хотя Smalltalk это нетипизированный язык ,он тоже использует немного полиморфизма.Недавно Лисп расширил этот стиль полиморфизма до непосредственных суперклассов.Язык ,который представляет парадигму параметрического полиморфизма это ML ,который изначально был построен вокруг этого стиля типизирования.В ML вы можете написать тождественную функцию ,которая работает с любыми типами аргументов , функцию length ,которая отображает список на целое число.Также возможно шаблонную функцию сортировки ,которая сортирует элементы любых типов.

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

1.3 Еволюция типов в языках программирования

В ранних языках программирования , вычислениеассоциировалось с числовыми вычислениями и значения имели единственный арифметический тип. Однако в 1954 в Фортране предложили раличать типы integer и float , в частности из-за того что использование integer для итераций и вычислений с массивами было логически отличным от использования чисел с плавающей запятой для вычилений. Фортран различал целочисленные переменные и с плавающей запятой по первой букве их имени. Алгол 60 сделал это различие явным введя добавочное объявление для Integer, real и Boolean типов.Алгол 60 был первым значительным языком , который имел явное определения типа и соответствующие требования для проверки типов при компиляции. Эти блочные требования позволяли не только проверку типов ,но и проверку области действия переменной при компиляции.


Определение типа в Алгол 60 было расширено другими классами значений в шестидесятых. Из многочисленных типизированных языков разрабатываемых в этом периоде PL/I ,Паскаль , Алгол 60 и Симула заслуживают внимания за их вклад в эволюцию языков программирования.

PL/I пытался скомбинировать элементы Фортрана ,Алгола ,Кобола и Лиспа.В него включены такие типы - типизированный массив ,записи ,указатели.Но он имеет множество лазеек : например - не требовалось определять тип значений на который указывает указатель , что ослабляло проверку типов при компиляции. В Паскале есть более чистое расширение типов до массивос ,записей и указателей и типов определенных пользователем. Однако Паскаль не определяет эквивалентность типов ,поэтому ответ на вопрос - когда два два выражения определяют один и тот же тип зависит от реализации. Также есть вопросы со степенью структурированности типов. Напрмер ,Паскалевское определение типа массив ,которое включает границы массива как часть типа ограничено в таких процедурах,которые единообразно оперируют с массивами разной размерности.Паскаль отсавляет лазейки в сильно типизированных определениях , не требуя определения полного типа процедур подставляемых в качестве параметра и позволяя независимо манипулировать полями записи.Эти неясности в паскалевской системе типов обсуждаются в [77].

Алгол 60 имеет более строгое определение типа чем Паскаль, с хорошо определенным определением эквивалентности типов. Определение типа расширено включением процедур как значений прервого класса(modes). Простейшие modes включают Int , real , char , bool , string ,bits ,bytes , format ,file , конструкторы типов включают array , struct , proc , union , ref соостветственно для конструирования типов массив , записей ,процедур , указателей.Алгол 68 осторожно определял правила для преобразования типов , использования

разыменований,распроцедурирование,расширение ,укрупнение ,объединения и низведение для преобразование значений к типам нужным для дальнейших вычислений. Проверка типов в Алголе 68 разрешена ,но алгоритм проверки типов настколько сложен ,что вопросы эквивалентности типов и преобразования типов настолько сложны ,что пользователь не всегда может решить их.Эта сложность явилась результатом сложности системы типов.Поэтому в поздних языках таких как Ада есть более простое определение эквивалентности типов с неколько ограниченным преобразованием типов.

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

Модула-2 первый широкораспространенный язык для использования модулей как основы структурирования. Типизированные интерфейсы определяли типы и операции доступные из модуля;типы в интерфейсе могут скрытыми чтобы достигнуть мезанизма абстракций данных. Интерфейс может быть определен раздельно от реализации , чтолбы разделить задачи реализации и декалрации. Блочная область видимости сохранявшаяся внутри модулей прекращала свою деятельность на более высоком уровнев пользу гибкой


межмодульной взаимодействиям через списки импорта и экспорта.Интерфейсы модулей похожи на декларации классов(кроме правил области видимости) ,но экземпляры класса это значения первого класса ,а экземпляры модулей нет. Фаза линковки необходима для соединения экзепмляров модулей для исполнения программыэта фаза определяется модульными интерфейсами ,но является внешней к языку.

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

Указанная выше историческая справка дает нам основу для дальнейшего обсуждения отношений между типами , абстракций данных и пполиморфизму в языках программирования.Мы рассмотрим нетипизированные абстракции данных(пакеты) в Ада , укажем на методологию ,которая требует чтобы абстракции данных имели тип и наследование , обсудим интерпретацию наследования как полиморфизма выделения подтипов и исследуем отношения между полиморфизмом подтипов в Smalltalk и параметрический полиморфизм в

ML.

Ада включает в себя множество модулей , включая подпрограммы для поддержки процедурно-ориентированного программирования,пакеты для поддержки абстракций данных и задачи для поддержки параллельного прогрраммирования. Но зато имеет слабое определение типа ,исключая процедуры и пакеты из множества типизированных объектов и включая типы задач намного позже в процессе дезайна как запоздалая мысль. Выбор в качестве эквивалентности типов эквивалентности имен намного слабее чем , идея структурной эквивалентности использованной в Алгол 68. Строгий запрет на явное приведение типов ослабляет возможность предоставления полиморфных операций применимых к операндам многих типов.

Пакеты в Ада имеют интерфейсное определение - название компонетов ,которые могут быть простыми переменными , процедурами ,исключениями и даже типами. Они могут прятать своё локальное состояния предоставляя тип данных private в теле пакета.Пакеты это похоже на тип запись , в качестве интерфейса перечисляются компоненты и эти компоненты определяют интерфейс. Пакеты в Ада отличаются от записей тем,что в записях компоненты должны быть типизированными значениями ,тогда как компоненты пакетов могут быть процедурами ,исключениями ,типами или другими сущностямиТак как пакеты не имеют типа ,то они не могут быть параметрами , компонентами структур или значениями указателей. Пакеты в Ада это второстепенные объекты ,тогда как класс в Симуле или объекты в объектно-ориентированных языках это первостепенные объекты.

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

- Он поддерживает объекты и абстракции данных с интерфейсом операций и сокрытием локальной информации.



[стр.Начало] [стр.1] [стр.2] [стр.3] [стр.4] [стр.5] [стр.6] [стр.7] [стр.8] [стр.9] [стр.10] [стр.11] [стр.12] [стр.13]