类型稳定性如何使Julia如此之快?

Unc*_*ers 1 types runtime julia

我听说类型稳定性是使Julia如此快速的原因,同时仍然像其他解释性语言(如Python)一样富有表现力.

Chr*_*kas 10

类型稳定性允许编译器在编译时直接从输入类型确定函数的输出类型.因为Julia专门对每个输入类型进行编译,这意味着如果所有函数都是类型稳定的,编译器可以推导出函数调用中每个值的类型.当发生这种情况时,Julia的JIT编译器将基本上创建该方法的静态类型版本并构建LLVM IR以编译该静态版本,其中该静态版本与使用clang(LLVM)编译的C基本上是相同的汇编代码.

这意味着,如果编译器可以推导出每个变量的基本类型,它将会发出强制这些类型保存的代码,就好像它是完全注释的C代码一样.Julia是动态的方式是,当它不成立时,它将"包装"变量,实质上创建一个新类型,说"我不知道类型是什么",并添加代码强制类型检查并在运行时调度计算以处理动态性.因此,如果所有类型信息都是已知的,那么Julia的动态性就会被编译掉并且甚至不再存在于运行的代码中.

这也是为什么多个调度对语言如此重要的原因,因为多个调度则意味着f(x)具有不同的方法f(x::Float64)(即使您没有指定具体版本,编译器也会推导并使用它,称为自动类型专用) ,现在具体版本比一般版本更可能稳定.将多个调度公开为一个功能实际上只是允许您拦截编译的这个阶段并允许更改类型 - >代码关系.