WebAssemblyがどのように機能するかを理解するには、アセンブラコードとは何か、コンパイラがどのように生成するかを理解することをお勧めします。 JITに関する記事で、コンピューターとの相互作用とエイリアンとの相互作用を比較しました。
エイリアンの脳の働き、つまりコンピューターの脳が受信したメッセージをどのように分析して理解するかを考えたいと思います。 脳の一部は、たとえば加算、減算、論理演算などを考えるためのものです。 短期記憶を担当する領域と長期を担当する別の領域があります。
それらはすべて名前を持っています。
- 思考の分野は、算術論理ユニット(ALU)です。
- 短期記憶はレジスタによって提供されます。
- 長期メモリはランダムアクセスメモリ(RAM)です。
マシンコード内の文は命令と呼ばれます。
そのような命令が脳に入るとどうなりますか? これは、異なる意味を持ついくつかの部分に分かれています。 命令の分離は、脳の構造に依存します。 たとえば、写真の脳は最初の6個を取り、算術論理演算装置(ALU)に入れます。 0と1に基づいて、ALUはこれらの部品を接続する必要があると判断します。
このチャンクは、実行する操作をALUに伝えるため、「オペコード、操作コード」と呼ばれます。
その後、脳はそれぞれ3ビットの次の2つのチャンクを取り、追加する2つの数字を決定します。 これらはレジスタのアドレスになります。
ここで何が起きているかを理解するのに役立つコードの上の説明に注意してください。 これがアセンブラーです。 これは、キャラクターマシンコードと呼ばれます。 これは人々がマシンコードを理解する方法です。
アセンブラーとマシンコードの間には直接リンクがあります。 このため、さまざまな種類のマシンアーキテクチャに対してさまざまな種類のアセンブラが存在します。 新しいアーキテクチャに直面した場合、ほとんどの場合、新しい方言のアセンブラが必要になります。
翻訳用のオブジェクトが複数あることがわかりました。 マシンコードと呼ばれる1つの言語ではなく、さまざまな種類のマシンコードがあります。 人と同じように、車はさまざまな言語を話します。
人間からエイリアンに変換すると、英語、ロシア語、中国語からエイリアンAまたはエイリアンBに切り替わります。プログラミング用語では、これはC、C ++、またはRustからx86またはARMに切り替える方法です。
これらの高レベルプログラミング言語を任意のタイプのアセンブラー(さまざまなアーキテクチャに適している)に翻訳できるようにしたいとします。 これを行う1つの方法は、任意の言語から任意のアセンブラーに翻訳できる多くの翻訳者を作成することです。
それは非常に非効率的です。 この問題を解決するために、ほとんどのコンパイラはプロセスにもう1つのステップを追加します。 高レベルのプログラミング言語はよりシンプルに変換されますが、それでもマシンコードのレベルでは動作しません。 これは、中間表現IRと呼ばれます。
これは、コンパイラーが任意の高水準プログラミング言語を使用して、IR言語に翻訳できることを意味します。 その後、コンパイラの別の部分がIR言語を取得し、そこからターゲットアーキテクチャに適したものをコンパイルできます。
コンパイラフロントエンドは、高レベルのプログラミング言語を中間表現に変換します。 また、バックエンドは、ターゲットアーキテクチャのアセンブラーの中間表現です。
おわりに
これがアセンブラーであり、コンパイラーが高水準プログラミング言語をアセンブラーに変換する方法です。 次の記事では、これがWebAssemblyにどのように関係するかを見ていきます。