Википедия

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

Система типов — совокупность правил в языках программирования, назначающих свойства, именуемые типами, различным конструкциям, составляющим программу — таким как переменные, выражения, функции или модули. Основная роль системы типов заключается в уменьшении числа багов в программах посредством определения интерфейсов между различными частями программы и последующей проверки согласованности взаимодействия этих частей. Эта проверка может происходить статически ([англ.]) или динамически (), а также быть комбинацией обоих видов.

Определение

По [англ.], система типов — разрешимый синтаксический метод доказательства отсутствия определённых поведений программы путём классификации конструкций в соответствии с видами вычисляемых значений.

Описание

Пример простой системы типов можно видеть в языке Си. Части программы на Си оформляются в виде определений функций. Функции вызывают друг друга. Интерфейс функции задаёт имя функции и список значений, которые передаются её телу. Вызывающая функция постулирует имя функции, которую хочет вызвать, и имена переменных, хранящих значения, которые требуется передать. Во время исполнения программы значения помещаются во временное хранилище, и затем исполнение передаётся в тело вызываемой функции. Код вызываемой функции осуществляет доступ к значениям и использует их. Если инструкции в теле функции написаны в предположении, что им на обработку должно быть передано целое значение, но вызывающий код передал число с плавающей точкой, то вызванная функция вычислит неверный результат. Компилятор Си проверяет типы, заданные для каждой переданной переменной, в отношении к типам, заданным для каждой переменной в интерфейсе вызываемой функции. Если типы не совпадают, компилятор порождает ошибку времени компиляции.

Технически, система типов назначает тип каждому вычисленному значению и затем, отслеживая последовательность этих вычислений, предпринимает попытку проверить или доказать отсутствие ошибок согласования типов. Конкретная система типов может определять, что именно приводит к ошибке, но обычно целью является предотвращение того, чтобы операции, предполагающие определённые свойства своих параметров, получали параметры, для которых эти операции не имеют смысла — предотвращение логических ошибок. Дополнительно это также предотвращает ошибки адресации памяти.

Системы типов обычно определяются как часть языков программирования и встраиваются в их интерпретаторы и компиляторы. Однако система типов языка может быть расширена посредством [англ.], осуществляющих дополнительные проверки на основе исходного синтаксиса типизации в языке.

Компилятор также может использовать статический тип значения для оптимизации хранилища и для выбора алгоритмической реализации операций над этим значением. Например, во многих компиляторах Си тип float представляется 32 битами, в соответствии со спецификацией IEEE для операций с плавающей точкой одинарной точности. На основании этого будет использоваться специальный набор инструкций микропроцессора для значений этого типа (сложение, умножение и другие операции).

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

Формальное обоснование

Формальным обоснованием для систем типов служит теория типов. В состав языка программирования включается система типов для осуществления проверки типов [англ.] или , требующая явного провозглашения типов или выводящая их самостоятельно. Марк Мэнесси (англ. Mark Manasse) сформулировал проблему так:

Основная проблема, решаемая теорией типов, состоит в том, чтобы убедиться, что программы являются осмысленными. Основная проблема, порождаемая теорией типов, состоит в том, что осмысленные программы могут не соответствовать поведению, ожидаемому от них по замыслу. Следствием этой напряжённости является поиск более мощных систем типов.

Марк Мэнесси

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

Проверка согласования типов

Процесс проверки и установления ограничений для типов — контроль типов или проверка соответствия типов — может осуществляться как [англ.] (статическая типизация), так и (динамическая типизация). Возможны и промежуточные решения (ср. Последовательная типизация).

Если спецификация языка требует, чтобы правила типизации исполнялись строго (то есть допуская в той или иной мере лишь те автоматические преобразования типов, которые не теряют информацию), такой язык называется сильно типизированным (англ. strongly typed; в русской литературе преобладает вариант перевода строго типизированным), в противном случае — слабо типизированным. Эти термины являются условными и не используются в формальных обоснованиях.

Статическая проверка типов

Динамическая проверка типов и информация о типах

Строгий и нестрогий контроль типов

Типобезопасность и защита адресации памяти

Типизированные и бестиповые языки

Язык называют типизированным, если спецификация каждой операции определяет типы данных, к которым эта операция может применяться, подразумевая её неприменимость к иным типам. Например, данные, которые представляет «этот текст в кавычках», имеют тип «строка». В большинстве языков программирования деление числа на строку не имеет смысла, и большинство современных языков отвергнет программу, которая пытается выполнить такую операцию. В одних языках бессмысленная операция будет выявлена [англ.] (статическая типизация), и отвергнута компилятором. В других она будет выявлена программы (динамическая типизация), порождая исключительную ситуацию.

Особый случай типизированных языков представляют однотиповые языки (англ. single-type language), то есть языки с единственным типом. Обычно это языки сценариев или разметки, такие как REXX и SGML, единственным типом данных в которых является символьная строка, используемая для представления как символьных, так и числовых данных.

