Лекции по информатике (984119), страница 30
Текст из файла (страница 30)
Тйповый контроль может быть определен также в терминах синтаксиса и семанти- ки [21]: ° рассматриваются синтаксически правильные программы, удовлетворяющие контекстным условиям (вроде согласованности формальных и фактических параметров при вызовах процедур); эта, задача эффективно разрешима алгоритмически: ° среди синтаксически правильных программ — тоже а>п»ритмически — могут быть выделены типово-правильные программы, удовлетворяющие правилам типизации языка приписывашно типов переменным и константам, определению типов выражений по типам их частей, согласование типов частей конструкций (например, присваиваний) и т. п., так что понятие типово-правильной программы становится частью синтаксиса языка как свойство текста, проверяемое в период компиляции до выполнения программы; ° семантика вьшолнепия программы на языке предусматривает понятие т!1новой ои!ибки, зависящее от понятия типа в языке (несоответствие типа текущего значения переменной (параметра и т.
д.) типу, требуемому операцией, процедурой., вообще конструкцией, в которой находится этй переменная (парам! тр и т. д.). Например, если текущее значение индекса 1 в выражении а[к] выходит за границы массива и, то это типовйя опгибкй, если грйнипы вх~дят в поняти!." типй массива, (кг>к в 11йскагге), и гцпг!гпе еггог в Фортране: ° динамический контроль требует от семантики языка наличия возможности продолжения выполнения программы после типовой огпибки (оставляя ее иезаыеченногз!) лиоо осуществ;!опия предварительного димамического типового контроля. Обьединяя в различной комбинации эти требования, можно получать языки с полным и неполным. с динамическим, статическим и смешанным контролем типов.
Тйким обрйзом, типизецгия языка и контроль типов являются вйжнейпгими элементами аппарата защиты языка программирования. Они прогнозируют (обьявляк>т) такие свойства поведения обьектов.,как принадлежность к определенному типу, указание области действия и ограничений на допустимые значения в определенных контекстах,и осуществляют контроль за соблюдением ограничений (в частности, управление реакцией на нарушение обьявленного поведения). 7.3.3 Преобразование и передача типов Если в яз!.гкс программирования разрешается о:!повременное использование данных несколь- ких типов, например, в одном выражении или разных частях оператора присваивания, то вступает в действие механизм согласования типов 11!)1.
Этот механизм может быть полностью отключен, и тогда внутреннее представление обьекта одного типа (отведенная ему пал)ять) предоставляется для обработки средствами другого тина. Например, печать указателя в виде це;!ого числа с помощью вариантной записи Паскаля. Другой пример бинарная запись данных в файл без преобразования значений в изображение. Для этого, например, в языке Си можно преобразовать указатель на переменную данного типа к типу с)еаг*, после чего записать байты непосредственно в файл. В Паскале запись двоичного кода без преобразования происходит всегда при обмене с тт)екстоеыс)! файлом.
Такая ПСРЕДЙ, Еа ЗНсВЮНИЯ ОсЧНОГО ТИПЙ ПОД ЮРИСДИКЦИК) ДРУГОГО ТИПй ИНОГДЙ ТЙК И НЙЗЫВЙЕТ- ся -- передача типа (1ГЙЫег1)ед 1уре). Если согласуемые типы в математическом или ином смысле родственные, то может иметь смысл определение соответствук>щих функций преобразования всех значений одного типа в допустимые значения другого типа и наоборот, задающих приведение исходного типа к целевому. Например, целый, вещественный и комплексный типы как математические множества, (алгебраические структуры) естественно вкладываются друг в друга .'Е б ек Е С. Но аппаратные (и программные) реализации этих типов не идеальны и существенно отличаются.
В силу известных причин преобразование значений может осуществляться неточно, быть необратимым и требовать некоторого немалого чаще всего линейного времени (схема Горнера). То есть память преобразуемого к новому типу значения существенно меняется. Даже в таких строгих языках как Паскаль многие преоб)разования выполняются неявно и необходимо понимать происходящие при этом закулисные действия. В отличие от преобразования значений согласованных типов передача типо, трактовка данных одного типа как значений другого типа 1бэ1. В современных версиях Паскаля имя любого типа, как предопределенного, так и обьявленного программистом, является также именем функции преобразования типа. Передача типа преобразует лишь тип (интерпрет))Елею) дйнного кйк Облйсги пймяти, Й н!) Гймо хрйнимое знйюние.
Тйк, функция ЛОЙ1, согласующая целый и вещественный типы. превра)цаст делос значение аргумента, в эквивалентное данное, хранимое как значение типа Геа!: Х1оае(3) = 3.0. Функция передачи типа геа1 присваивает этот тип области памяти с целым значением 3, не делая ПОпытОк прсВрй'!'игь сс)мО этО ЗЕЕЙ)юнис В экВиВален ПЕое знйчее)и!' типа Геа1, т. е. зеЕЙ>юнис геа1 (3) почти наверняка не равно 3.0 ! 7.3.4 Адресный тип Для обеспечения процессов разнотишюй интерпретации памяти необходимо применение родовых типов.
Родовые типы данных уже заложены в конструкцию универсальных ЭВМ, пймЯть кОтоРых ПРедстс)влсяет собой слОВЙ., ПРеднйзнстченныс ДЛЯ ХРан!.'ниЯ Данных ПРО- извольных т)лпов Щ. Ослабляя ограничения строго типизированных языков, можно ввести родовой тип данных и)огс1, не предполагающий какого-лиоо особенного использования памяти, выделяемой для его обьектов. Для типа ее)огс1 определены лишь операция присваивання и отношение равенства.
Также, как и тип множество, тип ъъ'огс1 является внутримашинным, нетекстовым, непечатным. По этой причине в этом типе нет констант, изображающих конкретные значения. Основное применени!' типа тчогг1 связано с ослаблением контроля типов при передаче параметров. Любой формальный параметр типа жогг1 считастся совместимым !.' любым фактическим параметром, занимйклцим ровно одно слово в памяти ЭВМ. В обычном употреблении тип ч>огс1 чужд другим типам, что уменыпает потенциальную опасность его применения и локализует места его использования. Другой, более универсальный способ ослабления тйпового контроля,основан на применении бестиповых, родовы>в указателей. В стандартном Паскале указатель может ссылаться на обьекты не более, чем одного типа. В современных версиях Паскаля бестиповые указатели вводятся как роп>!е>' ~о и>огс1 ('! и>огс1), распостраняя типовук> свобх>ду и~огс1 на мир ссылок и указателей.
Фактически тип рочового указателя вводит в обиход языка высокого уровня адреса соответствующей ЭВМ, единообразно ссылающиеся на данные любых типов, размещенные в ячейках ее памяти. Поэтому он и получил название адресного. Адресный тип имеет множеством значений диапазон допустимых адресов ЭВМ, быть может суженный до сегмента памяти процесса в мультипрограммных системах с защитой памяти. Обьекты адресного типа совместимы по присваиванию и сравнению с любыми ссылочными переменными, а формальные параметры -- с любыми ссылочными фактическими. Кроме того, адресный тип естественно совместим с целым и к нему применимы арифметические операции, что открывает в языке типа Паскаль набор гибких, но весьма опасных средств свойственной языку Си адресной арифметики. Адресный тип полностью устраняет контроль типов, выполняемый компилятором, и его следует употреблять только для разработки родовых модулей низкого уровня.
7.3.5 Родовые модули Понятие родового модуля противоречит строгой типизации данных. Родовой модуль, реализующий стек, способен вталкивать и выталкивать элементы различных типов данных !59]. Один программист может импортировать ,'этот модуль и использовать его в качестве стека целых значений, а другой — применять его как стек текстовых строк.
Однако в Паскале целые числа и строки считаются несовместимыми типами. Правильность типов данных для операций обы шо контролируется. Если же контроль типов ослабляется, возникает нарушение строгой типизации данных. Для большинства родовых операций характерна та или иная форма нарушения строгой типизации. Например., можно хранить в целочисленном стеке коды литер, допустив легкое и полностьк> контролируемое нарушение строгой типизации данных !2Ц. В качестве примера, ограниченно родового модуля часто приводят родовую очередь скалярных значений, реализуемую с помощью типа ъ~огс1 как очередь слов [59~.
аггау оГ э> огс1 без указания индексных границ устраняет все виды контроля типов и допустим лишь в качестве типа формальных параметров, которому может соответствовать фактический параметр лк>бого типа, и длины. 7.3.6 Полиморфизм Параме>призоаанные или полпморфные типы это один из аспектов общего понятия полиморфизма, !многоликости вообще и многотиповости в частности) !461.
Понятие полиморфной операции, т. е. операции, у которой хотя бы один аргумент допускает значения не одного, а нескольких типов, встречается почти в любом языке программирования, начиная с Фортрана, где операция !- может применяться как к вещественным значениям, так и к целым !211, '!'оже можно сказать и о присваивании: один и тот же синтаксический обьскт:= перегружен и интерпретируется по-разному в зависимости ог контекста чаг 1, ): шСенег; чаг х, у: геа1; :.
†. 3 ' х загружая разнотипные регистры машины фон Неймана. От абстракции имен относительно конкретных значений можно перейти к абстрагированию конструкций по отношению к имени типа, Например, можно определить абстрактную по отношению к типу или полиморфную процедуру виар: ргосес)иге э~чар (Т: Суре, чаг р, с1: Т); чагС: Т; Ьецш С: — р; р й: еп<1; Здесь в отличие от примера со знаком: =- внутри процедуры эзар смысл присваиваний неизвестен, поскольку тип Т не фиксируется, и мы имеем дело с типовой абстракцией. Абстракция заключается уже в неопределенности типа, и может стать явной, .как это сделано с помощью параметра-типа в процедуре вжар, вызов которой имеет вид эюар~шСедег, .х, у); При компиляции такой процедуры надо запланировать передачу набора атрибутов типа ~операций, отношений, ...) в процедуру например в виде вектора ссылок или как множество ссылок па процедуры (конкретных значений процедурного типа).