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バージョンでは、-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
: より低い最適化レベルで生成されたパッケージイメージを拒否しますが、より高い最適化レベルの読み込みは許可します。