Бестиповые языки, в противоположность типизированным, позволяют осуществлять любую операцию над любыми данными, которые в них представляются цепочками бит произвольной длины. Бестиповыми является большинство языков ассемблера. Примерами высокоуровневых бестиповых языков служат BCPL, [англ.], Forth, Рефал.

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

Типы и полиморфизм

Термин «полиморфизм» означает способность кода выполняться над значениями множества разных типов, или возможность разных экземпляров одной и той же структуры данных содержать элементы разных типов. Некоторые системы типов допускают полиморфизм для потенциального повышения коэффициента повторного использования кода: в языках с полиморфизмом программистам достаточно реализовать структуры данных, такие как список или ассоциативный массив, лишь единожды, и не требуется разрабатывать по одной реализации для каждого типа элементов, которые планируется хранить в этих структурах. По этой причине некоторые учёные в области информатики иногда называют использование определённых форм полиморфизма «обобщённым программированием». Обоснования полиморфизма с точки зрения теории типов практически те же, что и для абстракции, модульности и в ряде случаев [англ.].

Утиная типизация

Специальные системы типов

Ряд специальных систем типов был разработан для использования в определённых условиях с определёнными данными, а также для статического анализа программ. В большинстве своём они основываются на идеях формальной теории типов и используются лишь в составе исследовательских систем.

Экзистенциальные типы

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

Понятие экзистенциального типа часто используется совместно с понятием типа записи для представления модулей и абстрактных типов данных, что обусловлено их назначением — отделением реализации от интерфейса. Например, тип T = ∃X { a: X; f: (X → int); } описывает интерфейс модуля (семейства модулей с одинаковой сигнатурой), имеющий в своём составе значение данных типа X и функцию, принимающую параметр в точности этого же типа X и возвращающую целое число. Реализация может быть различной:

  • intT = { a: int; f: (int → int); }
  • floatT = { a: float; f: (float → int); }

Оба типа являются подтипами более общего экзистенциального типа T и соответствуют конкретно реализованным типам, так что любое значение, принадлежащее любому из них, принадлежит также к типу T. Если t — значение типа T, то t.f(t.a) проходит проверку типов, вне зависимости от того, к какому абстрактному типу принадлежит X. Это даёт гибкость при выборе типов, подходящих для конкретной реализации, так как пользователи извне обращаются только к значениям интерфейсного (экзистенциального) типа и изолированы от этих вариаций.

В общем случае механизм проверки согласования типов не способен определить, к какому именно экзистенциальному типу принадлежит данный модуль. В примере выше intT { a: int; f: (int → int); } также мог бы иметь тип ∃X { a: X; f: (int → int); }. Простейшим решением является явное указание для каждого модуля подразумеваемого в нём типа, например:

  • intT = { a: int; f: (int → int); } as ∃X { a: X; f: (X → int); }

Хотя абстрактные типы данных и модули использовались в языках программирования довольно давно, формальная модель экзистенциальных типов была построена лишь к 1988 году. Теория представляет собой типизированное лямбда-исчисление второго порядка, аналогичное Системе F, но с экзистенциальной квантификацией вместо универсальной.

Экзистенциальные типы явным образом доступны в качестве экспериментального расширения языка Haskell, где они представляют собой специальный синтаксис, позволяющий использовать переменную типа в определении алгебраического типа, не вынося её в сигнатуру конструктора типов, то есть не повышая его арность. Язык Java предоставляет ограниченную форму экзистенциальных типов посредством [англ.]. В языках, реализующих классический let-полиморфизм в стиле ML, экзистенциальные типы могут быть симулированы посредством так называемых «значений, индексированных типами».

Явное и неявное назначение типов

Многие статические системы типов, например, такие как в языках Си и Java, требуют провозглашения типа: программист должен явно назначать каждой переменной конкретный тип. Другие, такие как система типов Хиндли — Милнера, применяемая в языках ML и Haskell, осуществляют выведение типов: компилятор выстраивает заключение о типах переменных на основании того, как программист использует эти переменные.

Например, для функции f(x,y), осуществляющей сложение x и y, компилятор может сделать вывод, что x и y должны быть числами — поскольку операция сложения определена только для чисел. Следовательно, вызов где-либо в программе функции f для параметров, отличных от числовых, (например, для строки или списка) сигнализирует об ошибке.

Числовые и строковые константы и выражения обычно зачастую выражают тип в конкретном контексте. Например, выражение 3.14 может подразумевать вещественное число, тогда как [1,2,3] может быть списком целых — обычно массивом.

