Julia是dynamicinput的吗?
很多博客和手册本身都说Julia是dynamicinput的 。 但是从阅读本手册开始,听起来更像是静态键入 types推理 ,如F# 。
- Julia静态地键入types推断?
- 它是dynamicinput的吗?
- 我假设它是dynamicinput的,手册看起来不太可能是错误的。
- types推断是否涉及Julia?
Tim Holy的回答是非常正确的,但我会详细说明一下。 首先,我们定义一些术语 – 你可能不同意我的定义,但至less你会知道我在说什么。 在我看来,静态和dynamic语言之间的主要区别在于:在静态语言中,expression式具有types; 在dynamic语言中,值有types。
在静态语言中,有一些规则用于确定程序中每个expression式的types。 expression式的types决定了程序的行为。 一个程序,不承认一致的types来确定每一个expression式被认为是不正确的,将不会编译。 在存在多态性的情况下,expression式的types可能不是单一的具体types:参数多态性可以被认为是让相同的代码描述整个系列的具体types的algorithm的一种方式,由types的参数索引; 亚型多态性可以被认为是将有限的dynamic行为引入静态语言中。
另一方面,dynamic语言没有为expression式分配types的规则:types是数据在执行时通过程序stream动的方式所隐含的。 一般来说,expression式可能会产生任何types的值。 正因为如此,types理论家有时将dynamic语言描述为“统一” – 即从静态angular度来看,“types”本质上是expression式的一个属性,dynamic语言中的所有expression式的types都是Any
。 当然,这就是将types的静态概念(仅对expression式有意义)应用于types的概念仅对值有意义的语言。
朱莉娅正处于dynamic阵营中:types是价值而不是expression的属性。 代码的结果types由执行时的值如何决定, 该语言在执行它们之前不包括为expression式分配types的任何规则。 但是,与许多dynamic语言不同的是,Julia有一个相当复杂的语言来讨论types,并且可以用types注释expression式。 例如, x::T
是一个断言, x
是typesT
的值; 如果这是真的, x::T
计算结果为x
的值,否则引发错误,expression式不返回任何值。 方法签名中的types注释具有稍微不同的含义:不是断言现有值的types,而是指示该方法仅适用于相应参数是指定types的情况。 在任何一种情况下,下面的代码都可以安全地假定x
的值是typesT
[另外:在某些语言中使用“逐渐”或“可选”键入,键入注释将语言从dynamic切换到静态模式:没有键入注释的方法是dynamic的; types注释的方法是静态的。 在静态代码中,存在为所有expression式分配types的规则,并且代码必须满足这些规则。 这不是Julia的工作方式 – 带有types注释的代码仍然是dynamic的,并且具有与没有types注释的代码相同的语义。
F#,OCaml或Haskell等语言中的types推断是如何确定expression式的types的一部分。 如果编译器不能推断出任何expression式的types,那么你的程序就会中断,不会编译。 这些语言都使用某种forms的Hindley-Milnertypes推断,这是从代码结构中派生出expression式types的一种非常聪明的方式,而不必写出明确的types(将其与dynamic语言进行比较,其中types被执行代码)。 很多时候,根本不需要types注释,与C ++,C#和Java等语言中需要的冗长types声明相比,这是非常令人愉快的。 然而,与Julia和Python这样的dynamic语言完全不同,因为对于不具有预定types的expression式来说,完全可以接受types注释是不需要的。 在Hindley-Milner语言中,可能不需要编写与C ++或Javatypes相同的types,但每个expression式都有一个预定义types,编译器可以计算。
Julia的编译器可以进行types推断,但它有很大的不同:每个expression式都没有必要具有可推断的types。 编译器会分析代码以尝试预测expression式的types,并使用该信息生成更高效的机器码。 但是,如果它不能确定expression式的types,那么没有什么大不了的:编译器只是发出通用的代码,无论如何,它都会使用运行时types信息。 对于Julia大部分,types推断只是一种优化 – 你的代码在有或没有它的情况下将以相同的方式工作 – 但是通过成功的types推断,它将运行得更快。
两者都是事实。 Julia是dynamictypes的,但是在写得很好的julia代码中,通常可以推断出types。 如果可能的话,你经常会获得重大的性能提升。
在FAQ中有一些讨论。
以下是“ Julia编程语言入门”一书的摘录:
指定参数types来限制调用时传递的参数types也是有用的。 我们的浮点数函数头然后看起来像函数mult(x :: Float64,y :: Float64)。 当我们用mult(5,6)调用这个函数时,我们收到一个错误ERROR:'mult'没有匹配mult(:: Int64,:: Int64)的方法,certificate了Julia确实是一个强types语言。 它不接受浮点参数的整数参数。
这是本书中的示例函数:
function mult(x::Float64, y::Float64) x * y end mult(5, 6) # raises an error mult(5.0, 6.0) # => 30.0
我不确定这本书是否正确,但它与所有其他答案相矛盾。
它是dynamictypes的,但是如果你指定一个types如variables::types,你可以认为这个variables是静态types的(当编译器不能自动推断types时,这会提高性能)