Из Википедии, свободной энциклопедии
Перейти к навигации Перейти к поиску

В программировании теории языка , 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]

Внешние ссылки [ править ]

  1. Лукас Эдер (11 декабря 2014 г.). «Неудобная правда о динамической и статической печати» . blog.jooq.org . Проверено 11 марта +2016 .
  2. ^ Тони Хоар (2009-08-25). «Нулевые ссылки: ошибка в миллиард долларов» . InfoQ.com. Я называю это своей ошибкой на миллиард долларов. Это было изобретение нулевой ссылки в 1965 году. В то время я проектировал первую всеобъемлющую систему типов для ссылок на объектно-ориентированном языке ( АЛГОЛ W ). Моя цель состояла в том, чтобы гарантировать, что любое использование ссылок должно быть абсолютно безопасным, с автоматической проверкой компилятором. Но я не мог устоять перед соблазном вставить пустую ссылку просто потому, что это было так легко реализовать. Это привело к бесчисленным ошибкам, уязвимостям и системным сбоям, которые, вероятно, причинили боль и ущерб на миллиард долларов за последние сорок лет.
  3. ^ «Дизайн и реализация типизированной схемы | Lambda the Ultimate, 2008» . lambda-the-ultimate.org .
  4. Дэвид Дж. Пирс (22 сентября 2010 г.). «О чувствительных к потоку типах в Уэйри» . whiley.org . Проверено 11 марта +2016 .
  5. Дэвид Дж. Пирс (8 апреля 2012 г.). «Пока - Flow Typing» . whiley.org . Проверено 11 марта +2016 .
  6. ^ "5 Вхождение" . docs.racket-lang.org .
  7. ^ «Цейлон - Краткое введение - Типобезопасная ноль и чувствительная к потоку типизация» . ceylon-lang.org . Проверено 11 марта +2016 .
  8. Райан Кавано (18 ноября 2014 г.). «Краткий обзор TypeScript 1.4: типы объединений, средства защиты типов и многое другое» . blogs.msdn.microsoft.com . Проверено 11 марта +2016 .
  9. ^ Авик Чоудхури, Василий Хосмер, Гавриил Леви (18 ноября 2014). «Flow, новая программа проверки статического типа для JavaScript» . code.facebook.com . Проверено 11 марта +2016 .CS1 maint: использует параметр авторов ( ссылка )
  10. ^ «Дизайн со ссылочными типами, допускающими значение NULL» . docs.microsoft.com .
  11. ^ "Нулевая безопасность" . kotlinlang.org . Проверено 11 марта +2016 .
  12. ^ "Проверка типов и приведение" . kotlinlang.org . Проверено 11 марта +2016 .
  13. ^ "Система типов омаров" . aardappel.github.io .