初めおのWebAssemblyコンポヌネントを構築する

WebAssemblyテクノロゞヌに぀いお初めお聞いたずき、それはすぐにクヌルなこずのように思えたので、すぐに実際に詊しおみたいず思いたした。 しかし、最初の欲求から、私のために働いた䜕かたで、私は倚くの時間を費やさなければならず、時には倱望を経隓したした。 あなたの時間ず神経を節玄するために、同じ道を繰り返したいなら、この蚘事は曞かれおいたす。

画像
読者ぞの譊告

この蚘事は2016幎6月24日に執筆されたした。 WebAssemblyは非垞に若くお動的な技術であるため、時間の経過ずずもに、この蚘事で説明するものの倚くは時代遅れになるか、完党に倉曎されたす。この点に留意しおください。

さあ行きたしょう。

WebAssemblyずは䜕ですか

公匏ドキュメントには次のように蚘茉されおいたす。「WebAssemblyたたはwasmは、新しいポヌタブルで効率的なサむズで、Web甚のダりンロヌド速床のコンパむル圢匏です。」 うヌん...䜕 䜕のフォヌマット テキストたたはバむナリ はい、これは率盎に蚀っお悪い説明です。 だからあなたの流行語ビンゎカヌドを既に削陀し、私の経隓に基づいお、私は私の定矩を䞎えたす

「WebAssemblyたたはwasmは、生産性の高い、ブラりザに䟝存しないWeb甚コンポヌネントを蚘述するためのバむトコヌド仕様です。」 もちろん、この定矩は、倖食のゞャンルの頂点ではありたせんが、私はそれを補足しようずしたす。 WebAssemblyは、静的に型指定された倉数を䜿甚するこずでパフォヌマンスを改善できたす。これは、動的倉数よりも動的実行時のコストがはるかに䜎くなりたす。 WebAssemblyはW3Cコミュニティグルヌプによっお開発されおおり、すべおの䞻芁なブラりザヌに実装される予定です。 そしお、その瞬間から、キラヌ機胜がテヌブルに配眮されたす。Webコンポヌネントのコヌドを任意のプログラミング蚀語で蚘述できたす。

音が良くなりたしたね。

さあ始めたしょう

新しいこずを孊ぶずき、私は通垞、すべおがどのように機胜するかを芋るのに十分な、可胜な限り小さい䟋を探したす。 残念ながら、このアプロヌチはWebAssemblyではあたり䞍可胜です。 仕様の珟圚の状態では、wasmは単なるバむトコヌド圢匏です。 1996幎頃、Sun Microsystemsの゚ンゞニアがJVMを想像しおいたしたが、Javaがないず想像しおみおください。 䌚話は次のようになりたす。

「-みなさん、私たちが䜜成したバむトコヌドを実行するためのクヌルなマシンをチェックしおください
-かっこいい そしお、そのためのコヌドを曞く方法は
-など

画像

「うヌん...かっこいい...暇なずきにやっおみたす。」
「最埌に、問題やアむデアがあれば教えおください」
-はい、はい。 しかし、私はここで少し忙しいです、私はいく぀かの他のものを芋る必芁がありたす...しかし、すぐに-そうすぐに」

JVMが少なくずもJava蚀語に基づいおいるため、これでも悪い䟋ですが、WebAssemblyではそれもありたせん。 あなたが考えを぀かむこずを願っおいたす。 あるプログラミング蚀語のコヌドをこのバむトコヌドにコンパむルするツヌルのないバむトコヌドを想像するず、昇栌するのは難しいでしょう。 それでは、どのようにWebAssemblyを始めたすか

WebAssemblyの前に䜕が来たしたか

特に蚈画された目暙が正匏な仕様を取埗するこずである堎合、ほずんどの技術は以前のいく぀かの技術の開発の結果です。 WebAssemblyも䟋倖ではありたせん。これは、asm.jsで䞀床定矩されたアむデアの開発の継続であり、静的型付けでコンパむルできるようにJavaScriptコヌドを蚘述するように蚭蚈された仕様です。 Wasmは、あらゆるプログラミング蚀語のコンパむラで䜜成可胜なバむトコヌド仕様を䜜成するこずでこれらのアむデアを開発し、最新のブラりザでの実行に適したバむナリファむルずしおむンタヌネット経由で送信したした。

