ì¹ì´ì ë¸ë¦¬ì JavaScript API ì¬ì©í기
Emscriptenê³¼ ê°ì ë구를 ì¬ì©íì¬ ë¤ë¥¸ ì¸ì´ì 모ëì ì»´íì¼íê±°ë ì½ë를 ì§ì ë¡ëíì¬ ì¤í í´ë´¤ë¤ë©´ ë¤ì ë¨ê³ììë WebAssembly JavaScript APIì ë¤ë¥¸ 기ë¥ì ì¬ì©íë ë°©ë²ì ëí´ ìì¸í ìì ë´ ëë¤.
ì°¸ê³ : ì¬ê¸°ìì ì¸ê¸í 기본 ê°ë ì ìµìíì§ ìê±°ë ë ë§ì ì¤ëª ì´ íìí ê²½ì° WebAssembly concepts를 먼ì ì½ì´ë³´ì¸ì.
ëªê°ì§ ê°ë¨í ìì
WebAssembly JavaScript API를 ì¬ì©íë ë°©ë²ê³¼ ì¹ íì´ì§ìì wasm 모ëì ë¡ëíë ë°©ë²ì ì¤ëª íë ëª ê°ì§ ìì 를 ì¤í í´ ë³´ê² ìµëë¤.
ì°¸ê³ : ìí ì½ëë webassembly-examples GitHub repoìì ì°¾ì ì ììµëë¤.
ìì ì¤ë¹í기
-
먼ì wasm 모ëì´ íìí©ëë¤! simple.wasm íì¼ì ë¡ì»¬ ì»´í¨í°ì ì ëë í 리ì ì ì¥íì¸ì.
-
ë¤ìì¼ë¡, wasm íì¼ê³¼ ëì¼í ëë í 리ì index.htmlì´ë¼ë ê°ë¨í HTML íì¼ì ìì±í´ë³´ì¸ì (simple templateì ì°¸ê³ íë©´ ì½ìµëë¤.)
-
ì´ì ì¬ê¸°ì ë¬´ì¨ ì¼ì´ ë²ì´ì§ëì§ ì´í´í기 ì½ëë¡ í기ìí´ wasm 모ë (Converting WebAssembly format to wasmì ì°¸ê³ )ì í ì¤í¸ ííì ì´í´ ë³´ê² ìµëë¤.
rust(module (func $i (import "imports" "imported_func") (param i32)) (func (export "exported_func") i32.const 42 call $i)) -
ë ë²ì§¸ ì¤ìì 2ë¨ê³ì import ë¤ìì¤íì´ì¤ê° ììµëë¤. ì¦, ë´ë¶ 기ë¥
$iëimports.imported_funcìì ê°ì ¸ì´ì ì ì ììµëë¤. wasm 모ëë¡ ê°ì ¸ì¬ ê°ì²´ë¥¼ ìì±í ë JavaScriptìì ì´ 2ë¨ê³ ë¤ìì¤íì´ì¤ë¥¼ ë°ìí´ì¼ í©ëë¤. HTML íì¼ì<script></script>ìì를 ë§ë¤ê³ ë¤ì ì½ë를 ì¶ê°í©ëë¤.jsvar importObject = { imports: { imported_func: (arg) => console.log(arg) }, };
ì¹ì´ì ë¸ë¦¬ 모ëì ì¤í¸ë¦¬ë°í기
Firefox 58ì ìë¡ì´ 기ë¥ì¼ë¡ 기본 ìì¤ìì ì§ì WebAssembly 모ëì ì»´íì¼íê³ ì¸ì¤í´ì¤ííë 기ë¥ì´ ììµëë¤. ì´ë WebAssembly.compileStreaming() ì WebAssembly.instantiateStreaming() ë©ìë를 ì¬ì©íì¬ ìíë©ëë¤. ì´ ë©ìëë ë°ì´í¸ ì½ë를 ì§ì Module/Instance ì¸ì¤í´ì¤ë¡ ë³í í ì ì기 ë문ì ì¤í¸ë¦¬ë°ì´ ìë ë°©ìì ë©ìëë³´ë¤ ìì±ì´ ì½ìµëë¤. ë³ëë¡ Response를 ArrayBufferë¡ í¸ì¶í íìì±ì ìì ì¤ëë¤.
ì´ ìì ë (GitHubì instantiate-streaming.html ë°ëª¨ì view it live를 ë³´ì¸ì) instantiateStreaming()ì ì¬ì©íì¬ wasm 모ëì ê°ì ¸ì¤ê³ , JavaScript í¨ì를 ê°ì ¸ì¤ê³ , ì»´íì¼íê³ ì¸ì¤í´ì¤ííë©°, ë´ ë³´ë¸ í¨ìì ì¡ì¸ì¤íë ë°©ë²ì íë²ì ë³´ì¬ì¤ëë¤.
첫 ë²ì§¸ ë¸ë¡ ìëì ë¤ìì ì¶ê°íììì¤.
WebAssembly.instantiateStreaming(fetch("simple.wasm"), importObject).then(
(obj) => obj.instance.exports.exported_func(),
);
ê·¸ ê²°ê³¼, ë´ ë³´ë¸ WebAssembly í¨ì ì¸ export_func를 í¸ì¶í©ëë¤.ì´ í¨ìë ê°ì ¸ì¨ JavaScript í¨ì imported_func를 í¸ì¶í©ëë¤.ì´ í¨ìë WebAssembly ì¸ì¤í´ì¤ (42) ë´ë¶ì ì ê³µë ê°ì ì½ìì 기ë¡í©ëë¤. ì§ê¸ ìì ì½ë를 ì ì¥íê³ WebAssembly를 ì§ìíë ë¸ë¼ì°ì ì ë¡ëíë©´ ì´ë¥¼ ì¤ì ë¡ ë³¼ ì ììµëë¤!
ì°¸ê³ : ì´ê²ì ë§¤ì° ëí´íê³ , ê¸¸ê³ ì§ë£¨í ìì´ì§ë§ ì¹ ìì©íë¡ê·¸ë¨ìì JavaScriptì í¨ê» WebAssembly ì½ë를 ì¬ì©íì¬ ê°ë¥í ê²ì ì¤ëª íë ë° ëìì´ ë©ëë¤. ì°ë¦¬ê° ë¤ë¥¸ ê³³ìì ì¸ê¸íë¯ì´, WebAssemblyë JavaScript를 ëì²´íë ¤ë ê²ì´ ìëë¼, ê·¸ ë ê°ê° ìí¸ ìì©íì¬ ìë¡ì ê°ì ì ì´ëì´ ë¼ì ììµëë¤.
ì¤í¸ë¦¬ë°íì§ ìê³ ì¹ì´ì ë¸ë¦¬ 모ë ë¡ë
ììì ì¤ëª
í ì¤í¸ë¦¬ë° ë°©ë²ì ì¬ì©í ì ìê±°ë ì¬ì©íì§ ìì¼ë ¤ë©´ ì¤í¸ë¦¬ë°íì§ ìë ë©ìëWebAssembly.compile / WebAssembly.instantiate를 ëì ì¬ì©í ì ììµëë¤.
ì´ ë©ìëë ë°ì´í¸ ì½ëì ì§ì ì¡ì¸ì¤íì§ ìì¼ë¯ë¡ wasm 모ëì ì»´íì¼ / ì¸ì¤í´ì¤íí기 ì ì ìëµì ArrayBufferë¡ ë³ííë ì¶ê° ë¨ê³ê° íìí©ëë¤.
ì´ì ëë±í ì½ëë ë¤ìê³¼ ê°ìµëë¤.
fetch("simple.wasm")
.then((response) => response.arrayBuffer())
.then((bytes) => WebAssembly.instantiate(bytes, importObject))
.then((results) => {
results.instance.exports.exported_func();
});
ê°ë°ì ë구ìì ì¹ì´ì ë¸ë¦¬ 보기
Firefox 54+ìì Developer Tool Debugger Panelìë ì¹ íì´ì§ì í¬í¨ë 모ë wasm ì½ëì í ì¤í¸ ííì íìíë 기ë¥ì´ ììµëë¤. Debugger í¨ëë¡ ì´ëíì¬ "wasm://" í목ì í´ë¦í ì ììµëë¤.

