Package Images
Juliaパッケージimagesは、Juliaパッケージのためのオブジェクト(ネイティブコード)キャッシュを提供します。これらはJuliaのsystem imageに似ており、多くの同様の機能をサポートしています。実際、基盤となるシリアル化フォーマットは同じであり、システムイメージはパッケージイメージが構築される基盤イメージです。
High-level overview
パッケージイメージは、コードとデータの両方を含む共有ライブラリです。.ji
キャッシュファイルのように、パッケージごとに生成されます。データセクションには、パッケージ内のグローバルデータ(グローバル変数)と、パッケージによって定義されたメソッドや型に関する必要なメタデータが含まれています。コードセクションには、JuliaのLLVMベースのコンパイラの最終出力をキャッシュするネイティブオブジェクトが含まれています。
コマンドラインオプション --pkgimages=no
を使用すると、このセッションのオブジェクトキャッシングをオフにすることができます。これは、キャッシュファイルを再生成する必要があることを意味します。デフォルトでJuliaがキャッシュするバリアントの上限については、 JULIA_MAX_NUM_PRECOMPILE_FILES
を参照してください。
Linking
パッケージ画像にはネイティブコードが含まれているため、使用する前にリンカーを実行する必要があります。環境変数 JULIA_VERBOSE_LINKING
を true
に設定すると、パッケージ画像のリンクプロセスを詳細に表示できます。
さらに、ユーザーが動作するシステムリンカーをインストールしているとは限りません。したがって、JuliaはLLD、つまりLLVMリンカーを同梱して、すぐに使える体験を提供します。base/linking.jl
では、すべてのサポートされているプラットフォームでパッケージイメージをリンクできるように、制限されたインターフェースを実装しています。
Quirks
LLDはマルチプラットフォームリンカーであるにもかかわらず、プラットフォーム間で一貫したインターフェースを提供していません。さらに、clang
や他のコンパイラドライバから使用されることを意図しているため、llvm-project/clang/lib/Driver/ToolChains
の一部のロジックを再実装しています。幸いなことに、lld -flavor
を使用してlldを適切なプラットフォームに設定することができます。
Windows
link.exe
を扱う必要がないように、-flavor gnu
を使用し、実質的に lld
を mingw32 環境からのクロスリンカーに変えます。Windows DLL には _DllMainCRTStartup
関数を含める必要があり、mingw32 ライブラリへの依存を最小限に抑えるために、スタブ定義を自分たちで注入します。
MacOS
macOSのダイナミックライブラリは-lSystem
にリンクする必要があります。最近のmacOSバージョンでは、-lSystem
はXcodeが利用可能な場合にのみリンクできます。そのため、-undefined dynamic_lookup
でリンクします。
Package images optimized for multiple microarchitectures
multi-versioningのシステムイメージと同様に、パッケージイメージもマルチバージョンをサポートしています。統一されたキャッシュを持つ異種環境にいる場合は、環境変数JULIA_CPU_TARGET=generic
を設定してオブジェクトキャッシュをマルチバージョン化できます。
Flags that impact package image creation and selection
これらはキャッシュ選択に影響を与えるJuliaコマンドラインフラグです。異なるフラグで作成されたパッケージイメージは拒否されます。
-g
,--debug-info
: コード生成が変更されるため、正確な一致が必要です。--check-bounds
: コード生成が変更されるため、正確な一致が必要です。--inline
: 正確な一致が必要です。なぜなら、それがコード生成を変更するからです。--pkgimages
: オブジェクトキャッシングを有効にせずに実行を許可します。-O
,--optimize
: 低い最適化レベルで生成されたパッケージイメージを拒否しますが、高い最適化レベルの読み込みは許可します。