Постепенное набор текста
Типовые системы |
---|
Общие понятия |
Основные категории |
Второстепенные категории |
Постепенная типизация — это система типов , в которой некоторым переменным и выражениям могут быть присвоены типы, а правильность типизации проверяется во время компиляции (что является статической типизацией ), а некоторые выражения могут оставаться нетипизированными, а о возможных ошибках типов сообщается во время выполнения (что динамическая типизация ). Постепенная типизация позволяет разработчикам программного обеспечения выбирать подходящую парадигму типа в рамках одного языка. [1] Во многих случаях к существующему динамическому языку добавляется постепенная типизация. [2] создание производного языка, позволяющего, но не требующего использования статической типизации. В некоторых случаях язык использует постепенную типизацию с самого начала.
История [ править ]
Этот термин был придуман Джереми Сиком, который разработал поэтапную типизацию в 2006 году вместе с Валидом Таха. [1] [ нужен неосновной источник ]
Реализация [ править ]
специальный тип, называемый динамическим При постепенной типизации для представления статически неизвестных типов используется . Понятие равенства типов заменяется новым отношением, называемым согласованностью , которое связывает динамический тип со всеми остальными типами. Отношение непротиворечивости рефлексивно и симметрично, но не транзитивно. [3]
Предыдущие попытки объединить статическую и динамическую типизацию пытались сделать динамический тип одновременно верхним и нижним в иерархии подтипов. Однако, поскольку подтипирование является транзитивным, это приводит к тому, что каждый тип становится связанным с каждым другим типом, и поэтому подтипирование больше не исключает ошибок статического типа. Добавление в систему типов второго этапа проверки достоверности не решило полностью эту проблему. [4] [5]
Постепенную типизацию можно легко интегрировать в систему типов объектно-ориентированного языка, который уже использует правило обобщения , позволяющее неявное преобразование вверх по отношению к подтипированию. Основная идея заключается в том, что согласованность и подтипирование — это ортогональные идеи, которые хорошо сочетаются. Чтобы добавить подтипирование в язык с постепенной типизацией, просто добавьте правило подтипирования и правило подтипирования, которое делает динамический тип подтипом самого себя, поскольку подтипирование должно быть рефлексивным. (Но не делайте верхнюю часть порядка подтипов динамической!) [6]
Примеры [ править ]
Примеры постепенно типизированных языков, производных от существующих динамически типизированных языков, включают Closure Compiler , TypeScript (оба для JavaScript [7] ), [8] Взломать (для PHP), PHP (начиная с версии 7.0) [9] ), Типизированная ракетка (для ракетки [10] [11] ), Типизированный Clojure (для Clojure ), [12] Cython ( компилятор Python ), mypy (средство проверки статического типа для Python ), [13] Pyre (альтернативная проверка статического типа для Python), [14] или cperl (типизированный Perl 5 ). ActionScript — это язык с постепенной типизацией. [15] теперь это реализация ECMAScript от Apple , хотя изначально он возник отдельно как родственный язык, оба под влиянием HyperTalk .
система для языка программирования J , Разработана [16] добавление приведения, распространения ошибок и фильтрации к обычным свойствам проверки системы типов, а также применение функций типов вне определений функций, тем самым увеличивая гибкость определений типов.
И наоборот, C# начинался как статически типизированный язык, но начиная с версии 4.0 он постепенно типизируется, что позволяет явно помечать переменные как динамические с помощью dynamic
тип. [17] К постепенно типизированным языкам, не производным от динамически типизированных языков, относятся Dart , Dylan и Raku .
В Raku (ранее Perl6) с самого начала реализована постепенная типизация. Проверки типов происходят во всех местах, где значения назначаются или привязываются. «Нетипизированная» переменная или параметр вводится как Any
, который будет соответствовать (почти) всем значениям. Компилятор помечает конфликты проверки типов во время компиляции, если он может определить во время компиляции, что они никогда не будут успешными.
Objective-C имеет постепенную типизацию указателей объектов относительно вызовов методов. Статическая типизация используется, когда переменная вводится как указатель на определенный класс объекта: когда для переменной выполняется вызов метода, компилятор статически проверяет, объявлен ли класс для поддержки такого метода, или генерирует предупреждение или ошибку. . Однако если переменная типа id
используется, компилятор разрешит вызов любого метода.
Язык программирования JS++ , выпущенный в 2011 году, представляет собой надмножество JavaScript (динамически типизированное) с системой постепенного типа, которая подходит для угловых случаев ECMAScript и DOM API. [18]
Ссылки [ править ]
- ^ Jump up to: Перейти обратно: а б Зик, Джереми (24 марта 2014 г.). «Что такое постепенное типирование?» .
- ^ Браха, Гилад (2004). «Системы сменного типа» . OOPSLA'04 Семинар по возрождению динамических языков .
- ^ Сик, Джереми; Таха, Валид (сентябрь 2006 г.). Постепенная типизация для функциональных языков (PDF) . Схема и функциональное программирование 2006 . Чикагский университет . стр. 81–92.
- ^ Татте, Сатиш (1990). «Квазистатическая типизация». Материалы 17-го симпозиума ACM SIGPLAN-SIGACT по принципам языков программирования - POPL '90 . АКМ . стр. 367–381. дои : 10.1145/96709.96747 . ISBN 978-0897913430 . S2CID 8725290 .
- ^ Олиарт, Альберто (1994). Алгоритм вывода квазистатических типов (технический отчет). Бостонский университет. 1994-013.
- ^ Сик, Джереми; Таха, Валид (август 2007 г.). «Постепенная типизация объектов». ЭКООП 2007 – Объектно-ориентированное программирование . Конспекты лекций по информатике. Том. 4609. Спрингер . стр. 2–27. дои : 10.1007/978-3-540-73589-2_2 . ISBN 978-3-540-73588-5 .
- ^ Фельдтхаус, Асгер; Мёллер, Андерс (2014). «Проверка корректности интерфейсов TypeScript для библиотек JavaScript» . Материалы Международной конференции ACM 2014 года по языкам и приложениям объектно-ориентированных систем программирования . Портленд, Орегон, США: ACM Press. стр. 1–16. дои : 10.1145/2660193.2660215 . ISBN 978-1-4503-2585-1 .
- ^ Свами, Н.; Фурне, К.; Растоги, А.; Бхаргаван, К.; Чен, Дж.; Струб, П.Ю.; Бирман, Г. (2014). «Постепенная типизация, безопасно встроенная в JavaScript» (PDF) . Материалы 41-го симпозиума ACM SIGPLAN-SIGACT по принципам языков программирования — POPL '14 . стр. 425–437. дои : 10.1145/2535838.2535889 . ISBN 9781450325448 .
- ^ «PHP: Аргументы функции - Руководство » Строгая типизация» .
- ^ Тобин-Хохштадт, Сэм; Феллизен, Маттиас. «Межъязыковая миграция: от скриптов к программам» . Материалы симпозиума по системам объектно-ориентированного программирования, сопутствующий том . Портленд, Орегон. Тобин-Хохштадт06 . Проверено 6 ноября 2020 г.
- ^ Тобин-Хохштадт, Сэм; Феллизен, Маттиас. «Проектирование и реализация типизированной схемы» . Труды по основам языков программирования . Сан-Диего, Калифорния. Тобин-Хохштадт08 . Проверено 6 ноября 2020 г.
- ^ Чес Эмерик. «Руководство пользователя по печатному Clojure» . Гитхаб .
- ^ Юкка Лехтосало. «mypy — дополнительная статическая типизация для Python» .
- ^ «Pyre — эффективная программа проверки типов для Python 3» .
- ^ Асим Растоги; Авик Чаудхури; Бэзил Хосмер (январь 2012 г.). «Все тонкости постепенного вывода типов» (PDF) . Ассоциация вычислительной техники (ACM) . Проверено 23 сентября 2014 г.
- ^ "тип-система-j" . Гитхаб .
- ^ «динамический (Справочник по C#)» . Библиотека MSDN . Майкрософт . Проверено 14 января 2014 г.
- ^ «Система типов JS++, Приложение B: Проблемы (почему это было трудно решить?)» . Проверено 10 февраля 2020 г.
Дальнейшее чтение [ править ]
- Зик, Джереми Г.; Витоусек, Майкл М.; Чимини, Маттео; Бойленд, Джон Тан (2015). Болл, Томас; Бодик, Растислав; Кришнамурти, Шрирам; Лернер, Бенджамин С.; Моррисетт, Грег (ред.). Уточненные критерии постепенного набора текста . Лейбниц Международные труды по информатике. Том 32. Дагштуль, Германия: Центр компьютерных наук Schloss Dagstuhl-Leibniz. стр. 274–293. дои : 10.4230/lipics.snapl.2015.274 . ISBN 9783939897804 . S2CID 15383644 .