Firefoxìì WebAssembly를 í ì¤í¸ë¡ ë³´ë ê² ì¸ìë í ì¤í¸ íìì ì¬ì©íì¬ ê°ë°ìë WebAssembly를 ëë²ê¹ í ì ììµëë¤(breakpoint, callstack ê²ì¬, ë¨ì¼ ë¨ê³ ê²ì¬ ë±). ë¹ëì¤ ë¯¸ë¦¬ 보기ë WebAssembly debugging with Firefox DevToolsì 참조íììì¤.
ë©ëª¨ë¦¬ ì¸ì¤í´ì¤
WebAssemblyì ì ìì¤ ë©ëª¨ë¦¬ 모ë¸ìì ë©ëª¨ë¦¬ë Linear Memoryë¼ê³ íë íìì´ ì§ì ëì§ ìì ë°ì´í¸ì ì°ì ë²ìë¡ íìëë©° load and store instructionsì ìí´ ëª¨ë ë´ë¶ìì ì½ê³ ì°ì¬ì§ëë¤. ì´ ë©ëª¨ë¦¬ 모ë¸ìì 모ë load ëë storeë linear memoryì 모ë ë°ì´í¸ì ì¡ì¸ì¤ í ì ìì¼ë¯ë¡ í¬ì¸í°ì ê°ì C / C ++ ê°ë ì ì¶©ì¤íê² íííë ë° íìí©ëë¤.
ê·¸ë¬ë ë¤ì´í°ë¸ C / C ++ íë¡ê·¸ë¨ê³¼ ë¬ë¦¬ ì¬ì© ê°ë¥í ë©ëª¨ë¦¬ ë²ìê° ì ì²´ íë¡ì¸ì¤ì 걸ì³ìë ê²½ì° í¹ì WebAssembly ì¸ì¤í´ì¤ê° ì¡ì¸ì¤ í ììë ë©ëª¨ë¦¬ë WebAssembly ë©ëª¨ë¦¬ ê°ì²´ì í¬í¨ ë í¹ì ë²ì (ì ì¬ì ì¼ë¡ ë§¤ì° ìì ë²ì)ë¡ ì íë©ëë¤. ì´ë¥¼ íµí´ ë¨ì¼ ì¹ ìì© íë¡ê·¸ë¨ì WebAssembly를 ë´ë¶ì ì¼ë¡ ì¬ì©íë ì¬ë¬ ë 립 ë¼ì´ë¸ë¬ë¦¬ë¥¼ ì¬ì©íì¬ ìë¡ ìì í 격리 ë ë³ëì ë©ëª¨ë¦¬ë¥¼ ê°ì§ ì ììµëë¤.
ìë° ì¤í¬ë¦½í¸ìì Memory ì¸ì¤í´ì¤ë í¬ê¸°ë¥¼ ì¡°ì í ììë ArrayBufferë¡ ìê°í ì ìì¼ë©°, ArrayBuffersì ë§ì°¬ê°ì§ë¡ íëì ì¹ ì±ìì ë§ì ë
립ì ì¸ Memory ê°ì²´ë¥¼ ë§ë¤ ì ììµëë¤. WebAssembly.Memory() ìì±ì를 ì¬ì©íì¬ ìì± í ì ììµëë¤. ìì±ìë ì¸ìë¡ ì´ê¸° í¬ê¸°ì (ì íì ì¼ë¡) ìµë í¬ê¸°ë¥¼ ì¸ìë¡ ì·¨í©ëë¤.
ë¹ ë¥´ê² ìì 를 ì´í´ë´ ìë¤.
-
ìë¡ì´ ê°ë¨í HTML íì´ì§ë¥¼ ë§ë¤ê³ (simple templateì ë³µì¬íììì¤)
memory.htmlì í¸ì¶íììì¤.<script></script>ìì를 íì´ì§ì ì¶ê°íììì¤. -
ì´ì ì¤í¬ë¦½í¸ 맨 ìì ë¤ì íì ì¶ê°íì¬ ë©ëª¨ë¦¬ ì¸ì¤í´ì¤ë¥¼ ë§ëëë¤.
jsvar memory = new WebAssembly.Memory({ initial: 10, maximum: 100 });initialë°maximumë¨ìë WebAssembly íì´ì§ì´ë©° í¬ê¸°ë 64KBë¡ ê³ ì ëì´ ììµëë¤. ì¦, ì ë©ëª¨ë¦¬ ì¸ì¤í´ì¤ì ì´ê¸° í¬ê¸°ë 640KBì´ê³ ìµë í¬ê¸°ë 6.4MBì ëë¤.WebAssembly ë©ëª¨ë¦¬ë ArrayBuffer를 ë°ííë ë²í¼ getter / setter를 ì ê³µí¨ì¼ë¡ì¨ ë°ì´í¸ë¥¼ ë ¸ì¶í©ëë¤. ì를 ë¤ì´ ì í ë©ëª¨ë¦¬ì 첫 ë²ì§¸ ë¨ì´ì ì§ì 42를 ì°ë ¤ë©´ ë¤ìê³¼ ê°ì´íë©´ë©ëë¤.
jsnew Uint32Array(memory.buffer)[0] = 42;ê·¸ë° ë¤ì ë¤ìì ì¬ì©íì¬ ëì¼í ê°ì ë°í í ì ììµëë¤.
jsnew Uint32Array(memory.buffer)[0]; -
ë°ëª¨ìì ì§ê¸ ì¬ì©í´ë³´ììì¤. ì§ê¸ê¹ì§ ì¶ê° í ë´ì©ì ì ì¥íê³ ë¸ë¼ì°ì ìë¡ë í ë¤ì JavaScript ì½ìì ìì ë ì¤ì ì ë ¥ í´ë³´ììì¤.
ë©ëª¨ë¦¬ì íì¥
ë©ëª¨ë¦¬ ì¸ì¤í´ì¤ë Memory.prototype.grow()를 í¸ì¶íì¬ íì¥ í ì ììµëë¤. ì¬ê¸°ì ì¸ìë WebAssembly íì´ì§ ë¨ìë¡ ì
ë ¥í©ëë¤.
memory.grow(1);
ë©ëª¨ë¦¬ ì¸ì¤í´ì¤ ìì±ì ìµë ê°ì´ ì ê³µëìì ë ì´ ìµë ê°ì ì´ê³¼íì¬ ì¦ê°íë ¤ê³ ìëíë©´ WebAssembly.RangeError ìì¸ê° ë°ìí©ëë¤. ìì§ì ì´ ìíê°ì ì´ì©íì¬ ë¯¸ë¦¬ ë©ëª¨ë¦¬ë¥¼ ìì½íë¯ë¡ í¬ê¸°ë¥¼ ë³´ë¤ í¨ì¨ì ì¼ë¡ ì¡°ì í ì ììµëë¤.
ArrayBufferì byteLengthë ë¶ë³ì´ë¯ë¡, Memory.prototype.grow() ì¤í¼ë ì´ì
ì´ ì±ê³µíë©´, ë²í¼ getterë (ìë¡ì´ byteLengthë¡) ìë¡ì´ ArrayBuffer ê°ì²´ë¥¼ ëë ¤ 주ì´, ì´ì ì 모ë ArrayBuffer ê°ì²´ë ãdetachedãê°ëê±°ë, ì´ì ì ê°ë¦¬ì¼°ë 기본 ë©ëª¨ë¦¬ìì ì ìì´ ëì´ì§ëë¤.
í¨ìì ë§ì°¬ê°ì§ë¡ ì í ë©ëª¨ë¦¬ë¥¼ 모ë ë´ë¶ìì ì ìíê±°ë ê°ì ¸ì¬ ì ììµëë¤. ë§ì°¬ê°ì§ë¡ 모ëì ë©ëª¨ë¦¬ë¥¼ ì íì ì¼ë¡ ë´ë³´ë¼ìë ììµëë¤. ì¦, JavaScriptë ì WebAssembly.Memory를 ë§ë¤ê³ ê°ì ¸ ì¤ê¸°ë¡ ì ë¬íê±°ë Instance.prototype.exports를 íµí´ ë©ëª¨ë¦¬ ë´ë³´ë´ê¸°ë¥¼ íì¬ WebAssembly ì¸ì¤í´ì¤ì ë©ëª¨ë¦¬ì ì¡ì¸ì¤ í ì ììµëë¤.
ì¬íë ë©ëª¨ë¦¬ ìì
ìì ì ìí ë©ëª¨ë¦¬ ì¸ì¤í´ì¤ë¥¼ ê°ì ¸ ìì ì ì ë°°ì´ë¡ ì±ì´ ë¤ì ë í©ì¹ WebAssembly 모ëì íµí´ ë ë§ì ê´ë ¨ ë©ëª¨ë¦¬ ìì 를 ì´í´ë´ì¼ë¡ì¨ ìì ë´ì©ì ë³´ë¤ ìì¸í ìì ë³´ê² ìµëë¤. memory.wasmìì ì°¾ì ì ììµëë¤.
-
memory.wasmì ì´ì ê³¼ ê°ì´ ê°ì í´ëì ë³µì¬í©ëë¤.ì°¸ê³ : memory.watìì 모ëì í ì¤í¸ ííì ë³¼ ì ììµëë¤.
-
memory.htmlìí íì¼ë¡ ëìê°ì ì´ì ì²ë¼ wasm 모ëì ê°ì ¸ ìì ì»´íì¼íê³ ì¸ì¤í´ì¤íí©ëë¤. - ì¤í¬ë¦½í¸ì 맨 ìëì ë¤ìì ì¶ê°íì¸ì.jsWebAssembly.instantiateStreaming(fetch("memory.wasm"), { js: { mem: memory }, }).then((results) => { // add code here }); -
ì´ ëª¨ëì ë©ëª¨ë¦¬ë¥¼ ë´ë³´ë´ë¯ë¡ instanceë¼ë ì´ ëª¨ëì ì¸ì¤í´ì¤ê° export ë í¨ì
accumulate()를 ì¬ì©íì¬ ëª¨ë ì¸ì¤í´ì¤ì ì í ë©ëª¨ë¦¬ (mem)ì ì§ì ì ë ¥ ë°°ì´ì ë§ë¤ê³ ì±ì¸ ì ììµëë¤. ì½ëì ë¤ìì ì¶ê°íììì¤.jsvar i32 = new Uint32Array(memory.buffer); for (var i = 0; i < 10; i++) { i32[i] = i; } var sum = results.instance.exports.accumulate(0, 10); console.log(sum);
Memory ê°ì²´ì ë²í¼ (Memory.prototype.buffer)ìì Uint32Array 뷰를 ë§ëë ë°©ë²ì ì ìíììì¤.
ë©ëª¨ë¦¬ ê°ì ¸ ì¤ê¸°ë í¨ì ê°ì ¸ ì¤ê¸°ì ë§ì°¬ê°ì§ë¡ ìëíë©° ë©ëª¨ë¦¬ ê°ì²´ ë§ JavaScript í¨ì ëì ê°ì¼ë¡ ì ë¬ë©ëë¤. ë©ëª¨ë¦¬ ê°ì ¸ ì¤ê¸°ë ë¤ìê³¼ ê°ì ë ê°ì§ ì´ì ë¡ ì ì©í©ëë¤.
- ê·¸ê²ë¤ì ìë° ì¤í¬ë¦½í¸ê° 모ë ì»´íì¼ ì´ì ì ëë 모ë ì»´íì¼ê³¼ ëìì ë©ëª¨ë¦¬ì ì´ê¸° ë´ì©ì ê°ì ¸ì¤ê³ ìì± í ì ìëë¡í©ëë¤.
- WebAssemblyìì ëì ì°ê²°ì 구ííë ë° ì¤ìí êµ¬ì± ììì¸ multiple module instancesìì ë¨ì¼ Memory ê°ì²´ë¥¼ ê°ì ¸ì¬ ì ììµëë¤.
ì°¸ê³ : memory.htmlìì ìì í ëìíë ìì 를 íì¸í ì ììµëë¤. (see it live also)
í ì´ë¸ ì¸ì¤í´ì¤
WebAssembly í ì´ë¸ì JavaScript ë° WebAssembly ì½ëë¡ ì¡ì¸ì¤ í ì ìë í¬ê¸°ê° ì¡°ì ê°ë¥í íìì references ë°°ì´ì ëë¤. ë©ëª¨ë¦¬ë í¬ê¸°ë¥¼ ì¡°ì í ììë ìì ë°ì´í¸ ë°°ì´ì ì ê³µíì§ë§ 참조ë ìì ì±, ì´ìì± ë° ìì ì±ì ì´ì ë¡ ë´ì©ì¼ë¡ ì§ì ì½ê±°ë ì°ì§ ììì¼íë engine-trusted ê°ì´ë¯ë¡ ì°¸ì¡°ê° ë©ëª¨ë¦¬ì ì ì¥ëë ê²ì ìì íì§ ììµëë¤.
í ì´ë¸ìë í ì´ë¸ì ì ì¥í ììë 참조 ì íì ì ííë ìì ì íì´ ììµëë¤. WebAssemblyì íì¬ ë°ë³µììë WebAssembly ì½ë í¨ìì íìí 참조 ì íì´ íëë¿ì´ë¯ë¡ ì¬ë°ë¥¸ ìì ì íì´ íëë§ ììµëë¤. í¥í ë°ë³µììë ë ë§ì ìì ì íì´ ì¶ê°ë©ëë¤.
í¨ì 참조(Function references)ë í¨ì í¬ì¸í°ê° ìë C / C ++ì ê°ì ì¸ì´ë¥¼ ì»´íì¼íë ë° íìí©ëë¤. C / C ++ì ë¤ì´í°ë¸ 구íì í¨ì í¬ì¸í°ë íë¡ì¸ì¤ì ê°ì 주ì ê³µê°ììë í¨ì ì½ëì ìì 주ìë¡ íìëë¯ë¡ ììì ì¸ê¸ í ìì ìì ì´ì ë¡ ì í ë©ëª¨ë¦¬ì ì§ì ì ì¥í ì ììµëë¤. ëì í¨ì 참조ë í ì´ë¸ì ì ì¥ëë©° ì í ë©ëª¨ë¦¬ì ì ì¥ í ì ìë ì ìì¸ ì¸ë±ì¤ê° ëì ì ë¬ë©ëë¤.
í¨ì í¬ì¸í°ë¥¼ í¸ì¶ í ë WebAssembly í¸ì¶ìë ì¸ë±ì¤ë¥¼ ì ê³µí©ëë¤.ì´ í¸ì¶ìë ì¸ë±ì± ë í¨ì 참조를 ì¸ë±ì±íê³ í¸ì¶í기 ì ì í ì´ë¸ì ëí´ safety bounds를 ê²ì¬ í ì ììµëë¤. ë°ë¼ì í ì´ë¸ì íì¬ ì ìì¤ íë¡ê·¸ëë° ì¸ì´ 기ë¥ì ìì íê³ ì´ì ê°ë¥íê² ì»´íì¼íë ë° ì¬ì©ëë ë¤ì ë®ì ìì¤ì í리미í°ë¸(primitive)ì ëë¤.
í
ì´ë¸ì í
ì´ë¸ì ê° ì¤ íë를 ì
ë°ì´í¸íë Table.prototype.set()ê³¼ í
ì´ë¸ì ì ì¥í ììë ê°ì ì를 ë리ë Table.prototype.grow()를 íµí´ ë³í ë ì ììµëë¤. ì´ë¥¼ íµí´ ê°ì ì ì¼ë¡ í¸ì¶ í ììë í¨ì ì§í©ì´ ìê°ì´ ì§ë¨ì ë°ë¼ ë³ê²½ ë ì ìì¼ë©° ì´ë dynamic linking techniquesì íìí©ëë¤. mutationsë JavaScriptì Table.prototype.get()ê³¼ wasm 모ëì íµí´ ì¦ì ì¡ì¸ì¤ í ì ììµëë¤.
í ì´ë¸ ìì
ë ììê° ìë í ì´ë¸(ìì 0ì 13ì ë°ííê³ ìì 1ì 42를 ë°í)ì ë§ë¤ê³ ë´ë³´ë´ë WebAssembly 모ë(table.wasmìì íì¸ ê°ë¥)ë¡ ê°ë¨í í ì´ë¸ ìì 를 ë³´ê² ìµëë¤.
-
ìë¡ì´ ëë í 리ì
table.wasmì ë³µì¬íì¬ ë§ëëë¤.ì°¸ê³ : table.watìì 모ëì í ì¤í¸ íí(text representation)ì íì¸í ì ììµëë¤.
-
HTML template를 ê°ì ëë í 리ì ë³µì¬íì¬
table.htmlë¼ë íì¼ëª ì¼ë¡ ì ì¥í©ëë¤. -
wasm 모ëì fetch, compile, instantiateí기 ì ë¤ìì ì½ë를 HTML bodyìëì
<script>ìììì ë£ìµëë¤.jsWebAssembly.instantiateStreaming(fetch("table.wasm")).then( function (results) { // add code here }, ); -
ì´ì í ì´ë¸ ìì ìë ì ë³´ì ìì¸ì¤ íê² ìµëë¤. ë¤ìì ì½ë를 ìì add code here ë¶ë¶ì ë£ìµëë¤.
jsvar tbl = results.instance.exports.tbl; console.log(tbl.get(0)()); // 13 console.log(tbl.get(1)()); // 42
ì´ ì½ëë í
ì´ë¸ì ì ì¥ë ê° í¨ì 참조를 ì°¨ë¡ë¡ ì¡ì¸ì¤íê³ ì¸ì¤í´ì¤ííì¬ ê°ì§ê³ ìë ê°ì ì½ìì ì¶ë ¥í©ëë¤. Table.prototype.get() í¸ì¶ë¡ ê° í¨ì 참조를 ê²ì í ë¤ì ì¶ê° ì¸í¸ë¥¼ ì¶ê°í©ëë¤ ì¤ì ë¡ í¨ì를 í¸ì¶íë ¤ë©´ ëì ê´í¸ë¥¼ ì¬ì©íììì¤.
ì°¸ê³ : ì°ë¦¬ì ìì í ë°ëª¨ë table.htmlìì ì°¾ì ì ììµëë¤. (see it live also)
Globals
WebAssemblyë íë ì´ìì WebAssembly.Module ì¸ì¤í´ì¤ ì ì²´ìì JavaScriptì ê°ì ¸ì¤ê¸° / ë´ë³´ë´ê¸°ê° ê°ë¥í ì ì ë³ì ì¸ì¤í´ì¤ë¥¼ ìì± í ì ììµëë¤. ì´ë ì¬ë¬ 모ëì ëì ì¼ë¡ ì°ê²°í ì ìì¼ë¯ë¡ ë§¤ì° ì ì©í©ëë¤.
JavaScript ë´ë¶ìì WebAssembly ì ì ì¸ì¤í´ì¤ë¥¼ ë§ë¤ë ¤ë©´ ë¤ìê³¼ ê°ì WebAssembly.Global () ìì±ì를 ì¬ì©í©ëë¤.
const global = new WebAssembly.Global({ value: "i32", mutable: true }, 0);
ë¤ì ëê°ì§ 매ê²ë³ì를 íì¸ í ì ììµëë¤.
-
ì ì ë³ì를 ì¤ì íë ë ê°ì§ ìì±ì´ í¬í¨ ë ê°ì²´.
value: WebAssembly 모ëìì ì¬ì©í ì ìë ë°ì´í° íì ì ëë¤. ë¤ìì ê°ì ì¬ì©í ì ììµëë¤. âi32,i64,f32,f64.mutable: boolean ê°ì´ë©° mutableì´ ê°ë¥íì§ ì¬ë¶ë¥¼ ì§ì í©ëë¤.
-
ë³ìì ì¤ì ê°ì í¬í¨íë ê°. ì íì´ ì§ì ë ë°ì´í° ì íê³¼ ì¼ì¹íë©´ ì´ë¤ ê°ì´ë ë ì ììµëë¤.
ë¤ììì ìì mutable i32íì
ì¼ë¡ ì ìëê³ value 0ì ê°ì§ globalë¡ ì´ë»ê² ì¬ì©íëì§ ììë³´ê² ìµëë¤.
global ê°ì Global.value ìì±ì ì¬ì©íì¬ ì²ì 42ë¡ ë³ê²½ë ë¤ì global.wasmmoduleìì ë´ë³´ë¸ incGlobal() í¨ì를 ì¬ì©íì¬ 43ì¼ë¡ ë³ê²½ë©ëë¤. ì´ê²ì ê°ì´ 주ì´ì§ ê°ì 1ì ëí ë¤ì ì ê°ì ë°íí©ëë¤.
const output = document.getElementById("output");
function assertEq(msg, got, expected) {
output.innerHTML += `Testing ${msg}: `;
if (got !== expected)
output.innerHTML += `FAIL!<br>Got: ${got}<br>Expected: ${expected}<br>`;
else output.innerHTML += `SUCCESS! Got: ${got}<br>`;
}
assertEq("WebAssembly.Global exists", typeof WebAssembly.Global, "function");
const global = new WebAssembly.Global({ value: "i32", mutable: true }, 0);
WebAssembly.instantiateStreaming(fetch("global.wasm"), { js: { global } }).then(
({ instance }) => {
assertEq(
"getting initial value from wasm",
instance.exports.getGlobal(),
0,
);
global.value = 42;
assertEq(
"getting JS-updated value from wasm",
instance.exports.getGlobal(),
42,
);
instance.exports.incGlobal();
assertEq("getting wasm-updated value from JS", global.value, 43);
},
);
ì°¸ê³ : running live on GitHubìì ë¼ì´ë¸ ìì 를 íì¸íê³ ìì source code ìì¤ì½ë를 íì¸ í ì ììµëë¤.
Multiplicity
ì´ì ì°ë¦¬ë WebAssembly 기본 ë¸ë¡ì ì¬ì©ë²ì ë³´ì¬ì£¼ììµëë¤. ë¤ì¤ì±ì ê°ë ì ì¸ê¸í기ì ì¢ì ê³³ì ëë¤. ì¬ê¸°ì 구조ì í¨ì¨ì± 측면ììì ë¤ìí ë°ì ê³¼ í¨ê» WebAssembly를 ì ê³µí©ëë¤.
- íëì 모ëì íëì í¨ì 리í°ë´ì´ N ê°ì í´ë¡ì ê°ì ìì± í ììë ê²ê³¼ ê°ì ë°©ìì¼ë¡ N ê°ì ì¸ì¤í´ì¤ë¥¼ ê°ì§ ì ììµëë¤.
- íëì 모ë ì¸ì¤í´ì¤ë ì¸ì¤í´ì¤ì "주ì ê³µê°"ì ì ê³µíë 0-1 ë©ëª¨ë¦¬ ì¸ì¤í´ì¤ë¥¼ ì¬ì©í ì ììµëë¤. WebAssemblyì ì´í ë²ì ììë 모ë ì¸ì¤í´ì¤ ë¹ 0-N ê°ì ë©ëª¨ë¦¬ ì¸ì¤í´ì¤ê° íì© ë ì ììµëë¤ (Multiple Tables and Memories 참조).
- íëì 모ë ì¸ì¤í´ì¤ë 0-1 í ì´ë¸ ì¸ì¤í´ì¤ë¥¼ ì¬ì©í ì ììµëë¤. ì´ê²ì C í¨ì í¬ì¸í°ë¥¼ 구ííë ë° ì¬ì©ëë ì¸ì¤í´ì¤ì "í¨ì 주ì ê³µê°"ì ëë¤. WebAssemblyì í¥í ë²ì ììë í¥í 모ë ì¸ì¤í´ì¤ ë¹ 0-N í ì´ë¸ ì¸ì¤í´ì¤ë¥¼ íì© í ì ììµëë¤.
- íëì ë©ëª¨ë¦¬ ëë í ì´ë¸ ì¸ì¤í´ì¤ë 0-N 모ë ì¸ì¤í´ì¤ìì ì¬ì©í ì ììµëë¤.ì´ ì¸ì¤í´ì¤ë 모ë ëì¼í 주ì ê³µê°ì ê³µì íë¯ë¡ dynamic linkingì´ ê°ë¥í©ëë¤.
Understanding text formatìì multiplicity in action를 íì¸ í ìììµëë¤. - Mutating tables and dynamic linking sectionì 참조íììì¤.
ìì½
ì¬ê¸°ì WebAssembly JavaScript API를 ì¬ì©íì¬ JavaScript 컨í ì¤í¸ì WebAssembly 모ëì í¬í¨íê³ í´ë¹ 기ë¥ì ì¬ì©íë ë°©ë²ê³¼ JavaScriptìì WebAssembly ë©ëª¨ë¦¬ ë° í ì´ë¸ì ì¬ì©íë ë°©ë²ì ëí´ ì´í´ ë³´ììµëë¤. ê·¸ë¦¬ê³ ë¤ì¤ì±ì ê°ë ì ëí´ìë ì¸ê¸íìµëë¤.