Cheerp: Web 用の C++ コンパイラ
最近リリースされたCheerp 3.0は、あらゆるC/C++コードをWebAssemblyまたはJavaScriptにコンパイルできるコンパイラであり、注目に値する。この新しいブランチの特筆すべき点は、コンパイラとその付属ライブラリが、以前の限定的なライセンスポリシー(非商用プロジェクトにはGPLv2ライセンス、商用プロジェクトには独自のライセンスという選択肢があった)ではなく、より寛容なApache 2.0およびLLVMライセンスを使用するように変更されたことである。
Cheerp は、既存の C/C++ アプリケーションとライブラリを移植してブラウザーで実行することも、高性能 Web アプリケーションと WebAssembly コンポーネントをゼロから作成することもできます。
Cheerp の前回のリリース ( Cheerp 2.7 ) から XNUMX 年以上が経過しましたが、この新しいバージョンには、Web アプリケーションのプログラミング言語として C++ を使用する技術の最先端を動かす新機能と最適化が詰め込まれています。ゲーム。
最も重要なことは、このリリースで、Cheerp のライセンス モデルに大幅な変更を加えることです。 Cheerp 3.0 の時点で、すべてのコア コンパイラ コンポーネントとライブラリは、Apache 2.0/LLVM ライセンスの下で許可されています。 これは、以前の GPLv2/デュアル商用ライセンス モデルからの根本的な出発点であり、Cheerp 3.0 をあらゆる目的に制限なく使用できるようにします。
Cheerpについて
このプロジェクトでは、Webアプリケーション内でC/C++コードとJavaScriptコードを組み合わせることができ、 JavaScriptコードからC/C++で開発された関数にアクセスしたり、C/C++コードからJavaScriptオブジェクト、JavaScriptライブラリ、Web API、およびすべてのDOM機能にアクセスしたりすることが可能になります。また、一部のコードをJavaScriptでコンパイルし、一部をWebAssemblyでコンパイルするハイブリッドビルドの作成も可能です。標準のlibcおよびlibc++ライブラリを使用するビルドプロジェクトをサポートしています。
Emscriptenコンパイラと比較して、Cheerpはより最適化され、よりコンパクトなWebAssembly中間コードを生成します(平均して、生成されるファイルのサイズは7%小さくなります)。
概念的には、両者の違いは、EmscriptenがWebAssemblyオブジェクトフォーマットとして使用され、WebAssemblyの後処理段階(wasm-opt)でリンクと最適化を実行する点に集約されます。Cheerpは、ライブラリとオブジェクトファイルの中間表現としてLLVMバイトコードを使用することで、後処理を必要とせずにLLVMレベルのメタデータを利用した、より広範なプロジェクト全体の最適化を可能にします。
さらに、CheerpはPreExecuterオプティマイザを使用して、コンパイル時にコードをプリエンプティブに実行します。例えば、グローバルオブジェクトの初期化に使用されるコンストラクタを定数に変換します。また、コンパイル時にはPartialExecuterを使用し、関数パラメータの分析に基づいて、実行時に使用されないことが保証されているコードを削除します。
Cheerpは、ガベージコレクタが管理するメモリ領域を動的に操作するためのJavaScriptコードも生成できます。具体的には、手書き配列で従来のアドレス空間をエミュレートするのではなく、C++オブジェクトをJavaScriptオブジェクトに直接マッピングすることで、JavaScriptのガベージコレクタが未使用オブジェクトを削除できるため、メモリ消費量を削減します。さらにパフォーマンスを向上させるため、生成されたWebAssembly中間コードはSIMD拡張機能を使用してデータ操作を並列化します。
Cheerpは、C++でクライアント/サーバー統合型Webアプリケーションを構築するためのプラットフォームとして利用できます。現在の開発手法では、JavaScriptで記述されたブラウザベースのフロントエンドと、PHP、Python、Ruby、またはJavaScript/Node.jsで記述されたバックエンドを別々に開発するのが一般的です。
Cheerp は、単一のコード ベースでバックエンドとフロントエンドの両方をサポートする完全な C++ Web アプリケーションを構築する手段を提供します。
ビルド プロセス中に、サーバー側がネイティブ コードにコンパイルされ、インターフェイスが JavaScript 表現に変換されます。 JavaScript に変換されたものを含むすべてのプロジェクト コンポーネントのデバッグは、ソース マップ テクノロジを使用した C++ ソース テキストを使用して実行されます。
最後に、これについてさらに詳しく知りたい場合は、以下のリンクから詳細をご覧いただけます。
コンパイラ コードは LLVM と Clang の開発に基づいており、パフォーマンスを向上させ、コンパイルされた出力のサイズを縮小するための追加の最適化が含まれています。