Системы типов |
---|
Общие понятия |
Основные категории |
Второстепенные категории |
Смотрите также |
В программировании теории языка , FLOW-чувствительный ввод (также называемое типирование потока или возникновение типирование ) представляет собой система типа , где тип из выражения зависит от его позиции в потоке управления .
В языках со статической типизацией тип выражения определяется типами составляющих его подвыражений. Однако при типизации, чувствительной к потоку, тип выражения может быть обновлен до более конкретного типа, если он следует за инструкцией, которая проверяет его тип. Тип определяется с помощью вывода типа, а информация о типе передается с использованием алгебраических типов данных .
Пример [ править ]
Цейлон [ править ]
См. Следующий пример на Цейлоне, который иллюстрирует эту концепцию:
// Объект? означает, что переменная name имеет тип Object, иначе null void hello ( Object ? name ) { if ( is String name ) { // "name" теперь имеет тип String в этом блоке print ( "Hello,` `name`` ! " ); // и для переменной можно вызывать методы String print ( "String.size is` name.size`` ); } else if ( exists name ) { // "имя" теперь имеет тип Object в этом блоке print ("Здравствуйте, объект` name``! " ); } else { print ( "Привет, мир!" ); } } привет ( ноль ); привет ( 1 ); привет ( «Джон Доу» );
Какие выходы:
Привет мир!Привет, объект 1!Привет, Джон Доу! String.size - 8
Котлин [ править ]
См. Этот пример в Котлине :
fun hello ( obj : Any ) { // Приведение типа не выполняется, если `obj` не является String obj as String // Поскольку приведение типа не завершилось ошибкой, `obj` должен быть String! val l = obj . длина println ( "' $ obj ' - строка длины $ l " ) } привет ( "Муооо" )
Преимущества [ править ]
Этот метод в сочетании с выводом типа снижает потребность в написании аннотаций типов для всех переменных или в приведении типов , как это наблюдается в динамических языках , использующих утиную типизацию . Это снижает многословие и делает код более лаконичным, его легче читать и изменять.
Это также может помочь разработчикам языков предоставлять реализации, которые быстрее выполняют динамические языки, статически предсказывая тип объектов. [1]
Наконец, это увеличивает безопасность типов и может предотвратить проблемы, связанные с нулевыми указателями [ как? ] , которую КАР Хоар - изобретатель с нулевой ссылкой - назвал «ошибкой на миллиард долларов» [2]
Реализации [ править ]
Типизированная схема, система типов для схемы , была первой системой типов с этой функцией. [3] Вскоре после этого Дэвид Дж. Пирс независимо заново изобрел его на языке Whiley , первом языке, в котором эта функция была встроена. [4] [5]
Преемник Typed Scheme, Typed Racket (диалект Racket ), по-прежнему широко использует типизацию вхождения. [6] С тех пор он появился на Цейлоне , [7] TypeScript [8] и Facebook Flow. [9]
Есть также несколько языков, которые не имеют типов объединения, но имеют типы , допускающие значение NULL , которые имеют ограниченную форму этой функции, которая применяется только к типам, допускающим значение NULL, например C # , [10] Kotlin , [11] [12] и Омар. [13]
Внешние ссылки [ править ]
- ↑ Лукас Эдер (11 декабря 2014 г.). «Неудобная правда о динамической и статической печати» . blog.jooq.org . Проверено 11 марта +2016 .
- ^ Тони Хоар (2009-08-25). «Нулевые ссылки: ошибка в миллиард долларов» . InfoQ.com.
Я называю это своей ошибкой на миллиард долларов. Это было изобретение нулевой ссылки в 1965 году. В то время я проектировал первую всеобъемлющую систему типов для ссылок на объектно-ориентированном языке (
АЛГОЛ W
). Моя цель состояла в том, чтобы гарантировать, что любое использование ссылок должно быть абсолютно безопасным, с автоматической проверкой компилятором. Но я не мог устоять перед соблазном вставить пустую ссылку просто потому, что это было так легко реализовать. Это привело к бесчисленным ошибкам, уязвимостям и системным сбоям, которые, вероятно, причинили боль и ущерб на миллиард долларов за последние сорок лет.
- ^ «Дизайн и реализация типизированной схемы | Lambda the Ultimate, 2008» . lambda-the-ultimate.org .
- ↑ Дэвид Дж. Пирс (22 сентября 2010 г.). «О чувствительных к потоку типах в Уэйри» . whiley.org . Проверено 11 марта +2016 .
- ↑ Дэвид Дж. Пирс (8 апреля 2012 г.). «Пока - Flow Typing» . whiley.org . Проверено 11 марта +2016 .
- ^ "5 Вхождение" . docs.racket-lang.org .
- ^ «Цейлон - Краткое введение - Типобезопасная ноль и чувствительная к потоку типизация» . ceylon-lang.org . Проверено 11 марта +2016 .
- ↑ Райан Кавано (18 ноября 2014 г.). «Краткий обзор TypeScript 1.4: типы объединений, средства защиты типов и многое другое» . blogs.msdn.microsoft.com . Проверено 11 марта +2016 .
- ^ Авик Чоудхури, Василий Хосмер, Гавриил Леви (18 ноября 2014). «Flow, новая программа проверки статического типа для JavaScript» . code.facebook.com . Проверено 11 марта +2016 .CS1 maint: использует параметр авторов ( ссылка )
- ^ «Дизайн со ссылочными типами, допускающими значение NULL» . docs.microsoft.com .
- ^ "Нулевая безопасность" . kotlinlang.org . Проверено 11 марта +2016 .
- ^ "Проверка типов и приведение" . kotlinlang.org . Проверено 11 марта +2016 .
- ^ "Система типов омаров" . aardappel.github.io .