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

Types 类型稳定性如何使Julia如此快速?,types,runtime,julia,Types,Runtime,Julia,我听说类型稳定性使Julia变得如此快速,同时仍然像Python等其他解释语言一样具有表达能力。类型稳定性允许编译器在编译时直接从输入类型确定函数的输出类型。因为Julia专门对每个输入类型进行编译,这意味着如果所有函数都是类型稳定的,编译器可以推断函数调用中每个值的类型。当这种情况发生时,Julia的JIT编译器将本质上创建该方法的静态类型版本,并构建LLVM IR来编译该静态版本,其中该静态版本本质上与使用clang编译的C(LLVM)相同的汇编代码 这意味着,如果编译器能够推断出每个变量的

我听说类型稳定性使Julia变得如此快速,同时仍然像Python等其他解释语言一样具有表达能力。

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

这意味着,如果编译器能够推断出每个变量的基本类型,它将并且它将发出代码,强制这些类型保持不变,就像它是完全带注释的C代码一样。Julia是动态的,当这不起作用时,它将“装箱”变量,本质上创建一个新类型,上面写着“我不知道类型是什么”,并添加代码,用于强制类型检查和在运行时调度计算以处理动态性。因此,如果所有类型信息都已知,Julia的动态性就会被编译掉,甚至不再存在于运行的代码中


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

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

这意味着,如果编译器能够推断出每个变量的基本类型,它将并且它将发出代码,强制这些类型保持不变,就像它是完全带注释的C代码一样。Julia是动态的,当这不起作用时,它将“装箱”变量,本质上创建一个新类型,上面写着“我不知道类型是什么”,并添加代码,用于强制类型检查和在运行时调度计算以处理动态性。因此,如果所有类型信息都已知,Julia的动态性就会被编译掉,甚至不再存在于运行的代码中

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