我听说类型稳定性使 Julia 如此之快,同时仍然与其他解释语言(例如 Python)一样具有表达能力。
类型稳定性允许编译器在编译时直接根据输入类型确定函数的输出类型。因为 Julia 专门针对每种输入类型进行编译,这意味着如果所有函数都是类型稳定的,则编译器可以推断出函数调用内每个值的类型。当发生这种情况时,Julia 的 JIT 编译器本质上会创建该方法的静态类型版本,并构建 LLVM IR 来编译该静态版本,其中该静态版本本质上与使用 clang (LLVM) 编译的 C 汇编代码相同。
这意味着,如果编译器可以推导每个变量的基本类型,它将发出强制这些类型保持不变的代码,就像它是完全注释的 C 代码一样。 Julia 的动态方式是,当这不成立时,它将“装箱”变量,本质上是创建一个新类型,表示“我不知道该类型是什么”,并添加用于强制类型检查的代码并在运行时调度计算以处理动态性。因此,如果所有类型信息都已知,那么 Julia 的动态性就会消失,甚至不再存在于运行的代码中。
这也是为什么多重分派对于该语言如此重要,因为多重分派意味着f(x)
有一个不同的方法f(x::Float64)
(即使您没有指定具体版本,编译器也会推断并使用它,称为自动类型专业化),现在具体版本比通用版本更有可能稳定。将多重分派作为一项功能公开实际上只是允许您拦截编译的此阶段并允许更改类型->代码关系。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)