アプリケーション仮想化ソフトウェアの比較

アプリケーション仮想化ソフトウェアとは、アプリケーション仮想マシンと、それらを実装するソフトウェアの両方を指します。アプリケーション仮想マシンは通常、アプリケーションのバイトコードを様々なコンピュータアーキテクチャやオペレーティングシステム上で移植可能に実行するために用いられます。アプリケーションは通常、インタープリタまたはジャストインタイムコンパイル(JIT)を用いてコンピュータ上で実行されます。特定の仮想マシンには複数の実装が存在することが多く、それぞれが異なる機能セットをカバーしています。

仮想マシンの比較

この表は、仮想マシン設計の効率化を意図した要素をまとめたものであり、実装に存在する機能のリストではありません。

仮想マシン機械モデルメモリ管理コードセキュリティ通訳者ジットAOT共有ライブラリ共通言語オブジェクトモデル動的型付け
Android ランタイム(ART)登録する自動はいはいはいはい?はいはい
共通言語ランタイム(CLR)スタック自動または手動はいはいはいはいはいはいはい
ディスインフェルノ登録する自動はいはいはいはいはいはいはい
DotGNU ポータブル.NETスタック自動または手動はいはいはいはいはいはいいいえ
ホットスポット JVMスタック自動はいはいはいはいはいはいはい[1]
ジケスRVMスタック自動はいはいはいはい?はいはい
LLVM登録するマニュアルいいえはいはいはいはいはいいいえ
単核症スタック自動または手動はいはいはいはいはいはいはい
オウム登録する自動いいえはいいいえ[2]はいはいはいはい
ダルヴィク登録する自動はいはいはいいいえ?いいえいいえ
きしむスタック自動いいえはいはいいいえはいいいえはい
BEAM (アーラン)登録する自動?はいはいはいはいはいはい
モアVM登録する自動?はいはいはいはいはいはい

仮想マシン命令は、スタックマシンレジスタマシン、またはメモリマシンと呼ばれるランダムアクセスマシンといった主要な計算モデルを用いて、ローカル変数内のデータを処理します。これらの3つの手法が使用されるのは、解釈、コンパイル、セキュリティ検証の容易さなど、仮想マシンと物理マシンにおける異なるトレードオフが考慮されるためです。

これらのポータブル仮想マシンにおけるメモリ管理は、物理マシンよりも高い抽象レベルで処理されます。人気のJava仮想マシン(JVM)などの一部の仮想マシンでは、アドレス処理において安全な自動メモリ管理が求められます。仮想マシンはポインタ参照のトレースを許可し、マシン命令によるメモリへのポインタの手動構築を禁止します。一方、LLVMなどの仮想マシンは、従来の物理マシンに近く、ポインタの直接的な使用と操作が可能です。共通中間言語(CIL)は、その中間のハイブリッドであり、メモリの制御された使用(安全な自動メモリ管理を可能にするJVMなど)と、型境界や権限に違反する可能性のある直接的なポインタ操作を可能にする「安全でない」モードの両方を可能にします。

コードセキュリティとは、一般的に、ポータブル仮想マシンがコードを実行する能力を指し、その際に特定の機能セットのみを提供します。例えば、仮想マシンはコードに対し、特定の関数やデータへのアクセスのみを許可する場合があります。自動メモリ管理を可能にし、仮想マシンによる型安全なデータアクセスを保証するポインタ制御は、コードフラグメントが特定のメモリ要素のみにアクセスでき、仮想マシン自体をバイパスできないようにするためにも使用されます。さらに、コード検証ツール、スタック検証ツール、その他のセキュリティメカニズムが、このセキュリティメカニズムの上に重ねて配置されます。

インタプリタ、仮想命令で構成されたプログラムを、ネイティブマシン命令への潜在的にコストのかかるコンパイルなしに、即座にロードして実行することを可能にします。実行可能な仮想マシンはすべてインタプリタ化できるため、ここでの列の指定は、設計に(一般的な用途のための)効率的なインタプリタ化のための規定が含まれているかどうかを示します。

