Постепенная типизация - это система типов, в которой некоторым переменным и выражениям могут быть присвоены типы, а правильность ввода проверяется во время компиляции (что является статической типизацией ), а некоторые выражения могут оставаться нетипизированными, а возможные ошибки типа сообщаются во время выполнения (что это динамическая типизация ). Постепенная типизация позволяет разработчикам программного обеспечения выбирать любую парадигму типов в зависимости от конкретного языка. [1]Во многих случаях постепенная типизация добавляется к существующему динамическому языку, создавая производный язык, позволяющий, но не требующий использования статической типизации. В некоторых случаях язык использует постепенный набор текста с самого начала.
История
Термин был введен Джереми Сиком. Джереми Сик и Валид Таха начали исследовать постепенную типизацию в 2006 году [1].
Выполнение
В частности, постепенная типизация использует специальный тип с именем dynamic для представления статически неизвестных типов, а постепенная типизация заменяет понятие равенства типов новым отношением, называемым согласованностью, которое связывает динамический тип с каждым другим типом. Отношение согласованности симметрично, но не транзитивно. [2]
Предыдущие попытки интеграции статической и динамической типизации пытались сделать динамический тип одновременно верхним и нижним в иерархии подтипов. Однако, поскольку подтипирование является транзитивным, это приводит к тому, что каждый тип становится связанным с любым другим типом, и поэтому подтипирование больше не исключает каких-либо ошибок статического типа. Добавление второй фазы проверки достоверности в систему типов не решило полностью эту проблему. [3] [4]
Постепенную типизацию можно легко интегрировать в систему типов объектно-ориентированного языка, который уже использует правило подчинения, позволяющее неявное преобразование в соответствие с подтипами . Основная идея заключается в том, что согласованность и подтипы - это ортогональные идеи, которые прекрасно сочетаются друг с другом. Чтобы добавить подтип к постепенно типизируемому языку, просто добавьте правило подтипа и добавьте правило подтипа, которое делает динамический тип подтипом самого себя, потому что подтипирование должно быть рефлексивным. (Но не делайте верхнюю часть порядка подтипов динамической!) [5]
Примеры
Примеры языков с постепенной типизацией, производных от существующих языков с динамической типизацией, включают Closure Compiler , TypeScript (оба для JavaScript [6] ), [7] Hack (для PHP), PHP (начиная с 7.0 [8] ), Typed Racket (для Racket ), Типизированный Clojure (для Clojure ), [9] Cython ( компилятор Python ), mypy (средство проверки статического типа для Python ), [10] pyre (альтернативное средство проверки статического типа для Python), [11] или cperl (типизированный Perl 5 ). ActionScript - это язык с постепенной типизацией [12], который теперь является реализацией ECMAScript , хотя изначально он возник отдельно как родственный язык, оба находились под влиянием HyperTalk от Apple .
Система для языка программирования J была разработана, [13] , добавив принуждение, распространение ошибки и фильтрацию в нормальных свойства проверки системы типа, а также применение функций типа вне определений функций, таким образом , увеличения гибкости определений типов.
И наоборот, C # начинался как язык со статической типизацией, но начиная с версии 4.0 типизирован постепенно, что позволяет явно отмечать переменные как динамические с помощью dynamic
типа. [14] Постепенно типизированные языки, не производные от динамически типизированного языка, включают Дарт , Дилан и Раку .
В Raku (ранее Perl6) с самого начала реализована постепенная типизация. Типовые проверки происходят во всех местах, где значения присвоены или привязаны. «Нетипизированная» переменная или параметр набирается как Any
, что соответствует (почти) всем значениям. Компилятор помечает конфликты проверки типов во время компиляции, если он может определить во время компиляции, что они никогда не завершатся успешно.
Objective-C имеет постепенную типизацию указателей на объекты по отношению к вызовам методов. Статическая типизация используется, когда переменная типизирована как указатель на определенный класс объекта: при вызове метода к переменной компилятор статически проверяет, объявлен ли класс для поддержки такого метода, или генерирует предупреждение или ошибку. . Однако, если используется переменная этого типа id
, компилятор разрешит для нее вызывать любой метод.
Язык программирования JS ++ , выпущенный в 2011 году, представляет собой надмножество JavaScript (динамически типизированного) с системой постепенных типов, подходящей для угловых случаев ECMAScript и DOM API. [15]
Рекомендации
- ^ a b Siek, Джереми. "Что такое постепенный набор текста?" .
- ^ Зик, Джереми; Таха, Валид (сентябрь 2006 г.). Постепенный набор текста для функциональных языков (PDF) . Схема и функциональное программирование 2006 . Чикагский университет . С. 81–92.
- ^ Тэтт, Сатиш (1990). Квазистатическая типизация . POPL 1990: Принципы языков программирования ACM . ACM . С. 367–381. DOI : 10.1145 / 96709.96747 . ISBN 978-0897913430.
- ^ Олиарт, Альберто (1994). Алгоритм вывода квазистатических типов (Технический отчет). Бостонский университет. 1994-013.
- ^ Зик, Джереми; Таха, Валид (август 2007 г.). Постепенный набор объектов . ECOOP 2007: Европейская конференция по объектно-ориентированному программированию . Конспект лекций по информатике. 4609 . Springer . С. 2–27. DOI : 10.1007 / 978-3-540-73589-2_2 . ISBN 978-3-540-73588-5.
- ^ Feldthaus, Asger; Мёллер, Андерс (2014). «Проверка корректности интерфейсов TypeScript для библиотек JavaScript» . Материалы Международной конференции ACM 2014 по языкам и приложениям систем объектно-ориентированного программирования - OOPSLA '14 . Портленд, Орегон, США: ACM Press: 1–16. DOI : 10.1145 / 2660193.2660215 . ISBN 978-1-4503-2585-1.
- ^ Swamy, N .; Fournet, C .; Растоги, А .; Bhargavan, K .; Chen, J .; Strub, PY; Бирман, Г. (2014). «Постепенный набор текста надежно встроен в JavaScript». Материалы 41-го симпозиума ACM SIGPLAN-SIGACT по принципам языков программирования - POPL '14 (PDF) . С. 425–437. DOI : 10.1145 / 2535838.2535889 . ISBN 9781450325448.
- ^ «PHP: Аргументы функций - Руководство» Строгая типизация » .
- ^ Час Эмерик. «Типизированное руководство пользователя Clojure» .
- ^ Юкка Лехтосало. «mypy - Дополнительная статическая типизация для Python» .
- ^ «Pyre - высокопроизводительное средство проверки типов для Python 3» .
- ^ Асим Растоги; Авик Чаудхури; Бэзил Хосмер (январь 2012 г.). «Плюсы и минусы постепенного вывода типов» (PDF) . Ассоциация вычислительной техники (ACM) . Проверено 23 сентября 2014 .
- ^ "тип-система-j" .
- ^ «динамический (Справочник по C #)» . Библиотека MSDN . Microsoft . Проверено 14 января 2014 года .
- ^ «Система типов JS ++, приложение B: проблемы (почему это было трудно решить?)» . Дата обращения 10 февраля 2020 .
дальнейшее чтение
- Siek, Jeremy G .; Витаусек, Майкл М .; Чимини, Маттео; Бойленд, Джон Тан (2015). Болл, Томас; Бодик, Растислав; Кришнамурти, Шрирам; Lerner, Benjamin S .; Моррисетт, Грег (ред.). Уточненные критерии постепенного набора текста . 1-й Саммит по достижениям в языках программирования (SNAPL 2015) . Leibniz International Proceedings in Informatics (LIPIcs). 32 . Дагштуль, Германия: Schloss Dagstuhl – Leibniz-Zentrum fuer Informatik. С. 274–293. DOI : 10,4230 / lipics.snapl.2015.274 . ISBN 9783939897804.