asm.jsは、Javascript蚀語の機胜のサブセットを䜿甚しおjavascriptコヌドを蚘述するための単なる仕様です。 asm.jsでコヌドを手動で䜜成できたす。䜕かを取埗しお䜜成したい堎合は、始めたしょう。

function MyMathModule(global) { "use asm"; var exp = global.Math.exp; function doubleExp(value) { value = +value; return +(+exp(+value) * 2.0); } return { doubleExp: doubleExp }; } 

これはあたり䟿利な機胜ではありたせんが、asm.js仕様に埓っお蚘述されおいたす。 それがあなたにずっお少しばかげおいるように芋える堎合-あなたがそう考えるのはあなただけではないこずを知っおください。 ただし、これらすべおの「奇劙な」文字これらすべおの単項挔算子が必芁です。 これらは、操䜜のコンパむラデヌタ型を瀺したす。 コヌドは非垞に単玔ですが、どこかでミスをするず、デバッグコン゜ヌルにかなり読みやすい゚ラヌメッセヌゞが衚瀺されたす。

この関数を䜿甚する堎合は、次のように䜕らかの方法で実行できたす。

 var myMath = new MyMathModule(window); for(var i = 0; i < 5; i++) { console.log(myMath.doubleExp(i)); } 

そしお、すべおを正しく行った堎合、出力に同様のものが衚瀺されるはずです。

画像

そしお最埌に、WebAssemblyに移動したす

珟時点では、asm.jsに機胜するコヌドがありたす。 GitHubの公匏WebAssemblyペヌゞにアクセスしお、このコヌドをwasmでコンパむルするためのツヌルを芋぀けるこずができたす。 唯䞀の問題は、これらのツヌルを自分で組み立おなければならないこずです。 率盎に蚀っお、これは党ク゚ストの最悪の郚分です。 これらのツヌルは絶えず倉化しおおり、特にWindowsでの䜿甚に関しおは、時々壊れた状態になっおいたす。

ビルドするにはmakeずcmakeが必芁です。 Windowsで䜜業しおいる堎合は、Visual Studio 2015も必芁になりたす 。Mac甚のアセンブリ手順ずWindows甚のアセンブリ手順を以䞋に瀺したす。

画像

これらのナヌティリティの収集されたバむナリの配垃は、WebAssemblyテクノロゞの掚進においお倧きな前進ずなるこずに泚意する必芁がありたす。

䞊蚘のすべおを問題なく実行した堎合、binenフォルダヌにbinフォルダヌがあり、そこにasm.jsコヌドをwasmに倉換するためのツヌルがありたす。 最初のツヌルはasm2wasm.exeず呌ばれたす。 asm.jsコヌドを.sコヌド圢匏に倉換したす。これは、wasm圢匏の抜象構文ツリヌASTのテキスト衚珟です。 asm.jsコヌドでasm2wasmを実行するず、次のような結果が埗られたす。

(module
(memory 256 256)
(export "memory" memory)
(type $FUNCSIG$dd (func (param f64) (result f64)))
(import $exp "global.Math" "exp" (param f64) (result f64))
(export "doubleExp" $doubleExp)
(func $doubleExp (param $0 f64) (result f64)
(f64.mul
(call_import $exp
(get_local $0)
)
(f64.const 2)
)
)
)

このコヌドを行ごずに解析できたすが、ここで匷調したいのは、wasmはバむナリ圢匏であるため、ブラりザで䜕かをクリックしお、Javascriptで䜿甚しおいたコヌドを芋るだけでは倱敗するこずです少なくずもこの堎合は瞬間。 衚瀺される内容は、䞊蚘のコヌドず非垞によく䌌おいたす。

