Julia 朱莉娅每次都要编译剧本?

Julia 朱莉娅每次都要编译剧本?,julia,Julia,Julia语言每次都编译脚本,我们不能用Julia编译二进制文件吗? 我尝试了一个带有println函数的helloworld小脚本,julia花了2,3秒才显示输出!如果我们可以制作二进制文件,而不是每次编译,那就更好了 更新:自从我问了这个问题后,朱莉娅有了一些变化。虽然我不再关注julia的更新,但因为我已经问了这个问题,如果你正在寻找类似的东西,请查看下面跟踪julia的人的回答和评论 另外,很高兴知道,现在加载一个脚本大约需要150毫秒。此时Julia JIT在启动时编译其整个标准库。

Julia语言每次都编译脚本,我们不能用Julia编译二进制文件吗? 我尝试了一个带有println函数的helloworld小脚本,julia花了2,3秒才显示输出!如果我们可以制作二进制文件,而不是每次编译,那就更好了

更新:自从我问了这个问题后,朱莉娅有了一些变化。虽然我不再关注julia的更新,但因为我已经问了这个问题,如果你正在寻找类似的东西,请查看下面跟踪julia的人的回答和评论


另外,很高兴知道,现在加载一个脚本大约需要150毫秒。

此时Julia JIT在启动时编译其整个标准库。我们已经意识到了这种情况,目前正在努力缓存LLVM JIT输出以纠正这种情况,但在那之前,没有办法解决它(除了使用REPL)。

基诺的答案是正确的,但也许我可以提供一点关于正在发生什么以及我们计划如何处理它的更多细节

目前只有LLVM JIT模式:

  • 对于一些简单的顶级语句,有一个非常简单的解释器
  • 在执行之前,所有其他代码都被JIT成机器代码。使用代码要应用到的值的运行时类型对代码进行积极的专门化,并使用动态类型推断在程序中传播
这就是Julia在编写代码时即使没有类型注释也能获得良好性能的原因:如果调用
f(1)
,则会得到专门用于
Int64
——64位系统上
1
类型的代码;如果你调用
f(1.0)
你会得到一个新的jitted版本,专门用于
Float64
——所有系统上的
1.0
类型。由于该函数的每个编译版本都知道它将获得什么类型,因此它可以以类似C的速度运行。您可以通过编写和使用“类型不稳定”函数来破坏这一点,这些函数的返回类型取决于运行时数据,而不仅仅是类型,但在设计核心语言和标准库时,我们非常注意不要这样做

Julia的大部分代码都是自己编写的,然后经过解析、类型推断和jitted,因此从头开始引导整个系统需要15-20秒。为了加快速度,我们有一个分阶段的系统,在这个系统中,我们解析、类型推断,然后在文件
sys.ji
中缓存类型推断AST的序列化版本。然后加载此文件,并在运行
julia
时用于运行系统。但是,
sys.ji
中没有缓存任何LLVM代码或机器代码,因此每次启动
julia
时仍需要执行所有LLVM jitting,因此大约需要2秒钟

这种2秒的启动延迟非常烦人,我们有一个解决方案。基本计划是能够将整个Julia程序编译成二进制文件:可以运行的可执行文件或
.so
/
.dylib
共享库,这些库可以从其他程序调用,就像它们只是共享的C库一样。二进制文件的启动时间将与任何其他C程序一样,因此2秒的启动延迟将消失

附录1:自2013年11月以来,Julia的开发版本不再有2秒的启动延迟,因为它将标准库预编译为二进制代码。启动时间仍然比Python和Ruby慢10倍,因此有改进的余地,但速度相当快。下一步将是允许预编译包和脚本,以便这些包和脚本可以像Julia本身一样快速启动


附录2:自2015年6月以来,Julia的开发版本自动预编译了许多包,使它们能够快速加载。下一步是对整个Julia程序进行静态编译。

从去年左右的时间里,我在网上看到了很多评论,表明Julia的目标是编译可执行文件/共享对象,但没有任何进展迹象。你能提供一些关于这方面的见解吗?詹姆逊·纳什和以赛亚·诺顿已经取得了很多进展,但还没有完全实现。这个功能现在已经完成,并在朱莉娅·马斯特上合并。我的系统启动Julia不再需要约1.5秒,而是需要约150毫秒,这是令人印象深刻的10倍加速。如果我们能够累积10倍的加速(这是完全可能的),Julia的启动时间将与Ruby和Python相当。@StefanKrpinski,在Julia自己启动之后,加载我需要的包仍然需要一些时间。例如,使用Julia版本0.3.0-prerelease+3381(2014-06-02 13:19 UTC),shell命令
Julia-e“使用数据帧”
在我的机器上需要21秒。有什么方法可以解决这个问题吗?作为参考,@G.Grothendieck,模块预编译是
julia v0.4
的一个新功能,它极大地提高了模块加载时间。这已经在julia nightlies中实现,并将包含在0.3版本中。启动时间大大缩短。