Вообще говоря, выведение типов возможно, если оно принципиально разрешимо в теории типов. Более того, даже если выведение неразрешимо для данной теории типов, выведение зачастую возможно для многих реальных программ. Система типов языка Haskell, являющаяся разновидностью системы типов Хиндли — Милнера, представляет собой ограничение [англ.] для так называемых полиморфных типов первого ранга, на которых выведение разрешимо. Многие компиляторы Хаскела предоставляют полиморфизм произвольного ранга в качестве расширения, но это делает выведение типов неразрешимым, так что требуется явное провозглашение типов. Однако, проверка согласования типов остаётся разрешимой и для программ с полиморфизмом первого ранга типы по-прежнему выводимы.

Унифицированные системы типов

Некоторые языки, например, C#, имеют унифицированную систему типов. Это означает, что все типы языка вплоть до примитивных наследуются от единого корневого объекта (в случае с C# — от класса Object). В Java есть несколько примитивных типов, не являющихся объектами. Наряду с ними Java также предоставляет обёрточные объектные типы, так что разработчик может использовать примитивные или объектные типы по своему усмотрению.

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

Механизм проверки согласования типов в языке со статической типизацией проверяет, что всякое выражение соответствует типу, ожидаемому тем контекстом, в котором оно присутствует. Например, в операторе присваивания вида x := e выведенный для выражения e тип должен соответствовать типу, который провозглашён или выведен для переменной x. Нотация соответствия, называемая совместимостью, специфична для каждого языка.

Если e и x имеют единый тип, и присваивание разрешено для этого типа, то это выражение является корректным. Поэтому в простейших системах типов вопрос совместимости двух типов упрощается до вопроса их равенства (эквивалентности). Однако разные языки имеют разные критерии для определения совместимости типов двух выражений. Эти теории эквивалентности варьируются между двумя крайними случаями: (англ. structural type system), в которых два типа эквивалентны, если описывают одинаковую внутреннюю структуру значения; и (англ. nominative type system), в которых синтаксически различные типы никогда не эквивалентны (то есть два типа равны только в том случае, если равны их идентификаторы).

В языках с [англ.] правила совместимости более сложные. Например, если A является подтипом B, то значение, принадлежащее типу A, может быть использовано в контексте, ожидающем значение типа B, даже если обратное неверно. Как и в случае эквивалентности, отношения подтипов различаются в разных языках, и здесь возможно много вариантов правил. Наличие в языке параметрического или ситуативного полиморфизма может также влиять на совместимость типов.

Влияние на стиль программирования

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

См. также

  • Ковариантность и контравариантность (программирование)
  • Полиморфизм
  • Перегрузка операторов
  • [англ.]
  • [англ.]
  • [англ.]

Примечания

  1. Cardelli, 2004, p. 1.
  2. Pierce, 2002, p. 1.
  3. Pierce, 2002, с. 208.
  4. Andrew Cooke. Introduction To Computer Languages. Дата обращения: 13 июля 2012. Архивировано из оригинала 15 августа 2012 года.
  5. Mitchell, Plotkin, 1988.
  6. Existential types on HaskellWiki. Дата обращения: 15 июля 2014. Архивировано 20 июля 2014 года.
  7. Type-Indexed Values. Дата обращения: 15 июля 2014. Архивировано 21 апреля 2016 года.
  8. Standard ECMA-334 Архивная копия от 31 октября 2010 на Wayback Machine, 8.2.4 Type system unification.
  9. Meijer, Drayton.
  10. Amanda Laucher, Paul Snively. Types vs Tests (англ.). InfoQ. Дата обращения: 26 февраля 2014. Архивировано 2 марта 2014 года.
  11. Adobe and Mozilla Foundation to Open Source Flash Player Scripting Engine. Дата обращения: 26 февраля 2014. Архивировано 21 октября 2010 года.
  12. Psyco, a Python specializing compiler. Дата обращения: 26 февраля 2014. Архивировано 29 ноября 2019 года.
  13. C-Extensions for Python Архивная копия от 11 августа 2007 на Wayback Machine. Cython (2013-05-11). Retrieved on 2013-07-17

Литература

  • Luca Cardelli, Peter Wegner. On Understanding Types, Data Abstraction, and Polymorphism. — , 1985. — С. 471—523. — ISSN 0360-0300.
  • Benjamin C. Pierce. Types and Programming Languages. — MIT Press, 2002. — ISBN 978-0-262-16209-8.
  • Luca Cardelli. CRC Handbook of Computer Science and Engineering. — 2nd. — CRC Press, 2004. — ISBN 158488360X.
  • John C. Mitchell, Gordon Plotkin. Abstract [data types have existential type] // ACM Transactions on Programming Languages and Systems. — 1988. — Т. 10, № 3. — С. 470–502.
  • Tratt, Laurence. Dynamically Typed Languages. — Advances in Computers, 2009. — С. 149–184.
  • Gonzalez, T.; Diaz-Herrera, J.; Tucker, A. Type Systems (by Stephania Weirich) // Computing Handbook, Third Edition: Computer Science and Software Engineering. — CRC Press, 2015. — 2326 p. — ISBN 9781439898536.

