ネイティブ実行に関する制限事項と相違点

LLVMコードは、GraalVM CommunityまたはEnterpriseエディションのデフォルト構成で解釈またはコンパイルする場合と、管理対象環境(GraalVM Enterpriseで--llvm.managedオプションで有効化されます)で同じコードが解釈またはコンパイルする場合とで、特性が異なります。LLVMビットコード形式のプログラムを直接実行するために使用されるlliインタプリタの動作は、ネイティブ・モードと管理対象モードで異なります。相違点は、安全性の保証と言語間の相互運用性にあります。

ノート: LLVMビットコードの管理対象実行モードは、GraalVM Enterpriseでのみ使用できます。

デフォルト構成では、言語間の相互運用性には、デバッグ情報を有効にして(-g)ビットコードをコンパイルし、LLVMビットコードに対して-mem2reg最適化を実行する必要があります(少なくとも-O1を使用してコンパイルするか、optツールを明示的に使用します)。GraalVM Enterpriseの管理対象環境ではネイティブ・コードがポリグロット・プログラムに参加し、サポートされている他の言語との間でデータを受渡しできるため、これらの要件には、この環境で対応できます。セキュリティに関しては、管理対象環境でのネイティブ・コードの実行は、安全機能を追加して渡されます(不正なポインタ・アクセスの捕捉や境界外の配列へのアクセスなど)。

GraalVMのエディションに応じて、ネイティブ実行には特定の制限事項と相違点があります。それぞれについて考えます。

GraalVM Communityでのネイティブ実行に関する制限事項と相違点

GraalVM Community Edition環境でLLVMインタプリタを使用すると、多言語のコンテキストでLLVMビットコードを実行できます。汎用のLLVMランタイムである必要がありますが、ユーザーが認識しておく必要がある一定の基本的な制限事項または実装上の制限事項(あるいはその両方)があります。

LLVMビットコードがGraalVM CommunityでLLVMインタプリタを使用して実行される場合、ネイティブ実行(つまり、ネイティブ・コードにコンパイルされたビットコード)には次の制限事項と相違点があります:

GraalVM Enterpriseでの管理対象実行に関する制限事項と相違点

LLVMビットコードの管理対象実行は、GraalVM Enterprise Editionの機能であり、--llvm.managedコマンドライン・オプションを使用して有効にすることができます。管理対象モードでは、GraalVM LLVMランタイムによって、管理対象外メモリーへのアクセスと、ネイティブ・コードおよびオペレーティング・システム機能への無制御のコールが防止されます。割当ては管理対象Javaヒープ内で実行され、周囲のシステムへのアクセスは適切な言語APIおよびJava APIコールを介してルーティングされます。

GraalVMでのデフォルトのネイティブLLVM実行のすべての制限事項が管理対象実行に適用されますが、次の相違点および変更点があります: