webassemblyコンパイラアップデート


これはAの再投稿ですDiscourse post 2020年6月から
Aを投稿しましたfew times before ELBMをwebassemblyにコンパイルするプロジェクトについて.
プロジェクトは2つのgithubレポ、1つのcompiler そして、core libraries .
これはどれも公式ではない.私はコアチームの一部ではありません、そして、私が知っている限りでは、彼らはすぐにいつでもWebbassemblyに動く計画がありません.これは私自身の好奇心によって駆動される趣味プロジェクトです.

前任概要
インthis post , 私はカスタムガベージコレクターと私がWASMに移植したコアライブラリの部分について説明しました.
インmy last post システムアーキテクチャについて述べた.WebBassemblyがWeb APIをまだ持っていないので、ELMランタイムはJavaScriptに残ります.JSラッパーを介してランタイムにWASMアプリの協議.
私も非常に基本的な作業アプリのデモを示した.私がまだ作業用コンパイラを持っていなかったので、それは「手コンパイル」でした.

最新ニュース
マイlatest demo 実際に完全にコンパイルされたコードです!
数年前からのEvanのtodomvc例のwebassemblyポートですoriginal repo )

コンパイラ変更
forkされたコンパイラは--output elm.c コマンドラインオプションと同様に--output elm.js and --output elm.html . Cファイルを持っているならばEmscripten さらにwebassemblyにコンパイルします.GNUを使って調整するステップもいくつかありますmake .
私はタイプ情報でいくつかの課題に出くわした.コンパイラにはいくつかの異なる段階があります.私は最後の段階では、コードの生成は、範囲を制限するために働いた.しかし、すべてのタイプ情報はその後、ASTから削除されており、それはいくつかの課題を作成しました.
  • 現在のところ、アプリケーションレベルでfloatパラメータを使用するのは安全ではないMsg 種類私は、JSランタイムからWASMアプリにメッセージを渡すとき、intをfloatから指示する方法がありません.
  • The Time モジュールはタイムスタンプ用にintを使用するので動作しません.現実的な値は、少なくとも42ビットが必要ですが、私は32ビットを使用しています.一部の低レベルの詳細はうまく動作します.なぜなら、WASMポインタは32ビットですからです.とJson and Bitwise ライブラリは32ビット整数も必要とします.
  • カスタムタイプをタプルとリストから区別する必要があります.私はランタイムタイプの検出を使用しています.
  • 詳細はこちらhttps://github.com/brian-carroll/elm-compiler#architecture-challenges

    開発状況
    それで?それはすべて作業ですか?今すぐ生産に使えますか.それは本当に速いですか?OMG!
    いや!ごめんなさい!
    私はまだ多くの実装問題に取り組んでいます.例えば、まだリチャード・フェルドマンのelm-spa-example 作業それは十分な複雑なので、私はすべてのバグを持っている場合は、それが表示されるバインドされている偉大なテストケースです!
    私はまだパフォーマンスの仕事をしていない.私がそれに集中する前に、私はそれをデバッグして、アーキテクチャで若干の問題を分類する必要があります(下記の「現在の焦点」を見てください).

    現在の焦点
    私が現在している仕事の多くは、JS/WASMインターフェースにあります.私はJISとWASMのアプリでランタイムを持っているので、2つの間のインターフェイスは大きな焦点です.
    私が考えている話題の二つ
    JSランタイムからアプリケーションに渡されたオブジェクトの一部は、Unserialisableです.たとえば、DOMイベントは循環参照を含むので、シリアル化できません.JSONライブラリがどのように実装されているかはすべてです.私はほとんどの時間の作品何かを持っている!しかし、私はより信頼できる何かに取り組んでいます.
    現在のアプリのModel はJSに格納されますがupdate 関数はWASMにある.つまり、モデルはJSからWASMへと渡され、すべての更新サイクルで再びやり直されなければなりません.それがJSランタイムで何かを変える必要がなかったので、これが動く唯一の理由はそれが起きて、走るのがより速いということでした.

    文字エンコーディング
    The original post このプロジェクトが特に文字列エンコーディングとUTF - 8に特に言及していることを示します.そして、このことについていくつかの議論がありましたlast post . 私は、UTF - 16が利点を持っているかもしれないことを示唆しました.
    私はいくつかbenchmarking 両方の符号化で、パフォーマンスの意味のアイデアを得るために.
    多くのパフォーマンスの違いはありません.結果に基づいて、私は当初UTF - 8と行きたかったです.しかし、私は、私がコンパイラをテストするためにアプリを選ぶたびに、私はまた、同様に新しいストリングライブラリを使用するためにそのELMコードを移行しなければならないと思いました.そうでなければ、URL解析のようなものは壊れているかもしれません.それは単に物事を複雑にする.それで、私はこのプロジェクトのためにUTF - 16に貼り付けています.UTF - 8は別プロジェクトです.

    非同期の初期化
    webassemblyモジュールは通常コンパイルされますasynchronously 一度ブラウザにロードされます.編集が終わるまで待たなければならないElm.Main.init .
    新しい機能を作ったElm.onReady これを助ける.あなただけのコールバックにあなたのアプリケーションの通常のセットアップコードを入れてElm.onReady 適切なタイミングで実行します.
    todomvcの例のwebassembly版については、次のようになります.
    <script type="text/javascript">
      Elm.onReady(function () {
        var storedState = localStorage.getItem('elm-todo-save');
        var startingState = storedState ? JSON.parse(storedState) : null;
        var app = Elm.Main.init({ flags: startingState });
        app.ports.setStorage.subscribe(function (state) {
          localStorage.setItem('elm-todo-save', JSON.stringify(state));
        });
      });
    </script>
    

    概要
    我々は現在、いくつかのELMアプリケーションをwebassemblyにコンパイルすることができますTodoMVC demo
    いくつかのアーキテクチャ上の問題がありますが、まだ実行されていないパフォーマンスの作業は、カーネルのコードがたくさん書かれていないです.
    WASMはUTF - 8を有効にしますが、別のプロジェクトです
    AsyncコンパイルによるセットアップAPIの変更がいくつかあります