Постепенный набор текста - Gradual typing
Системы типов |
---|
Общие понятия |
Основные категории |
|
Второстепенные категории |
Смотрите также |
Постепенный набор текста это система типов в котором некоторые переменные и выражениям могут быть присвоены типы, а правильность набора проверяется на время компиляции (который статическая типизация ), а некоторые выражения можно оставить нетипизированными и в конечном итоге ошибки типа сообщается на время выполнения (который динамическая типизация ). Постепенная типизация позволяет разработчикам программного обеспечения выбирать любую парадигму типа в зависимости от конкретного языка.[1] Во многих случаях постепенная типизация добавляется к существующему динамическому языку, создавая производный язык, позволяющий, но не требующий использования статической типизации. В некоторых случаях язык использует постепенный набор текста с самого начала.
История
Термин был введен Джереми Сиком. Джереми Сик и Валид Таха начали исследовать постепенную типизацию в 2006 году.[1]
Выполнение
В частности, при постепенной типизации используется специальный тип с именем динамичный для представления статически неизвестных типов, а постепенная типизация заменяет понятие равенства типов новым отношением, называемым последовательность что связывает динамический тип со всеми остальными типами. Отношение согласованности симметрично, но не транзитивно.[2]
Предыдущие попытки интеграции статической и динамической типизации пытались сделать динамический тип одновременно верхним и нижним в иерархии подтипов. Однако, поскольку подтип является транзитивным, что приводит к тому, что каждый тип становится связанным с любым другим типом, и поэтому создание подтипов больше не исключает каких-либо ошибок статического типа. Добавление второй фазы проверки правдоподобия в систему типов не решило полностью эту проблему.[3][4]
Постепенный набор текста можно легко интегрировать в систему типов объектно-ориентированного языка, который уже использует подчинение правило, разрешающее неявное возвышения в отношении подтипов. Основная идея состоит в том, что согласованность и подтипы - это ортогональные идеи, которые прекрасно сочетаются. Чтобы добавить подтип к постепенно типизируемому языку, просто добавьте правило подтипа и добавьте правило подтипа, которое делает динамический тип подтипом самого себя, потому что подтипирование должно быть рефлексивным. (Но не делайте верхнюю часть порядка подтипов динамической!)[5]
Примеры
Примеры языков с постепенной типизацией, производных от существующих языков с динамической типизацией, включают: Компилятор закрытия, Машинопись (как для JavaScript[6]),[7] Взломать (для PHP), PHP (начиная с 7.0[8]), Typed Racket (для Ракетка ), Типизированный Clojure (для Clojure ),[9] Cython (а Python компилятор), mypy (средство проверки статического типа для Python ),[10] костер (альтернативная проверка статического типа для Python),[11] или же cperl (напечатанный Perl 5 ). ActionScript это постепенно типизированный язык[12] это теперь реализация ECMAScript, хотя изначально он возник отдельно как родной брат, оба под влиянием Apple HyperTalk.
Система для Язык программирования J была разработана,[13] добавление принуждения, распространения ошибок и фильтрации к нормальным свойствам проверки системы типов, а также применение функций типов вне определений функций, тем самым повышая гибкость определений типов.
Наоборот, C # начинался как статически типизированный язык, но начиная с версии 4.0 типизирован постепенно, что позволяет явно отмечать переменные как динамические с помощью динамичный
тип.[14] Постепенно типизированные языки, не производные от динамически типизированного языка, включают Дротик, Дилан, и Раку.
Раку (ранее Perl6) с самого начала реализована постепенная типизация. Типовые проверки происходят во всех местах, где значения присвоены или связаны. «Нетипизированная» переменная или параметр набирается как Любой
, который будет соответствовать (почти) всем значениям. Компилятор помечает конфликты проверки типов во время компиляции, если он может определить во время компиляции, что они никогда не завершатся успешно.
Цель-C имеет постепенную типизацию указателей объектов по отношению к вызовам методов. Статическая типизация используется, когда переменная типизирована как указатель на определенный класс объекта: при вызове метода к переменной компилятор статически проверяет, объявлен ли класс для поддержки такого метода, или генерирует предупреждение или ошибку. . Однако если переменная типа я бы
, компилятор позволит вызвать на нем любой метод.
В JS ++ язык программирования, выпущенный в 2011 году, представляет собой надмножество JavaScript (динамически типизированный) с системой постепенного набора, которая звук за ECMAScript и ДОМ Угловые корпуса API.[15]
Рекомендации
- ^ а б Зик, Джереми. "Что такое постепенный набор текста?".
- ^ Зик, Джереми; Таха, Валид (сентябрь 2006 г.). Постепенный набор текста для функциональных языков (PDF). Схема и функциональное программирование 2006. Чикагский университет. С. 81–92.
- ^ Тэтт, Сатиш (1990). Квазистатическая типизация. POPL 1990: Принципы языков программирования ACM. ACM. С. 367–381. Дои:10.1145/96709.96747. ISBN 978-0897913430.
- ^ Олиарт, Альберто (1994). Алгоритм вывода квазистатических типов (Технический отчет). Бостонский университет. 1994-013.
- ^ Зик, Джереми; Таха, Валид (август 2007 г.). Постепенный ввод объектов. ECOOP 2007: Европейская конференция по объектно-ориентированному программированию. Конспект лекций по информатике. 4609. Springer. С. 2–27. Дои: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. Дои:10.1145/2660193.2660215. ISBN 978-1-4503-2585-1.
- ^ Swamy, N .; Fournet, C .; Растоги, А .; Bhargavan, K .; Chen, J .; Strub, P. Y .; Бирман, Г. (2014). «Постепенный набор текста надежно встроен в JavaScript». Материалы 41-го симпозиума ACM SIGPLAN-SIGACT по принципам языков программирования - POPL '14 (PDF). С. 425–437. Дои:10.1145/2535838.2535889. ISBN 9781450325448.
- ^ «PHP: аргументы функций - Руководство» Строгий ввод ».
- ^ Час Эмерик. «Типизированное руководство пользователя Clojure».
- ^ Юкка Лехтосало. «mypy - Дополнительная статическая типизация для Python».
- ^ "Pyre - эффективная проверка типов для Python 3".
- ^ Асим Растоги; Авик Чаудхури; Бэзил Хосмер (январь 2012 г.). «Плюсы и минусы постепенного вывода типов» (PDF). Ассоциация вычислительной техники (ACM). Получено 2014-09-23.
- ^ "тип-система-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. Дои:10.4230 / lipics.snapl.2015.274. ISBN 9783939897804.