我听说类型稳定性使Julia变得如此之快,同时仍然像其他解释语言(如Python)一样具有表现力。
答案 0 :(得分:10)
类型稳定性允许编译器在编译时直接从输入类型确定函数的输出类型。因为Julia对每种输入类型都专门进行编译,所以这意味着,如果所有函数都是类型稳定的,则编译器可以推断出函数调用内每个值的类型。发生这种情况时,Julia的JIT编译器将实质上创建该方法的静态类型版本,并构建LLVM IR来编译该静态版本,其中该静态版本与使用clang(LLVM)编译的C本质上是相同的汇编代码。
这意味着,如果编译器可以推断出每个变量的基本类型,它将并且将发出强制保留这些类型的代码,就像被完全注释的C代码一样。 Julia的动态方式是,当它不成立时,它将“装箱”变量,本质上创建一个新类型,显示“我不知道类型是什么”,并添加用于强制类型检查的代码并在运行时调度计算以处理动态性。因此,如果知道所有类型信息,Julia的动态性就会消失,甚至在运行的代码中甚至不再存在。
这也是为什么多重发送对语言如此重要的原因,因为多重发送意味着f(x)
对于f(x::Float64)
具有不同的方法(即使您未指定具体版本,编译器将推论和使用这种方法,称为自动类型规范化,现在,具体版本比常规版本更稳定。将多个分派作为功能公开实际上只是允许您拦截编译的这一阶段并允许更改type-> code关系。