webassemblyコンパイラアップデート
8487 ワード
これは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されたコンパイラは
私はタイプ情報でいくつかの課題に出くわした.コンパイラにはいくつかの異なる段階があります.私は最後の段階では、コードの生成は、範囲を制限するために働いた.しかし、すべてのタイプ情報はその後、ASTから削除されており、それはいくつかの課題を作成しました. 現在のところ、アプリケーションレベルでfloatパラメータを使用するのは安全ではない The カスタムタイプをタプルとリストから区別する必要があります.私はランタイムタイプの検出を使用しています. 詳細はこちらhttps://github.com/brian-carroll/elm-compiler#architecture-challenges
開発状況
それで?それはすべて作業ですか?今すぐ生産に使えますか.それは本当に速いですか?OMG!
いや!ごめんなさい!
私はまだ多くの実装問題に取り組んでいます.例えば、まだリチャード・フェルドマンのelm-spa-example 作業それは十分な複雑なので、私はすべてのバグを持っている場合は、それが表示されるバインドされている偉大なテストケースです!
私はまだパフォーマンスの仕事をしていない.私がそれに集中する前に、私はそれをデバッグして、アーキテクチャで若干の問題を分類する必要があります(下記の「現在の焦点」を見てください).
現在の焦点
私が現在している仕事の多くは、JS/WASMインターフェースにあります.私はJISとWASMのアプリでランタイムを持っているので、2つの間のインターフェイスは大きな焦点です.
私が考えている話題の二つ
JSランタイムからアプリケーションに渡されたオブジェクトの一部は、Unserialisableです.たとえば、DOMイベントは循環参照を含むので、シリアル化できません.JSONライブラリがどのように実装されているかはすべてです.私はほとんどの時間の作品何かを持っている!しかし、私はより信頼できる何かに取り組んでいます.
現在のアプリの
文字エンコーディング
The original post このプロジェクトが特に文字列エンコーディングとUTF - 8に特に言及していることを示します.そして、このことについていくつかの議論がありましたlast post . 私は、UTF - 16が利点を持っているかもしれないことを示唆しました.
私はいくつかbenchmarking 両方の符号化で、パフォーマンスの意味のアイデアを得るために.
多くのパフォーマンスの違いはありません.結果に基づいて、私は当初UTF - 8と行きたかったです.しかし、私は、私がコンパイラをテストするためにアプリを選ぶたびに、私はまた、同様に新しいストリングライブラリを使用するためにそのELMコードを移行しなければならないと思いました.そうでなければ、URL解析のようなものは壊れているかもしれません.それは単に物事を複雑にする.それで、私はこのプロジェクトのためにUTF - 16に貼り付けています.UTF - 8は別プロジェクトです.
非同期の初期化
webassemblyモジュールは通常コンパイルされますasynchronously 一度ブラウザにロードされます.編集が終わるまで待たなければならない
新しい機能を作った
todomvcの例のwebassembly版については、次のようになります.
概要
我々は現在、いくつかのELMアプリケーションをwebassemblyにコンパイルすることができますTodoMVC demo
いくつかのアーキテクチャ上の問題がありますが、まだ実行されていないパフォーマンスの作業は、カーネルのコードがたくさん書かれていないです.
WASMはUTF - 8を有効にしますが、別のプロジェクトです
AsyncコンパイルによるセットアップAPIの変更がいくつかあります
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から削除されており、それはいくつかの課題を作成しました.
Msg
種類私は、JSランタイムからWASMアプリにメッセージを渡すとき、intをfloatから指示する方法がありません.Time
モジュールはタイムスタンプ用にintを使用するので動作しません.現実的な値は、少なくとも42ビットが必要ですが、私は32ビットを使用しています.一部の低レベルの詳細はうまく動作します.なぜなら、WASMポインタは32ビットですからです.とJson
and Bitwise
ライブラリは32ビット整数も必要とします.開発状況
それで?それはすべて作業ですか?今すぐ生産に使えますか.それは本当に速いですか?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の変更がいくつかあります
Reference
この問題について(webassemblyコンパイラアップデート), 我々は、より多くの情報をここで見つけました https://dev.to/briancarroll/webassembly-compiler-update-1i2gテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol