什么是类型推理器?

时间:2009-03-28 03:01:44

标签: programming-languages types type-inference type-systems

它只存在于静态类型语言中吗?只有当语言没有强类型时(即Java有一个),它才会出现吗?此外,它属于哪里 - 在编译阶段假设它是一种编译语言?

一般情况下,当语言规范所规定的类型不明确或者实施时是否存在规则?

4 个答案:

答案 0 :(得分:4)

类型推断是某些静态类型语言的一个特性。它由编译器完成,以将类型分配给否则缺少任何类型注释的实体。编译器有效地代表程序员“填写”静态类型信息。

类型推断往往在具有许多隐式强制和模糊性的语言中工作得更差,因此大多数类型推理语言都是功能语言,几乎没有强制,重载等方式。

类型推断是语言规范的一部分,例如F#规范详细介绍了类型推断算法和规则,因为这有效地确定了“什么是合法程序”。

虽然一些(大多数?)语言支持某些有限形式的类型推断(例如C#中的'var'),但大多数人使用“类型推断”来指代推断绝大多数类型的语言,而不是显式(例如在F#中,函数和方法签名,除局部变量外,通常也是推断的;与C#形成对比,其中'var'允许推断局部变量,但方法声明需要完整的类型信息)。

答案 1 :(得分:2)

类型推断器确定变量来自上下文的类型。它依靠强大的打字来做到这一点。例如,函数式语言非常强大,静态类型,但完全依赖于类型推断。

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

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

答案 2 :(得分:0)

在某些静态语言中,类型推理有点折衷。您可以在不指定类型的情况下声明变量,前提是可以在编译时推断类型。它不提供潜在打字的灵活性,但你确实获得了类型安全,你不必写得那么多。

请参阅the Wikipedia article

答案 3 :(得分:0)

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

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

使用这种类型推断:

  • 以避免使用静态语言中的类型注释,
  • 优化动态语言的编译器(即Scheme,Self和Python),
  • 用于动态语言的错误检查工具,编译器和安全性分析。