Programming languages 什么是类型推断?

Programming languages 什么是类型推断?,programming-languages,types,type-inference,type-systems,Programming Languages,Types,Type Inference,Type Systems,它是否只存在于静态类型语言中?它是否只有在语言不是强类型时才存在(例如,Java是否有强类型)?另外,它属于哪里?在编译阶段,假设它是一种编译语言 一般来说,当类型不明确时,规则是由语言规范规定的还是由实现决定的?类型推断器从上下文确定变量的类型。它依赖于强类型来实现这一点。例如,函数式语言是非常强的静态类型,但完全依赖于类型推断 C#和VB.Net是具有类型推理的静态类型语言的其他示例(它们提供类型推理是为了使泛型可用,并且它是LINQ中的查询所必需的,特别是为了支持投影) 动态语言不推断类型

它是否只存在于静态类型语言中?它是否只有在语言不是强类型时才存在(例如,Java是否有强类型)?另外,它属于哪里?在编译阶段,假设它是一种编译语言


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

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

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


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

类型推断在一些静态语言中有点折衷。如果可以在编译时推断类型,则可以在不指定类型的情况下声明变量。它不提供潜在类型的灵活性,但您可以获得类型安全性,并且不必编写太多的内容


请参阅。

类型推断是某些静态类型语言的一项功能。编译器将类型分配给缺少任何类型注释的实体。编译器实际上只是代表程序员“填充”静态类型信息

类型推断往往在具有许多隐式强制和歧义的语言中工作得更差,因此大多数类型推断语言都是函数式语言,几乎没有强制、重载等方式

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


尽管一些(大多数?)语言支持一些有限形式的类型推断(例如C#中的“var”),但大多数人使用“类型推断”来指代绝大多数类型是推断的而不是显式的语言(例如,在F#中,除了局部变量外,函数和方法签名通常是推断出来的;与C#相反,“var”允许推断局部变量,但方法声明需要完整的类型信息)类型推断器是任何使用类型推断算法静态推断类型的东西。因此,它不仅仅是静态语言的一个特性

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

因此,使用类型推断:

  • 为了避免静态语言中的类型注释
  • 在为动态语言(即Scheme、Self和Python)优化编译器时
  • 用于动态语言的错误检查工具、编译器和安全分析