ジャストインタイムコンパイル(JIT)とは、可能な限り遅いタイミングで、通常はプログラムの実行直前または実行中にネイティブ命令にコンパイルする手法を指します。JITの課題は、仮想マシンの設計というよりも実装上の問題ですが、最近の設計では効率性の向上が考慮され始めています。最も単純なJIT手法は、オフラインコンパイラと同様に、単純にコードフラグメントにコンパイルします。しかし、より複雑な手法もしばしば採用され、コンパイルされたコードフラグメントを実行時にのみ判明するパラメータに特化させます(適応型最適化を参照)。

事前コンパイル(AOT)とは、プリコンパイラを用いてプログラム実行中に変化しないネイティブ命令セットを生成する、より古典的な手法を指します。積極的なコンパイルと最適化には時間がかかるため、プリコンパイルされたプログラムは、JITのみで実行するプログラムよりも起動が速くなる場合があります。JVM実装では、ネイティブコードフラグメントがJITによって生成されるまで、初期解釈処理によって起動時間を短縮することで、この起動コストを軽減しています。

共有ライブラリは、実行中の複数のプログラム間でネイティブコードのセグメントを再利用する機能です。最近のオペレーティングシステムでは、これは通常、仮想メモリを使用して、メモリ保護によって互いに保護されている異なるプロセス間で共有ライブラリを含むメモリページを共有することを意味します。適応型最適化などの積極的なJIT手法では、プロセス間での共有やプログラムの連続実行に適さないコードフラグメントが生成されることが多く、プリコンパイルされた共有コードの効率と適応的に特化したコードの利点との間でトレードオフが必要になることは興味深いことです。たとえば、CILには効率的な共有ライブラリを可能にするための設計規定がいくつか存在しますが、おそらくより特化したJITコードを犠牲にする可能性があります。OS XのJVM実装では、共有ライブラリの利点の一部を提供するためにJava Shared Archive [3]を使用しています。

アプリケーション仮想マシン実装の比較

前述のポータブル仮想マシンに加えて、仮想マシンは個々のスクリプト言語の実行モデルとして、通常はインタープリタによって使用されることがよくあります。この表は、前述のポータブル仮想マシンとスクリプト言語仮想マシンの両方について、具体的な仮想マシン実装を示しています。

