stringtranslate.com

Постепенный набор текста

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

Постепенная типизация позволяет разработчикам программного обеспечения выбирать любую подходящую парадигму типа в пределах одного языка. [1] Во многих случаях постепенная типизация добавляется к существующему динамическому языку, [2] создавая производный язык, позволяющий, но не требующий использования статической типизации. В некоторых случаях язык использует постепенную типизацию с самого начала.

История

Термин был придуман Джереми Сиком, который разработал метод постепенной типизации в 2006 году совместно с Валидом Тахой. [1] [ необходим неосновной источник ]

Выполнение

В постепенной типизации специальный тип, называемый dynamic, используется для представления статически неизвестных типов. Понятие равенства типов заменяется новым отношением, называемым conformity , которое связывает динамический тип с любым другим типом. Отношение conformity является рефлексивным и симметричным, но не транзитивным. [3]

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

Постепенная типизация может быть легко интегрирована в систему типов объектно-ориентированного языка, который уже использует правило подчинения , чтобы разрешить неявные преобразования относительно подтипирования. Основная идея заключается в том, что согласованность и подтипирование являются ортогональными идеями, которые прекрасно сочетаются. Чтобы добавить подтипирование к постепенно типизированному языку, просто добавьте правило подчинения и правило подтипирования, которое делает динамический тип подтипом самого себя, поскольку подтипирование должно быть рефлексивным. (Но не делайте верхнюю часть порядка подтипирования динамической!) [6]

Примеры

Примерами постепенно типизированных языков, полученных из существующих динамически типизированных языков, являются Closure Compiler , TypeScript (оба для JavaScript [7] ), [8] Hack (для PHP), PHP (с версии 7.0 [9] ), Typed Racket (для Racket [10] [11] ), Typed Clojure (для Clojure ), [12] Cython ( компилятор Python ), mypy (статическая проверка типов для Python ), [13] pyre (альтернативная статическая проверка типов для Python), [14] или cperl (типизированный Perl 5 ). ActionScript — это постепенно типизированный язык [15] , который сейчас является реализацией ECMAScript , хотя изначально он возник отдельно как родственный язык, оба под влиянием HyperTalk от Apple .

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

Напротив, C# изначально был статически типизированным языком, но начиная с версии 4.0 стал постепенно типизированным, что позволяет явно помечать переменные как динамические с помощью типа dynamic. [17] Постепенно типизированные языки, не являющиеся производными от динамически типизированных языков, включают Dart , Dylan и Raku .

Raku (ранее Perl6) имеет постепенную типизацию, реализованную с самого начала. Проверки типов происходят во всех местах, где значения назначаются или связываются. «Нетипизированная» переменная или параметр типизируется как Any, что будет соответствовать (почти) всем значениям. Компилятор отмечает конфликты проверки типов во время компиляции, если он может определить во время компиляции, что они никогда не будут успешными.

Objective-C имеет постепенную типизацию для указателей объектов относительно вызовов методов. Статическая типизация используется, когда переменная типизирована как указатель на определенный класс объектов: когда выполняется вызов метода для переменной, компилятор статически проверяет, что класс объявлен для поддержки такого метода, или он генерирует предупреждение или ошибку. Однако, если idиспользуется переменная типа, компилятор разрешит вызывать любой метод для нее.

Язык программирования JS++ , выпущенный в 2011 году, представляет собой надмножество JavaScript (динамически типизированное) с постепенной системой типов, которая подходит для особых случаев ECMAScript и DOM API. [18]

Ссылки

  1. ^ ab Siek, Джереми (24 марта 2014 г.). «Что такое постепенная типизация?».
  2. ^ Браха, Гилад (2004). «Подключаемые системы типов». Семинар OOPSLA'04 по возрождению динамических языков .
  3. ^ Сик, Джереми; Таха, Валид (сентябрь 2006 г.). Постепенная типизация для функциональных языков (PDF) . Scheme and Functional Programming 2006. Чикагский университет . стр. 81–92.
  4. ^ Thatte, Satish (1990). "Квазистатическая типизация". Труды 17-го симпозиума ACM SIGPLAN-SIGACT по принципам языков программирования - POPL '90 . ACM . С. 367–381. doi :10.1145/96709.96747. ISBN 978-0897913430. S2CID  8725290.
  5. ^ Олиарт, Альберто (1994). Алгоритм вывода квазистатических типов (технический отчет). Бостонский университет. 1994-013.
  6. ^ Сик, Джереми; Таха, Валид (август 2007 г.). «Постепенная типизация объектов». ECOOP 2007 – Объектно-ориентированное программирование . Конспект лекций по информатике. Том 4609. Springer . С. 2–27. doi :10.1007/978-3-540-73589-2_2. ISBN 978-3-540-73588-5.
  7. ^ Feldthaus, Asger; Møller, Anders (2014). «Проверка корректности интерфейсов TypeScript для библиотек JavaScript». Труды Международной конференции ACM 2014 года по языкам и приложениям объектно-ориентированных систем программирования. Портленд, Орегон, США: ACM Press. стр. 1–16. doi :10.1145/2660193.2660215. ISBN 978-1-4503-2585-1.
  8. ^ Свами, Н.; Фурнет, К.; Растоги, А.; Бхаргаван, К.; Чен, Дж.; Страб, П.Й.; Бирман, Г. (2014). «Постепенная типизация, надежно встроенная в JavaScript» (PDF) . Труды 41-го симпозиума ACM SIGPLAN-SIGACT по принципам языков программирования — POPL '14 . стр. 425–437. doi :10.1145/2535838.2535889. ISBN 9781450325448.
  9. ^ "PHP: Аргументы функций - Руководство » Строгая типизация".
  10. ^ Тобин-Хохштадт, Сэм; Феллейзен, Маттиас. «Межъязыковая миграция: от скриптов к программам». Труды симпозиума по системам объектно-ориентированного программирования, Companion Volume . Портленд, штат Орегон. Тобин-Хохштадт06 . Получено 2020-11-06 .
  11. ^ Тобин-Хохштадт, Сэм; Феллейзен, Маттиас. «Проектирование и реализация типизированной схемы». Труды Principles of Programming Languages . Сан-Диего, Калифорния. Tobin-Hochstadt08 . Получено 2020-11-06 .
  12. ^ Чес Эмерик. «Типизированное руководство пользователя Clojure». GitHub .
  13. ^ Юкка Лехтосало. «mypy — дополнительная статическая типизация для Python».
  14. ^ «Pyre — производительная проверка типов для Python 3».
  15. ^ Асим Растоги; Авик Чаудхури; Бэзил Хосмер (январь 2012 г.). «Внутри и снаружи постепенного вывода типов» (PDF) . Ассоциация вычислительной техники (ACM) . Получено 23 сентября 2014 г.
  16. ^ "type-system-j". GitHub .
  17. ^ "dynamic (C# Reference)". Библиотека MSDN . Microsoft . Получено 14 января 2014 г. .
  18. ^ "Система типов JS++, Приложение B: Проблемы (Почему это было трудно решить?)" . Получено 10 февраля 2020 г.

Дальнейшее чтение