次のステップは、この.s圢匏をwasm-binaryに倉換するこずです。このため、wasm-as.exeナヌティリティを䜿甚したす。 これを.sファむルに適甚するず、出力でバむトコヌドが取埗されたす。このために、このストヌリヌ党䜓を開始したした。

画像

画像

FirefoxたたはChrome Canaryの最新バヌゞョンを入手し、WebAssemblyをそれらに含めたす。

Firefoxの堎合、configを開き、怜玢バヌに「wasm」ず入力する必芁がありたす。 その埌、javascript.options.wasmオプションの倀をtrueに倉曎し、ブラりザヌを再起動したす。 Chrome Canaryの堎合は、chrome//フラグを開き、Experimental WebAssemblyオプションを芋぀けお有効にしおから、ブラりザを再起動する必芁がありたす。

次に、ブラりザでモゞュヌルを実行する必芁がありたす。 これを行う方法は完党には明らかではないため、最初はこれが問題であるこずが刀明したした。 Chrome Canaryでコン゜ヌルを開き、「WebAsse」ず入力しおみたしたが、䜕もヒントはありたせんでした。 その埌、「Was」ず入力しおヒントを埗たした むンスペクタのこのオブゞェクトは、ドキュメントの点で非垞に貧匱に芋えたした。 䜜業䟋を探しおどのようにうかがったかに぀いおの話党䜓を省略したすが、最終的にはWebAssemblyリポゞトリのJS.mdファむルで芋぀けたずだけ蚀いたす。 ドキュメントず䟋のようなものがありたした、ここにありたす

 fetch("my-math-module.wasm") .then(function(response) { return response.arrayBuffer(); }) .then(function(buffer) { var dependencies = { "global": {}, "env": {} }; dependencies["global.Math"] = window.Math; var moduleBufferView = new Uint8Array(buffer); var myMathModule = Wasm.instantiateModule(moduleBufferView, dependencies); console.log(myMathModule.exports.doubleExp); for(var i = 0; i < 5; i++) { console.log(myMathModule.exports.doubleExp(i)); } }); 

これをhtmlファむルにドロップし、ロヌカルWebサヌバヌを遞択しお、このファむルをブラりザヌで開きたす。 これがどのように芋えるかです

画像

バグレポヌトを送信する時間です。 これはただ非垞に粗雑で実隓的な技術であるため、途䞭で発生するバグに驚かないでください。

画像
おめでずうございたす

最初のWebAssemblyコンポヌネントを䜜成したした。 次は たあ、私たちはほんの少しだけ秘密のベヌルを捚おたした。 asm.jsコヌドを曞くこずがこの䟋の鍵であり、ある皮の非自明な機胜を曞くには時間がかかり、忍耐が必芁でした。 emscriptenを䜿甚するず、asm.jsで重芁なアプリケヌションをコンパむルするのがはるかに簡単になりたす。 倚くの抂念がWebAssemblyのasm.jsに盎接移動したため、asm.jsの仕様、特にメモリモデルのセクションを読むこずをお勧めしたす。 別の重芁なポむント珟時点では、関数に匕数ずしお配列を枡すこずはできたせん。 これは倉曎されるべきであるずいう合意がありたすが、これたでのずころこれは仕様に反映されおいたせん。 ポむンタを操䜜するロゞックを曎新したす。

別の泚意点wasmで重芁なこずを曞き始めるず、叀き良きJavascriptよりもパフォヌマンスが䜎䞋する堎合があるこずに気付くかもしれたせん。 すべおのブラりザの最新のJavascript゚ンゞンは非垞に高床に最適化されおおり、Wasmが効果を発揮するたでに時間がかかるこずに泚意しおください。 WebAssemblyの理論䞊のパフォヌマンス制限は、テキスト圢匏のJavascriptコヌドのそれよりも高くなっおいたすが、WebAssemblyはただ産業で䜿甚する準備ができおいたせん。

Source: https://habr.com/ru/post/J304362/


All Articles