Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
20161221-WASM
Search
chikoski
January 10, 2017
Technology
92
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
20161221-WASM
chikoski
January 10, 2017
More Decks by chikoski
See All by chikoski
20210825_ossx
chikoski
0
360
festudy02-wasm
chikoski
1
1.1k
An overview of WebAssembly; how it is used, created, and applied?
chikoski
1
790
Functions in JavaScript
chikoski
1
1.2k
20171018-WASM
chikoski
2
1.5k
20171002-wejs
chikoski
1
630
20170924-html5conference-wasm
chikoski
5
10k
Equivalence_in_JS
chikoski
0
1.6k
いまさら振り返るPromise
chikoski
1
620
Other Decks in Technology
See All in Technology
美しいコードを書くためにF#を学んでみた話
yud0uhu
1
440
Making sense of Google’s agentic dev tools
glaforge
1
250
環境凍結という Toil を倒す -セルフサービス型 Ephemeral テスト環境の 設計と実践
shirouz
1
2.5k
あなたの『Site』はどこですか? — xREという考え方
miyamu
0
1.2k
しぶいSRE: サーバから見えない障害にどう向き合うか。ラストワンマイルのデバッグ実践 / Shibui SRE
kanny
13
6.3k
“それは自分の仕事じゃない"を越えて行け
yuukiyo
1
400
事業価値を⽣み出すSREへ SREが担うべき意思決定の5層
kenta_hi
2
3.8k
Devsumi 2026 Summer 人もAIも使える共通基盤を事業の加速装置にする~デザインシステム運用に学ぶ組織レバレッジ~ 渡辺 凌央
legalontechnologies
PRO
1
160
地域 SRE コミュニティ最前線 / SRE NEXT 2026 Discussion Night Track C
muziyoshiz
0
230
貴方はどのエンジニアリングを磨くのか
hatyibei
0
130
Control Planeで育てるBtoB SaaSの認証基盤 - SRE NEXT 2026
pokohide
1
2.5k
型は壁、Rustでもバグを直すな、表現できなくせよ
nwiizo
14
2.1k
Featured
See All Featured
Rails Girls Zürich Keynote
gr2m
96
14k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
290
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.5k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
How to make the Groovebox
asonas
2
2.3k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
590
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.1k
Design in an AI World
tapps
1
260
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.4k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.7k
Side Projects
sachag
455
43k
Transcript
ブラウザプレビュー期間に入ったWebAssembly Mozilla Japan N.Shimizu (
[email protected]
/ @chikoski) Emscripten Night!! #2
@ Drecom (2016/12/21)
/4IJNJ[V!DIJLPTLJ ˖ ⛆加㖩ח֮8FC⡲⠓爡ד⫴ְגְתׅ ˖ 'JSFGPY ˖ 3VTUBTNKT8FC"TTFNCMZ8FC73 ˖ فؚٗٓىؚٝ鎉铂ה؟حؕ٦鋅ךָ㥨ֹדׅ ˖
㘗ך䓼ְ鎉铂ָ㥨ֹדׅ ˖ IUUQTTQFBLFSEFDLDPNDIJLPTLJ
None
None
Open Source Project
Proudly non-profit, Mozilla makes products like Firefox with a mission
to keep the power of the Web in the hands of users everywhere. Mozilla Mission (https://www.mozilla.org/en-US/mission/)
To ensure the Internet is a global public resource, open
and accessible to all. Mozilla Mission(https://www.mozilla.org/en-US/mission/)
debugger.html:再開発中のFirefox 組み込みのデバッガー • React と Redux、flow を使って実装されています • スタンドアローンで実行できます •
Firefox だけでなく、Google Chromeやnode.jsで動いているコードもデバッグできます • https://github.com/devtools-html/debugger.html
Remote Debugging Protocol / Chrome Debugging Protocol のフロントエンド $ISPNF%FCVHHJOH1SPUPDPM $ISPNF%FCVHHJOH1SPUPDPM
3FNPUF%FCVHHJOH1SPUPDPM
よく紹介させていただいています!ありがとうございます!!
• asm.js のコードはサイズが大きくなりがちで、ロードに時間がかかる傾向があります • ロードに時間の大半が構文解析に充てられています • 構文解析を事前に行い、その結果をバイナリ形式で表現することで、ロード時間を短縮します ߏจղੳ μϯϩʔυ ίϯύΠϧ
࣮ߦ asm.js ߏจղੳ μϯϩʔυ ίϯύΠϧ ࣮ߦ WASM
WAST TFU@MPDBMB JBEE JDPOTU JNVM
JDPOTU JDPOTU i32.mul i32.add set_local $a 1 i32.const 1 i32.const 2 i32.const
https://hacks.mozilla.org/2016/10/webassembly-browser-preview/
https://hacks.mozilla.org/2016/10/webassembly-browser-preview/
https://blogs.windows.com/msedgedev/2016/10/31/webassembly-browser-preview/
8"4.גוֲװג8FCل٦آח穈鴥ך
HTML TDSJQUUZQFNPEVMFTSDNPEVMF@BXBTNTDSJQU TDSJQUUZQFNPEVMFTSDNPEVMF@CKTTDSJQU TDSJQUTSDNBJOKTTDSJQU 未来的には、ES6 moduleの枠組みで利用できるようにしたい(希望)
JS GFUDI NPEVMF@BXBTN UIFO SFTQPOTFSFTQPOTFBSSBZ#VGGFS UIFO CVGGFSOFX6*OU"SSBZ CVGGFS
UIFO CZUFT8FC"TTFNCMZDPNQJMF CZUFT UIFO NPEVMF\ DPOTUJOTUBODFOFX8FC"TTFNCMZ*OTUBODF NPEVMF ^ WASMモジュールのコンパイルと、モジュールのインスタンス化
属性 役割 WebAssembly.Module WebAssembly.Moduleオブジェクトのコンストラクタ WebAssembly.Instance WebAssembly.Instanceオブジェクトのコンストラクタ WebAssembly.Memory WebAssembly.Memoryオブジェクトのコンストラクタ WebAssembly.Table WebAssembly.Tableオブジェクトのコンストラクタ
WebAssembly.CompileError デコード、もしくは検証中に発生したエラー WebAssembly.RuntimeError trap 発生時に送出されるエラー WebAssembly:グローバルオブジェクト
WASMのWebAssembly.Moduleへのコンパイル 1.エンコード方式に従って、バイトコードをデコードし、抽象構文木(AST)を作成します 2.ASTの構造を検証します 3.AST中の文字列を UTF-8 としてデコードします •名前は文字列として扱われます •名前:インポートする関数、エキスポートする関数など 4.上記に成功した場合、WebAssembly.Moduleオブジェクトが作成されます 5.失敗した場合は、WebAssembly.ComileError
が送出されます
NPEVMF\ MPDBM'PSBHFTFU*UFN DPNQJMFE@NPEVMF@B NPEVMF XPSLFSQPTU.FTTBHF \DPNQJMFE.PEVMFNPEVMF ^ NPEVMF\
MPDBM'PSBHFTFU*UFN DPNQJMFE@NPEVMF@B NPEVMF XPSLFSQPTU.FTTBHF \DPNQJMFE.PEVMFNPEVMF ^ PONFTTBHFGVODUJPO NFTTBHF \ DPOTUNPEVMFNFTTBHFDPNQJMFE.PEVMF DPOTUJOTUBODF8FC"TTFNCMZ*OTUBODF JOTUBODF MFUUXPJOTUBODFFYQPSUTBEE ^ main Worker WebAssembly.Module オブジェクトはクローンできます MPDBM'PSBHFחאְגכֿ撑IUUQTHJUIVCDPNMPDBM'PSBHFMPDBM'PSBHF
WAST NPEVMF JNQPSUJNIFMMP JNQPSUJXPSME GVODNBJO
DBMM@JNQPSUJ TUBSUNBJO GVODG DBMM@JNQPSUJ FYQPSUGG import / export
JS NPEVMF\ DPOTUJNQPSU\ N\IFMMP DPOTPMFMPH IFMMP XPSME DPOTPMFMPH XPSME
^ DPOTUJOTUBODF8FC"TTFNCMZJOTUBODF NPEVMF JNQPSU IFMMP JOTUBODFFYQPSUTG XPSME ^ インスタンス作成時にimportするシンボルを与えることで、ダイナミックリンクさせられます
線形メモリー:WebAssemblyのメモリモデル • バイト単位(8ビット)でアクセスできる線形メモリ • ヒープ領域 • データ領域 • リトルエンディアン •
最大サイズは 4GiB(1ページ64KiB、32ビット分) • 演算子を利用してサイズを増やせます • grow_memory 演算子でサイズを増やせます • current_memory 演算子で現在のサイズを取得できます CZUF BEESFTT@TQBDF@NBY
ԋࢉࢠ ৼΔ͍ i32.load8_s 1όΠτΛϩʔυ͠ɺi32ͱ֦ு͢Δ i32.load8_u 1όΠτΛϩʔυ͠ɺu32ͱ֦ு͢Δ i32.load16_s 2όΠτΛϩʔυ͠ɺi32ͱ֦ு͢Δ i32.load16_u 2όΠτΛϩʔυ͠ɺu32ͱ֦ு͢Δ
i32.load 4όΠτϩʔυ͢Δ i32.store8 i32ͷΛi8ͱͯ͠อଘ͢Δ i32.store16 i32ͷΛi16ͱͯ͠อଘ͢Δ i32.store i32ͷΛอଘ͢Δ 読み書きするデータのサイズは演算子の種類によって決まります
JS asm.js WPJEIJ DIBS CVG \ CVG<>I CVG<>J CVG<>= ^
GVODIJ QBSBNJ JTUPSFPGGTFU HFU@MPDBM JDPOTU JTUPSFBMJHO HFU@MPDBM JDPOTU SFUVSO I J = CVG
GVODIJ QBSBNJ JTUPSFPGGTFU HFU@MPDBM
JDPOTU JTUPSFBMJHO HFU@MPDBM JDPOTU SFUVSO = HFU@MPDBM PGGTFU offsetで、アクセスする場所をバイト単位でずらせます
GVODIJ QBSBNJ JTUPSFPGGTFU HFU@MPDBM
JDPOTU JTUPSFBMJHO HFU@MPDBM JDPOTU SFUVSO I J = HFU@MPDBM Y Y YJ YI align を指定することで、転送サイズを変えられます(上記の例は1バイトずつ転送しています)
JS DPOTUNPEVMFT\^ NPEVMF"\ NPEVMFT"8FC"TTFNCMZ*OTUBODF NPEVMF" ^ NPEVMF#\ NPEVMFT#8FC"TTFNCMZ*OTUBODF NPEVMF#
^ module.A と module.B はメモリ空間を共有します
JS DPOTUNFNPSZ8FC"TTFNCMZ.FNPSZ DPOTUWJFXOFX6*OU"SSBZ NFNPSZCVGGFS WJFX<> WJFX<> WJFX<> WJFX<> WJFX<>
WJFX<> メモリ空間は、WebAssembly.Memoryオブジェクトとして参照できます
つかってください! • これからはWebAssemblyオブジェクトを利用して、モジュールをコンパイルします • WebAssembly.compile • WebAssembly.Module • WebAssembly.Instance •
ダイナミックリンクできるようになりました • メモリ空間はインスタンス間で共有されます • Firefox 52で標準利用できるようになります(2017年3月リリース予定) • バグやおかしいな?と思う点があったら、ご連絡ください! • 知見を貯めて、公開してください!