見出し画像

【完全保存版】Binaryenについて学んでみよう!

この記事は、下のGithubの「Binaryen」の項目を翻訳・編集したものです。

1 概要

Binaryenは、C++で書かれたWebAssemblyのためのコンパイラおよびツールチェインインフラストラクチャライブラリです。

一般的に、ツールチェインソースコードから実行可能なソフトウェアを生成するまでの過程で必要な一連のツールを指します。

これらのツールは互いに密接に関連していて、各ツールの出力は次のツールの入力となります。

例えば、コンパイラソースコードを受け取り、アセンブラ用のコードを出力します。

次にアセンブラはそのコードを受け取り、オブジェクトコードを生成します。

最後に、リンカはこれらのオブジェクトコードを組み合わせて、実行可能なバイナリを生成します。

https://paiza.hatenablog.com/entry/2020/07/03/%E5%88%9D%E5%BF%83%E8%80%85%E5%90%91%E3%81%91%E3%83%BB%E3%82%A2%E3%82%BB%E3%83%B3%E3%83%96%E3%83%A9%E3%81%A7%E5%AD%A6%E3%81%B6%E3%80%8C%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%81%AE
https://www.momoyama-usagi.com/entry/info-calc-sys10

WebAssemblyへのコンパイル簡単に、速く効果的にすることを目指しています。

1 簡単

Binaryenには単純なC APIがあり、単一のヘッダーから利用することができます。

翻訳者注
BinaryenのシンプルなC APIとは、Binaryenが提供する関数群のことを指します。

これらの関数はC言語で書かれており、開発者はこれを用いてBinaryenの機能にアクセスすることができます。

また、JavaScriptからも使用できます。

入力としてWebAssembly形式を受け入れるだけでなく、一般的な制御フローグラフ(CFG)も受け入れます。

翻訳者注
制御フローグラフ(CFG)は、プログラムの実行フロー(つまり、プログラムがどのように実行されるか)をグラフとして表現したものです。

ノード命令(または命令ブロック)を表し、エッジは制御が一つの命令から次にどのように移るかを表します。

これは通常、コンパイラソースコードの構造を理解し、最適化を行うために用いられます。

2 高速

Binaryen内部IRコンパクトなデータ構造を使用しており、完全に並列なコード生成最適化を可能にし、利用可能なすべてのCPUコアを使用します。

翻訳者注
ここでの "IR""Intermediate Representation"(中間表現)の略語です。

コンパイラの設計において、IRソースコード目的のマシンコードとの間に存在する抽象的なコード表現です。

一般的に、コンパイラはまずソースコードをこのIRに変換し、次にそれを最適化し、最後にそれをマシンコードに変換します。

BinaryenIRは、実質的にWebAssemblyのサブセットであるため、WebAssemblyに非常に簡単かつ迅速にコンパイルすることができます。

翻訳者注
"サブセット"とは、ある集合の一部である別の集合を指します。

https://tama-san.com/sourcehan-2/


3 効果的:

Binaryen最適化器には、コードのサイズ速度を改善するための多くのパス(一連の最適化手順)があります。

これらの最適化は、Binaryenコンパイラのバックエンドとして使用するのに十分なパワーを提供することを目指しています。

翻訳者注
つまり、Binaryenは、他のツールなしでプログラムの最適化コンパイルを行うことを目指しています。

特に焦点を当てているのは、WebAssembly固有最適化(一般的なコンパイラでは行わないかもしれないもの)で、これはJavaScriptやCSSなどの最小化と同様に、言語固有の最小化と考えることができます。

翻訳者注
これは、不要なスペース、改行、コメントなどを取り除くことでコードを縮小し、結果としてロード時間を短縮し、パフォーマンスを改善するプロセスを指します。
この場合はWebAssemblyのコードが最適化されているため、結果としてより効率的に実行できるコードが生成されます。

2 Binaryenを使用するコンパイラ

Binaryenを使用するコンパイラには以下のものがあります。

  • AssemblyScriptTypeScriptバリアントWebAssemblyにコンパイルします

  • wasm2jsWebAssemblyJSにコンパイルします

  • AsteriusHaskellWebAssemblyにコンパイルします

  • GrainGrainWebAssemblyにコンパイルします

3 提供するツールチェーンユーティリティ

Binaryenはまた、以下のツールチェインユーティリティを提供します。

1 パースと発行

WebAssemblyのパース発行

特に、WebAssemblyロードし、Binaryenを使用して最適化し、再発行することで、一つのコマンドでwasm-to-wasm最適化器を実装します。

2 解釈とSpecテスト

WebAssembly解釈し、WebAssemblyspecテストを実行します。

翻訳者注
BinaryenWebAssemblyのコードを読み込み、それを解釈して実行できることを示しています。
つまり、WebAssemblyのコードをCPUが直接実行する代わりに、Binaryenがその役割を果たします。

仕様テストはBinaryenがWebAssemblyの正確な実装であることを確認するための重要な手段です。
仕様テストは、ある特定の技術の実装がその技術の公式仕様に準拠していることを確認するための一連のテストを指します。
したがって、BinaryenがWebAssemblyの仕様テストを実行できるということは、それがWebAssemblyの公式仕様に準拠した動作をすることが検証できる、ということを意味します。

3 Emscriptenとの統合

Emscriptenと統合して、CおよびC++からWebAssemblyへの完全なコンパイラツールチェインを提供します。

翻訳者注
Emscriptenは、CやC++のようなプログラムをWebAssemblyまたはJavaScriptコンパイルするためのオープンソースのコンパイラです。

この文は、BinaryenEmscriptenと協力して、CやC++からWebAssemblyへの全体的なコンパイルと最適化のプロセス(つまり、ツールチェーン)を支援していることを示しています。

これは、BinaryenEmscriptenと一緒に動作して、CC++のコードをWebAssemblyに効率的にコンパイルするために使用できる最適化ツールを提供することを意味します。

https://livebook.manning.com/book/webassembly-in-action/chapter-3/56

4 ブラウザがまだネイティブサポートを提供していない場合

ブラウザがまだネイティブサポートを提供していない場合には、JavaScriptにコンパイルされたインタープリタWebAssemblyPolyfillすることで実行します(テストに便利)。

翻訳者注
ここでの"Polyfill"とは、新しい機能が既存の環境(この場合は特定のブラウザ)でまだネイティブにサポートされていない場合に、その機能をエミュレート(模倣)するためのコードのことを指します。

これにより、開発者は新しい機能が広く利用可能になる前にそれを使用することができ、それがどのように動作するかをテストできます。

つまり、BinaryenはJavaScriptにコンパイルされたインタープリタを通じてWebAssemblyを実行することで、WebAssemblyがまだネイティブにサポートされていないブラウザでWebAssemblyのコードを実行する能力を提供します。

これにより、WebAssemblyのコードがどのように動作するかをテストするために使用できます。

JavaScriptにコンパイルされたインタープリタとは、WebAssemblyのコードを読み込み、JavaScriptのコードとしてそれを実行するプログラムを指します。

このインタープリタは、JavaScriptを理解できる任意の環境(この場合はブラウザ)でWebAssemblyのコードを実行することができます。

以上です。

サポートをしていただけたらすごく嬉しいです😄 いただけたサポートを励みに、これからもコツコツ頑張っていきます😊