Ссылки

  • Smith, Chris. What To Know Before Debating Type Systems.
  • Erik Meijer, Peter Drayton. Static Typing Where Possible, Dynamic Typing When Needed: The End of the Cold War Between Programming Languages (англ.). Microsoft Corporation.
  • Ликбез по типизации в языках программирования (рус.)

Википедия, чтение, книга, библиотека, поиск, нажмите, истории, книги, статьи, wikipedia, учить, информация, история, скачать, скачать бесплатно, mp3, видео, mp4, 3gp, jpg, jpeg, gif, png, картинка, музыка, песня, фильм, игра, игры, мобильный, телефон, Android, iOS, apple, мобильный телефон, Samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Сеть, компьютер, Информация о Система типов, Что такое Система типов? Что означает Система типов?

Eta statya o sistemah tipov s tochki zreniya programmirovaniya O teoreticheskoj formulirovke sm Teoriya tipov Sistema tipov sovokupnost pravil v yazykah programmirovaniya naznachayushih svojstva imenuemye tipami razlichnym konstrukciyam sostavlyayushim programmu takim kak peremennye vyrazheniya funkcii ili moduli Osnovnaya rol sistemy tipov zaklyuchaetsya v umenshenii chisla bagov v programmah posredstvom opredeleniya interfejsov mezhdu razlichnymi chastyami programmy i posleduyushej proverki soglasovannosti vzaimodejstviya etih chastej Eta proverka mozhet proishodit staticheski angl ili dinamicheski a takzhe byt kombinaciej oboih vidov OpredeleniePo angl sistema tipov razreshimyj sintaksicheskij metod dokazatelstva otsutstviya opredelyonnyh povedenij programmy putyom klassifikacii konstrukcij v sootvetstvii s vidami vychislyaemyh znachenij OpisaniePrimer prostoj sistemy tipov mozhno videt v yazyke Si Chasti programmy na Si oformlyayutsya v vide opredelenij funkcij Funkcii vyzyvayut drug druga Interfejs funkcii zadayot imya funkcii i spisok znachenij kotorye peredayutsya eyo telu Vyzyvayushaya funkciya postuliruet imya funkcii kotoruyu hochet vyzvat i imena peremennyh hranyashih znacheniya kotorye trebuetsya peredat Vo vremya ispolneniya programmy znacheniya pomeshayutsya vo vremennoe hranilishe i zatem ispolnenie peredayotsya v telo vyzyvaemoj funkcii Kod vyzyvaemoj funkcii osushestvlyaet dostup k znacheniyam i ispolzuet ih Esli instrukcii v tele funkcii napisany v predpolozhenii chto im na obrabotku dolzhno byt peredano celoe znachenie no vyzyvayushij kod peredal chislo s plavayushej tochkoj to vyzvannaya funkciya vychislit nevernyj rezultat Kompilyator Si proveryaet tipy zadannye dlya kazhdoj peredannoj peremennoj v otnoshenii k tipam zadannym dlya kazhdoj peremennoj v interfejse vyzyvaemoj funkcii Esli tipy ne sovpadayut kompilyator porozhdaet oshibku vremeni kompilyacii Tehnicheski sistema tipov naznachaet tip kazhdomu vychislennomu znacheniyu i zatem otslezhivaya posledovatelnost etih vychislenij predprinimaet popytku proverit ili dokazat otsutstvie oshibok soglasovaniya tipov Konkretnaya sistema tipov mozhet opredelyat chto imenno privodit k oshibke no obychno celyu yavlyaetsya predotvrashenie togo chtoby operacii predpolagayushie opredelyonnye svojstva svoih parametrov poluchali parametry dlya kotoryh eti operacii ne imeyut smysla predotvrashenie logicheskih oshibok Dopolnitelno eto takzhe predotvrashaet oshibki adresacii pamyati Sistemy tipov obychno opredelyayutsya kak chast yazykov programmirovaniya i vstraivayutsya v ih interpretatory i kompilyatory Odnako sistema tipov yazyka mozhet byt rasshirena posredstvom angl osushestvlyayushih dopolnitelnye proverki na osnove ishodnogo sintaksisa tipizacii v yazyke Kompilyator takzhe mozhet ispolzovat staticheskij tip znacheniya dlya optimizacii hranilisha i dlya vybora algoritmicheskoj realizacii operacij nad etim znacheniem Naprimer vo mnogih kompilyatorah Si tip float predstavlyaetsya 32 bitami v sootvetstvii so specifikaciej IEEE dlya operacij s plavayushej tochkoj odinarnoj tochnosti Na osnovanii etogo budet ispolzovatsya specialnyj nabor instrukcij mikroprocessora dlya znachenij etogo tipa slozhenie umnozhenie i drugie operacii Kolichestvo nalagaemyh na tipy ogranichenij i sposob ih vychisleniya opredelyayut tipizaciyu yazyka Pomimo etogo v sluchae polimorfizma tipov yazyk mozhet takzhe zadat dlya kazhdogo tipa operaciyu varirovaniya konkretnyh algoritmov Izucheniem sistem tipov zanimaetsya teoriya tipov hotya na praktike konkretnaya sistema tipov yazyka programmirovaniya osnovyvaetsya na osobennostyah arhitektury kompyutera realizacii kompilyatora i obshem obraze yazyka Formalnoe obosnovanieFormalnym obosnovaniem dlya sistem tipov sluzhit teoriya tipov V sostav yazyka programmirovaniya vklyuchaetsya sistema tipov dlya osushestvleniya proverki tipov angl ili trebuyushaya yavnogo provozglasheniya tipov ili vyvodyashaya ih samostoyatelno Mark Menessi angl Mark Manasse sformuliroval problemu tak Osnovnaya problema reshaemaya teoriej tipov sostoit v tom chtoby ubeditsya chto programmy yavlyayutsya osmyslennymi Osnovnaya problema porozhdaemaya teoriej tipov sostoit v tom chto osmyslennye programmy mogut ne sootvetstvovat povedeniyu ozhidaemomu ot nih po zamyslu Sledstviem etoj napryazhyonnosti yavlyaetsya poisk bolee moshnyh sistem tipov Originalnyj tekst angl The fundamental problem addressed by a type theory is to ensure that programs have meaning The fundamental problem caused by a type theory is that meaningful programs may not have meanings ascribed to them The quest for richer type systems results from this tension Mark Menessi Operaciya naznacheniya tipa nazyvaemaya tipizaciej pridayot smysl cepochkam bit takim kak znachenie v pamyati kompyutera ili obektam takim kak peremennaya Kompyuter ne imeet vozmozhnosti otlichit k primeru adres v pamyati ot instrukcii koda ili simvol ot celogo chisla ili chisla s plavayushej zapyatoj poskolku cepochki bit predstavlyayushie eti razlichnye po smyslu znacheniya ne imeyut kakih libo yavnyh osobennostej pozvolyayushih delat predpolozheniya ob ih smysle Naznachenie cepochkam bit tipa predostavlyaet eto osmyslenie prevrashaya tem samym programmiruemoe apparatnoe obespechenie v simvolnuyu sistemu sostoyashuyu iz etogo apparatnogo obespecheniya i programmy Proverka soglasovaniya tipovProcess proverki i ustanovleniya ogranichenij dlya tipov kontrol tipov ili proverka sootvetstviya tipov mozhet osushestvlyatsya kak angl staticheskaya tipizaciya tak i dinamicheskaya tipizaciya Vozmozhny i promezhutochnye resheniya sr Posledovatelnaya tipizaciya Esli specifikaciya yazyka trebuet chtoby pravila tipizacii ispolnyalis strogo to est dopuskaya v toj ili inoj mere lish te avtomaticheskie preobrazovaniya tipov kotorye ne teryayut informaciyu takoj yazyk nazyvaetsya silno tipizirovannym angl strongly typed v russkoj literature preobladaet variant perevoda strogo tipizirovannym v protivnom sluchae slabo tipizirovannym Eti terminy yavlyayutsya uslovnymi i ne ispolzuyutsya v formalnyh obosnovaniyah Staticheskaya proverka tipov Osnovnaya statya Staticheskaya tipizaciya Dinamicheskaya proverka tipov i informaciya o tipah Osnovnaya statya Dinamicheskaya tipizaciya Strogij i nestrogij kontrol tipov Osnovnaya statya Silnaya i slabaya tipizaciya Tipobezopasnost i zashita adresacii pamyati Osnovnaya statya Tipobezopasnost Tipizirovannye i bestipovye yazyki Yazyk nazyvayut tipizirovannym esli specifikaciya kazhdoj operacii opredelyaet tipy dannyh k kotorym eta operaciya mozhet primenyatsya podrazumevaya eyo neprimenimost k inym tipam Naprimer dannye kotorye predstavlyaet etot tekst v kavychkah imeyut tip stroka V bolshinstve yazykov programmirovaniya delenie chisla na stroku ne imeet smysla i bolshinstvo sovremennyh yazykov otvergnet programmu kotoraya pytaetsya vypolnit takuyu operaciyu V odnih yazykah bessmyslennaya operaciya budet vyyavlena angl staticheskaya tipizaciya i otvergnuta kompilyatorom V drugih ona budet vyyavlena programmy dinamicheskaya tipizaciya porozhdaya isklyuchitelnuyu situaciyu Osobyj sluchaj tipizirovannyh yazykov predstavlyayut odnotipovye yazyki angl single type language to est yazyki s edinstvennym tipom Obychno eto yazyki scenariev ili razmetki takie kak REXX i SGML edinstvennym tipom dannyh v kotoryh yavlyaetsya simvolnaya stroka ispolzuemaya dlya predstavleniya kak simvolnyh tak i chislovyh dannyh Bestipovye yazyki v protivopolozhnost tipizirovannym pozvolyayut osushestvlyat lyubuyu operaciyu nad lyubymi dannymi kotorye v nih predstavlyayutsya cepochkami bit proizvolnoj dliny Bestipovymi yavlyaetsya bolshinstvo yazykov assemblera Primerami vysokourovnevyh bestipovyh yazykov sluzhat BCPL angl Forth Refal Na praktike lish nekotorye yazyki mogut schitatsya tipizirovannymi s tochki zreniya teorii tipov razreshaya ili otvergaya vse operacii bolshinstvo sovremennyh yazykov predlagayut lish nekuyu stepen tipizirovannosti Mnogie promyshlennye yazyki predostavlyayut vozmozhnost obojti ili narushit sistemu tipov postupayas tipobezopasnostyu radi bolee tochnogo kontrolya nad ispolneniem programmy kalambur tipizacii Tipy i polimorfizmOsnovnaya statya Polimorfizm informatika Termin polimorfizm oznachaet sposobnost koda vypolnyatsya nad znacheniyami mnozhestva raznyh tipov ili vozmozhnost raznyh ekzemplyarov odnoj i toj zhe struktury dannyh soderzhat elementy raznyh tipov Nekotorye sistemy tipov dopuskayut polimorfizm dlya potencialnogo povysheniya koefficienta povtornogo ispolzovaniya koda v yazykah s polimorfizmom programmistam dostatochno realizovat struktury dannyh takie kak spisok ili associativnyj massiv lish edinozhdy i ne trebuetsya razrabatyvat po odnoj realizacii dlya kazhdogo tipa elementov kotorye planiruetsya hranit v etih strukturah Po etoj prichine nekotorye uchyonye v oblasti informatiki inogda nazyvayut ispolzovanie opredelyonnyh form polimorfizma obobshyonnym programmirovaniem Obosnovaniya polimorfizma s tochki zreniya teorii tipov prakticheski te zhe chto i dlya abstrakcii modulnosti i v ryade sluchaev angl Utinaya tipizaciya Osnovnaya statya Utinaya tipizaciyaSpecialnye sistemy tipovRyad specialnyh sistem tipov byl razrabotan dlya ispolzovaniya v opredelyonnyh usloviyah s opredelyonnymi dannymi a takzhe dlya staticheskogo analiza programm V bolshinstve svoyom oni osnovyvayutsya na ideyah formalnoj teorii tipov i ispolzuyutsya lish v sostave issledovatelskih sistem Etot razdel nuzhno dopolnit Pozhalujsta uluchshite i dopolnite razdel 31 dekabrya 2016 Ekzistencialnye tipy Ekzistencialnye tipy to est tipy opredelyonnye posredstvom ekzistencialnogo kvantifikatora kvantora sushestvovaniya predstavlyayut soboj mehanizm inkapsulyacii na urovne tipov eto kompozitnyj tip skryvayushij realizaciyu nekoego tipa v svoyom sostave Ponyatie ekzistencialnogo tipa chasto ispolzuetsya sovmestno s ponyatiem tipa zapisi dlya predstavleniya modulej i abstraktnyh tipov dannyh chto obuslovleno ih naznacheniem otdeleniem realizacii ot interfejsa Naprimer tip T X a X f X int opisyvaet interfejs modulya semejstva modulej s odinakovoj signaturoj imeyushij v svoyom sostave znachenie dannyh tipa X i funkciyu prinimayushuyu parametr v tochnosti etogo zhe tipa X i vozvrashayushuyu celoe chislo Realizaciya mozhet byt razlichnoj intT a int f int int floatT a float f float int Oba tipa yavlyayutsya podtipami bolee obshego ekzistencialnogo tipa T i sootvetstvuyut konkretno realizovannym tipam tak chto lyuboe znachenie prinadlezhashee lyubomu iz nih prinadlezhit takzhe k tipu T Esli t znachenie tipa T to t f t a prohodit proverku tipov vne zavisimosti ot togo k kakomu abstraktnomu tipu prinadlezhit X Eto dayot gibkost pri vybore tipov podhodyashih dlya konkretnoj realizacii tak kak polzovateli izvne obrashayutsya tolko k znacheniyam interfejsnogo ekzistencialnogo tipa i izolirovany ot etih variacij V obshem sluchae mehanizm proverki soglasovaniya tipov ne sposoben opredelit k kakomu imenno ekzistencialnomu tipu prinadlezhit dannyj modul V primere vyshe intT a int f int int takzhe mog by imet tip X a X f int int Prostejshim resheniem yavlyaetsya yavnoe ukazanie dlya kazhdogo modulya podrazumevaemogo v nyom tipa naprimer intT a int f int int b as b X a X f X int Hotya abstraktnye tipy dannyh i moduli ispolzovalis v yazykah programmirovaniya dovolno davno formalnaya model ekzistencialnyh tipov byla postroena lish k 1988 godu Teoriya predstavlyaet soboj tipizirovannoe lyambda ischislenie vtorogo poryadka analogichnoe Sisteme F no s ekzistencialnoj kvantifikaciej vmesto universalnoj Ekzistencialnye tipy yavnym obrazom dostupny v kachestve eksperimentalnogo rasshireniya yazyka Haskell gde oni predstavlyayut soboj specialnyj sintaksis pozvolyayushij ispolzovat peremennuyu tipa v opredelenii algebraicheskogo tipa ne vynosya eyo v signaturu konstruktora tipov to est ne povyshaya ego arnost Yazyk Java predostavlyaet ogranichennuyu formu ekzistencialnyh tipov posredstvom angl V yazykah realizuyushih klassicheskij let polimorfizm v stile ML ekzistencialnye tipy mogut byt simulirovany posredstvom tak nazyvaemyh znachenij indeksirovannyh tipami Yavnoe i neyavnoe naznachenie tipovOsnovnaya statya Vyvod tipov Mnogie staticheskie sistemy tipov naprimer takie kak v yazykah Si i Java trebuyut provozglasheniya tipa programmist dolzhen yavno naznachat kazhdoj peremennoj konkretnyj tip Drugie takie kak sistema tipov Hindli Milnera primenyaemaya v yazykah ML i Haskell osushestvlyayut vyvedenie tipov kompilyator vystraivaet zaklyuchenie o tipah peremennyh na osnovanii togo kak programmist ispolzuet eti peremennye Naprimer dlya funkcii f x y osushestvlyayushej slozhenie x i y kompilyator mozhet sdelat vyvod chto x i y dolzhny byt chislami poskolku operaciya slozheniya opredelena tolko dlya chisel Sledovatelno vyzov gde libo v programme funkcii f dlya parametrov otlichnyh ot chislovyh naprimer dlya stroki ili spiska signaliziruet ob oshibke Chislovye i strokovye konstanty i vyrazheniya obychno zachastuyu vyrazhayut tip v konkretnom kontekste Naprimer vyrazhenie 3 14 mozhet podrazumevat veshestvennoe chislo togda kak 1 2 3 mozhet byt spiskom celyh obychno massivom Voobshe govorya vyvedenie tipov vozmozhno esli ono principialno razreshimo v teorii tipov Bolee togo dazhe esli vyvedenie nerazreshimo dlya dannoj teorii tipov vyvedenie zachastuyu vozmozhno dlya mnogih realnyh programm Sistema tipov yazyka Haskell yavlyayushayasya raznovidnostyu sistemy tipov Hindli Milnera predstavlyaet soboj ogranichenie angl dlya tak nazyvaemyh polimorfnyh tipov pervogo ranga na kotoryh vyvedenie razreshimo Mnogie kompilyatory Haskela predostavlyayut polimorfizm proizvolnogo ranga v kachestve rasshireniya no eto delaet vyvedenie tipov nerazreshimym tak chto trebuetsya yavnoe provozglashenie tipov Odnako proverka soglasovaniya tipov ostayotsya razreshimoj i dlya programm s polimorfizmom pervogo ranga tipy po prezhnemu vyvodimy Unificirovannye sistemy tipovNekotorye yazyki naprimer C imeyut unificirovannuyu sistemu tipov Eto oznachaet chto vse tipy yazyka vplot do primitivnyh nasleduyutsya ot edinogo kornevogo obekta v sluchae s C ot klassa Object V Java est neskolko primitivnyh tipov ne yavlyayushihsya obektami Naryadu s nimi Java takzhe predostavlyaet obyortochnye obektnye tipy tak chto razrabotchik mozhet ispolzovat primitivnye ili obektnye tipy po svoemu usmotreniyu Sovmestimost tipovMehanizm proverki soglasovaniya tipov v yazyke so staticheskoj tipizaciej proveryaet chto vsyakoe vyrazhenie sootvetstvuet tipu ozhidaemomu tem kontekstom v kotorom ono prisutstvuet Naprimer v operatore prisvaivaniya vida x i e i vyvedennyj dlya vyrazheniya i e i tip dolzhen sootvetstvovat tipu kotoryj provozglashyon ili vyveden dlya peremennoj x Notaciya sootvetstviya nazyvaemaya sovmestimostyu specifichna dlya kazhdogo yazyka Esli i e i i x imeyut edinyj tip i prisvaivanie razresheno dlya etogo tipa to eto vyrazhenie yavlyaetsya korrektnym Poetomu v prostejshih sistemah tipov vopros sovmestimosti dvuh tipov uproshaetsya do voprosa ih ravenstva ekvivalentnosti Odnako raznye yazyki imeyut raznye kriterii dlya opredeleniya sovmestimosti tipov dvuh vyrazhenij Eti teorii ekvivalentnosti variruyutsya mezhdu dvumya krajnimi sluchayami angl structural type system v kotoryh dva tipa ekvivalentny esli opisyvayut odinakovuyu vnutrennyuyu strukturu znacheniya i angl nominative type system v kotoryh sintaksicheski razlichnye tipy nikogda ne ekvivalentny to est dva tipa ravny tolko v tom sluchae esli ravny ih identifikatory V yazykah s angl pravila sovmestimosti bolee slozhnye Naprimer esli A yavlyaetsya podtipom B to znachenie prinadlezhashee tipu A mozhet byt ispolzovano v kontekste ozhidayushem znachenie tipa B dazhe esli obratnoe neverno Kak i v sluchae ekvivalentnosti otnosheniya podtipov razlichayutsya v raznyh yazykah i zdes vozmozhno mnogo variantov pravil Nalichie v yazyke parametricheskogo ili situativnogo polimorfizma mozhet takzhe vliyat na sovmestimost tipov Vliyanie na stil programmirovaniyaOdni programmisty predpochitayut staticheskie sistemy tipov drugie dinamicheskie Staticheski tipizirovannye yazyki signaliziruyut ob oshibkah soglasovaniya tipov na angl mogut porozhdat bolee effektivno ispolnyaemyj kod i dlya takih yazykov osushestvimo bolee relevantnoe avtodopolnenie v integrirovannyh sredah razrabotki Storonniki dinamicheskoj tipizacii utverzhdayut chto oni luchshe podhodyat dlya bystrogo prototipirovaniya i chto oshibki soglasovaniya tipov sostavlyayut lish maluyu chast vozmozhnyh oshibok v programmah S drugoj storony v staticheski tipizirovannyh yazykah yavnaya deklaraciya tipov obychno ne trebuetsya esli yazyk podderzhivaet vyvod tipov a nekotorye dinamicheski tipizirovannye yazyki proizvodyat optimizaciyu na etape vypolneniya programmy zachastuyu posredstvom primeneniya chastichnogo vyvoda tipov Sm takzheKovariantnost i kontravariantnost programmirovanie Polimorfizm Peregruzka operatorov angl angl angl PrimechaniyaCardelli 2004 p 1 Pierce 2002 p 1 Pierce 2002 s 208 Andrew Cooke Introduction To Computer Languages neopr Data obrasheniya 13 iyulya 2012 Arhivirovano iz originala 15 avgusta 2012 goda Mitchell Plotkin 1988 Existential types on HaskellWiki neopr Data obrasheniya 15 iyulya 2014 Arhivirovano 20 iyulya 2014 goda Type Indexed Values neopr Data obrasheniya 15 iyulya 2014 Arhivirovano 21 aprelya 2016 goda Standard ECMA 334 Arhivnaya kopiya ot 31 oktyabrya 2010 na Wayback Machine 8 2 4 Type system unification Meijer Drayton Amanda Laucher Paul Snively Types vs Tests angl InfoQ Data obrasheniya 26 fevralya 2014 Arhivirovano 2 marta 2014 goda Adobe and Mozilla Foundation to Open Source Flash Player Scripting Engine neopr Data obrasheniya 26 fevralya 2014 Arhivirovano 21 oktyabrya 2010 goda Psyco a Python specializing compiler neopr Data obrasheniya 26 fevralya 2014 Arhivirovano 29 noyabrya 2019 goda C Extensions for Python Arhivnaya kopiya ot 11 avgusta 2007 na Wayback Machine Cython 2013 05 11 Retrieved on 2013 07 17LiteraturaLuca Cardelli Peter Wegner On Understanding Types Data Abstraction and Polymorphism 1985 S 471 523 ISSN 0360 0300 Benjamin C Pierce Types and Programming Languages MIT Press 2002 ISBN 978 0 262 16209 8 Luca Cardelli CRC Handbook of Computer Science and Engineering 2nd CRC Press 2004 ISBN 158488360X John C Mitchell Gordon Plotkin Abstract data types have existential type ACM Transactions on Programming Languages and Systems 1988 T 10 3 S 470 502 Tratt Laurence Dynamically Typed Languages Advances in Computers 2009 S 149 184 Gonzalez T Diaz Herrera J Tucker A Type Systems by Stephania Weirich Computing Handbook Third Edition Computer Science and Software Engineering CRC Press 2015 2326 p ISBN 9781439898536 SsylkiImeetsya vikiuchebnik po teme Types Imeetsya vikiuchebnik po teme Class Declarations Smith Chris What To Know Before Debating Type Systems Erik Meijer Peter Drayton Static Typing Where Possible Dynamic Typing When Needed The End of the Cold War Between Programming Languages angl Microsoft Corporation Likbez po tipizacii v yazykah programmirovaniya rus

NiNa.Az

NiNa.Az - Абсолютно бесплатная система, которая делится для вас информацией и контентом 24 часа в сутки.
Взгляните
Закрыто