流敏感型

2020-11-22 23:00:05

跳转至导航跳转至搜索在编程语言理论中,流敏感类型(或流类型)是一种类型系统,其中表达式的类型取决于其在控制流中的位置。

在静态类型语言中,表达式的类型由组成它的子表达式的类型确定。但是,在流敏感类型中,如果表达式的类型遵循验证其类型的语句,则可以将其类型更新为更特定的类型。通过使用类型推断确定类型,并使用代数数据类型携带类型信息。

//对象?表示变量“名称”为Object类型,否则为null void hello(Object?name){如果(是字符串名称){//“名称”现在在此块打印中具有String类型(“ Hello,``name`` !“); //并且可以在变量print上调用String方法(“ String.size为``name.size``”); }否则if(存在名称){//“名称”现在在此块打印中具有对象类型(“ Hello,object``name``!”); } else {print(“ Hello,world!”);你好(null);你好(1);你好(“ John Doe”);

fun hello(obj:Any){//如果`obj`不是String obj,则类型转换将失败,因为// //由于类型转换没有失败,所以`obj`必须是String! val l = obj。长度println(“'$ obj'是长度为$ l的字符串”)}你好(“ Mooooo”)

这种技术与类型推断相结合,减少了为所有变量编写类型注释或进行类型转换的需求,就像使用鸭子类型的动态语言所看到的那样。它减少了冗长性并弥补了简短代码,更易于阅读和修改。

它还可以通过静态预测对象的类型来帮助语言实现者提供更快地执行动态语言的实现。 [1]

最后,它提高了类型安全性,并可以防止由C.A.R.标记的空指针[how?]引起的问题。 Hoare-空引用发明者-“十亿美元的错误” [2]

由David J. Pearce创建的Whiley是2009年第一种使用流敏感类型的语言。[3] [4]

自介绍以来,其他语言都使用了它,例如Ceylon,[5] Kotlin,[6] [7] TypeScript [8]和Facebook Flow。 [9]

^卢卡斯·埃德(2014年12月11日)。 “关于动态打字与静态打字的不便之处”。 blog.jooq.org。

^托尼·霍尔(Tony Hoare)(2009-08-25)。 “空引用:十亿美元的错误”。 InfoQ.com。我称之为我的十亿美元错误。这是在1965年发明空引用的。那时,我正在设计第一个全面的类型系统,用于面向对象语言(ALGOL W)的引用。我的目标是确保对引用的所有使用都绝对安全,并由编译器自动执行检查。但是我无法抗拒引入空引用的诱惑,只是因为它是如此容易实现。这导致了无数错误,漏洞和系统崩溃,在最近四十年中可能造成十亿美元的痛苦和破坏。

^ Ryan Cavanaugh(2014年11月18日)。 “ TypeScript 1.4速览:联合类型,类型卫士等”。 blogs.msdn.microsoft.com。

^阿维克·乔杜里(Avik Chaudhuri),罗勒·霍斯默(Basil Hosmer),加布里埃尔·列维(Gabriel Levi)(2014年11月18日)。 “ Flow,一个新的JavaScript静态类型检查器”。 code.facebook.com。 CS1维护:使用作者参数(链接)