今日、私たちは Cheerp 3.0 を宣言できることを非常に誇りに思っています。これは、基本的に、Web 用の C++ コンパイラのリリースで最もトレンドが支配的である.
Cheerp の古いリリース (Cheerp 2.7) 以来、この現代的なバージョンには現代的な側面と最適化が詰め込まれています。 C++ を Web 目的やゲーム用のプログラミング言語として利用する最先端を広めます。 Cheerp のライセンス マネキンへの既知の商取引。 Cheerp 3.0 から、コンパイラのコア コンポーネントとライブラリ全体が Apache 2.0 / LLVM ライセンス の下で寛容にライセンス供与されるようになりました。 これは、Cheerp 3.0 が制限なしにあらゆる理由で老化することを考慮して、古い GPLv2 / 双子の商用ライセンス マネキンからの集中的な逸脱を示しています。 なぜ Cheerp のライセンスを変更するのですか? 2014 年に無償提供されて以来、Cheerp はツイン ライセンス契約の下でライセンスされています。非営利ユーザー向けの GPLv2、および現在 GPLv2 条項への準拠に関与していない人向けのプロプライエタリ ライセンス𝚆𝚊𝚝𝚌𝚑 𝙽𝙾𝚆 📺
Leaning Technologies 、これは常に最高よりも低いが、重要な優先事項を表しています。 外部資本を持たない自己資本型の会社として、ツイン ライセンスがツールを収益化するための具体的な方法であると感じていました。 2014 年以来、多くのことが伝えられてきました。 , CheerpX for Flash および WebVM)。 私たちは、財政的にも成熟度によっても、まったく異なる状態にあります。 この間ずっと Cheerp は すべての の礎であり続けました私たちの応用科学。 Leaning Technologies で調達するものはすべて C++ で記述され、Cheerp でコンパイルされています。 WebAssembly エコシステムでどのような位置を占めるように努力しているかを熟考した結果、今こそギアを商取引し、このツールのより広範な採用を優先する絶好の機会であることに気付きました。 寛容なリベラルなライセンスに再ライセンスすることで、「リンクされていない」誰かによって現在熟成されている場所にある Cheerp の採用に対する障壁を取り除くことを望んでいます. Cheerp が不規則な理由は? Cheerp は、C++ を優勢なクラスにするために設計されたコンパイラです。 Cheerp の動機は今ではありません C++ から最適化された WebAssembly を生成するには、 correct を使用します。 かなり、C++ を外部の HTML5/JavaScript とシームレスに統合できるようにするツールを維持することです。 : 最先端の WebAssembly バックエンド : これは、Web を対象とする最新の C++ コンパイラによって予想されるものです。 Cheerp は、後処理 (Binaryen wasm-opt など) を必要とせずに、非常にまずまずの効果的な WebAssembly コードを 1 ステップで生成します。 Cheerp は、テール コール、SIMD、externrefs など、WebAssembly のポスト MVP の側面を支援します。 -cheerp-wasm-enable=
ライン フラグを明確に公開して、要件を考慮して想像しているブラウザと同じ数のブラウザもターゲットにする必要があることを明確にします
高パフォーマンスの JavaScript バックエンド: Cheerp は、C++ から純粋な JavaScript コードを生成できる、市場に出回っている特定のツールです。 特に、トレイン機能またはクラスに ] 属性。 通常、-対象の応援 ラインオプション公開。 Cheerp の JavaScript 出力は非常に最適化されています。 現在、V8 および SpiderMonkey と同等のエンジンが内部でどのように機能するかを個人的に詳細に調査し、生成された JavaScript も同様に効率的にコンパイルされる可能性があることを明確にしました。- DOM API および JavaScript ライブラリへの透過的な派生エントリ: JavaScript バックエンドの収益を受け取ることによって、Cheerp は DOM を操作し、C++ で遅滞なく任意の JavaScript API を呼び出すことを許可します。 Cheerp では、ここで client で宣言された API を利用して実行されます。 名前空間。
ヘッダーは、現時点では従来の DOM API の合計を発音しますが、それについて魔法は何もなく、同様に、 クライアント 名前空間は、実験的な DOM API またはサード パーティの JavaScript ライブラリを使用する場合に使用します。 Cheerp で想像できることの一時的な例として、正当な C++ コードを次に示します:
client::HTMLElementnewElem=client::account.createElement(“div”); [[cheerp::jsexport]] 属性: この機能を使用すると、手動で記述された JavaScript から遅滞なく C++ の機能と完全なクラスを実行することも想像できるでしょう。 コンパイラは、カバーされていないインターフェイスの原則の領域をトレースして、そのように作成することが適切であることを保証します。 今、私たちは非公開です 長々と書いた この機能については以前にスラッシュアシストコードの次元への進化した最適化 : Cheerp は、プログラム全体の最適化戦術の収益を綿密に取ります。 現在、PreExecuter に相当する高度な最適化をプライベートに開発しました。 (グローバル C++ コンストラクターを定数に変換), PartialExecuter (目的のパラメータの部分的なデータを完全に基に、基本的には絶対に破棄されないことも確認できるコードを決定)、および高度な devirtualizer。 これらはすべて、よく知られているコード次元の削減に貢献します。Cheerp は Emscripten と比べてどうですか? Cheerp と Emscripten はどちらも、基本的に代替の従来の LLVM/Clang インフラストラクチャに完全に基づいており、基本的には同じ要素を作成します: C++ コードを自走できるものにコンパイルします。
過度の段階では、2 つのツールの原則的な違いは哲学の問題です。 Emscripten は、C++ の目的全体を WebAssembly に変更することに対して強い関心を持っており、ブラウザーで自首することを断言しています。 逆に、Cheerp は、既存の C++ コードを現代の Web ネイティブの人間の能力の断片として熟成できるようにすることを専門としています。 これは、事実上すべてのお客様がエクササイズの状況で必要とするものです. これを実現するために、Cheerp は C++ 間のシームレスな相互運用性を可能にするさまざまな側面を提示します。および任意の外部 JavaScript/DOM。 特に、[[cheerp::jsexport]] タグは、生成されたコードが外部 JavaScript のオーバーヘッドなしで検出されることを示します。 この不規則な機能では、Cheerp が単一の C++ ソースから WebAssembly と JavaScript の集合体を生成する場所にいる必要がありますが、カバーされていないインターフェイスに原則のアリーナを課して、それらの動作を明確にすることは予測可能であり、驚くことではありません. 技術的な面では、主な違いは、中間出力の表現方法と、リンクが発生するデバイスに関するものです。 Emscripten はデフォルトで WebAssembly を使用します。これは、記事のレイアウト、数百のレコードデータがリンクされ、wasm-opt (binaryen のフラグメント) による後処理で最適化されるためです。 派生ジョグから、Web 上で C++ 用の統合ツールを非公開にする必要性に動機付けられた明確な取り決めを採用しました。 Cheerp without delay は LLVM バイトコード レイアウトを使用します。これは、すべてのオブジェクトがデータとライブラリを記録するための中間の図です。 これにより、LLVM 段階ですべてのメタデータを取得することで、プログラム全体の最適化を完全に実現することも想像できるようになります。 Cheerp は最終的に LTO のすべての定義を「内部化」し、LLVM 段階で従来の最適化とカスタム最適化の優先順位を均等に設定できるようにします。 このプロセスの後、後処理ステップを必要とせずに、まずまずの効果的な WebAssembly と JavaScript が生成されます。
Emscripten テスト スイートに対して Cheerp を自動的にベンチマークします。 結果は、前述の配置の違いを再現します。 LLVM ステージ全体のプログラムの最適化とカスタム パスにより、アウトプット ディメンションを調整することで、Cheerp on the total は全体的により大きな結果を達成し、一般的な 7% 小さいプロデュース ディメンションを実現します。
出力ディメンションのベンチマーク。低いほど適合します。 そこにある知識 ここ .
出力次元の減少は、実行効率に悪影響を与えません。これは、ベンチマークと実行の優先度が均等である Emscripten と同様です。エンジン。 たとえば、ここでは v8 エンジンでの実行ケースを非公開にしています。低いほど適しています。
v8 の強力なデータセットがあります。 、 クモザル と JavaScriptコア. Cheerpが贈る数々の言葉Emscripten と比較して効率を犠牲にすることなく、出力フットプリントが小さく、コンパイルされた C++ と外部 JavaScript との間の明確なレベルの統合。 Cheerp 3.0 では、WebAssembly のアトミックとマルチスレッド化が強化されていますが、現在この機能に取り組んでおり、この最終的なギャップにクエリを実行して、次の数か月で Cheerp 3.1 を解放して埋めます。
現時点では、ブラウザでマルチスレッドを利用するには、ジャンプするよりも多くのジャンプが必要であることは、よく知られていることを黙認する必要があります t SharedArrayBuffer を有効にするためのいくつかのフープ (つまり、inferior-origin 分離用の COEP/COOP/CORP ヘッダー)。 これらのフープは、サードパーティのリソースをロードするための正確な制限に発展する可能性がありますが、Web の目的では不規則ではありません. これは、実際には、マルチスレッド機能が本当に必要な場合を除いて、マルチスレッドに依存しない方が賢明であることを意味します. Cheerp は、Leaning Technologies のすべてのツール (例: WebVM 、過度の効率でブラウザで実行されている x86 仮想マシン).
クエリの効果は、Cheerp で生成されるものです? Cheerp をダウンロードできますここ。 Debian/Ubuntu の場合、私たちの
PPA
もしそうなら、どこから手を付けるべきか迷ってしまうかもしれません。 ドキュメンテーション および 始めましょう情報 追加の豚肉アップについて定義する 私たちの不和に登録すること: https://discord.leaningtech.com では、私を含む Leaning Technologies のコア開発者を獲得できます。 Cheerp をご利用いただき、ありがとうございます。