Cheerp: Web 用の C++ コンパイラ
最近発表された Cheerp 3.0 リリース、コンパイラ 任意の C/C++ コードを WebAssembly または JavaScript にコンパイルできます. 新しいブランチは、非商用プロジェクトに GPLv2.0 ライセンス オプションを提供し、商用プロジェクトにライセンス所有者を提供する、以前に適用された限定ライセンス ポリシーではなく、コンパイラと付随するライブラリを寛容な Apache 2 および 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% 小さくなります。)
概念的には、違いは次の事実に要約されます。 サインアップ WebAssembly のオブジェクト形式として使用され、後処理段階でバインディングと最適化を実行します。 WebAssembly (wasm-opt)。 Cheerp はライブラリとオブジェクト ファイルの中間表現として LLVM バイトコードを使用し、後処理を必要とせずに LLVM レベルのメタデータを使用して、より広範なプロジェクト全体の最適化を可能にします。
さらに、 Cheerp は PreExecuter オプティマイザーを使用して、コードをプリエンプティブに実行します たとえば、コンパイル時に、グローバル オブジェクトの初期化に使用されるコンストラクターを定数に変換します。 さらに、コンパイル中に PartialExecuter が使用され、関数のパラメーターの解析に基づいて、実行時に使用されないことが保証されているコードが削除されます。
Cheerp は、メモリを動的に処理する JavaScript コードを生成することもできます。 ガベージコレクターによって覆われています。 特に、Cheerp は、型付き配列で従来のアドレス空間をエミュレートする代わりに、C++ オブジェクトから JavaScript オブジェクトへの直接マッピングを提供します。これにより、JavaScript ガベージ コレクターには未使用のオブジェクトを削除する機能があるため、メモリ消費が削減されます。 パフォーマンスを向上させるために、生成された WebAssembly 中間コードは SIMD 拡張を使用してデータ操作の並列化を調整します。
Cheerp は組み込み Web アプリケーションを構築するためのプラットフォームとして使用できます C++ のクライアント/サーバー。 現在の慣行では、JavaScript で記述された別のブラウザー ベースのフロントエンドと、PHP、Python、Ruby、または JavaScript/Node.js で記述された別のバックエンドを開発するのが一般的です。
Cheerp は、単一のコード ベースでバックエンドとフロントエンドの両方をサポートする完全な C++ Web アプリケーションを構築する手段を提供します。
ビルド プロセス中に、サーバー側がネイティブ コードにコンパイルされ、インターフェイスが JavaScript 表現に変換されます。 JavaScript に変換されたものを含むすべてのプロジェクト コンポーネントのデバッグは、ソース マップ テクノロジを使用した C++ ソース テキストを使用して実行されます。
最後に、 あなたがそれについてもっと知りたいなら、詳細はで確認できます 次のリンク。
コンパイラ コードは LLVM と Clang の開発に基づいており、パフォーマンスを向上させ、コンパイルされた出力のサイズを縮小するための追加の最適化が含まれています。