アーキテクチャ
CheerpJはどのように動作するのか?
CheerpJは、WebAssemblyベースの ブラウザ用Java仮想マシンです。これにより、Javaアプリケーションをブラウザから直接実行でき、Javaのインストールが不要になります。驚きですよね?しかし、どうやって動作するのでしょうか?
概要
CheerpJは、WebAssembly、JavaScript、およびHTML5などの標準的なWeb技術を使用して、現代のどのブラウザでも動作できます。JavaScriptライブラリのように、単に<script>
タグを追加するだけで、Webページに統合できます。特別な実行可能コンポーネント、プラグイン、またはサーバー側のバックエンドは必要ありません。
CheerpJは非常に使いやすく、スタンドアロンのJavaアプリケーション、アプレット、Java Web Start、およびJavaライブラリをブラウザ内で完全に実行するためのAPIを公開しています。CheerpJの強みの一つは、 Javaバイトコード/JARと直接連携し、アプリケーションのソースコードを変更したりアクセスしたりする必要がないことです。
CheerpJのアセットは静的であり、簡単にセルフホストできます。また、CheerpJコミュニティライセンス (個人プロジェクトや技術評価での無料利用が可能)でクラウド版も提供しています。
CheerpJのコンポーネント
CheerpJは以下の構成要素で構成されています:
- JVMの実装とJava-to-JavaScript JITコンパイラを含む、完全なJavaランタイム環境
- 仮想化されたウィンドウマネージャー
- 仮想化されたファイルシステム
- ネットワーキングサポート用のモジュール
CheerpJのJavaランタイム環境
CheerpJの背後にある魔法は、OpenJDKに基づく完全なJava SE 8ランタイムをコンパイルするために使用されたCheerpにあります。 このランタイムはもともとC++で書かれ、WebAssemblyとJavaScriptにコンパイルされ、100%ブラウザ互換性を持つように設計されています。 CheerpJのアーキテクチャは、複数のJavaバージョンやカスタムランタイムをサポートするように設計されています。将来のバージョンのCheerpJでは、Java 11や新しいLTSバージョンのJavaをサポートする予定です。
CheerpJのJavaランタイム環境の最も重要なコンポーネントは、そのJVM実装です。CheerpJのJVM実装は、インタープリタ と 実行時コンパイラ(JIT)で構成されており、これらが2段階で連携して動作します:
- Javaバイトコードはインタープリタ内で実行されます。
- その後、このバイトコードが実行時に最適化されたJavaScriptにコンパイルされます。
インタープリタは、初期化やあまり使用されないコードの処理を行うだけでなく、JITコンパイルに必要な情報も収集します。生成されたコードは非常に効率的であり、内部の最適化機能により、インライン化や呼び出しの非仮想化などが行われます。これは、Javaのような言語にとって非常に重要です。
CheerpJランタイムは、ブラウザ内でJavaアプリケーションを実行できるだけでなく、JavaとJavaScriptの間で高度な双方向の相互運用性も提供します。つまり、JavaからDOMにアクセスすることができ、native
メソッドを直接JavaScriptで実装することができます。また、新しい cheerpjRunLibrary
APIを使用することで、JavaScriptから直接Javaのメソッド、オブジェクト、および配列と相互作用することもできます。
仮想化されたウィンドウマネージャー
グラフィカルなUIがないアプリケーションなんてありえないでしょう。CheerpJのウィンドウマネージャーは、ウィンドウをHTML要素とHTML5キャンバスの階層に変換することで、Java AWT/Swingをサポートしています。
Swingアプリケーションは、ネイティブ環境と同様にレンダリングされます。 SwingのLook&Feelもサポートされており、サードパーティ製のものも含まれます。マルチウィンドウアプリケーションもサポートされており、キーボードフォーカスも期待通りに管理されます。システムクリップボードとの統合は、初期化オプションで有効にすることができます。
仮想化されたファイルシステム
CheerpJは、サーバーホストファイルへのアクセスや持続的なローカルストレージなど、さまざまなアプリケーションの要求に対応するための複数のファイルシステムバックエンドを提供しています。
ネットワーキングサポート
同一オリジンのHTTP/HTTPSリクエストについては、CheerpJはfetch
を透過的に使用できます。より一般的なネットワーキングは、WebSocketをトランスポート層として使用するVPN技術であるTailscaleを通じてサポートされます。 これにより、プライベートネットワークサービスへのアクセス、ユーザー間のピアツーピア接続、ユーザーやアプリケーションが提供する出口ノードを介したインターネットへのアクセスなど、さまざまなネットワーキングシナリオに対応できます。