gpt4 book ai didi

types - Julia 是动态类型的吗?

转载 作者:行者123 更新时间:2023-12-05 00:59:17 24 4
gpt4 key购买 nike

很多博客,还有manual itself ,说 Julia 是 dynamically typed .
但是从我对手册的阅读来看,对我来说听起来更像是
statically typedtype inference , 喜欢 F# .

  • Julia 是否使用类型推断进行静态类型化?
  • 它是动态类型的吗?
  • 我假设它是动态输入的,手册似乎不太可能是错误的。
  • Julia 中是否涉及类型推断?
  • 最佳答案

    蒂姆·霍利 (Tim Holy) 的回答非常正确,但我会详细说明一下。首先,让我们定义一些术语——你可能不同意我的定义,但至少你会知道我在说什么。在我看来,静态语言和动态语言的主要区别在于:在静态语言中,表达式有类型;在动态语言中,值有类型。
    在静态语言中,有确定程序中每个表达式类型的规则。表达式的类型决定了程序的行为。不允许为每个表达式确定一致类型的程序被认为是不正确的并且不会编译。在多态存在的情况下,表达式的类型可能不是单一的具体类型:参数多态可以被认为是一种让相同的代码描述整个系列具体类型算法的方式,由类型的参数索引;子类型多态可以被认为是将有限数量的动态行为引入到静态语言中。
    另一方面,动态语言没有为表达式分配类型的规则:类型是由数据在程序执行时流经程序的方式所隐含的。一般来说,表达式可能会产生任何类型的值。因此,类型理论家有时将动态语言描述为“单类型”——即从静态角度来看,“类型”本质上是表达式的一个属性,动态语言中的所有表达式都具有类型 Any .当然,这是将类型的静态概念(仅对表达式有意义)应用于类型概念仅对值有意义的语言。
    Julia 完全属于动态阵营:类型是值的属性,而不是表达式。代码的结果类型取决于执行时值如何流经它;该语言不包含在执行表达式之前为表达式分配类型的任何规则。然而,与许多动态语言不同,Julia 有一种相当复杂的语言来讨论类型,并且您可以使用类型注释表达式。例如,x::Tx 的断言是类型 T 的值;如果这是真的,x::T计算为 x 的值,否则会引发错误并且表达式不返回任何值。方法签名中的类型注释的含义略有不同:它们不是断言现有值的类型,而是表明该方法仅在相应的参数为指定类型时才适用。无论哪种情况,以下代码都可以安全地假设 x 的值类型为 T .
    [旁白:在一些具有“渐进”或“可选”类型的语言中,类型注释将语言从动态模式切换到静态模式:没有类型注释的方法是动态的;带有类型注解的方法是静态的。在静态代码中,有为所有表达式分配类型的规则,代码必须满足这些规则。这不是 Julia 的工作方式——带有类型注释的代码仍然是动态的,并且与没有类型注释的代码具有相同的语义。]
    F#、OCaml 或 Haskell 等语言中的类型推断是确定表达式类型的方式的一部分。如果编译器无法推断任何表达式的类型,则您的程序已损坏且无法编译。这些语言都使用某种形式的 Hindley-Milner 类型推断,这是一种非常聪明的方式,可以从代码结构中推导出表达式类型,而无需写出显式类型(将其与动态语言相比,其中类型由代码的执行)。大多数时候根本不需要类型注释,与 C++、C# 和 Java 等语言中可能需要的冗长类型声明相比,这非常令人愉快。然而,这与不需要类型注释的 Julia 和 Python 等动态语言大不相同,因为表达式没有预先确定的类型是完全可以接受的。在 Hindley-Milner 语言中,您可能不必编写与 C++ 或 Java 一样多的类型,但每个表达式都必须具有编译器可以计算的预定类型。
    Julia 的编译器会进行类型推断,但它非常不同:并非每个表达式都必须具有可推断类型。编译器分析代码以尝试预测表达式的类型,并使用该信息生成更高效的机器代码。但是,如果它不能确定表达式的类型,那也没什么大不了的:编译器只是使用运行时类型信息发出无论如何都可以工作的通用代码。在 Julia 中的大多数情况下,类型推断只是一种优化——无论有没有它,你的代码都会以相同的方式工作——但是如果成功的类型推断,它会运行得更快。

    关于types - Julia 是动态类型的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28078089/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com