Package Images

Juliaパッケージimagesは、Juliaパッケージのためのオブジェクト(ネイティブコード)キャッシュを提供します。これらはJuliaのsystem imageに似ており、多くの同様の機能をサポートしています。実際、基盤となるシリアル化フォーマットは同じであり、システムイメージはパッケージイメージが構築される基盤イメージです。

High-level overview

パッケージイメージは、コードとデータの両方を含む共有ライブラリです。.jiキャッシュファイルのように、パッケージごとに生成されます。データセクションには、パッケージ内のグローバルデータ(グローバル変数)と、パッケージによって定義されたメソッドや型に関する必要なメタデータが含まれています。コードセクションには、JuliaのLLVMベースのコンパイラの最終出力をキャッシュするネイティブオブジェクトが含まれています。

コマンドラインオプション --pkgimages=no を使用すると、このセッションのオブジェクトキャッシングをオフにすることができます。これは、キャッシュファイルを再生成する必要があることを意味します。デフォルトでJuliaがキャッシュするバリアントの上限については、 JULIA_MAX_NUM_PRECOMPILE_FILES を参照してください。

Note

パッケージの画像はネイティブ共有ライブラリとして表示されますが、それはあくまで近似に過ぎません。ネイティブプログラムからそれらにリンクすることはできず、Juliaから読み込む必要があります。

Linking

パッケージ画像にはネイティブコードが含まれているため、使用する前にリンカーを実行する必要があります。パッケージ画像のリンクプロセスを詳細に表示するには、環境変数 JULIA_VERBOSE_LINKINGtrue に設定できます。

さらに、ユーザーが動作するシステムリンカーをインストールしているとは限りません。したがって、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: より低い最適化レベルで生成されたパッケージイメージを拒否しますが、より高い最適化レベルの読み込みは許可します。