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

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

История

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

Выполнение

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

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

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

Примеры

Примеры языков с постепенной типизацией, производных от существующих языков с динамической типизацией, включают: Компилятор закрытия, Машинопись (как для JavaScript[6]),[7] Взломать (для PHP), PHP (начиная с 7.0[8]), Typed Racket (для Ракетка ), Типизированный Clojure (для Clojure ),[9] CythonPython компилятор), 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]

Рекомендации

  1. ^ а б Зик, Джереми. "Что такое постепенный набор текста?".
  2. ^ Зик, Джереми; Таха, Валид (сентябрь 2006 г.). Постепенный набор текста для функциональных языков (PDF). Схема и функциональное программирование 2006. Чикагский университет. С. 81–92.
  3. ^ Тэтт, Сатиш (1990). Квазистатическая типизация. POPL 1990: Принципы языков программирования ACM. ACM. С. 367–381. Дои:10.1145/96709.96747. ISBN  978-0897913430.
  4. ^ Олиарт, Альберто (1994). Алгоритм вывода квазистатических типов (Технический отчет). Бостонский университет. 1994-013.
  5. ^ Зик, Джереми; Таха, Валид (август 2007 г.). Постепенный ввод объектов. ECOOP 2007: Европейская конференция по объектно-ориентированному программированию. Конспект лекций по информатике. 4609. Springer. С. 2–27. Дои:10.1007/978-3-540-73589-2_2. ISBN  978-3-540-73588-5.
  6. ^ Feldthaus, Asger; Мёллер, Андерс (2014). «Проверка корректности интерфейсов TypeScript для библиотек JavaScript». Материалы Международной конференции ACM 2014 по языкам и приложениям систем объектно-ориентированного программирования - OOPSLA '14. Портленд, Орегон, США: ACM Press: 1–16. Дои:10.1145/2660193.2660215. ISBN  978-1-4503-2585-1.
  7. ^ 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.
  8. ^ «PHP: аргументы функций - Руководство» Строгий ввод ».
  9. ^ Час Эмерик. «Типизированное руководство пользователя Clojure».
  10. ^ Юкка Лехтосало. «mypy - Дополнительная статическая типизация для Python».
  11. ^ "Pyre - эффективная проверка типов для Python 3".
  12. ^ Асим Растоги; Авик Чаудхури; Бэзил Хосмер (январь 2012 г.). «Плюсы и минусы постепенного вывода типов» (PDF). Ассоциация вычислительной техники (ACM). Получено 2014-09-23.
  13. ^ "тип-система-j".
  14. ^ "динамический (Справочник по C #)". Библиотека MSDN. Microsoft. Получено 14 января 2014.
  15. ^ «Система типов 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.