Package Images
Juliaパッケージimagesは、Juliaパッケージのためのオブジェクト(ネイティブコード)キャッシュを提供します。これらはJuliaのsystem imageに似ており、多くの同様の機能をサポートしています。実際、基盤となるシリアル化フォーマットは同じであり、システムイメージはパッケージイメージが構築されるベースイメージです。
High-level overview
パッケージイメージは、コードとデータの両方を含む共有ライブラリです。.jiキャッシュファイルのように、パッケージごとに生成されます。データセクションには、パッケージ内のグローバルデータ(グローバル変数)と、パッケージによって定義されたメソッドや型に関する必要なメタデータが含まれています。コードセクションには、JuliaのLLVMベースのコンパイラの最終出力をキャッシュするネイティブオブジェクトが含まれています。
コマンドラインオプション --pkgimages=no を使用すると、このセッションのオブジェクトキャッシングをオフにすることができます。これは、キャッシュファイルを再生成する必要があることを意味します。デフォルトでJuliaがキャッシュするバリアントの上限については JULIA_MAX_NUM_PRECOMPILE_FILES を参照してください。
パッケージの画像はネイティブの共有ライブラリとして表示されますが、それはあくまで近似に過ぎません。ネイティブプログラムからそれらにリンクすることはできず、Juliaから読み込む必要があります。
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バージョンでは、Xcodeが利用可能な場合にのみ-lSystemがリンクに使用できます。そのため、-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: より低い最適化レベルで生成されたパッケージイメージを拒否しますが、より高い最適化レベルの読み込みは許可します。