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
800
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
20260804_Q4AzureUpdateBite_FabricDataAgentの精度を高める設計.pdf
matayuuu
1
140
2026-08-15 JAWS-UG 茨城 #16 Secrets ManagerにおけるSecret値の管理(Terraformの場合) / Secrets Manager Secrets
masasuzu
0
190
え?フロントエンドエンジニアの ワイがインフラも!?
puku0x
1
680
今こそ聞きたいソフトウェア設計 ドメイン駆動設計再入門
masuda220
PRO
17
7.5k
ブラウザ研修 2026
recruitengineers
PRO
6
1.1k
AIコーディングの次。コードレビューと理解負荷を解消して組織の開発生産性を高める
moongift
PRO
2
2.6k
FORENSIA: ローカルLLMフォレンジックハーネス
sumeshi
2
410
ホームラボ紹介
y_sera15
0
200
Data Hubグループ 紹介資料
sansan33
PRO
0
3.2k
会社紹介資料 / Sansan Company Profile
sansan33
PRO
24
430k
Bill One 開発エンジニア 紹介資料
sansan33
PRO
7
20k
Contract One Engineering Unit 紹介資料
sansan33
PRO
0
19k
Featured
See All Featured
The Pragmatic Product Professional
lauravandoore
37
7.4k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.6k
We Are The Robots
honzajavorek
0
300
Faster Mobile Websites
deanohume
310
32k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
What's in a price? How to price your products and services
michaelherold
247
13k
Optimising Largest Contentful Paint
csswizardry
37
3.9k
Abbi's Birthday
coloredviolet
3
9.3k
Ruling the World: When Life Gets Gamed
codingconduct
0
300
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
210
Game over? The fight for quality and originality in the time of robots
wayneb77
1
240
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月リリース予定) • バグやおかしいな?と思う点があったら、ご連絡ください! • 知見を貯めて、公開してください!