什么是类型推断?

3

它只存在于静态类型语言中吗?当语言不是强类型时(即Java是否有此项功能)?此外,它属于哪个阶段 - 假设它是编译型语言,那么它属于编译阶段吗?

一般来说,当类型模糊不清时的规则是由语言规范决定还是由实现决定?

4个回答

5
类型推断是某些静态类型语言的一个特性。编译器会为没有任何类型注释的实体分配类型,以代表程序员填写静态类型信息。
类型推断在有许多隐式强制转换和歧义的语言中往往效果较差,因此大多数支持类型推断的语言都是功能型语言,几乎没有强制转换、重载等问题。
类型推断是语言规范的一部分,例如F#规范详细介绍了类型推断算法和规则,因为这有效地决定了“什么是合法程序”。
尽管一些(大多数?)语言支持某些有限形式的类型推断(例如C#中的'var'),但大多数情况下人们使用“类型推断”来指代大部分类型都是隐式推断而非显式声明的语言(例如在F#中,函数和方法签名以及局部变量通常都是推断的;相比之下,在C#中,“var”允许推断局部变量,但方法声明需要完整的类型信息)。

2

类型推断器可以从上下文中确定变量的类型。它依赖于强类型来实现。例如,函数式语言非常强大,静态类型但完全依赖于类型推断。

C#和VB.Net是其他具有类型推断的静态类型语言的示例(它们提供类型推断以使泛型可用,并且在LINQ中需要支持投影,因此必须使用它)。

动态语言不会推断类型,它是在运行时发现的。


0

类型推断是一些静态语言中的妥协。您可以声明变量而不指定类型,前提是该类型可以在编译时被推断出来。它不提供潜在类型的灵活性,但您可以获得类型安全性,并且无需编写太多代码。

请参见维基百科文章


0

类型推断器是通过使用类型推断算法静态地推导类型的任何东西。因此,它不仅是静态语言的一个特性。

您可以为动态语言或具有不安全或隐式类型转换的语言构建静态分析工具,并且类型推断将成为其工作的重要部分。但是,对于具有不安全或动态类型系统或包含隐式转换的语言,通常不能使用类型推断来证明程序在一般情况下的类型安全性。

因此,类型推断用于:

  • 避免在静态语言中使用类型注释
  • 用于动态语言的优化编译器(例如Scheme、Self和Python)
  • 用于动态语言的漏洞检查工具、编译器和安全性分析。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接