仮想マシン実行言語コメント通訳者ジット実装言語SLoC
ビームエルランエリクサーグリームクネイフォームLFE、クロイェル、ルエルはい[4]はい[5]アーラン、C、C++1561k( OTPを含む)
共通言語ランタイム(CLR)C#C++/CLIF#VB.NETバイトコードはCILです。GitHub上の.NET CoreランタイムいいえはいC#、C++
Adobe Flash Player (別名タマリン)ActionScriptSWF(ファイル形式)インタラクティブなウェブオーサリングツール。バイトコードはActionScriptバイトコード(.abc)と呼ばれます。はいはいC++135k(初回リリース)
ディスインフェルノリンボDis仮想マシン仕様はいはいC15k + JIT アーキテクチャあたり 2850 + ホスト OS あたり 500
DotGNU -Portable.NETCLI 言語: C#を含む共通言語ランタイムクローンいいえはいC、C#
フォースフォース機能は簡素化されており、通常はアセンブラ、コンパイラ、テキストレベルおよびバイナリレベルのインタープリタが含まれますが、場合によってはエディタ、デバッガ、OS も含まれます。コンパイル速度は 20 SKLOC/S を超え、JIT とほぼ同様に動作します。はいいいえForth、Forthアセンブラ2.8K ~ 5.6K。高度なプロフェッショナル実装ではさらに小さくなります。
グルクスインフォーム6、インフォーム7、その他はいいいえ様々な実装が存在する
HHVMPHPハックHack および PHP で記述されたプログラムを実行するために設計されたオープンソースの仮想マシンです。はいはいC++、OCaml
ホットスポットJavaKotlinJythonGroovyJRubyCC++ClojureScalaなどSun によるJVMリファレンス実装、OpenJDK : GPLに基づくコードIcedTea : GPLに基づくコードとツールはいはい通常の JIT を備えたJDKOpenJDKIcedTea : Java、C、C++、ASM; 「Zero」 JIT を備えたIcedTea : Java、C、C++HotSpotは約650万行、TCKは8万テストと約100万行
アイコンアイコンベースソースコードには、インタープリタと、サポートされていないCへのコンパイルバージョンの両方が含まれています。コンパイラとインタープリタ間で共有されるランタイムコードは、RTTと呼ばれるCの派生言語で記述されています。はいいいえC、RTT (Icon の基本ソースとともに提供される、C のカスタム フロントエンド)。合計約 180k。(ソースからバイトコード: 約 11k、バイトコード インタープリタ: 約 46k、iconc: 約 23k、common/headers: 約 13k、rtt: 約 15k)
LLVMCC++KotlinObjective-CSwiftAdaFortranRustMSIL、C、C++出力がサポートされています。ActionScriptバイトコード出力はAdobe Alchemyでサポートされています。バイトコードは「LLVMバイトコード(.bc)」という名前で、アセンブリは「LLVMアセンブリ言語(*.ll)」という名前で出力されます。はいはいC++811k [6]
ルアルアはいルアJITC13k + 7k LuaJIT
MMIXミミクサル
単核症CLI 言語には、C#VB.NETIronPythonIronRubyなどがあります。共通言語ランタイムクローンはいはいC#、C2332k
ネコVM現在はネコハックスはいx86のみC46k
オズオズ、アリス
OコードマシンBCPL
PコードマシンパスカルUCSD Pascal、Apple IIを含む70年代後半に普及はいいいえアセンブリ、パスカル
オウムPerl 5Raku、NQP-rx、PIR、PASMPBCBASICbcC99ECMAScriptLispLuam4TclWMLScriptXML、その他はいはいC、Perl111k C、240k Perl
Perl仮想マシンパールオペコードツリーウォーカーはいいいえC、Perl175k C、9k Perl
CPythonパイソンはいC387k C、368k Python、10k ASM、31k Psyco
ピピパイソンPythonのセルフホスティング実装、次世代のPsycoはいはいパイソン
ルビニウスルビー別のRuby実装用の仮想マシンはいはいC++、ルビー
シルバーライトC#VB.NETアプリケーションをブラウザ内でサンドボックス化して実行できるようにする Microsoft .NET FrameworkのマイクロバージョンはいはいC++7MB(初回リリース)
スカムVMスカムコンピュータゲームエンジン
長官ISWIMLispkit Lisp
リスリスはいリス_JITC++12k
雑談雑談
SQLiteSQLite オペコード仮想データベースエンジン
きしむスクイーク・スモールトークSqueak仮想マシンのセルフホスティング実装。豊富なマルチメディアサポート。はいコグ&テグジュペリ雑談/スラング110k Smalltalk、約300K C
SWI-PrologProlog: SWI-PrologYAPはいいいえC、SWI-Prolog
トレースモンキーJavaScriptタマリンをベースにいいえはいC++173k
トゥルータイプトゥルータイプフォントレンダリングエンジンはいいいえC(通常)
ヴァルグリンドx86 / x86-64バイナリLinuxでのメモリアクセスとリークのチェックC467k [7]
ビジュアルワークス雑談いいえはいC
Vx32仮想マシンx86バイナリネイティブコード向けのアプリケーションレベルの仮想化いいえはい
ワバJavaに似た小型デバイス用の仮想マシン
Yet Another Ruby VM ( YARV )ルビーRuby 1.9以降のバージョン向けのリファレンス実装の仮想マシンはいはいC
ZマシンZコード
ZendエンジンPHPはいいいえC75k

参照

参考文献

  1. ^ 「Java Community Process(SM)プログラム - JSR:Java仕様リクエスト - 詳細JSR# 292」Jcp.org . 2013年7月4日閲覧
  2. ^ "JITRewrite – Parrot". Trac.parrot.org . 2013年7月4日閲覧
  3. ^ OS XでのJava Shared Archiveの使用に関するAppleのドキュメント
  4. ^ 「インタープリタの詳細 - Erlang/OTP」。
  5. ^ 「JIT の初見 - Erlang/OTP」。
  6. ^ LLVM コンパイラインフラストラクチャ Archived 2012-07-31 at the Wayback Machine , ohloh.net, 2011年11月30日
  7. ^ Valgrind、ohloh.net、2011年11月30日。
Retrieved from "https://en.wikipedia.org/w/index.php?title=Comparison_of_application_virtualization_software&oldid=1327254400"