Types 朱莉娅是动态输入的吗?

Types 朱莉娅是动态输入的吗?,types,type-inference,julia,Types,Type Inference,Julia,很多博客和杂志都说朱莉娅是。 但从我对手册的阅读来看,听起来更像是这样 像是 Julia是否使用类型推断静态类型化? 它是动态键入的吗? 我假设它是动态输入的,看来手册不太可能是错的 朱莉娅是否涉及类型推断? 两者都是正确的。Julia是动态类型的,但是在编写良好的Julia代码中,通常可以推断出类型。在可能的情况下,您通常会获得重大的性能提升 对此有一些讨论。蒂姆·霍利的回答非常正确,但我会详细说明一下。首先,让我们定义一些术语——你可能不同意我的定义,但至少你知道我在说什么。在我看来,静态

很多博客和杂志都说朱莉娅是。 但从我对手册的阅读来看,听起来更像是这样 像是

  • Julia是否使用类型推断静态类型化?
  • 它是动态键入的吗?
  • 我假设它是动态输入的,看来手册不太可能是错的
  • 朱莉娅是否涉及类型推断?

    • 两者都是正确的。Julia是动态类型的,但是在编写良好的Julia代码中,通常可以推断出类型。在可能的情况下,您通常会获得重大的性能提升


      对此有一些讨论。

      蒂姆·霍利的回答非常正确,但我会详细说明一下。首先,让我们定义一些术语——你可能不同意我的定义,但至少你知道我在说什么。在我看来,静态语言和动态语言的主要区别在于:在静态语言中,表达式有类型;在动态语言中,值具有类型

      在静态语言中,有确定程序中每个表达式类型的规则。表达式的类型决定了程序的行为。不允许为每个表达式确定一致类型的程序被认为是不正确的,并且不会编译。在存在多态性的情况下,表达式的类型可能不是单一的具体类型:参数多态性可以被认为是让同一代码描述一系列具体类型算法的一种方式,这些算法由类型的参数索引;子类型多态性可以被认为是在一种静态语言中引入了有限的动态行为

      另一方面,动态语言没有为表达式指定类型的规则:类型是通过程序执行时数据流经程序的方式隐含的。通常,表达式可能会生成任何类型的值。正因为如此,类型理论家有时将动态语言描述为“单位类型”——也就是说,从静态角度看,“类型”本质上是表达式的属性,动态语言中的所有表达式都具有类型
      Any
      。当然,这是将类型的静态概念(仅对表达式有意义)应用于类型概念仅对值有意义的语言

      Julia完全处于动态阵营中:类型是值的属性,而不是表达式。代码的结果类型取决于执行时值如何流经代码;该语言不包括在执行表达式之前为表达式指定类型的任何规则。然而,与许多动态语言不同的是,Julia有一种相当复杂的语言来讨论类型,您可以用类型注释表达式。例如,
      x::T
      是断言
      x
      T
      类型的值;如果这是真的,
      x::T
      计算为
      x
      的值,否则将引发错误,表达式不返回任何值。方法签名中的类型注释的含义稍有不同:它们不是断言现有值的类型,而是指示仅当相应的参数为指定类型时,方法才适用。在任何一种情况下,以下代码都可以安全地假定
      x
      的值属于
      T
      类型

      [旁白:在某些语言中带有“渐进”或“可选”类型、类型批注将语言从动态模式切换到静态模式:没有类型批注的方法是动态的;带有类型批注的方法是静态的。在静态代码中,有为所有表达式分配类型的规则,代码必须满足这些规则。Julia不是这样工作的–带有类型批注的代码仍然是动态的d与不带类型注释的代码具有相同的语义。]

      像F#、OCaml或Haskell这样的语言中的类型推断是确定表达式类型的一部分。如果编译器无法推断任何表达式的类型,则您的程序已损坏,将无法编译。这些语言都使用某种形式的Hindley-Milner类型推断,这是一种非常聪明的方法,可以从代码结构中派生表达式类型,而不必写出显式类型(与动态语言相比,在动态语言中,类型是通过执行代码隐含的)。很多时候根本不需要类型注释,这与在C++语言、C语言和java语言中可能需要的冗长类型声明相比是非常令人愉快的。然而,这与Julia和Python这样的动态语言非常不同,后者不需要类型注释,因为表达式没有预先确定的类型是完全可以接受的。在Hindley Milner语言中,您可能不必编写与C++或java一样多的类型,但是每个表达式都必须具有编译器能够计算的预定类型。
      Julia的编译器进行类型推断,但这是非常不同的:并非每个表达式都有可推断的类型。编译器分析代码以尝试预测表达式的类型,并使用该信息生成更高效的机器代码。但是,如果它不能确定表达式的类型,那也没什么大不了的:编译器只是使用运行时类型信息发出无论如何都能工作的通用代码。在Julia中,类型推断在很大程度上只是一种优化——不管有没有它,您的代码都将以相同的方式工作——但如果成功进行类型推断,它将运行得更快。

      它是动态类型的,但如果您指定类似variable::type的类型,则可以将该变量视为静态类型(在编译器无法自动推断类型的情况下,这将提高性能)

      删除类型注释并不会改变Julia程序的含义,这当然不是真的。因为Julia的方法分派是如何工作的。@Steven\u Obua