Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
20161221-WASM
Search
chikoski
January 10, 2017
Technology
96
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
800
Functions in JavaScript
chikoski
1
1.3k
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
630
Other Decks in Technology
See All in Technology
12 個 Tool と、 4,096 Token
hlum
0
150
触りたくないデータに、どう触るか AI時代のRBACアクセスガバナンス
ivry_presentationmaterials
0
140
脆弱性診断って、何をしているの? 〜弱点を見つけて、会社の改善につなげるまで〜
keeg
0
890
実践!Cloud Run ハンズオン!! / Cloud Run handson
y0hgi
2
260
Snapshot Testing in Practice: Predictable and Reliable SwiftUI Views
fespinoza
0
210
AI時代だからこそ推したい!Gitコマンド再入門
munakata
0
180
How to Design Configuration for Rails Applications
willnet
0
230
Post AI時代のリファクタリング実践記 / Refactoring in the post AI era
kaminashi
1
190
「Docker Desktop不要の時代」は 来たのか?
ueponx
0
620
日本語に強いオープンな大規模言語モデル「LLM-jp」
odashi
3
830
Claude Code本は、どのように執筆チームで書かれたか
oikon48
1
360
Persisting Massive Data with Rails ~Designing for 60 billion rows, and fighting the bottlenecks~ Railsで挑む大量データ永続化 〜600億件を永続化するための設計とボトルネックとの戦い〜
occhi
0
490
Featured
See All Featured
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
3.1k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
The Invisible Side of Design
smashingmag
301
52k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
Design in an AI World
tapps
1
350
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
1.1k
Building a Scalable Design System with Sketch
lauravandoore
464
34k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
58k
Being A Developer After 40
akosma
92
590k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
46k
Testing 201, or: Great Expectations
jmmastey
46
8.3k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
580
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月リリース予定) • バグやおかしいな?と思う点があったら、ご連絡ください! • 知見を貯めて、公開してください!