Engee 文档

包装图像

Julia中的包映像为Julia包提供对象缓存(机器代码)。 它们看起来像 系统映像是Julia并支持其许多功能。 特别是,基本序列化格式类似,系统映像是从中创建包映像的基本映像。

一般概览

包映像是包含代码和数据的共享库。 就像`。ji’缓存文件,它们是为单个包创建的。 数据部分包含全局数据(全局包变量)和有关包中定义的方法和类型的必要元数据。 代码部分包含基于LLVM缓存Julia编译器最终输出的机器对象。

使用命令行参数'--pkgimages=no',您可以在当前会话中禁用对象缓存。 请注意,正因为如此,缓存文件很可能需要重新创建。 有关Julia默认缓存的最大选项数的信息,请参阅环境变量的描述。 'JULIA_MAX_NUM_PRECOMPILE_FILES'

尽管乍一看,包图像代表了常见的机器代码库,但实际上它们只是表面上的相似之处。 您将无法从自己的程序构建它们,并且必须从Julia下载它们。

布局

由于包映像包含机器代码,因此必须先通过链接器传递它们,然后才能使用它们。 要使用详细信息输出合成包映像,可以分配一个环境变量 JULIA_VERBOSE_LINKING值为’true'。

此外,我们不能假设链接器安装在用户的工作系统上。 因此,为了避免需要安装额外的组件,Julia已经包含了一个名为LLD的LLVM链接器。 基/链接。jl有一个有限的接口,允许您在所有支持的平台上链接包映像。

一些微妙之处

虽然LLD是一个多平台链接器,但它并不具有所有平台的统一接口。 此外,它假设使用来自clang的编译器或其他编译器驱动程序,因此重新设计了llvm-project/clang/lib/Driver/ToolChains的一些逻辑的实现。 幸运的是,使用lld-flavor,您可以为正确的平台选择LLD。

窗户

这样你就不必和林克打交道了。exe`,我们使用'-flavor gnu',它本质上将`lld`变成了来自mingw32环境的交叉编译器。 Windows DLL库应该包含'_DllMainCRTStartup’函数,并且为了最大限度地减少对mingw32库的依赖,我们引入了存根定义。

MacOS的

MacOS中动态库的布局必须使用'-lSystem’完成。 在macOS的最新版本中,只有在Xcode环境可用的情况下,才能使用"-lSystem"进行链接。 出于这个原因,我们使用`-undefined dynamic_lookup’执行布局。

针对多个微体系结构优化的封装图像

如在 系统映像,软件包映像支持多个版本控制。 在具有统一缓存的异构环境中,可以为对象缓存的多个版本控制设置环境变量`JULIA_CPU_TARGET=generic'。

影响包映像的创建和选择的标志

下面列出了影响缓存选择的Julia命令行标志。 使用不同标志创建的包映像将被拒绝。

  • -g,'--debug-info':需要精确匹配,因为这会影响代码生成。

  • '--check-bounds':需要精确匹配,因为这会影响代码生成。

  • '--inline':需要完全匹配,因为这会影响代码生成。

  • '--pkgimages':允许在禁用对象缓存时执行。

  • `-O','--optimize':拒绝为较低优化级别创建的包映像,但允许加载较高优化级别。