์ด ์ฝ๋๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
let descriptor = /* ... */;
let memories = Array.apply(null, {length: 1024}).map(() => new WebAssembly.Memory(descriptor));
let instance = fetch('foo.wasm')
.then(response => response.arrayBuffer())
.then(buffer => WebAssembly.compile(buffer))
.then(module => new WebAssembly.Instance(module, { memory: memories[1023] }));
WebAssembly.Instance
์(๋) ์๋นํ ์๊ฐ ๋์ ์ฐจ๋จํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด WebAssembly.Module
๋ฅผ ๋ค์ ์ปดํ์ผํ ์ ์์ต๋๊น?
๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์๋์ค๋ผ๊ณ ๋งํ๊ณ ์ถ์ง๋ง ์ด๋ฏธ ์ปดํ์ผ๋ ์ฝ๋๊ฐ ์์ ํ๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํนํ ๋ง์์ ๋ค์ง ์๋๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? ๊ทธ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ ์ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ์ด๊ณ ์ฝ๋๊ฐ ๊ณ ์ ๋ชจ๋๋ฅผ ๊ฐ์ ํ์ฌ ์ปดํ์ผ๋์๊ธฐ ๋๋ฌธ์
๋๊น? ์๋ง๋ memories[0]
๋ ๊ณ ์ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ์์ง๋ง memories[1023]
๋ ๊ทธ๋ ์ง ์์ ๊ฒ์
๋๋ค.
๋์ ์ด ์ฝ๋๋ ์ด๋ป์ต๋๊น?
let instances = [0,1,2,3,4,5,6,7].map(v => fetch(`foo${v}.wasm`)
.then(response => response.arrayBuffer())
.then(buffer => WebAssembly.compile(buffer))
.then(module => new WebAssembly.Instance(module)));
WebAssembly.Instance
ํธ์ถ์ด ๋ค์ ์ปดํ์ผ๋๋๋ก ํ์ฉ๋ฉ๋๊น?
์์ ๋ด์ฉ์ด ์๋ฏธ๊ฐ ์๋ค๊ณ ๊ฐ์ ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ๊ด๋ จ ์ง๋ฌธ์ด ์์ต๋๋ค.
WebAssembly.Module
์ปดํ์ผ๋ ์ฝ๋๊ฐ ๋น ๋ฅด๊ณ WebAssembly.Memory
์ธ์คํด์ค๊ฐ ์ด๋ฌํ ๋น ๋ฅธ ์ฝ๋์ ์ ํฉํ๋ค๋ ๊ฒ์ ์ด๋ป๊ฒ ๋
ธ์ถํฉ๋๊น? ์ง๊ธ ๋๋ต์ "์๋ํ๊ณ ์์์ฐจ๋ฆด ์ ์๋์ง ํ์ธํ์ญ์์ค"์ธ ๊ฒ ๊ฐ์ต๋๋ค.WebAssembly.Memory
์ธ์คํด์ค์ ์๋ฅผ ์ด๋ป๊ฒ ์ ์ ์์ต๋๊น?WebAssembly.Instance
๊ฐ ๋๋๋ก ์ฌ์ปดํ์ผ์ ์ผ์ผํค๋ ๊ฒ์ด ์ข์ ๊ฒ์
๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ ์ ์ญ ๋ณ์๊ฐ ์์ฑ๋ ์ฝ๋์์ ์ผ์ ํ๊ฒ ์ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด Emscripten์ ์ ์ ๋ฐ์ดํฐ์ ๋ํ ๋ชจ๋ ํฌ์ธํฐ๋ฅผ ์คํ์
ํ์ฌ ์ฌ๋ฐฐ์น ๊ฐ๋ฅํ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค. ์คํ์
์ ๋ชจ๋์ด ์ธ์คํด์คํ๋ ๋ ๋ณ๊ฒฝํ ์ ์๋ ์ ์ญ ๋ณ์๋ก ์ ๋ฌ๋ฉ๋๋ค. WebAssembly.Instance
๋ฅผ ๋ค์ ์ปดํ์ผํ ์ ์์ผ๋ฉด ์์ฑ๋ ์ฝ๋๋ฅผ ํน์ํํ ์ ์์ต๋๋ค.
์ฌ์์ "์ปดํ์ผ"์ด ๋ฌด์์ธ์ง ์ ์ํ์ง ์์ผ๋ฉฐ
๊ตฌํ ๋ฐฉ์์ด ํฌ๊ฒ ๋ค๋ฅผ ์ ์์ผ๋ฏ๋ก ๊ทธ๋ ๊ฒ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
(ํต์ญ์ฌ ํฌํจ). ๋ฐ๋ผ์ ์ด์ ๋ํด ์ด๋ ํ ๊ท๋ฒ์ ๋ฐ์ธ๋ ํ ์ ์์ต๋๋ค.
์ด๋ ์ชฝ์ด๋ . ์ฐ๋ฆฌ๊ฐ ํ ์ ์๋ ์ต์ ์
WebAssembly.Instance
์(๋) "๋น ๋ฅธ" ๊ฒ์ผ๋ก ์์๋ฉ๋๋ค.
2016๋
10์ 27์ผ 03:24, Michael Bebenita [email protected]
์ผ๋ค:
WebAssembly.Instance๊ฐ ๋๋๋ก ์ฌ์ปดํ์ผ์ ์ผ์ผํค๋ ๊ฒ์ด ์ข์ ๊ฒ์ ๋๋ค.
์ด ๋ฐฉ๋ฒ์ผ๋ก ๋ถ๋ณ ์ ์ญ ๋ณ์๋ ์์ฑ๋ ํ์ผ์์ ์ผ์ ํ๊ฒ ์ ํ ์ ์์ต๋๋ค.
์ํธ. ์๋ฅผ ๋ค์ด Emscripten์ ๋ชจ๋ ํญ๋ชฉ์ ์คํ์ ํ์ฌ ์ฌ๋ฐฐ์น ๊ฐ๋ฅํ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค.
์ ์ ๋ฐ์ดํฐ์ ๋ํ ํฌ์ธํฐ. ์คํ์ ์ ๋ณ๊ฒฝํ ์ ์๋ ์ ์ญ var๋ก ์ ๋ฌ๋ฉ๋๋ค.
๋ชจ๋์ด ์ธ์คํด์คํ๋ ๋. WebAssembly.Instance๋ฅผ ๋ค์ ์ปดํ์ผํ ์ ์๋ ๊ฒฝ์ฐ
์์ฑ๋ ์ฝ๋๋ฅผ ์ ๋ฌธํํ ์ ์์ต๋๋ค.โ
์ด ์ค๋ ๋์ ๊ฐ์ ํ๊ธฐ ๋๋ฌธ์ ์ด ๋ฉ์์ง๋ฅผ ๋ฐ๊ณ ์์ต๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธ
https://github.com/WebAssembly/design/issues/838#issuecomment -256522163,
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AEDOO9sJPgujK3k0f6P7laYV_zaJxES5ks5q3_1LgaJpZM4Kh1gM
.
๊ธฐ๊ปํด์ผ ๋น๊ท๋ฒ์ ์ธ ๋ฉ๋ชจ๊ฐ ๋ ๊ฒ์ด๋ผ๋ ๋ฐ ๋์ํ์ต๋๋ค.
SM์์๋ ํ์ฌ ์ฌ์ปดํ์ผํ์ง ์๋๋ก ์ธ์คํด์คํํ์ฌ ๊ฐ๋ฐ์๋ฅผ ์ํ ์์ธก ๊ฐ๋ฅํ ์ปดํ์ผ ๋น์ฉ ๋ชจ๋ธ์ด ์๋๋ก ํ๋ ค๊ณ ํฉ๋๋ค(ํนํ ๊ฐ๋ฐ์๊ฐ WebAssembly.compile
๋ฐ IDB๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํ์ผ ํํธ๋ฅผ ์ ์ดํ ์ ์๋๋ก). . ๋๊ธฐ Instance
์์ฑ์ ๋ด์์ ์ธ์คํด์คํ ์๊ฐ ์ฌ์ปดํ์ผ์ ํ์คํ ํด๋น ๋น์ฉ ๋ชจ๋ธ์ ๊นจ๊ณ ์ฃผ์ ๋ฒ๋ฒ
๊ฑฐ๋ฆผ์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๋ณ๋์ ์ปดํ์ผ์ ์์ฑ๋ ์ฝ๋๋ฅผ ์ฃผ๋ณ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌธํํ๊ธฐ ์ํด ์ํํ ์ ์๋ ๋ค์ํ ์ต์ ํ์ ๊ทผ๋ณธ์ ์ผ๋ก ์์ถฉ๋๋ค๋ ์ ์ ์ธ์ ํฉ๋๋ค. ์ปดํ์ผ๊ณผ ์ธ์คํด์คํ๋ฅผ ํ๋์ ๋น๋๊ธฐ ์์
์ผ๋ก ํตํฉํ๋ ๊ฒ์ ์๋ฏธ๊ฐ ์์ผ๋ฉฐ ๊ณผ๊ฑฐ์ ๊ณ ๋ คํ๋ ๊ฒ์
๋๋ค. ๋ฌผ๋ก ๋จ์ ์ ์ด๊ฒ์ด ๋ช
์์ ์บ์ฑ์ ์ต์ ํ๋ค๋ ๊ฒ์
๋๋ค( Module
). ๋ฐ๋ผ์ ๊ฐ๋ฐ์๋ ๋ถ์พํ ์ ์ถฉ์์ ๋ง๋ค์ด์ผ ํฉ๋๋ค. ์ผ๋ถ ์ต์
:
WebAssembly.Cache
๋น์ ์ด ๋ฐ์ดํธ ์ฝ๋์ ์ธ์คํด์ค ๋งค๊ฐ ๋ณ์๋ฅผ ์ ๋ฌ API๋ฅผํ๊ณ ๋ค์ ์ป์ Promise<Instance>
.ํ์๋ ์ ๋ฅผ ํฅ๋ฏธ๋กญ๊ฒ ํ๊ณ IDB๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ๋์ ๊ฐ๋ฐ์ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ผ๋ฉฐ ์บ์ฑ์ ๋์ฑ ์ต์ ํํ ์ ์๋ ๊ธฐํ๋ฅผ ์ ๊ณตํ ์๋ ์์ง๋ง(์บ์๋ ๋ชฉ์ ์ ๋ง๊ฒ ํนํ๋์ด ์๊ธฐ ๋๋ฌธ์) ํ์คํ ํฐ ๊ธฐ๋ฅ์ด๋ฉฐ ์๊ฐ์ด ์ข ๊ฑธ๋ฆฌ๊ณ ์ถ์ต๋๋ค. ๊ณ ๋ คํ๋ค.
@rossberg-chromium ๋ด ๋ชฉ์ ์ ์๋ชป ์ค๋ช
ํ ๊ฒ ๊ฐ์ต๋๋ค. ์ฌ์์ด ๋งํ๋ ๋ด์ฉ์ ๋ํด ๋
ผ์ํ๊ณ ์ถ์ง ์์ต๋๋ค. API ์๋์ ์จ์ด ์๋ ๊ฐ๋ฐ์๋ค์๊ฒ ์ฌ๊ฐํ ๋๋ผ์์ผ๋ก ๋ณด์ด๋ ๊ฒ์ ์ง์ ํ๋ ค๊ณ ํฉ๋๋ค. ๊ฐ๋ฐ์๋ .compile
์ ๊ฒฐ๊ณผ๊ฐ ๋ค์ ์ปดํ์ผ๋๋ ๊ฒ์ ๊ธฐ๋ํ์ง ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋์๊ฒ ๋์์ธ ๊ฒฐํจ์ฒ๋ผ ๋ณด์ธ๋ค.
@lukewagner ๋ ์์์ ๋๋ ๋ช
์์ ์บ์ฑ์ ์ฌ์ฉํ๋๋ผ๋ ๋์ผํ ๋ฌธ์ ๊ฐ ์์ ์ ์์ต๋๋ค. ๋์ผํ ์ฃผ์ ๊ณต๊ฐ/์์ ์์ ์ผ๋ง๋ ๋ง์ WebAssembly.Memory
๋ฅผ ๋ง๋ค ์ ์๋์ง๋ ๋ธ๋ผ์ฐ์ ์ ํ ์ฌํญ์
๋๋ค. ๋๋ ๋น์ ์ด ์ ์ํ๋ ๊ฒ์ ์ข์ํ์ง๋ง ๋ฌธ์ ์ ์ง๊ตํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋น์ ์ด ์ ์ํ ๊ฒ์ ๋ด๊ฐ ์๋ชป ์ดํดํ๋ค๋ฉด ์๋ ค์ฃผ์ญ์์ค.
์๋ง๋ .compile
๋ฐ Module
์ Memory
๊ฐ ์ฃผ์ด์ง ์ ์๊ณ Instance
์๋ ๋ค๋ฅธ ์ปดํ์ผ/์ธ์คํด์คํ์ ์ ๋ฌํ ์ ์๋ .memory
์์ฑ์ด ์์ต๋๋ค. ?
์ฌ์ปดํ์ผ ๊ฐ๋ฅ์ฑ์ ์์ ๋ ค๋ ๊ฒ์ด ์๋๋ผ ์ฒซ ๋ฒ์งธ ์ปดํ์ผ ์๊ฐ(๋๋ ์บ์ ๊ฒ์ ์๊ฐ)์ ์๋ฒฝํ ์ ๋ณด wrt Memory
๊ฐ ์๋ ์ผ๋ฐ์ ์ธ ๊ด์ฉ์ API ์ฌ์ฉ์ ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ์ํ ๊ฒฝ์ฐ ์ปดํ์ผ์์ ๊ฒฝ๊ณ ๊ฒ์ฌ๋ฅผ ๋ด๋ณด๋ด๋์ง ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค.
@jfbastien ํน์ ์ธ์คํด์คํ ๋งค๊ฐ๋ณ์(๊ทธ๋์ Memory
)๊ฐ ์ ๊ณต๋ ์์์ /๋ช
์์ ์บ์ฑ์ ์ฌ์ฉํ๋ฉด ์ฌ์ปดํ์ผ์ด ์ด๋ป๊ฒ ํ์ํ์ง ์ ์ ์์ต๋๋ค.
@jfbastien ํน์ ์ธ์คํด์คํ ๋งค๊ฐ๋ณ์(๊ทธ๋์
Memory
)๊ฐ ์ ๊ณต๋ ์์์ /๋ช ์์ ์บ์ฑ์ ์ฌ์ฉํ๋ฉด ์ฌ์ปดํ์ผ์ด ์ด๋ป๊ฒ ํ์ํ์ง ์ ์ ์์ต๋๋ค.
๋ค์์ด ์์ ์ ์์ต๋๋ค.
Memory
๋ง๋ญ๋๋ค.Memory
๊ฐ ๋๋ฌด ๋ง๊ธฐ ๋๋ฌธ์ ๋ช
์์ (๋๋ฆฐ) ๊ฒฝ๊ณ ๊ฒ์ฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋๋ฅผ ์ปดํ์ผํฉ๋๋ค.Memory
ํ๋๋ง ํ ๋นํ์ญ์์ค.Instance
.์ด ์์ ์์ ์ฌ์ปดํ์ผ์ด _ํ์ํ์ง ์๋ค๋ ๋ฐ ๋์ํ์ง๋ง ํ์ํ์ง ์์ ๋ ๋๋ฆฐ ๊ฒฝ๊ณ ๊ฒ์ฌ๋ฅผ ์ํํ๋ ๊ฒ์ ์ด๋ฆฌ์์ ์ผ์ ๋๋ค.
๋ด๊ฐ ๋งํ๋ฏ์ด: ๋๋ ๋น์ ์ด ์ ์ํ ์ด Cache
API๊ฐ ๋ง์์ ๋ ๋ค. ๋๋ ๊ทธ๊ฒ์ด WebAssembly๋ฅผ ๋ ์ ์ฉํ๊ฒ ๋ง๋ ๋ค๊ณ ์๊ฐํ์ง๋ง, ๋๋ ์ฌ์ ํ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ์๊ฐํ๋ค. ๐ข
์ธ์คํด์คํ ๋งค๊ฐ๋ณ์์ ๋ฐ์ดํธ์ฝ๋๋ฅผ ํ์ฉํ๋ ํฅ์๋ ์บ์์ ๋ํ ์ ์์ ์ ๋๋ค. ์บ์๋ ํญ๋ชฉ์ด ์ธ์คํด์คํ ๋งค๊ฐ๋ณ์์ ์ผ์นํ์ง ์๋ ๊ฒฝ์ฐ ์บ์๋ฅผ ๋ค์ ์ปดํ์ผํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋จ๊ณ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Memory
Instance
์์ฒญ, ๊ทธ ์ค ํ๋๋ฅผ (๋๋ฆฐ) Memory
Instance
๋ก ๋ฐํ๋ฉ๋๋ค.Memory
Instance
์์ฒญ, ๋น ๋ฅธ Memory
Instance
๋ก ๋ฐํ๋ฉ๋๋ค.8๋จ๊ณ ์ดํ์๋ ๋ชจ๋ ํฅํ ํ์ด์ง ๋ก๋๊ฐ ๋น ๋ฅด๊ฑฐ๋ ๋๋ฆฐ ์ฝ๋๋ก ์บ์๋ฉ๋๋ค.
@lukewagner ์ฐ์ , WebAssembly๊ฐ ๊ฒฐ์ ์ ์ฑ๋ฅ์ ์ ๊ณตํ๋ค๋ ๋ช ์๋ ๋ชฉํ์ ๋ฐํ๋ ์ํ ๋ฐฉ์์ ์ ์ํ๊ณ ์์ต๋๋ค. ๋๋ฆฐ ๊ฒ๊ณผ ๋น ๋ฅธ ๊ฒ์ ์ฐจ์ด๋ ์ฝ 20%๋ก ๋ง์ง๋ง์ผ๋ก ์ธ์ฉ๋์์ผ๋ฏ๋ก, ๊ฒฐ์ ๋ก ์ ์ฑ๋ฅ์ ๋ชฉํ๋ก ํ๋ ์ฌ์์ด API ํน์ฑ ๋๋ฌธ์ ๋ฐ๋ฅ์ ๋จ์ด๋จ๋ฆฌ๋ฉด ์ ๋ง ์ ์ทจ๊ฐ ๋ ๊ฒ์ ๋๋ค. ๋๋ ํ๋กํ์ผ-์ฌ์ปดํ์ผ-์บ์ ์ต์ ํ์ ํ์์ฑ์ ์์ ๊ธฐ ์ํด ์ฌ์์ด ์ด๋ฏธ ๋ค๋ฅธ ๊ณณ์์ ๋ง์ ๋ฌธ์ ๋ฅผ ์ผ์ผํค๊ณ ์๊ธฐ ๋๋ฌธ์ ์ฝํ ์ธ ์ฃผ์ ์ง์ ์บ์๊ฐ ์๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์ฌ๋ฐ๋ฅธ ์๋ฃจ์ ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ฐ๋ฆฌ๋ ์ฝ๋๊ฐ ์บ์๋์ง ์๋๋ผ๋ ์ฑ์ด ํฉ๋ฆฌ์ ์ธ ๋์์ ํ ์ ์๋๋ก ์ ํํ๊ฒ ์ปดํ์ผ์ ์ฝ์ํฉ๋๋ค. ์ด๊ฒ์ด ์ง์ ๋๋ ๋ฐฉ์์ผ๋ก ์ธํด ์ฐ๋ฆฌ ๋ชจ๋๊ฐ ์บ์ ๋๋ ๊ธฐํ ์ํ๋ฅผ ๊ตฌํํด์ผ ํ๋ ๊ฒฝ์ฐ ์ฌ๋๋ค์๊ฒ ํฉ๋ฆฌ์ ์ผ๋ก ์ด์ ๊ฐ๋ฅํ ๋น์ฉ ๋ชจ๋ธ์ ์ ๊ณตํ๋ ค๋ ๋ชฉํ์ ์คํจํ ๊ฒ์ ๋๋ค.
๋์๊ฒ ๋ฌธ์ ๋ ๋ฐ๋ก ์ด๊ฒ์ ๋๋ค. ๊ฒฝ์์ ์ธ ์ด์ ๋ก ์ฐ๋ฆฌ ๋ชจ๋๊ฐ ํจ๊ณผ์ ์ผ๋ก ์ํํด์ผ ํ๋ ์ต์ ํ ์ค ํ๋(4GB ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ฒฝ๊ณ ํ์ธ, ๋๋ 4GB ํดํน์ด๋ผ๊ณ ์นญํจ)๋ ํ์ฌ ์ฌ์์์ ํฌ์ ์์ด๋ ์ํํ ์ ์์ต๋๋ค. ๋ค์ ์ค ํ๋:
์ด๊ฒ์ ์ฌ์์ด ๊ณต๊ธ์ ์ฒด๊ฐ wasm ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น๋ ๋๋ง๋ค 4GB ์์ฝ์ ํ์ฉํ๊ฑฐ๋ ์ด๋ฅผ ๊ฐ์งํ๊ธฐ ์ํด ์บ์/์ง์ฐ ์ปดํ์ผ/ํ๋กํ์ผ ์ต์ ํ๋ฅผ ๊ฐ๋๋ก ์๋ ดํ๋๋ก ๊ถ์ฅํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก, ๋๋ ์ด๊ฒ์ ๋น๊ท๋ฒ์ ์ผ๋ก ๋ง๋๋ ๊ฒ์ ๋ํ ์์ ์ ์ดํดํ์ง ๋ชปํฉ๋๋ค. ์ด๊ฒ์ ๊ท๋ฒ์ ์ผ ์ ์์ต๋๋ค. ์๋ํ๋ฉด ์ฐ๋ฆฌ๋ API๊ฐ ๋ธ๋ผ์ฐ์ ์ ์ด๋ค ์ข ๋ฅ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์๋์ง ์์ง ๋ชปํ ์ฑ ๋ฌด์ธ๊ฐ๋ฅผ ์ปดํ์ผํด์ผ ํ ๊ฐ๋ฅ์ฑ์ ๋ฐฐ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋๋ ์ด๊ฒ์ ํ๋ ๋ง์ ๋ฐฉ๋ฒ์ด ์๋ค๊ณ ์์ํ๋ค. ์๋ฅผ ๋ค์ด ์ธ์คํด์คํ๋ ์ฝ์์ ๋ฐํํ ์ ์๊ณ ๋ณ๋์ ์ปดํ์ผ ๋จ๊ณ๋ฅผ ์ ๊ฑฐํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ์ธ์คํด์คํ๊ฐ ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์๋ ๋จ๊ณ๋ผ๋ ๊ฒ์ ๋ถ๋ช ํ ํ๊ณ ํด๋ผ์ด์ธํธ์๊ฒ ์ด๊ฒ์ด ์ปดํ์ผ์ ์ํํ๋ ๋จ๊ณ์์ ๊ฐ๋ ฅํ๊ฒ ์์ํฉ๋๋ค. ์ด๋ฌํ API์์ ์ปดํ์ผ๋ฌ๋ ์ปดํ์ผ ๋์ ๋ฉ๋ชจ๋ฆฌ์ 4GB ํดํน์ด ์๋์ง ์ฌ๋ถ๋ฅผ ํญ์ ์๊ณ ์์ต๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ด๊ฒ์ ์ด์ ์์ผ ์์์ฐจ๋ฆฐ๋ค๋ ๊ฒ์ด ์ฌํ์ง๋ง, ์ฌ๋ฌ๋ถ์ด ์ด๊ฒ์ด ๋ ํฐ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋์ต๋๋ค. ๋ด๊ฐ ๊ฐ๊ณผํ๊ณ ์๋ ์บ์ฑ ์ด์ธ์ ์ํ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
๋๊ธฐ ๋ถ์ฌ ์๋๋ฆฌ์ค์์ @jfbastien ์ ๋ชจ๋์ด ๋น ๋ฅธ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ํธํ๋๋ก ์์ฑ๋์๋ค๊ณ ์ง์ ํ์ต๋๋ค. ๋๋ ๋น์ ์ด ์ฃผ๋ก ํน์ ๋ชจ๋์ด ์ํ ๋ ๋น ๋ฅธ ๋ฉ๋ชจ๋ฆฌ ์ต์ ํ๋ฅผ ํ์ฑํํ๋ ๊ฒ์ ์ซ๊ณ ์๋ค๊ณ ๊ฐ์ ํ๊ณ ๋ชจ๋์ด ์ํ์ง ์์ ๋ ๊ทธ๊ฒ์ ํ์ง ์์๋ ๊ด์ฐฎ์ ๊ฒ์ ๋๋ค. , ์ฐ์ ์์๋ฅผ ๊ตฌ๋ถํ๋ ค๊ณ ์ ์ฐ๋ ๊ฒ๋ฟ์ ๋๋ค).
๊ทธ๋ ๋ค๋ฉด ์บ์ฑ ๋๋ ๋น๋๊ธฐ ์ธ์คํด์คํ์ ๋ํ ์ด๋ฌํ ๋์์ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ ๋๋ค.
"4GB ํดํน" ๋ฌธ์ ์ ์ด๋ฅผ ์ฌ์ฉํ๋ ๋ฉ๋ชจ๋ฆฌ์ ์ด๋ฅผ ์์ํ๋ ์ฝ๋ ๊ฐ์ ๋ถ์ผ์น์ ๋ํด ๋ด๋ถ์ ์ผ๋ก ๋ ๊ฐ์ง ๋ฒ์ ์ ์ฝ๋๋ฅผ ๋ด๋ณด๋ด๋ ์ปดํ์ผ์ด ์๋ฏธ๊ฐ ์์ต๋๊น? (๋ถ๋ช ํ ์ด๊ฒ์ ๋ ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ฒ ๋์ด ์ฌํ์ง๋ง ์ปดํ์ผ ์๊ฐ์ด ํจ์ฌ ๋ ๋๋น ์ง์ง ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ์์ฑ์๊ฐ ๋ ๊ฐ์ง๋ฅผ ๋์์ ์์ฑํ ์ ์์๊น์?)
@mtrofin ์ฌ์ฉ ํ์ง ์์ผ
On 2.: ์ฌ์ ํ ๊ฐ๋ฐ์์๊ฒ ํฐ ๋์์ด ๋์ง ์์ต๋๋ค. ํด๋น ๋ณํ์ ์ฌ์ฉํ๊ณ ์คํจํ๋ฉด ์ด๋ป๊ฒ ๋ฉ๋๊น?
@kripken ์ด์ค ์ปดํ์ผ์ ์ข์ ์๊ฐ์ด ์๋๋ผ๊ณ ์๊ฐํฉ๋๋ค.
@kripken ๋๋ ์ด๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ์ด ๋ฌธ์ ์ ๋ํ ๋ค๋ฅธ ํด๊ฒฐ์ฑ ์์ด ํ ์ ์๋ ์ผ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์บ์ฃผ์ผ ๋ธ๋ผ์ฐ์ง์ ๊ฒฝ์ฐ WebAssembly๊ฐ ํ๋ฅญํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๋ฉ์ง ์ผ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ URL์ ๋ณด๋ด๋ฉด ํด๋ฆญํ๊ณ ๋ช ๋ถ ๋์ ์ฆ๊ฒ๊ฒ ์ง๋ ๋๋ค. ๊ทธ๊ฒ์ด ์น์ ๋ฉ์ง๊ฒ ๋ง๋๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ ๋ง์ ์ปดํ์ผ์ด ์บ์๋์ง ์์ ์ฝ๋๋ก ์ด๋ฃจ์ด์ง๋ฏ๋ก ์ปดํ์ผ ์๊ฐ์ด ์ฌ์ฉ์์ ๋ฐฐํฐ๋ฆฌ ์๋ช ์ ํฐ ์ญํ ์ ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๊ทธ๋์, ๋๋ธ ์ปดํ์ผ์ ์ ๋ฅผ ์ฌํ๊ฒ ํฉ๋๋ค.
@mtrofin
๋ชจ๋ ์์ฑ์๋ ์ต์/์ต๋ ๋ฉ๋ชจ๋ฆฌ๋ก 4GB๊ฐ ํ์ํฉ๋๋ค.
๋ง์ ์ฅ์น์ 4GB์ ๋ฌผ๋ฆฌ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ค์ ๋ก๋ ์ค์ฉ์ ์ด์ง ์์ต๋๋ค. ๋ํ ์ฌ์ํ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค.
๋น ๋ฅธ ๋ฉ๋ชจ๋ฆฌ๋ง ํ์ฉํ๋ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ์ปดํ์ผ(์ ์ด๋ ๋น๋๊ธฐ, ๋๊ธฐํ๋ ๊ฐ๋ฅ)์ ๋ณํ์ ๋๋ค.
๋๋ ์ฐ๋ฆฌ๊ฐ ์ด์ค ์ปดํ์ผ์ ์ํ์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
@pizlonator ์ง๊ธ๊น์ง ๋ค๋ฅธ ๋ชจ๋์ ์ฝ๋ ์์ฑ์ด ํ์ํ ๋์์ธ์ ๊ณ ๋ คํ์ง ์์์ต๋๋ค. ์ฐ๋ฆฌ๋ ํญ์ 64๋นํธ์ 4GB ์์ญ์ ํ ๋นํ๊ณ Linux, OSX ๋ฐ Windows์์ ์์ฒ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ํด ์ฑ๊ณตํ๋ ๊ฒ์ ๊ด์ฐฐํ์ต๋๋ค. ๋ง์ ์๊ท๋ชจ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ง์ํ๊ธฐ์ ์ถฉ๋ถํ ๊ฒ์ผ๋ก ์์๋๋ ์ฌ์ฉ ๊ฐ๋ฅํ ์ฃผ์ ๊ณต๊ฐ์ ์ฌ์ํ ์ ์ฒด ๊ณ ๊ฐ์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ณด์์ ์ธ ์ํ์ ์ด ์์ต๋๋ค. ๋ฐ๋ผ์ ์ฌ๊ธฐ์ ํด๊ฒฐํ๋ ค๋ ์๋ก์ด ์ ์ฝ ์กฐ๊ฑด์ iOS์ 4GB ํ ๋น ์๋ฅผ ์ค์ผ ์ ์๋ ๊ฐ์ ์ฃผ์ ๊ณต๊ฐ ์ ํ์ด ์๋ค๋ ๊ฒ์ ๋๋ค.
๋ฐ๋ผ์ ํ ๊ฐ์ง ๊ด์ฐฐ์ 4GB ํดํน์ด ํ์ฉํ๋ ๊ฒฝ๊ณ ํ์ธ ์ ๊ฑฐ์ ๋ง์ ๋ถ๋ถ์ wasm ๋ฉ๋ชจ๋ฆฌ ๋์ ์์ ๋ณดํธ ์์ญ์ ๊ฐ์ง์ผ๋ก์จ ํผํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ์ ์ด๊ธฐ ์คํ์ ๊ธฐ๋ณธ ๋ถ์(๋ฃจํ์ ๊ด๋ จ์ด ์์ผ๋ฉฐ ๋์ผํ ๊ธฐ๋ณธ ํฌ์ธํฐ๊ฐ ์๋ ๋ก๋/์ ์ฅ์ ๋ํ ๊ฒ์ฌ ์ ๊ฑฐ)์ด ์ด๋ฏธ ๊ฒฝ๊ณ ๊ฒ์ฌ์ ๋๋ต ์ ๋ฐ์ ์ ๊ฑฐํ ์ ์์์ ๋ณด์ฌ์ค๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๋ง๋ ์ด๊ฒ์ ๋ ๋์์ง ์ ์์ต๋๋ค. ๋ฐ๋ผ์ 4GB ํดํน์ ๋ ๊ฒธ์ํ๊ณ ๋ ํ์ํ ์๋ ํฅ์์ด ๋ ๊ฒ์ ๋๋ค.
๋ด๊ฐ ์ด์ ์ ๊ฐ์ง๊ณ ์๋ ๋ ๋ค๋ฅธ ์์ด๋์ด๋ ๊ฒฝ๊ณ ๊ฒ์ฌ(๊ฐ๋ ํ์ด์ง ๊ธฐ๋ฐ ์ ๊ฑฐ ์ฌ์ฉ)๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋๋ฅผ ๋น๊ด์ ์ผ๋ก ์ปดํ์ผํ ๋ค์ ๊ณ ์ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ๋ก ์ธ์คํด์คํํ ๋ ์ ๊ฑฐํ๋ ๊ฒ์ ๋๋ค. ๊ฒฐํฉํ๋ฉด ์ค๋ฒํค๋๋ ์ด์์ ์ธ ๊ณ ์ ๋ชจ๋ ์ฝ๋์ ๋นํด ์๋นํ ์์ ์ ์์ต๋๋ค.
@lukewagner
์ง๊ธ๊น์ง ์ฐ๋ฆฌ๋ ๋ค๋ฅธ ๋ชจ๋์ ์ฝ๋ ์์ฑ์ด ํ์ํ ๋์์ธ์ ๊ณ ๋ คํ์ง ์์์ต๋๋ค. ์ฐ๋ฆฌ๋ ํญ์ 64๋นํธ์ 4GB ์์ญ์ ํ ๋นํ๊ณ Linux, OSX ๋ฐ Windows์์ ์์ฒ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ํด ์ฑ๊ณตํ๋ ๊ฒ์ ๊ด์ฐฐํ์ต๋๋ค. ๋ง์ ์๊ท๋ชจ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ง์ํ๊ธฐ์ ์ถฉ๋ถํ ๊ฒ์ผ๋ก ์์๋๋ ์ฌ์ฉ ๊ฐ๋ฅํ ์ฃผ์ ๊ณต๊ฐ์ ์ฌ์ํ ์ ์ฒด ๊ณ ๊ฐ์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ณด์์ ์ธ ์ด ์๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ฌ๊ธฐ์ ํด๊ฒฐํ๋ ค๋ ์๋ก์ด ์ ์ฝ ์กฐ๊ฑด์ iOS์ 4GB ํ ๋น ์๋ฅผ ์ค์ผ ์ ์๋ ๊ฐ์ ์ฃผ์ ๊ณต๊ฐ ์ ํ์ด ์๋ค๋ ๊ฒ์ ๋๋ค.
์ด๊ฒ์ iOS ๊ด๋ จ ๋ฌธ์ ๊ฐ ์๋๋๋ค. ๋ฌธ์ ๋ ์ด๋ฌํ ํ ๋น์ ๋ง์ด ํ์ฉํ๋ฉด ๊ฐ ํ ๋น์ด ASLR์ ํจ์จ์ฑ์ ๊ฐ์์ํค๊ธฐ ๋๋ฌธ์ ๋ณด์ ์ํ์ด ์๋ค๋ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ VM์๋ ํ ๋นํ๋ 4GB ๊ณต๊ฐ ์์ ๋ํด ๋งค์ฐ ๋ฎ์ ์ ํ์ ์ค์ ํ๋ ์ต์ ์ด ์์ด์ผ ํ์ง๋ง ์ด๋ ๋์ฒด ๊ฒฝ๋ก๊ฐ ๋๋ฌด ๋น์ธ์ง ์์์ผ ํจ์ ์๋ฏธํฉ๋๋ค(์ฆ, ๋ค์ ์ปดํ์ผํ ํ์๊ฐ ์์ด์ผ ํจ).
ํ ๋นํ 4GB ๋ฉ๋ชจ๋ฆฌ ์์ ์ ํ์ด ์์ต๋๊น? ์ด ํ๊ณ์ ๋๋ฌํ๋ฉด ๋ฌด์์ ํฉ๋๊น? ์์ ํ ํฌ๊ธฐํ๊ฑฐ๋ ์ธ์คํด์คํํ ๋ ๋ค์ ์ปดํ์ผํฉ๋๊น?
๋ฐ๋ผ์ ํ ๊ฐ์ง ๊ด์ฐฐ์ 4GB ํดํน์ด ํ์ฉํ๋ ๊ฒฝ๊ณ ํ์ธ ์ ๊ฑฐ์ ๋ง์ ๋ถ๋ถ์ wasm ๋ฉ๋ชจ๋ฆฌ ๋์ ์์ ๋ณดํธ ์์ญ์ ๊ฐ์ง์ผ๋ก์จ ํผํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ์ ์ด๊ธฐ ์คํ์ ๊ธฐ๋ณธ ๋ถ์(๋ฃจํ์ ๊ด๋ จ์ด ์์ผ๋ฉฐ ๋์ผํ ๊ธฐ๋ณธ ํฌ์ธํฐ๊ฐ ์๋ ๋ก๋/์ ์ฅ์ ๋ํ ๊ฒ์ฌ ์ ๊ฑฐ)์ด ์ด๋ฏธ ๊ฒฝ๊ณ ๊ฒ์ฌ์ ๋๋ต ์ ๋ฐ์ ์ ๊ฑฐํ ์ ์์์ ๋ณด์ฌ์ค๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๋ง๋ ์ด๊ฒ์ ๋ ๋์์ง ์ ์์ต๋๋ค. ๋ฐ๋ผ์ 4GB ํดํน์ ๋ ๊ฒธ์ํ๊ณ ๋ ํ์ํ ์๋ ํฅ์์ด ๋ ๊ฒ์ ๋๋ค.
๋ถ์์ ํตํด ๋ ๋ง์ ๊ฒ์ฌ๋ฅผ ์ ๊ฑฐํ ์ ์๋ค๋ ์ ์๋ ๋์ํ์ง๋ง ์ต๊ณ ์ ์ฑ๋ฅ์ ์ํ๋ค๋ฉด 4GB ํดํน์ ์ ํํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋ชจ๋๊ฐ ์ต๊ณ ์ฑ๋ฅ์ ์ํ๊ณ ๋ณด์ ๋ฌธ์ , ๋ฆฌ์์ค ๋ฌธ์ , ์๊ธฐ์น ์์ ์ฌ์ปดํ์ผ๋ ์ผ์ผํค์ง ์๊ณ ์ต๊ณ ์ฑ๋ฅ์ ์ป์ ์ ์๋๋ก ํ๋ฉด ์ข์ ๊ฒ ๊ฐ์์.
๋ด๊ฐ ์ด์ ์ ๊ฐ์ง๊ณ ์๋ ๋ ๋ค๋ฅธ ์์ด๋์ด๋ ๊ฒฝ๊ณ ๊ฒ์ฌ(๊ฐ๋ ํ์ด์ง ๊ธฐ๋ฐ ์ ๊ฑฐ ์ฌ์ฉ)๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋๋ฅผ ๋น๊ด์ ์ผ๋ก ์ปดํ์ผํ ๋ค์ ๊ณ ์ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ๋ก ์ธ์คํด์คํํ ๋ ์ ๊ฑฐํ๋ ๊ฒ์ ๋๋ค. ๊ฒฐํฉํ๋ฉด ์ค๋ฒํค๋๋ ์ด์์ ์ธ ๊ณ ์ ๋ชจ๋ ์ฝ๋์ ๋นํด ์๋นํ ์์ ์ ์์ต๋๋ค.
๊ฒฝ๊ณ ๊ฒ์ฌ๊ฐ ์๋ ์ฝ๋๋ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ์ ๋ํ ๋ ์ง์คํฐ๋ฅผ ๊ณ ์ ํ๊ณ ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ์ ๋ํ ๋ ์ง์คํฐ๋ฅผ ๊ณ ์ ํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค.
4GB ํดํน์ ์ฌ์ฉํ๋ ์ฝ๋๋ ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ ๋ ์ง์คํฐ๋ง ๊ณ ์ ํ๋ฉด ๋ฉ๋๋ค.
๋ฐ๋ผ์ ์ด๊ฒ์ ํ๋ฅญํ ์๋ฃจ์ ์ด ์๋๋๋ค.
์ฌ์๊ณผ ๊ตฌํ์ ๋ญ๊ธ๋งํด์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์ ์ธ์ ์ปดํ์ผ๊ณผ ์ธ์คํด์คํ๋ฅผ ์ฝ์๋ ํ๋์ ์์ ์ผ๋ก ๊ฒฐํฉํ๋ ๊ฒ์ ๋จ์ ์ ๋ฌด์์ ๋๊น?
๋ฌธ์ ๋ ์ด๋ฌํ ํ ๋น์ ๋ง์ด ํ์ฉํ๋ ๊ฒฝ์ฐ ๊ฐ๊ฐ์ ์ด๋ฌํ ํ ๋น ๋๋ฌธ์ ๋ณด์ ์ํ์ด ๋ฐ์ํ๋ค๋ ๊ฒ์ ๋๋ค.
ํ ๋น์ ASLR์ ํจ์จ์ฑ์ ๊ฐ์์ํต๋๋ค.
์ ๋ ASLR์ ๋ํ ์ ๋ฌธ๊ฐ๋ ์๋์ง๋ง iiuc, ๋น๋ก ์ฐ๋ฆฌ๊ฐ ๋ณด์์ ์ธ ๊ฒฝ๊ณ๋ฅผ ๊ฐ์ง๊ณ ์์ง ์๋๋ผ๋(์ฆ, ์ปค๋์ด ํด๋น ์์ ๋๋ฌํ์ฌ mmap
์คํจํ ๋๊น์ง ๊ณ์ ํ ๋นํ๋๋ก ํ์ฉํ ๊ฒฝ์ฐ) address-ranges max), ์ ์ฒด 47๋นํธ ์ฃผ์ ์ง์ ๊ฐ๋ฅ ๊ณต๊ฐ์ ์์ ๋ถ๋ถ๋ง ์ฌ์ฉ๋๋ฏ๋ก ์ฝ๋ ๋ฐฐ์น๋ ์ด 47๋นํธ ๊ณต๊ฐ์์ ๊ณ์ ๋งค์ฐ ๋ฌด์์์ ์
๋๋ค. IIUC, ASLR ์ฝ๋ ๋ฐฐ์น๋ ์์ ํ ๋ฌด์์๊ฐ ์๋๋๋ค. ๋ฌด์์ด ์์์ง ์์ธกํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ค๊ธฐ์ ์ถฉ๋ถํฉ๋๋ค.
ํ ๋นํ 4GB ๋ฉ๋ชจ๋ฆฌ ์์ ์ ํ์ด ์์ต๋๊น? ๋ ๋ญํ๋
์ด ํ๊ณ์ ๋๋ฌํ์ ๋ - ์์ ํ ํฌ๊ธฐํ ๊ฒ์ธ๊ฐ, ์๋๋ฉด ์ธ์คํด์คํํ ๋ ์ฌ์ปดํ์ผํ ๊ฒ์ธ๊ฐ?
๊ธ์์, asm.js ์์ ๋ถํฐ 1000๊ฐ๋ฐ์ ์ ๋๊ฑฐ๋ ์. ๊ทธ๋ฌ๋ฉด ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ด ๊ทธ๋ฅ ๋์ง๋๋ค. ์๋ง๋ ์ฐ๋ฆฌ๋ ์ด๊ฒ์ ๋ถ๋ช์ณ์ผ ํ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋ ๋์ผํ ํ๋ก์ธ์ค๋ฅผ ๊ณต์ ํ๋ ๋ง์ ์ํผ ๋ชจ๋ํ ์ฑ(๊ฐ๊ฐ ๋ง์ ๊ฐ๋ณ wasm ๋ชจ๋ ํฌํจ)์ด ์๋๋ผ๋ ๋๋ฌด ๋ง์ ๊ฒ์ด ํ์ํ ๊ฒ์ด๋ผ๊ณ ์์ํ ์ ์์ต๋๋ค. Memory
๋ ์ฑ์ด ์์ฐ์ค๋ฝ๊ฒ ์์ฒ ๊ฐ๋ฅผ ๋ง๋ค๊ณ ์ถ์ดํ์ง ์๋๋ค๋ ์ ์์ ๊ธฐ์กด์ ArrayBuffer
์ ๋ค๋ฅด๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ฌ์๊ณผ ๊ตฌํ์ ๋ญ๊ธ๋งํด์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์ ์ธ์ ๋จ์ ์ ๋ฌด์์ ๋๊น?
์ปดํ์ผ๊ณผ ์ธ์คํด์คํ๋ฅผ ํ๋์ ์ฝ์๋ ์์ ์ผ๋ก ๊ฒฐํฉํ๋ ๊ฒ?
์์์ ์ธ๊ธํ๋ฏ์ด Promise<Instance> eval(bytecode, importObj)
API๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๊ด์ฐฎ์ง๋ง ์ด์ ๊ฐ๋ฐ์๋ ์ผ๋ถ ํ๋ซํผ์์ ์ฑ๋ฅ ํฅ์๊ณผ ์ปดํ์ผ๋ ์ฝ๋๋ฅผ ์บ์ํ ์ ์๋ ๊ฒ ์ฌ์ด์์ ์ ํํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ด๋ ค์ด ์์น์ ๋์
๋๋ค. ๋ชจ๋ ํ๋ซํผ. ์บ์ฑ๊ณผ ํตํฉ๋๋ ์๋ฃจ์
์ด ํ์ํ ๊ฒ ๊ฐ์ผ๋ฉฐ ์์์ ๋ช
์์ ์ธ Cache
API๋ก ๋ธ๋ ์ธ์คํ ๋ฐ์ ํ์ต๋๋ค.
์๋ก์ด ์์ด๋์ด: new Instance
์ ๋น๋๊ธฐ ๋ฒ์ ์ ์ถ๊ฐํ๊ณ WebAssembly.instantiate
์ ๊ฐ์ด WebAssembly.compile
์ ๊ฐ์ด ๋ชจ๋ ์ฌ๋์ด ๋น๋๊ธฐ ๋ฒ์ ์ ์ฌ์ฉํด์ผ ํ๋ค๊ณ ํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? ์ด๊ฒ์ ํจ์น๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ธ์คํด์คํ์ ๋ช ms๊ฐ ๊ฑธ๋ฆด ์ ์๊ธฐ ๋๋ฌธ์ _์ด์จ๋ _ ๊ณ ๋ คํ๋ ๊ฒ์
๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ฌ์์์ ์์ง์ด compile
๋๋ instantiate
์์ ๊ฐ๋น์ผ ์์
์ ์ํํ ์ ์๋ค๊ณ ๋งํฉ๋๋ค(์์ง์ด ์ง์ฐ ์ ํจ์ฑ ๊ฒ์ฌ/์ปดํ์ผ์ ์ํํ๋ ๊ฒฝ์ฐ ๋ ๋ค!).
compile
d Module
๊ฐ IDB์ ์ ์ฅ๋์ด ์์ ๋ ๋ฌด์์ ํด์ผ ํ๋์ง์ ๋ํ ์ง๋ฌธ์ ์ฌ์ ํ โโ๋จ์ง๋ง, ์ฌ๋ฌ codegen ๋ชจ๋๊ฐ _์ด์จ๋ _ ์์ ๋ ์ด๋ ์ด๋ ค์ด ์ง๋ฌธ์ผ ๋ฟ์
๋๋ค. ํ ๊ฐ์ง ์์ด๋์ด๋ IDB์ ์ ์ฅ๋๊ฑฐ๋ IDB์์ ๊ฒ์๋ Module
๊ฐ IDB ํญ๋ชฉ์ ๋ํ ํธ๋ค์ ์ก๊ณ ์ด ํญ๋ชฉ์ ์ ์ปดํ์ผ๋ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ค๋ ๊ฒ์
๋๋ค. ๊ทธ๋ฐ ์์ผ๋ก IDB ํญ๋ชฉ์ ๋ชจ๋์ ํ๋ ์ด์์ ์ปดํ์ผ๋ ๋ฒ์ ์ ๋๋ฆฌ๊ฒ ์ถ์ ํ๊ณ ์ธ์คํด์คํ ์ค์ ํ์ํ ๊ฒ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
IDB ๋ถ๋ถ์ ์ฝ๊ฐ ๋ ๋ง์ ์์ ์ด ํ์ํ์ง๋ง ์ฑ๋ฅ ๋ฉด์์ ์ด์์ ๊ฐ๊น์ต๋๋ค. ์ด๋ป๊ฒ ์๊ฐํ์ญ๋๊น?
async instantiate
์ถ๊ฐํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง compile
Memory
๋งค๊ฐ๋ณ์๋ ์ถ๊ฐํฉ๋๋ค. instantiate
๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ๋ฌํ๋ฉด ๋ค์ ์ปดํ์ผํ ์ ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ปดํ์ผํ ๋ ์ด๋ฏธ ๋ฉ๋ชจ๋ฆฌ๋ฅผ "๋ฐ์ธ๋ฉ"ํ ๊ฒ์
๋๋ค.
๋๋ ์์ง ์์ ํ ํํ์ ์๊ฒฌ์ ๊ฐ์ง ๋งํผ ์บ์ฑ์ ๋ํด ์๊ฐํ์ง ์์์ต๋๋ค.
@lukewagner
๋๋ ASLR์ ๋ํ ์ ๋ฌธ๊ฐ๋ ์๋์ง๋ง iiuc, ๋น๋ก ์ฐ๋ฆฌ๊ฐ ๋ณด์์ ์ธ ๊ฒฝ๊ณ๋ฅผ ๊ฐ๊ณ ์์ง ์๋๋ผ๋(์ฆ, ์ปค๋์ด ์ต๋ ์ฃผ์ ๋ฒ์ ์์ ๋๋ฌํ๊ธฐ ๋๋ฌธ์ mmap์ด ์คํจํ ๋๊น์ง ๊ณ์ ํ ๋นํ๋๋ก ํ์ฉํ ๊ฒฝ์ฐ) , ์ ์ฒด 47๋นํธ ์ฃผ์ ์ง์ ๊ฐ๋ฅ ๊ณต๊ฐ์ ์์ ๋ถ๋ถ๋ง ์ฌ์ฉ๋๋ฏ๋ก ์ฝ๋ ๋ฐฐ์น๋ ์ด 47๋นํธ ๊ณต๊ฐ์์ ๊ณ์ํด์ ๋งค์ฐ ๋ฌด์์์ ์ ๋๋ค. IIUC, ASLR ์ฝ๋ ๋ฐฐ์น๋ ์์ ํ ๋ฌด์์๊ฐ ์๋๋๋ค. ๋ฌด์์ด ์์์ง ์์ธกํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ค๊ธฐ์ ์ถฉ๋ถํฉ๋๋ค.
ASLR์ ์ฝ๋์ ๋ฐ์ดํฐ ๋ชจ๋์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ์์ ์ ๊ณต๊ฒฉ์๊ฐ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋ํ ํฌ์ธํฐ๋ฅผ ์ถ์ ํ์ง ์๊ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ์นจ์ ํ๋ ๋ฐ ๋ ๋ง์ ๋น์ฉ์ด ๋ค๊ฒ ํ๋ ๊ฒ์ ๋๋ค. ๊ณต๊ฒฉ์๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณ ๊ฐ์ํฌ ์ ์๋ค๋ฉด ํ์คํ ๋ ๋ง์ ์ํฅ๋ ฅ์ ํ์ฌํ ์ ์์ต๋๋ค.
๊ธ์์, asm.js ์์ ๋ถํฐ 1000๊ฐ๋ฐ์ ์ ๋๊ฑฐ๋ ์. ๊ทธ๋ฌ๋ฉด ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ด ๊ทธ๋ฅ ๋์ง๋๋ค. ์๋ง๋ ์ฐ๋ฆฌ๋ ์ด๊ฒ์ ๋ถ๋ช์ณ์ผ ํ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋์ผํ ํ๋ก์ธ์ค๋ฅผ ๊ณต์ ํ๋ ๋ง์ ์ํผ ๋ชจ๋ํ ์ฑ(๊ฐ๊ฐ ๋ง์ ๊ฐ๋ณ wasm ๋ชจ๋ ํฌํจ)์ด ์๋๋ผ๋ ๋๋ฌด ๋ง์ ๊ฒ์ด ํ์ํ ๊ฒ์ด๋ผ๊ณ ์์ํ ์ ์์ต๋๋ค. ๋ฉ๋ชจ๋ฆฌ๋ ์ฑ์ด ์์ฐ์ค๋ฝ๊ฒ ์์ฒ ๊ฐ์ ์์ฑ์ ์ํ์ง ์๋๋ค๋ ์ ์์ ๊ธฐ์กด์ ์ผ๋ฐ ArrayBuffer์ ๋ค๋ฆ ๋๋ค.
1000์ ํฉ๋ฆฌ์ ์ธ ํ๊ณ์ฒ๋ผ ๋ณด์ ๋๋ค. ๋ณด์ ๋ด๋น์์๊ฒ ๋ฌผ์ด๋ณด๊ฒ ์ต๋๋ค.
์์์ ์ธ๊ธํ๋ฏ์ด Promise๋ฅผ ์ถ๊ฐํ๋ฉด
eval(bytecode, importObj) API๋ ๊ด์ฐฎ์ง๋ง ์ด์ ๊ฐ๋ฐ์๋ ์ผ๋ถ ํ๋ซํผ์์ ์ฑ๋ฅ ํฅ์๊ณผ ๋ชจ๋ ํ๋ซํผ์์ ์ปดํ์ผ๋ ์ฝ๋๋ฅผ ์บ์ํ ์ ์๋ ๊ฒ ์ค ํ๋๋ฅผ ์ ํํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ์๋ฅผ ์ด๋ ค์ด ์์น์ ๋ก๋๋ค. ์บ์ฑ๊ณผ ํตํฉ๋๋ ์๋ฃจ์ ์ด ํ์ํ ๊ฒ ๊ฐ์ผ๋ฉฐ ์์์ ๋ช ์์ Cache API๋ฅผ ์ฌ์ฉํ์ฌ ๋ธ๋ ์ธ์คํ ๋ฐํ์ต๋๋ค.
์ค๋ฅธ์ชฝ. ๊ทธ๋ฌํ API๊ฐ ์๋ํ๋๋ก ๋ง๋ค ์ ์๋ ๋ช ๊ฐ์ง ๋ฐฉ๋ฒ์ ๋ณผ ์ ์์ต๋๋ค. ์ธ๊ตฌ๋ ค์ง๋ง ์ค์ฉ์ ์ธ API๋ eval์ ์ค๋ฒ๋ก๋ํ๋ ๊ฒ์ ๋๋ค.
Instance์๋ getter๊ฐ ์์ต๋๋ค.
๋ชจ๋ = instance.module
์ฌ๊ธฐ์ ๋ชจ๋์ ๊ตฌ์กฐ๋ฅผ ๋ณต์ ํ ์ ์์ต๋๋ค.
์ด๊ฒ์ ๋ํด์ ์ด๋ป๊ฒ ์๊ฐํ๋?
์๋ก์ด ์์ด๋์ด: WebAssembly.instantiate์ ๊ฐ์ด ์ ์ธ์คํด์ค์ ๋น๋๊ธฐ ๋ฒ์ ์ ์ถ๊ฐํ๊ณ WebAssembly.compile๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ชจ๋ ์ฌ๋์ด ๋น๋๊ธฐ ๋ฒ์ ์ ์ฌ์ฉํด์ผ ํ๋ค๊ณ ๊ฐ์ ํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? ์ด๊ฒ์ ํจ์น๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ธ์คํด์คํ์ ๋ช ms๊ฐ ๊ฑธ๋ฆด ์ ์๊ธฐ ๋๋ฌธ์ ์ด์จ๋ ๊ณ ๋ คํ ๊ฒ์ ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ฌ์์์ ์์ง์ด ์ปดํ์ผ ๋๋ ์ธ์คํด์คํ์์ ๋น์ฉ์ด ๋ง์ด ๋๋ ์์ ์ ์ํํ ์ ์๋ค๊ณ ๋งํฉ๋๋ค(์์ง์ด ์ง์ฐ ์ ํจ์ฑ ๊ฒ์ฌ/์ปดํ์ผ์ ์ํํ๋ ๊ฒฝ์ฐ ๋ ๋ค!).
์ปดํ์ผ๋ ๋ชจ๋์ด IDB์ ์ ์ฅ๋ ๋ ๋ฌด์์ ํด์ผ ํ๋์ง์ ๋ํ ์ง๋ฌธ์ ์ฌ์ ํ โโ๋จ์ ์์ง๋ง ์ด์จ๋ ์ฌ๋ฌ codegen ๋ชจ๋๊ฐ ์๋ ๊ฒฝ์ฐ ์ด๋ ค์ด ์ง๋ฌธ์ผ ๋ฟ์ ๋๋ค. ํ ๊ฐ์ง ์์ด๋์ด๋ IDB์ ์ ์ฅ๋๊ฑฐ๋ IDB์์ ๊ฒ์๋ ๋ชจ๋์ด IDB ํญ๋ชฉ์ ๋ํ ํธ๋ค์ ์ก๊ณ ์ด ํญ๋ชฉ์ ์ ์ปดํ์ผ๋ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฐ ์์ผ๋ก IDB ํญ๋ชฉ์ ๋ชจ๋์ ํ๋ ์ด์์ ์ปดํ์ผ๋ ๋ฒ์ ์ ๋๋ฆฌ๊ฒ ์ถ์ ํ๊ณ ์ธ์คํด์คํ ์ค์ ํ์ํ ๊ฒ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
IDB ๋ถ๋ถ์ ์ฝ๊ฐ ๋ ๋ง์ ์์ ์ด ํ์ํ์ง๋ง ์ฑ๋ฅ ๋ฉด์์ ์ด์์ ๊ฐ๊น์ต๋๋ค. ์ด๋ป๊ฒ ์๊ฐํ์ญ๋๊น?
ํฅ๋ฏธ๋กญ๋ค. ์์ ๋ด ์์ด๋์ด์ ๊ด๋ จํ์ฌ :
์ฅ์ : ๋น์ ์ ์ง๊ธ ์ฐ๋ฆฌ๊ฐ ๋งํ๋ ๊ฒ๊ณผ ๊ฐ๋
์ ์ผ๋ก ์ ์ฌํ ์ดํดํ๊ธฐ ์ฌ์ด ์ถ์ํ์
๋๋ค.
๋จ์ : ๋น์ ์ ๊ฒ์ ์ฌ์ฉ์๊ฐ ํ๋ ์ผ๊ณผ ๋ด ์ ์์ด ํ์ฉํ๋ ๋งํผ ์์ง์ด ํ๋ ์ผ ์ฌ์ด์ ๋ง์ ์๋์ง ํจ๊ณผ๋ฅผ ๊ฐ์ ธ์ค์ง ์์ต๋๋ค.
๊ทํ์ ์ ์์ด ์ฌ์ฉ์์๊ฒ ์ ๋งํผ ๋ง์ ์ ์ด ๊ถํ์ ๋ถ์ฌํ์ง ์๋ ์ธ ๊ฐ์ง ์์ญ์ด ์์ต๋๋ค.
๊ทธ๋์ ์ ๋ ์ ๊ฒ์ด ๋ ์ข์ต๋๋ค. ๊ทธ๋ ๊ธด ํ์ง๋ง, ๋น์ ์ ์ ์์ ์ง๋ณด์ ์ด๋ผ๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ํ์คํ ๋์๊ฒ ์ข๊ฒ ๋ค๋ฆฝ๋๋ค.
์ด ๋ฌธ์ ๋ ์กฐ๊ฐํ๋ก ์ธํด
๋ฉ๋ชจ๋ฆฌ(4GB + ์ต๋ ์ง์ ์คํ์
๋๋ 8GB)๊ฐ ์คํจํฉ๋๋ค. ๋ง์ฝ
์๋ง๋ 1% ๋ฏธ๋ง์ผ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋ฉด ์์ ํ ๋นํฉ๋ฆฌ์ ์ด์ง ์์ ์๋ ์์ต๋๋ค.
OOM ์ํฉ์
๋๋ค.
์ฌ์ฉ์๊ฐ ์น์ ํ์ํ๊ณ ๋ง์ ๊ฒ์ ์ฌ์ฉํ๋ ์๋๋ฆฌ์ค์์
์์ WASM ๋ชจ๋์ด ์ฐ์์ ์ผ๋ก ๋น ๋ฅด๊ฒ ์ฐ๊ฒฐ๋๋ฉฐ ์๋ง๋ ๋ชจ๋ ๋ผ์ด๋ธ ์ํ๊ฐ ์๋ ๊ฒ์
๋๋ค.
ํ ๋ฒ. ์ด ๊ฒฝ์ฐ ์์ฝ๋ 4GB ์ฒญํฌ์ ์์ ์บ์๊ฐ
๋ฌธ์ .
๋ ๋ค๋ฅธ ๊ฐ๋ฅํ ์ ๋ต์ ๋ค์์ ์ฌ์ฉํ์ฌ ํ ๋ฒ์ ์ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์
๋๋ค.
๊ฒฝ๊ณ๋ฅผ ํ์ธํ๊ณ ๋น ๋ฅธ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ ๊ฒฝ๊ณ๋ฅผ ๋ฎ์ด์๋๋ค.
nops๋ก ํ์ธํฉ๋๋ค. ์ถ์
ํ์ง๋ง, ๊ทธ๊ฒ์ ์ง์ฅ๋ณด๋ค ํจ์ฌ ๋น ๋ฆ
๋๋ค.
๋ค์ ์ปดํ์ผํ๊ณ ๋ ์ปดํ์ผ๋ณด๋ค ์ ์ ๊ณต๊ฐ์ ์ฐจ์งํฉ๋๋ค.
2016๋
10์ 27์ผ ๋ชฉ์์ผ ์คํ 9:03, pizlonator [email protected]
์ผ๋ค:
@mtrofin https://github.com/mtrofin
๋ชจ๋ ์์ฑ์๋ ์ต์/์ต๋ ๋ฉ๋ชจ๋ฆฌ๋ก 4GB๊ฐ ํ์ํฉ๋๋ค.
๋ง์ ์ฅ์น์ 4GB์ ๋ฌผ๋ฆฌ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ค์ ๋ก๋ ์ค์ฉ์ ์ด์ง ์์ต๋๋ค.
๋ฉ๋ชจ๋ฆฌ. ๋ํ ์ฌ์ํ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค.๋ค์์ ์์ฑํ๋ ์ปดํ์ผ์ ๋ณํ(์ ์ด๋ ๋น๋๊ธฐ, ๋๊ธฐํ๋ ๊ฐ๋ฅ)
๋น ๋ฅธ ๋ฉ๋ชจ๋ฆฌ๋ง ํ์ฉํ๋ ์ธ์คํด์ค.๋๋ ์ฐ๋ฆฌ๊ฐ ์ด์ค ์ปดํ์ผ์ ์ํ์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
โ
์ด ์ค๋ ๋์ ๊ฐ์ ํ๊ธฐ ๋๋ฌธ์ ์ด ๋ฉ์์ง๋ฅผ ๋ฐ๊ณ ์์ต๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธ
https://github.com/WebAssembly/design/issues/838#issuecomment -256738329,
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/ALnq1F6CYUaq0unla0H6RYivUC8jfxIAks5q4PWIgaJpZM4Kh1gM
.
ASLR ๋ฟ๋ง ์๋๋ผ pagetable/allocator/etc ์ค์ผ์ด๊ธฐ๋ ํฉ๋๋ค. ์ฐ๋ฆฌ ๋ชจ๋๋ ๋ณด์ ๋ด๋น์ _๋ฟ๋ง ์๋๋ผ_ ์ปค๋/์์คํ
๋ด๋น์์ ์ด์ผ๊ธฐํด์ผ ํฉ๋๋ค. ๋๋ ๊ฐ ์์ง์ด "๋น ๋ฅธ" Memory
์ ๋ถ๊ณผํ๋ ์ ํ์ ๋ํด ๊ฐ๋ฐ์์๊ฒ ๋ฏธ๋ฆฌ ์๋ฆฌ๊ณ API์์ ์ด๋ฅผ ๊ด์ฉ์ ์ผ๋ก ๋ง๋ค์ด์ ์๋ชป ์ฌ์ฉํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
nop ๋๋ ์ด์ค ์ปดํ์ผ๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ ๋ชจ๋ ๋ชฉ๋ฐ์ด ์์ง๋ง ์ ๋ชฉ๋ฐ์ด ์์ต๋๊น?
@jfbastien PROT_NONE ๋ฉ๋ชจ๋ฆฌ ๋น์ฉ์ด ํ์ด์ง ํ ์ด๋ธ ํญ๋ชฉ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ํ์ด์ง ํ ์ด๋ธ์ด ๋๋ฆฌ๊ฒ ์ฑ์์ง๋ ๋งคํ์ ๋ณด์ ํ๋ ๋ณ๋์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
@pizlonator ์ ๋ ๊ทธ ์์ด๋์ด๊ฐ ๋ง์์ Module
๋ฌด์ํ ์ ์๋ค๋ฉด ๋ ๊ฐ๊ฒฐํ๊ณ ๊ฐ๋ฅด์น๊ธฐ ์ฝ์ต๋๋ค. ์ด๊ฒ์ ๋ํ ๊ฐ์ฅ ์ข์ API๋ฅผ ๋น๋๊ธฐ API๋ก ๋ง๋ค์ด ๋๊ธฐํ API ์ฌ์ฉ์ ๋ฐฉํดํ๋ @s3ththompson ์ ์ฐ๋ ค๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ WebAssembly.compile
๋ฐ Module
์์ฑ์๋ฅผ ์ ๊ฑฐํด์๋ ์ ๋๋ค๊ณ ์๊ฐํฉ๋๋ค. "์ฝ๋ ์๋ฒ"(IDB + postMessage
๋ฅผ ํตํด ์๋ณธ ๊ฐ ์ฝ๋ ์บ์ฑ ์ ๊ณต)๊ฐ ์๋ ์๋๋ฆฌ์ค๋ฅผ ์์ํ๊ณ ์์ต๋๋ค. new Module
ํตํด)์ ์ํ๋ ๋์ผํ ๋ชจ์๋ฆฌ ๊ฒฝ์ฐ์ ๋ํด new Instance
๋ฅผ ์ ์งํด์ผ ํฉ๋๋ค.
๋ฐ๋ผ์ ์ด์ ๋์ํ๋ฉด ์ธ๊ธํ ๋ ๊ฐ์ WebAssembly.eval
์ค๋ฒ๋ก๋์ ๋ํ ์์ ํ ์ถ๊ฐ ์ ์์ผ๋ก ์์ฝ๋ฉ๋๋ค. ์?
ํ๋ ํ
๊ฒจ, ๋น๋ก : ๋ด๊ฐ ์๊ฐํ๋ ์ฐ๋ฆฌ๋์ด ์๋๋ module
๊ฒํฐ์ด๋ ํ์ํ๊ธฐ ๋๋ฌธ์ Instance
์ ์๋ช
์ฃผ๋ณ์ ์ผ๋ถ ๋ด๋ถ ๋ฐ์ดํฐ๋ฅผ ์ ์งํ๊ธฐ ์ํด (์ฆ, ๋ฐ์ดํธ ์ฝ๋.) Instance
; ์ง๊ธ Module
๋ ์ผ๋ฐ์ ์ผ๋ก ์ธ์คํด์คํ ์งํ์ GC๋ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋ฐ์ดํฐ ์์ฑ(์ฌ์ฉ์๊ฐ ์ ๊ฑฐํ ์ ์์ง๋ง ์์ด๋ฒ๋ฆด ์ ์์) ๋๋ {instance, module}
์์ ๋ฐํํ๋ eval
์ ์ธ ๋ฒ์งธ ๋ฒ์ ์ ์ ์ํฉ๋๋ค.
์ผ๋ฐ์ ์ธ ๋ชจ๋๋ฆฌ์ ์ฑ์ ๊ถ์ฅ ์ฌ๋ก๋ก ๋น๋๊ธฐ 1๋จ๊ณ API๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ถ์ฅ ํจํด์ผ๋ก ์๋ฏธ๊ฐ ์์ต๋๋ค.
new Module + new Instance๊ฐ ๋ค๋ฃจ๋ ๋ชจ๋ ๋๊ธฐํ(์ธ๋ผ์ธ ์ปดํ์ผ) ์ฌ๋ก๊ฐ ๋ชจ๋ ์ ์ฉ ํ๋ค๋
๋ํ ๋๊ธฐํ ์ธ์คํด์คํ ๊ธฐ๋ฅ์ด ์๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ปดํ์ผ(๋น๋๊ธฐ) ์๋ฒ๋ ์ ์ฉํด ๋ณด์
๋๋ค.
์ ์๋ ๋ ๊ฐ์ง ํ๊ฐ ๋ณํ์ ์ถ๊ฐํ๋ ๊ฒ์ด ์ด๋ฅผ ์๊ฐํ๋ ์ข์ ๋ฐฉ๋ฒ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ๋ฌ๋ ๋๋ ๊ทธ ์ด๋ฆ์ด ๋ง์์ ๋ค์ง ์์ต๋๋ค. ์๋ํ๋ฉด ๊ทธ๊ฒ์ (๋ณด์) ์ฌ๋๋ค์ ๋ง์๊ณผ js eval(ํ ๋ฉด์์๋ ๋น์ทํ์ง๋ง ๋ฒ์ ์บก์ฒ ์ธก๋ฉด์์๋ ๊ทธ๋ ์ง ์์)๊ณผ ์ตํฉ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์
๋๋ค.
WebAssembly.instantiate๋ ์ด๋ป์ต๋๊น?
ํ, ์ข์ ์ง์ ์
๋๋ค. eval์๋ ์ฝ๊ฐ์ ๋ด๋น์๊ฐ ์์ต๋๋ค. +1 ~ WebAssembly.instantiate
.
๋น๋๊ธฐ ์ธ์คํด์คํ๋ฅผ ์ฌ์ฉํ ๋ ๊ฐ๋ฐ์์ ๋ํ ์ง์นจ์ ๋ฌด์์ ๋๊น?
@mtrofin ํน์ ์ฉ๋์ ๋
๋ฆฝ์ ์ผ๋ก Module
์ปดํ์ผํด์ผ ํ๋ ํน๋ณํ ์ฝ๋ ๊ณต์ /๋ก๋ฉ ์ฒด๊ณ๊ฐ ์๋ ํ ๊ธฐ๋ณธ์ ์ผ๋ก WebAssembly.instantiate
๋ฅผ ์ฌ์ฉํฉ๋๋ค.
@lukewagner ํฉ๋ฆฌ์ ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
ํ, ์ข์ ์ง์ ์ ๋๋ค. eval์๋ ์ฝ๊ฐ์ ๋ด๋น์๊ฐ ์์ต๋๋ค. WebAssembly.instantiate์ +1.
๋์.
๋ฐ๋ผ์ ์ด์ ๋์ํ๋ฉด ์ธ๊ธํ ๋ ๊ฐ์ WebAssembly.eval ์ค๋ฒ๋ก๋์ ๋ํ ์์ ํ ๋ถ๊ฐ์ ์ธ ์ ์์ผ๋ก ์์ฝ๋ฉ๋๋ค. ์?
๊ทธ๊ฒ ๋ฌด์จ ์๋ฆฌ์ผ.
๋ชจ๋ getter๊ฐ ์์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ ค๋ฉด Instance๊ฐ Instance์ ์๋ช ๋์ ์ผ๋ถ ๋ด๋ถ ๋ฐ์ดํฐ(์ฆ, ๋ฐ์ดํธ์ฝ๋)๋ฅผ ์ ์งํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ฐ๋ก ์ง๊ธ ๋ชจ๋์ ์ผ๋ฐ์ ์ผ๋ก ์ธ์คํด์คํ ์งํ์ GC๋ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋ฐ์ดํฐ ์์ฑ(์ฌ์ฉ์๊ฐ ์ ๊ฑฐํ ์ ์์ง๋ง ์์ด๋ฒ๋ฆด ์ ์์) ๋๋ {instance, module} ์์ ๋ฐํํ๋ ์ธ ๋ฒ์งธ ๋ฒ์ ์ eval์ ์ ์ํฉ๋๋ค.
ํ์คํ ๋ฐ์ดํฐ ์์ฑ์ด ๋ ๋์ ๊ฒ์ฒ๋ผ ๋๊ปด์ง๋๋ค. ๋๋ WebAssembly.instantiate๊ฐ ํญ์ ์ธ์คํด์ค, ๋ชจ๋ ์์ ๋ฐํํ๋๋ก ํฉ๋๋ค.
์ด๊ฒ์ด ๋ง์ต๋๊น? fastmemory ๋ชจ๋ ๋ณํ์ ์ป๊ธฐ ์ํด WebAssembly.instantiate
ํ๋ค๊ณ ๊ฐ์ ํ์ญ์์ค. ์ด์ ๋ชจ๋์ ๊ฐ์ ธ์ ๊ตฌ์กฐ ๋ณต์ ํฉ๋๋ค. ์ด์ ์ด ๋ชจ๋์ fastmemory๋ฅผ ์ง์ํ๋ Memory
-es๋ก ์ธ์คํด์คํํด์ผ ํฉ๋๋ค.
@pizlonator ์, ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์์ ๊ฑฐ๋ฅผ ํ ์ ์์ต๋๋ค. ๋๋ ์ค์๋ก ์ฌ์ฉํ์ง ์์ Module
๋๋ฐํ๋ ์ฌ๋๋ค์ด ์ค์ด๋ค๊ธฐ ๋๋ฌธ์ ์์ ๋ฐํํ๋ ๊ฒ์ด ๋ ๋ซ๋ค๊ณ ์๊ฐํฉ๋๋ค.
@mtrofin ์ฌ ์ปดํ์ผ์ instantiate
ํธ์ถ์์ Module
๋ฅผ ๋ฝ๊ณ ์ ๊ฐ์ ธ์ค๊ธฐ๋ก instantiate
๋ฅผ ๋ฝ์ ๋ ์ฌ์ ํ ํ์ํ ์ ์์ต๋๋ค. ์ด API ์ถ๊ฐ์ ์์ ์ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ๊ฐ ์๋๋ฉฐ ๊ทผ๋ณธ์ ์ผ๋ก ํ์ํ ๋๋ง ๋ฐ์ํ๋ค๋ ๊ฒ์
๋๋ค(์ฆ, ๋ ์ข
๋ฅ์ ๋ฉ๋ชจ๋ฆฌ์ ์ก์ธ์คํ๋ 1๊ฐ์ ๋ชจ๋์ด ์๋ ๊ฒฝ์ฐ).
์ด ์ค๋ ๋๊ฐ ๊ธธ์ด์ง๊ณ ์๋ ด๋๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง 100% ํ์ ํ๋ ค๋ฉด ๋ค๋ฅธ ์ฌ์ฉ์๊ฐ ์์ฑํ ๊ฒ์ผ๋ก ์์๋๋ ์ฝ๋๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค.
.wasm
๋ชจ๋์ ์
๋ฐ์ดํธ ๋ฐ ๋ค๋ฅธ ๋ชจ๋์ ์บ์๋ ๋ก๋.๋ค๋ฅธ ๊ฑด ์๋์? @lukewagner ๊ฐ ๋ด๊ฐ ์์ ํ ์ดํดํ์ง ๋ชปํ๋ ์์ ํ์ ๋ํ ์์ด๋์ด๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฒ
์ฆ, ์ด ๋ชจ๋์ ํ์ ์ฌ์ฉ์ ๋น๋๊ธฐ์์ผ๋ก ์ธ์คํด์คํํด์ผ ํ๋ฉฐ, ๊ทธ๋ ์ง ์์ผ๋ฉด ๋๋๊ฒ๋ ๊ธด ๋๊ธฐ์ ์ธ์คํด์คํ๋ก UI ์ค๋ ๋๋ฅผ ์ฐจ๋จํ ์ํ์ด ์์ต๋๋ค.
@jfbastien ์ ๋ ๊ฐ๋ฐ์๊ฐ ์์ฑํ๊ธฐ๋ฅผ ๊ธฐ๋ํ๋ ๊ฐ ์ค๋ํซ, ํน์ ๊ฒฝ๋ก๋ก ์ด๋ํ๋๋ก ๋๊ธฐ๋ฅผ ๋ถ์ฌํ๋ ์์, ๊ฐ๋ฐ์๊ฐ ๊ฒฐ์ ์ ๋ด๋ฆฌ๊ธฐ ์ํด ์ฌ์ฉํ ์ ์์ด์ผ ํ๋ ์ ๋ณด๋ฅผ ์ดํดํ๊ณ ์ถ์ต๋๋ค.
@mtrofin ๋ง์ต๋๋ค. Module
m
์ฃผ์ด์ง๋ฉด ๋น๋๊ธฐ์์ธ WebAssembly.instantiate(m)
๋ฅผ ํธ์ถํ ๊ฒ์
๋๋ค. new Instance(m)
_ํ ์ ์๊ณ ๋น์ฉ์ด ๋ง์ด ๋ค ์ ์์ง๋ง new Module(m)
์ ๋ค๋ฅด์ง ์์ต๋๋ค.
@jfbastien "๋น๋๊ธฐ ์ธ์คํด์คํ"๋ผ๊ณ ๋งํ ๋ "๋น๋๊ธฐ ์ปดํ์ผ ๋ฐ ์ธ์คํด์คํ"๋ฅผ ์๋ฏธํ๋ค๊ณ ๊ฐ์ ํ๋ฉด ๋ค์์ ์งง์ ๋ฒ์ ์ ๋๋ค.
WebAssembly.instantiate(bytecode, imports)
WebAssembly.instantiate(bytecode, imports)
, ์ฌ๊ธฐ์ imports
๋ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํฌํจํฉ๋๋ค.new Instance(new Module(bytecode), imports)
Module
๋น์ ์๊ฒ ๋ค์, put
์๋ค๋์์ IDBObjectStore
. ๋์ค์ get
a Module
m
๋ค์ WebAssembly.instantiate(m, imports)
์ ํ๋ฅผ ๊ฒ๋๋ค.WebAssembly.instantiate
๋ฐ์ดํธ ์ฝ๋์์ ํ๋ ๊ฐ์ ๋ชจ๋ ๋ฐ instantiate
๋ก๋ถํฐ ๋๋จธ์ง Module
IDB์์ ๊ฐ์ ธ์จ๋ค.๋๊ธฐํ ์ปดํ์ผ์ ์ฌ์ฉํ ์ ์๋ค๊ณ ์๊ฐ๋๋ฉด ๋๊ธฐํ ์ธ์คํด์คํ๋ฅผ ์ฌ์ฉํ๊ณ ๋น๋๊ธฐ ์ปดํ์ผ์ ์ฌ์ฉํด์ผ ํ๋ค๊ณ ์๊ฐ๋๋ฉด ๋น๋๊ธฐ ์ธ์คํด์คํ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๊น?
๊ทธ ์ธ์๋ ๊ฐ๋ฐ์๊ฐ ๋ ๋ณต์กํ ์์คํ , ์ฆ ์ฐ๋ฆฌ๊ฐ ๊ณํ ์ค์ธ ์ต์ ํ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ ๋ ๋ง์ ์ ํ์ ์ง๋ฉดํ๊ฒ ๋ ๊น๋ด ๊ฑฑ์ ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ๋ฐ์๊ฐ ์ ์ถฉ์ ์ ๋ง๋๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ์ฌ๋ฐ๋ฅธ ์ ๋ณด๊ฐ ์๋์ง ํ์ ํ ์ ์์ต๋๋ค. ๊ฐ๋ฐ์์ ๊ด์ ์์ ์๊ฐํด๋ณด๋ฉด ๊ทธ๋ค์ด ์ ๊ฒฝ์ฐ๊ณ ํธ์ํ๊ฒ ํํํ ์ ์๋ ์์ ๊ฑฑ์ ๊ฑฐ๋ฆฌ๊ฐ ์์ต๋๊น? ์ฐ๋ฆฌ๋ ๊ฐ๋ฐ์๊ฐ "์ ํํ ์คํจ ์ง์ ์ ํฌ์ํ์ฌ ์ต์ ํ"ํ๋ ๊ฒ์ ๋ํด ์ด์ผ๊ธฐํ์ต๋๋ค(์ด๊ฒ์ ๊ฒฝ๊ณ ํ์ธ์ ๋ค์ ๋์ด์ฌ๋ฆฌ๋ ๊ฒ์ด์์ต๋๋ค). ๋์์ด "์ต์ ํ" ํ๋๊ทธ๊ฐ ๋ ๊น์?
@mtrofin ๊ฐ๋ฐ์๊ฐ ์์ฑํ๊ฑฐ๋ ํด์ฒด์ธ์์ ์์ฑํ WebAssembly.instantiate
์
๋๋ค. ํน๋ณํ "๋๋ wasm์์ JIT๋ฅผ ์์ฑ ์ค์
๋๋ค"์ ๋ํด์๋ง ๋๊ธฐํ API๋ฅผ ์ฌ์ฉํ๊ณ ์ผ๋ถ ์ฝ๋ ๊ณต์ ์์คํ
์ ์์ฑํ๋ ๊ฒฝ์ฐ WebAssembly.compile
๋ํด์๋ง ๋๊ธฐํ API๋ฅผ ์ฌ์ฉํ๋ฏ๋ก "์์ํ๊ธฐ" ํํ ๋ฆฌ์ผ์ด WebAssembly.instantiate
๋
์ ์ ์ผ๋ก ๋ค๋ฃฐ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค
@lukewagner ์์ #3 new Module()์ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ถ๊ฐํ์ต๋๋ค. WebAssembly.compile์ ์ถ๊ฐํ๋ ๊ฒ์ ์ข์ ์๊ฐ์ด๋ฉฐ ๊ฐ๋ฅ์ฑ์ ์์ฑํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๋ ๊ฒํ๋ฉด ์ปดํ์ผ ํ์์ ๋ฉ๋ชจ๋ฆฌ์ ๋ํด ํํธ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
๋์ค์ ๋ค๋ฅธ ๊ฐ์ ธ์ค๊ธฐ๋ก, ํนํ ๋๊ธฐ์ ์ผ๋ก ๋ค์ ์ธ์คํด์คํํ๋ฉด ๋ธ๊พน์ง์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
๋ณ๊ฒฝ ์ฌํญ ์์ฝ (๋ด๊ฐ ๋ช ํํ๊ธฐ ๋๋ฌธ์) :
์ปดํ์ผ์์ ๊ฐ์ ธ์ค๊ธฐ๊ฐ ์ธ์คํด์คํ๋๋ฉด ์ธ์คํด์คํ ์๋๊ฐ ๋นจ๋ผ์ง ๊ฒ์ด๋ผ๋ ์์์ ์ด๋๊ฐ์ ๋ช ์ํ์ญ์์ค.
์ด๋ป๊ฒ ์๊ฐํ์ญ๋๊น?
์ด๋ฐ, ๊ฐ์ ธ์ค๊ธฐ๋ฅผ Instance
์ธ์๋ก ๋ฃ์ผ๋ ค๊ณ ํ์ต๋๋ค. Module
๋๋ compile
ํ์ํ๋ค๊ณ ํ์ ํ์ง ๋ชปํฉ๋๋ค. [ํธ์ง: ๊ฐ์ง๊ณ ์๋ค๋ฉด instantiate
์ ํ๋ฅผ ๊ฑธ๊ธฐ ๋๋ฌธ์
๋๋ค.]
์ฆ, ์ข ๋จ ๊ฐ ๋น๋๊ธฐ์ ๊ฒฝ์ฐ 4GB ํดํน ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ์ธ๋ฉ๋์ง๋ง JITed ํํฐ ์ปค๋ ๋๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ปดํ์ผ ํญ๋ชฉ์ ๋ํด์๋ ๋ฐ์ธ๋ฉ๋์ง ์๋๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ๋จ์ด์ ธ ์ธ์คํด์ค)?
์ปดํ์ผ ๋ฐ ์ธ์คํด์คํ์ ๋น๋๊ธฐ ์์ ๋ํ ์ง์นจ์ ์ด์ ์ ๋ง์ถ๋ ๋ฐ +1 - ๋ฉ์์ง๋ฅผ ๋จ์ํ๊ฒ ๋ง๋ค๊ณ ๊ฐ๋ฐ์๋ก๋ถํฐ ๊ฒฐ์ ๋ฌธ์ ์ ๋ณต์ก์ฑ์ ์จ๊น๋๋ค.
๋ค, ์ ๋ ์ฐ๋ฆฌ ๋ชจ๋๊ฐ ์ฌ๋๋ค์๊ฒ ๋ค์์ ์ง์ ํ๋ค๋ ๋ฐ ๋์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ฒ์์ผ๋ก:
WebAssembly.instantiate(bytes, imports) -> {module, instance}์ ์ฝ์(indexeddb์ ๋ํ ์บ์ ๋ชจ๋)
๋๋ฒ์งธ:
WebAssembly.instantiate(module, imports) -> {module, instance}์ ์ฝ์
๊ทธ๊ฒ์ด ์ฃผ์ ํจํด์ด๋ผ๋ ๊ฒ์ ๋ํ ์ด์๊ฐ ์์ต๋๊น?
์ปดํ์ผ/์ ๋ชจ๋์ ๋ํ ๊ฐ์ ธ์ค๊ธฐ์ ๋ํด ๊ณ ๋ฏผํ๊ณ ์์ต๋๋ค. ์ ์ฉํ ํํธ๊ฐ ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ๋ฌ๋ ๋๋ ๊ทธ๊ฒ์ ๊ฐ๋ฅ์ฑ์ผ๋ก ์ธ๊ธํ๊ณ Post-MVP์ ํด๋น arg(์ ํ ์ฌํญ์ผ ์ ์์)๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ์ฐ๊ธฐํ ์ ์์ต๋๋ค.
์๊ฐ?
@mtrofin (๊ธฐ์ ์ ์ผ๋ก๋ instantiate
์
๋๋ค.)
@lukewagner ( @mtrofin์ด ์๋ฏธํ๋ ๊ฒ ๊ฐ์์)
@lukewagner , @flagxor OK, ํ์ง๋ง ์ฐ๋ฆฌ๋ ๋น๋๊ธฐ ์ปดํ์ผ API๋ฅผ ์ ์งํ๊ณ ์์ต๋๋ค. ๋ง์ฃ ?
์ด ์๋๋ฆฌ์ค๋ ์ด๋ป์ต๋๊น? ์๋ง์ ํ๋ฌ๊ทธ์ธ์ด ํฌํจ๋ PhotoShop๊ณผ ๊ฐ์ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ป์ ์ ์์ต๋๋ค. ๊ฐ ํ๋ฌ๊ทธ์ธ์ wasm ๋ชจ๋์ ๋๋ค. ๋ฉ์ธ ์ฑ์ ์์ํ๊ณ fastmemory๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋ ๋ง๋ฒ์ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ๋ฅผ ํ ๋นํฉ๋๋ค(์ด ์๋๋ฆฌ์ค์์๋ ์ฑ ํ๋, ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ).
์ฌ๋ฌ ํ๋ฌ๊ทธ์ธ์ ๋ณ๋ ฌ๋ก ์ปดํ์ผํ๊ณ ์ผ๋ถ ์์ ์๋ฅผ ์คํํ์ฌ ์ด๋ฅผ ์ํํ๋ ค๊ณ ํฉ๋๋ค. ๋น์ ์ ๋น์ ์ด ์ฌ์ฉํ ์ค์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ทธ ์ปดํ์ผ์ ์ ๋ฌํ ์ ์์ต๋๋ค(๋ง์ต๋๊น?). ๋ฐ๋ผ์ ๊ธฐ๋ณธ๊ฐ์ ๋ฐ๋ผ ํ๋ฌ๊ทธ์ธ์ ๋ํ ๋๋ฆฐ ๋ฉ๋ชจ๋ฆฌ ์ปดํ์ผ์ด ๋ฐ์ํ๊ณ ํ๋ฌ๊ทธ์ธ์ด ์ฑ์ ์ฐ๊ฒฐ๋ ๋ fastmemory์ ๋ํ ๋น์ฉ์ด ๋ง์ด ๋๋ ๋น๋๊ธฐ ์ฌ์ปดํ์ผ์ด ๋ค๋ฐ๋ฆ ๋๋ค.
์ด ์๋๋ฆฌ์ค๋ฅผ ๊ตฌ์ ํ๋ฉด ์ผ๋ถ ๋ฉ๋ชจ๋ฆฌ ์ค๋ช ์(์ค์ ์ง์ ๋ฉ๋ชจ๋ฆฌ ์์ด ๋ช ํํ๊ฒ)๋ฅผ ์ปดํ์ผ API์ ์ ๋ฌํ๋ ๋ฐ ๊ฐ์น๊ฐ ์์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์, Memory
๋ฅผ ์ปดํ์ผ์ ์ ๋ฌํ ์ ์์ด์ผ ํฉ๋๋ค(์ฌ์ง์ด ๊ถ์ฅ๋จ).
@mtrofin ๋ง์ต๋๋ค. ๊ณ ๊ธ ์ฉ๋์ ๊ฒฝ์ฐ compile
์
๋๋ค. ํ๋ฌ๊ทธ์ธ ์์ ๋ Memory
๊ฐ ์์ง๋ง _์ปดํ์ผ_ ํ๊ณ _๊ทธ๋ฆฌ๊ณ _ ํ์ง๋ง ์ธ์คํด์คํ(์์ง)๋ ์ํ์ง ์๋ ์ ํจํ ๊ฒฝ์ฐ๋ผ๊ณ ์๊ฐํฉ๋๋ค.
@pizlonator Btw, "ํ๋ก์ธ์ค๋น 1000๊ฐ ์ด์์ 4GB ๋งต์ด ์๋ ๊ฒฝ์ฐ ๋์ง๊ธฐ" ํดํน์ด ASLR/๋ณด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ์ ์ถฉ๋ถํ๋ค๊ณ ๊ฐ์ ํ๊ณ ์ด์ ์ ๋ฌป๊ณ ์ถ์์ต๋๋ค. ๊ฐ์ ์ฃผ์ ํ ๋น๋ ์ ํ? ์์๋ค๋ฉด ๊ณ ๊ธ ์ฌ์ฉ์๋ฅผ ์ํ ์ฑ๋ฅ ๊ณ ๋ ค ์ฌํญ๋ ์๋์๋ค๋ฉด ํ์คํ ์ข์์ ๊ฒ์
๋๋ค. (๋ฌผ๋ก instantiate
API๋ ์ฐ๋ฆฌ๊ฐ ์ธ๊ธํ ๋ค๋ฅธ ์ด์ ๋ก ์ถ๊ฐํ๋ ๋ฐ ์ ์ฉํด ๋ณด์
๋๋ค.)
๋ํ 2์ ๊ฑฐ๋ญ์ ๊ณฑ์ ์คํ ์์ญ์ ๋ํ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ์ ์ด์ ์ ์ป์ ์ ์๋ ์์ฉ ํ๋ก๊ทธ๋จ์ด ์์ต๋๋ค. ์ฌ๊ธฐ์ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ด๋ฏธ ํฌ์ธํฐ๋ฅผ ๋ง์คํฌํ์ฌ ํ๊น ์ ์ ๊ฑฐํ๋ฏ๋ก ๊ฒฝ๊ณ ๊ฒ์ฌ๋ฅผ ํผํ๊ธฐ ์ํด ์์ ๋นํธ๋ฅผ ๋ง์คํนํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ง์คํน์ ์ฌ์ฉ๋๋ ์ ์ญ ์์๋ฅผ ์์ ํ๊ฑฐ๋ wasm์ผ๋ก ์์ถ์ ํธ๋ ๋์ ์ ์ ํ ์์๋ฅผ ๋ฒ ์ดํนํ์ฌ ์ปดํ์ผ ์ ์ ๋ฐ์ ์ ์๋ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ํฌ๊ธฐ์ ๋ํด ์ถ๋ก ํด์ผ ํฉ๋๋ค.
๋ํ ์ผ๋ถ ๋ฐํ์์์ ํ์ฉํ๊ธฐ๋ฅผ ์ํ๋ 0์์ ๋ฒํผ ์ต์ ํ๊ฐ ์์ผ๋ฉฐ ํ๋ก์ธ์ค๋น ํ๋์ ๋ฒํผ๋ง ์์ ๊ฒ์ ๋๋ค.
๋ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ปดํ์ผํ๊ธฐ ์ ์ ํ์ํ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ์ ๋ํด ์ถ๋ก ํ ์ ์๋ค๋ฉด ํ๋ซํผ์ ๋ณด๋ค ์ฌ์ฉ์ ์นํ์ ์ผ๋ก ๋ง๋ค ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ธ๋ผ์ฐ์ ๋ ์ฑ์ด ์ฌ์ฉ์์๊ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๊ฑฐ๋ ์ฑ๋ฅ ์ ํ ์์ด ์คํํ๋ ค๋ฉด ์ผ๋ถ ํญ์ ๋ซ์์ผ ํจ์ ์๋ฆด ์ ์์ต๋๋ค.
์น ๋ธ๋ผ์ฐ์ ๋ ์ฌ์ฉ์๋ฅผ ์ํ ์ต์ ์ธ ์ ์ฉ ์ฑ ๋ชจ๋๋ฅผ ์ํ ์ ์์ต๋๋ค. ์ด ๋ชจ๋์์๋ ์ ํ๋ ์ฅ์น์์ ์คํ๋๊ณ ํ๋์ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ ๋๋ก ์คํํ๊ธฐ ์ํด ์ป์ ์ ์๋ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ์ ์ฑ๋ฅ์ด ํ์ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ์ํด์๋ ์๊ตฌ ์ฌํญ์ ๋ํด ์กฐ๊ธฐ์ ์ถ๋ก ํ ์ ์์ด์ผ ํฉ๋๋ค.
๋ฉ๋ชจ๋ฆฌ๋ ์ปดํ์ผ ์ ์ ํ ๋นํ ํ์๊ฐ ์์ผ๋ฉฐ ํฉ๋ฆฌ์ ์ผ๋ก ์์ฝํด์ผ ํฉ๋๋ค. ์ ํ๋ ์ฅ์น์์ ์ปดํ์ผ๋ง์ผ๋ก๋ ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก ํฐ VM ํ ๋น๋ ์ผ ์คํ ํผ๊ฐ ๋ ์ ์์ต๋๋ค.
์ด๊ฒ์ ์๋ก์ด ๋ฌธ์ ๊ฐ ์๋๋ฉฐ ์๋ ๋์ ๋ ผ์๋์ด ์์ต๋๋ค. ๋ฉ๋ชจ๋ฆฌ ์์ ๊ด๋ฆฌ๊ฐ ํ์ํ๋ฉฐ ์ฝ๋ ์์ฑ๊ณผ ํจ๊ป ์กฐ์ ๋์ด์ผ ํฉ๋๋ค.
@lukewagner ๋ด ์๊ฐ์ ๊ทธ๋ ๊ฒ ์๊ฐํฉ๋๋ค. ์๋ํ๋ฉด ์ฐ๋ฆฌ๊ฐ 1000๊ฐ์ ๋ชจ๋๋ก ์ ํํ๋ค๋ฉด ํ์ฉ ์ค์ฐจ๊ฐ ์ถฉ๋ถํ ํฌ์ง ์์๊น ๊ฑฑ์ ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ฐ์ ๋ API๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ ์์ ์ธ์์ ์ธ ์ํ์ ์ด ํ์ํ๊ฑฐ๋ ์ฌ์ปดํ์ผํด์ผ ํ๋ ํ์ ๋๋ ๊ธฐํ ๋ฐ๋์งํ์ง ์์ ์ผ์ ์ ๊ฑฐํ ์ ์๋ค๋ ์ ์ด ๋ง์์ ๋ญ๋๋ค. ๋๋ ํ์ฉ ์ค์ฐจ๊ฐ ๋งค์ฐ ํฌ์ง ์๋ ํ ์ธ๊ณต ์ฒ์ฅ์ ์ข์ํ์ง ์์ผ๋ฉฐ ์ฌ๊ธฐ์์๋ ๊ทธ๋ ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
@pizlonator ์ถฉ๋ถํ ๊ณต์ ํ๊ณ ๋ ๊นจ๋ํ๊ณ ๊ฐ๋จํ API์ด๋ฏ๋ก ์ถ๊ฐํ๋ ๊ฒ์ด ์ข๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ทํ๊ฐ ์ธ๊ธํ ํญ๋ชฉ์ ๋ํด ๊ด์ฌ์ด ์๋ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค(ํ์ฌ).
Memory
s๋ฅผ ํ์ ๋ ๊ฒ์ ๋ ๊ณต๊ฒฉ์ ์ธ GC๋ก ์ด์ด์ง๋๋ค. ๋ ๋ง์ GC๋ ์ข์ง ์์ง๋ง ์ด๊ฒ์ด ์ผ๋ฐ์ ์ธ ํจํด์ธ์ง ํ์ ํ ์ ์์ต๋๋ค.๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๊ฐ ๋ฏธ๋์ ๋ฌด์์ ๋ณด๊ฒ ๋ ์ง ๋๊ฐ ์ ์ ์์ต๋๊น? ๋ฐ๋ผ์ ์ง๊ธ ๋ด์ฅ๋ ์ ์ฐ์ฑ์ ๊ฐ๋ ๊ฒ์ด ์ ์ฉํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
js API(ํนํ ์ํคํ ์ฒ/ํ๋ซํผ๋ณ ์ธ๋ถ์ฌํญ)์์ ๋๋ฌด ๋ง์ ๊ตฌํ ์ธ๋ถ์ฌํญ์ ํ๋ฉดํํ๋ ค๊ณ ํ๋ ๊ฒ์ ๋์ ์๊ฐ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋น ๋ฅธ ๋ฉ๋ชจ๋ฆฌ์ ๋ํ ์์ฒด ๋ด๋ถ ์ ํ์ ๊ตฌํํ๋ ๊ฒ์ผ๋ก ์ถฉ๋ถํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋น๋๊ธฐ ์ธ์คํด์คํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ผ๋ก ๋ณด์ด์ง๋ง ์ปดํ์ผ๋ฌ ํํธ๋ฅผ ์ ๊ณตํ๋ ๋ฐ ์ฌ์ฉํ๋ ค๋ฉด ๋ค๋ฅธ ๊ฒ์ ์ฌ์ฉํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ฑ๊ธํค ์ต์ ํ, ๋ง์ ์ธ์คํด์ค ์ต์ ํ, ๋ก๋ ์๊ฐ ์ต์ ํ, ์์ธก ๊ฐ๋ฅํ ์ฑ๋ฅ ์ต์ ํ ๋ฑ์ ์์ฒญํ๋ ํ๋๊ทธ ์น์ ์ ๊ฐ๋๋ก ๋ชจ๋์ ํ์ฅํ ์ ์์ต๋๋ค. ๋ฌผ๋ก (์๋ ๊ฒฝ์ฐ) ์์ง์ด ํ๋ ์ผ์ ์ ์ ์ผ๋ก ๊ตฌํ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. ๊ทธ๋ฌ๋ ๊ฐ๋ฐ์์๊ฒ ๋ฐฉํฅ์ ๋๋ฆด ์ ์๋ ์์ก์ด๋ฅผ ์ ๊ณตํ๊ณ ๊ฒฝ์์ ๋ธ๋ผ์ฐ์ ๊ณต๊ธ์ ์ฒด๋ฅผ ์ ์งํ๊ฒ ์ ์งํฉ๋๋ค.
2016๋
10์ 28์ผ ๊ธ์์ผ ์ค์ 2์ 15๋ถ, JF Bastien [email protected]
์ผ๋ค:
์, ๋ฉ๋ชจ๋ฆฌ๋ฅผ
ํธ์ง.๋๋ ๊ทธ๊ฒ์ด ์คํ๋ ค ๋ฐ๋์ ์ฐฌ์ฑํ์ฌ ๋๋ดํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค
๋ฉ๋ชจ๋ฆฌ ๊ฐ์ ธ์ค๊ธฐ/๋ด๋ณด๋ด๊ธฐ. ๊ฒฐ๊ตญ ๋ชจ๋์ ๊ฐ์ ธ์ค์ง ์์ผ๋ฉด
๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ด๋ณด๋ด๊ฑฐ๋ ์ปดํ์ผํ ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์ฝํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ ์์
์ผ๋ถ๋ ๋ณต์กํ ๋ชจ๋์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๊ธฐ๋ฅผ ์ํฉ๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ ํ๊ณ ์ถ์ดํ์ง๋ง ๋ชจ๋๋ฆฌ์ WASM ์ฑ์
์ฐ๋ฆฌ๊ฐ ์์ํ๋ ๊ฒ๋ณด๋ค ๋ ์ผ๋ฐ์ ์ ๋๋ค. ๋ด๊ฐ ์ฌ๊ธฐ ์์์ผ ์๋ ์์ง๋ง
๋์ ๋ฐ์ธ๋ฉ์ด ์ ์ ๋ชจ๋์ ๋ ์ ๊ฒ ๋ณด๊ณ ์ถ์ต๋๋ค.
โ
๋น์ ์ด ๋๊ธ์ ๋ฌ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธ
https://github.com/WebAssembly/design/issues/838#issuecomment -256805006,
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/ALnq1KXrUWaegRZwEhznmT1YcyI33IN9ks5q4T6TgaJpZM4Kh1gM
.
์ ์ ์ผ๋ก ๋์ํฉ๋๋ค. ๋ชจ๋๋ฆฌ์ ์ฑ์ด ์ต์ํ mvp ์ดํ ๋ช ๋ ๋์์ ์ฃผ์ ์ฌ์ฉ ์ฌ๋ก๊ฐ ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์๋ง ๊ฐ์ ๋ชจ๋์ด ๋ก๋๋์์ ๋ ๋ฌด์จ ์ผ์ด ์ผ์ด๋ ์ง ๊ฑฑ์ ํ๋ ๊ฒ์ ์์ง ์กด์ฌํ์ง ์๋ wasm ์ํ๊ณ์ ๋ํด ๋ง์ ๊ฒ์ ๊ฐ์ ํ๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ํด์ผ ํ ์ผ์ ๋ฌด์์
๋๊น? ํ ๊ฐ์ง๋ ๋ด๊ฐ ํ ์ ์๋ http://webassembly.org/getting-started/js-api ๋ฅผ ์
๋ฐ์ดํธํ๋ ๊ฒ์
๋๋ค. ๋ ๋ค๋ฅธ ๊ฒ์ binaryen์ด ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๊ฒ์ ๋ฐฉ์ถํ๋ ๊ฒ์
๋๋ค(์ข์ @kripken?). @titzer Canary๋ WebAssembly.instantiate
๊ตฌํํฉ๋๊น?
๋ค๋ฅธ ๊ฑด ์๋์?
@lukewagner : ๋น์ ์ด ๋ฌด์์ ๋ฌป๊ณ ์๋์ง ํ์คํ์ง ์์ต๋๋ค. ์ด ๋ฌธ์ ์ ๋ํ ๋ ผ์๋ ๋งค์ฐ ๊น๋๋ค. ์ฌ๊ธฐ์ ์ ์๋ ์๋ก์ด ์ฝ์ ๊ธฐ๋ฐ API ์ค ํ๋๋ฅผ ์ฌ์ฉํ๋ ๋ฐ ์ฌ์ฉํ๋ ํ์ฌ ๋๊ธฐํ WebAssembly.Instance API์์ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋ณ๊ฒฝํ์๊ฒ ์ต๋๊น? ๊ทธ๊ฒ์ด ํ์ํฉ๋๊น? ์ฐ๋ฆฌ๋ ์ด์ ๋ฐฉ์์ ์ ๊ฑฐํ๊ณ ์์ต๋๊น?
@kripken ๋ง์ต๋๋ค. WebAssembly.instantiate
์ฌ์ฉ์ผ๋ก ์ ํํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ด์ ๋ฐฉ๋ฒ์ ์ ๊ฑฐํ์ง ์์ง๋ง ์ ๋ฐฉ๋ฒ์ด ๋ ํจ์จ์ ์ด๋ฉฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
HTML์ ์์ฑํ ๋ promise ๊ธฐ๋ฐ API๋ฅผ ์ฌ์ฉํ ์ ์์ง๋ง ๋ง์ ์ฌ์ฉ์๊ฐ JS๋ฅผ ์์ฑํ๊ณ ์๋์ผ๋ก ๋น๋๊ธฐ ๋จ๊ณ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ์ฝ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ฌ๋๋ค์ ์ํด ์ด๊ฒ์ ๋ฌธ์ํํ ์ ์์ต๋๋ค. ํ์ง๋ง ๋ชจ๋ ๋ธ๋ผ์ฐ์ ์ ์ด ๊ธฐ๋ฅ์ด ํ์ฌ๋ ํ์๋ง ์ด ๋ชจ๋ ์์ ์ ์ํํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
@kripken ๋ด๊ฐ ์ดํดํ๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ํ์ฌ ์ ๊ทผ ๋ฐฉ์์ ๋น๋๊ธฐ API๋ฅผ ์ ํ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ ๋๊น?
์ . ๋น๋๊ธฐ ํญ๋ชฉ์ ์ถ๊ฐํ๋ ค๋ฉด ์ด ๋ฌธ์ ๋ฅผ ์ฐธ์กฐํ์ธ์.
@kripken ๋
ธ๋์๋ ์๋ํ๋ ์ฝ์์ด ์์ ๊ฒ์
๋๋ค. ์
ธ์๋ ์ฝ์ ๋๊ธฐ์ด์ ๋ช
์์ ์ผ๋ก ๋น์ฐ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค(๋ฐ๋ผ์ ๋ชจ๋ ํด๊ฒฐ์ ๋๊ธฐ์ ์ผ๋ก ์คํ). SM์์๋ drainJobQueue()
์ด๊ณ V8์์๋ %RunMicroTasks()
๋ผ๊ณ ๋ค์์ต๋๋ค. ๋จ์ํ test WebAssembly.instantiate
๊ธฐ๋ฅ์ ์ ๊ณตํ๊ณ ๊ธฐ๋ณธ์ ์ผ๋ก ์กด์ฌํ ๋ ์ฌ์ฉํ ์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ฌผ๋ก , ํ์ง๋ง ๋จผ์ Promise ์ง์์ ์ต์ node.js์ ์์ ์ ์์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๋ฒ์ ์๋ ์์ต๋๋ค(์: Linux ๋ฐฐํฌํ์ ๊ธฐ๋ณธ ๋ฒ์ ). ๋ ๋ฒ์งธ๋ก ๋ ํฐ ๋ฌธ์ ๋ HTML์ ๋ด๋ณด๋ผ ๋ ํ์ด์ง๊ฐ ๋ก๋๋๋ ๋ฐฉ์์ ์ ์ดํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค(emcc๊ฐ ์ฌ์ฉ์๋ฅผ ์ํด ๋ก๋ ์ฝ๋๋ฅผ ๋ด๋ณด๋). ๋ฐ๋ฉด JS๋ฅผ ๋ด๋ณด๋ผ ๋๋ JS๊ฐ ์ ํ์ผ๋ก ์คํ๋๋ ๊ฒ์ผ๋ก ๊ฐ์ ํ๊ณ ์ฌ์ฉ์๋ ์๋ฅผ ๋ค์ด ํด๋น JS ๋ฐ๋ก ๋ค์ ๋ค๋ฅธ ์คํฌ๋ฆฝํธ ํ๊ทธ๊ฐ ์์ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ์ฌ์ฉ์๋ ์์ ์ ๋ก๋ฉ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค.
์ด ๋ ๊ฐ์ง์ ๊ฒฐ๊ณผ๋ก ์์ ์ธ๊ธํ ๊ฒ์ฒ๋ผ HTML์ ๋ด๋ณด๋ผ ๋ Promise API๋ฅผ ์ฌ์ฉํ ์ ์์ง๋ง(๊ทธ๋ฌ๋ฉด ๋ถ๋ช ํ ์ ธ์ ์์ง ์๊ณ ๋ก๋๋ฅผ ์ ์ดํ ์ ์์) JS๋ฅผ ๋ด๋ณด๋ผ ๋๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๊ณณ์์ ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ๋ฌธ์ํํ ์ ์์ ๋ฟ์ ๋๋ค.
Node์ WebAssembly๋ฅผ ์ง์ํ์ง๋ง Promise๋ ์ง์ํ์ง ์๋ ๋ฒ์ ์ด ์์ต๋๊น? ๋ ธ๋ ์ฌ๋๋ค์ ์ด๋ฌํ ๋ฒ์ ์ ๊ด์ฌ์ด ์์ต๋๊น?
๋๋ ์ง์ JS๋ฅผ ์ดํดํ์ง ๋ชปํ๋ค. ํญ์ Promise๋ฅผ ๋ฐํํ๋ฉด Just Work(์ฝ๋ ์ฌ์ฉ์๋ Promise๋ฅผ ์ฌ์ฉํด์ผ ํจ)๊ฐ ๋์ง ์์ต๋๊น?
์ฒซ ๋ฒ์งธ ์ง๋ฌธ์ ๋ํ ๋ต์ ๋ชจ๋ฅด์ง๋ง polyfill์ ์ฌ์ฉํ๋ฉด ์ฝ์์ด ์๋ ๋ ธ๋ ๋ฒ์ ์์ wasm์ ์คํํ ์ ์์ต๋๋ค. ๋ ธ๋๊ฐ ์ ์ ๋์ setTimeout ๋ฒ์ ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ์ฝ์์ ํด๋ฆฌํํ๋ ๊ฒ์ด ๊ฐ๋ฅํ ์๋ ์์ง๋ง, ๊ทธ๊ฒ๋ ํ์คํ์ง ์์ต๋๋ค.
์ง์ ๋ฌธ์ ์ ๋ณด: emcc๋ ๋ฐํ์์ ์ค์ ํ๊ณ ์ปดํ์ผ๋ ์ฝ๋์ ์ฐ๊ฒฐํ๋ JS๋ฅผ ๋ฐฉ์ถํฉ๋๋ค. ์คํฌ๋ฆฝํธ ํ๊ทธ์ ์ผ๋ถ JS๋ ์ปดํ์ผ๋ ์ฝ๋๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค(์: ccall ์ฌ์ฉ). ์ฆ, emcc์ JS ์ถ๋ ฅ์ ์ฝ์์ด ์๋๋ฏ๋ก "์ฝ์ ๋ฐํ"์ด ๋ฌด์์ ์๋ฏธํ๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋๊ฐ ๋ฐํํ๊ณ ๋๊ฐ ๋ฐ์๊น์? ๊ทธ๋ฌ๋ ์ด๋ค ๊ฒฝ์ฐ๋ ์์ ์ธ๊ธํ๋ฏ์ด ๊ถ์ฅ๋๋ ๊ฒฝ๋ก๋ emcc๊ฐ HTML์ ๋ด๋ณด๋ด๋ ๊ฒ์ ๋๋ค. ์ด ๊ฒฝ์ฐ ๋น๋๊ธฐ ๋ก๋ฉ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ์ผ๋ถ ์ฌ์ฉ์๋ ๋ก๋๋ฅผ ๋ณด๋ค ์ง์ ์ ์ผ๋ก ์ ์ดํ๋ โโ๊ฒ์ ์ ํธํฉ๋๋ค. ๋ ๋์ ๊ฒฝ์ฐ ๋น๋๊ธฐ wasm์ ์ฌ์ฉํ๋๋ก ๊ถ์ฅํด์ผ ํฉ๋๋ค.
WebAssembly๊ฐ ์์ง๋ง Promise๊ฐ ์๋ IMO Node๋ ์ฐ๋ฆฌ๊ฐ ๊ฑฑ์ ํด์ผ ํ๋ ์ค๊ณ ์ ์ฝ ์กฐ๊ฑด์ด ์๋๋๋ค. WebAssembly์ ๋ํ ํด๋ฆฌํ์ ๊ทธ๋ฐ ๋งฅ๋ฝ์์ ๊ฝค ์ด๋ฆฌ์์ ์ผ์ ๋๋ค.
์ค๋ ์ฝ๋๊ฐ ๋ฌด์์ ํ๋์ง ์ค๋ช ํ๊ณ ์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ ์์ ํ ์ดํดํ์ง ๋ชปํ์ง๋ง ๋ฐฑ์ ํ๊ณ ์ถ์ต๋๋ค. ์น ํ์ด์ง์ ์ฝ๋๊ฐ Promise API๋ฅผ ์ฌ์ฉํ๊ธฐ๋ฅผ ์ํฉ๋๋ค. Emscripten์ ์ด๋ฌํ ์ฝ๋์ ์ ์์์ ๋๋ค. ์ฝ์์ ์ฌ์ฉํ๋ ์ฝ๋๋ฅผ ๋ด๋ณด๋ด๋ ๊ฒ์ ์ฐจ๋จํ๋ ๊ฒ์ด ๋ฌด์์ธ์ง ์ดํดํ์ง ๋ชปํฉ๋๋ค. "์ค๋์ ๊ทธ๋ ์ง ์๊ธฐ ๋๋ฌธ์ ์๋ฏธ ์๋ ์์ ์ด์ง๋ง ์ฐ๋ฆฌ๊ฐ ํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค"๋ผ๊ณ ๋งํด๋ ๊ด์ฐฎ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ ํ ๋ก ์์ ๊ทธ๊ฒ์ด ๋น์ ์ด ๋งํ๋ ๊ฒ์ธ์ง ํ์คํ์ง ์์ต๋๋ค.
์บ์ฑ์ ์ํด ๋น๋๊ธฐ API๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ํด์๋ง ์ง์ ํ ๋ฌธ์ ์ ๋๊น? ๊ทธ๊ฒ์ด ์์์ด๋ผ๊ณ ์๊ฐํ์ง๋ง ๋ด๊ฐ ๋๋ฌํ๊ณ ์ถ์ ์ต์ข ์ํ๋ ์ฒซ ๋ฒ์งธ ๋ก๋์์๋ ๋น๋๊ธฐ API๊ฐ ์ฌ์ฉ๋๋ ๊ณณ์ ๋๋ค.
๋ ธ๋์์ ํด๋ฆฌํ์ด ์ด๋ฆฌ์์ ์ด์ ๋ ๋ฌด์์ ๋๊น? ๋ค๋ฅธ ๊ฒฝ์ฐ๋ณด๋ค ์ ๋๋ผ๋ ๊ทธ ๋งฅ๋ฝ์์ ์ฌ์ ํ ์ ์ฉํด ๋ณด์ ๋๋ค. :)
๋ค์: Emscripten ์ HTML์ ๋ด๋ณด๋ผ ๋ promise API
๊ทธ๊ฒ์ด ๋น์ ์ ์ฐ๋ ค ์ฌํญ์ ํด๊ฒฐํฉ๋๊น?
๋ด๊ฐ ๋งํ๊ณ ์ ํ๋ ๊ฒ์ Emscripten์ด JS(๋ ๊ถ์ฅ๋๋ ๊ฒฝ๋ก)๋ฅผ ๋ฐฉ์ถํ ๋ ํด๋น ์ถ๋ ฅ์ ๋ํ ๋ณด์ฅ์ด ๋ด๋ถ์ ์ผ๋ก ๋น๋๊ธฐ ๋ง์ ์ ์ํํ๋ ์ฝ๋์ ์ผ์นํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ ์ํ์ง ์๋ ์ฌ๋๋ค์ ์ฝ๋๋ฅผ ๊นจ๋จ๋ฆด ๊ฒ์ ๋๋ค. ๋ด๊ฐ ๋งํ๋ฏ์ด ๋๊ตฐ๊ฐ๋ ์ค๋น๊ฐ ๋์๋ค๊ณ ๊ฐ์ ํ๋ JS ์งํ์ ๋๊ธฐ์ ์ผ๋ก ์คํ๋๋ JS๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ด ๊ฒฝ์ฐ์๋ ์ฝ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ์์ํด๋ณด์ญ์์ค.
````
````
doSomething
Module.my_func
์ด ์กด์ฌํ๋ ค๋ฉด output.js
๋ฐฉ๊ธ ์ฝ์์ ๋ฐํํ๋ค๋ฉด ์์ง ์กด์ฌํ์ง ์๋ ๊ฒ์
๋๋ค. ๋ฐ๋ผ์ ์ด๊ฒ์ ํ๊ธฐ์ ์ธ ๋ณ๊ฒฝ์ด ๋ ๊ฒ์
๋๋ค.
๊ทธ๊ฒ ์ง๊ธ ๋ง์ด ๋ฉ๋๊น?
๋ ธ๋์์ ํด๋ฆฌํ์ด ์ด๋ฆฌ์์ ์ด์ ๋ ๋ฌด์์ ๋๊น? ๋ค๋ฅธ ๊ฒฝ์ฐ๋ณด๋ค ์ ๋๋ผ๋ ๊ทธ ๋งฅ๋ฝ์์ ์ฌ์ ํ ์ ์ฉํด ๋ณด์ ๋๋ค. :)
wasm์ ๋ํ ํด๋ฆฌํ์ ์ด๋ฆฌ์์ ์ผ์ด ์๋๋๋ค. wasm์ด ์๊ณ ํด๋ฆฌํํ๊ณ ์ฝ์์ ์์ง๋ง ํด๋ฆฌํํ์ง ์๋ ๋ ธ๋ ์ค์น์ ์ผ์ดํฐ๋ง์ ์ ๊ณตํ๋ ๊ฒ์ ์ด๋ฆฌ์์ ์ผ์ ๋๋ค. ๋ฐ๋ง์ ๋๋ค. ๊ทธ๋ค์ ์๋ฉ์ด์ ๋๋จธ์ง ์ ๋ฐ์ ๊ฐ์ ธ์์ผํฉ๋๋ค ๐
๋ค์: Emscripten์ HTML์ ๋ด๋ณด๋ผ ๋ promise API๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ด ๊ถ์ฅ๋๋ ๊ฒฝ๋ก์ ๋๋ค. ๋ฐ๋ผ์ ๊ทํ์ ์ง๋ฌธ์ ๋ํ ๋๋ต์ "์"์ ๋๋ค. ์๋ฏธ ์๋ ์์ ์ ์๋๋๋ค. ์บ์ฑ์ ์ค์ ์ ๋ ํด๋น ๋ฌธ์ ์ ์ค์ผ์น๋์ด ์์ง๋ง (์ด์ ) ์คํ๋ผ์ธ ํ ๋ก ์์ ๋ฉ๋ชจ๋ฅผ ์ถ๊ฐํ์ต๋๋ค. ๊ทธ๋ ๊ฒ ํ๋ ๋์ ์ฐ๋ฆฌ๊ฐ ํ ์ ์๊ณ ์ฌ์ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๊ฑฐ๊ธฐ์์ ๋ค๋ฅธ ๋น๋๊ธฐ ์ต์ ํ๋ ๋ง์ด ์ํํด์ผ ํฉ๋๋ค.
๊ทธ๊ฒ์ด ๋น์ ์ ์ฐ๋ ค ์ฌํญ์ ํด๊ฒฐํฉ๋๊น?
๊ทธ๋ ๊ด์ฐฎ๋ค! ๋๋ถ๋ถ์ ์น ํ์ด์ง๊ฐ promise API๋ฅผ ์ฌ์ฉํ๋ ํ ์ ๋ ๋ง์กฑํฉ๋๋ค.
[ํ์กฐ๊ฐ]
๊ทธ๊ฒ ์ง๊ธ ๋ง์ด ๋ฉ๋๊น?
์. ์ค๋ช ํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
๋ด ๊ด์ ์์ ๋ณผ ๋ Emscripten์ ๋ ์ด์ JS๋ฅผ ๋ด๋ณด๋ด๋ ์ฌ์ ์ด ์๋๋๋ค! ๊ทํ์ ์๋ Ye Olden Codes์ ์ ํฉํ์ง๋ง ์๋ก์ด ๊ฒ์ ์ฝ์ IMO๋ฅผ ๊ฐ์ ํด์ผ ํฉ๋๋ค.
Btw, instantiate
๋ฅผ ์ฌ์ฉํ๋๋ก webassembly.org/demo๋ฅผ ์ ํํ๋ ๊ฒ์ ๋ณด์๊ณ ํ์ฌ ๋๊ธฐ new Instance
๊ฐ ๋๊ธฐ ๊ฒฐ๊ณผ๋ฅผ ์ํ๋ ์ปจํ
์คํธ์์ ๋ฐ์ํ๋ ๊ฒ์ ์ฝ๊ฐ ๊น๋ค๋กญ์ต๋๋ค. ๋ฐ๋ผ์ ๊ธฐ๋ณธ์ ์ผ๋ก instantiate
๋ฅผ ๋ฐฉ์ถํ๋๋ก Binaryen์ด ์
๋ฐ์ดํธ๋๋ฉด AngryBots ๋ฐ๋ชจ๋ฅผ ์ฒ์๋ถํฐ ๋ค์ ๋น๋ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์, ํ์ง๋ง ์ฒ์๋ถํฐ ๋ค์ ๋น๋ํ๋ ๊ฒ๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ ์ ์์ต๋๋ค. Unity๋ ์์ฒด ๋ก๋ฉ ๋ฐ HTML ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ฐ๋ผ์ ์์ ์ธ๊ธํ ๋๋ก ์ด ๋ฌธ์ ๋ฅผ ๋ฌธ์ํํ๊ณ ์ ๋ฌํ์ฌ ํ์ํ ์์ ์ ์ํํ ์ ์๋๋ก ํด์ผ ํฉ๋๋ค(๋๋ emcc์์ html์ ๋ด๋ณด๋ด๋๋ก ํ ์ ์์ง๋ง ์ด๊ฒ์ด ๊ฐ๋ฅํ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค).
์, ํ์ง๋ง ์ฒ์๋ถํฐ ๋ค์ ๋น๋ํ๋ ๊ฒ๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ ์ ์์ต๋๋ค. Unity๋ ์์ฒด ๋ก๋ฉ ๋ฐ HTML ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ฐ๋ผ์ ์์ ์ธ๊ธํ ๋๋ก ์ด ๋ฌธ์ ๋ฅผ ๋ฌธ์ํํ๊ณ ์ ๋ฌํ์ฌ ํ์ํ ์์ ์ ์ํํ ์ ์๋๋ก ํด์ผ ํฉ๋๋ค(๋๋ emcc์์ html์ ๋ด๋ณด๋ด๋๋ก ํ ์ ์์ง๋ง ์ด๊ฒ์ด ๊ฐ๋ฅํ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค).
WebAssembly.instantiate
API๋ฅผ ์ฌ์ฉ ํ์ง ์์ ๋์ ์ ์ฌ์ ์ธ ๋จ์ ์ ๊ฐ์ํ ๋ ์ฌ์ฉ์ ๊ณ ๋ คํ๋๋ก ์์ฒญํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ด๋ฌํ ๋จ์ ์ด ๋ฌธ์ํ๋์ด ์์ต๋๊น? ๋ฉ์ธ wasm ์น์ฌ์ดํธ๋ emscripten wasm ์ํค ํ์ด์ง ์์ ์ด์ ๋ํ ๋ช ํํ ์ง์นจ์ด
๋๋์ด ๊ธด ๋ฌธ์ ๋ฅผ ์ง์ ํ์ด ๋ณด์๊ณ ์์ง ๋จ์ ์ด ๋ช ํํ์ง ์์ผ๋ฏ๋ก ๊ทธ๊ฒ๋ ์ฝ๊ณ ์ถ์ต๋๋ค. :)
@kripken ํ์ฌ ์ฝ๋์ ๋ฌธ์ ๋ ๋ด๋ณด๋ด๊ธฐ๊ฐ ๋๊ธฐ์ ์ผ๋ก ํ์ํจ๊ณผ ๋์์ binaryen/emscripten์ด ํ์ํ ๊ฐ์ ธ์ค๊ธฐ( instantiate
์ ๋ํ ์ธ์๋ก ํ์)๋ง ์ ๊ณตํ๋ค๋ ๊ฒ์
๋๋ค. ๊ฐ์ ธ์ค๊ธฐ๋ฅผ "์์" ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ ๋น๋๊ธฐ XHR์ ๊ผฌ๋ฆฌ ๋ถ๋ถ์ WebAssembly.instantiate
๋ฅผ ๋ถ์ฐฉํ๋ ๊ฒ์ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค(ํ์ฌ ๋ฐ๋ชจ์์ async compile
์ํํ ๊ฒ์ฒ๋ผ ๋ณธ ๋ฐ์ ๋ฐ๋ฅด๋ฉด ํ์ฌ AngryBots wasm ๋น๋๋ ์ฐจ์ ์ฑ
์ด๋ฉฐ ์ด์จ๋ ์๋ก์์ ธ์ผ ํฉ๋๋ค.
์ค, ๋๋ wasm XHR์ด ์์๋๊ธฐ๋ ์ ์ ์์ ํ์ ์ฌ์ฉํ ์ ์๊ฒ ํ๋ ๊ฒ์ด ์ฌ๊ธฐ์ ํต์ฌ์ด๋ผ๋ ๊ฒ์ ์ดํดํ์ง ๋ชปํ์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ํจ์ฌ ๋ ๊น๋ค๋กญ์ต๋๋ค. ๊ทธ๋์ ๋ด๊ฐ ์ ์ ๋งํ ๋๋ถ๋ถ์ ํ๋ ธ๋ค.
๊ฐ์ ธ์ค๊ธฐ๋ฅผ ํ๋ ค๋ฉด ๋ชจ๋ JS ๊ธ๋ฃจ๋ฅผ ๋ค์ด๋ก๋, ๊ตฌ๋ฌธ ๋ถ์ ๋ฐ ์คํํด์ผ ํฉ๋๋ค. wasm XHR์ด ์์๋๊ธฐ ์ ์ ์ด ๋ชจ๋ ์์ ์ ์ํํ๋ฉด ์ง๊ธ๊ณผ๋ ๋งค์ฐ ๋ค๋ฅธ ๋ก๋ฉ ๋ฐฉ์๊ณผ ํธ๋ ์ด๋์คํ๊ฐ ๋ฉ๋๋ค. ํนํ, ์ค์ ๊ท๋ชจ ํ๋ก์ ํธ์ ๊ฒฝ์ฐ ์๋ ํฅ์์ด ์๋ ์๋ ์์ต๋๋ค. ์์ง ์ธก์ ํ์ง ์์๋ค๋ฉด ์ธก์ ํด์ผ ํ ๊ฒ ๊ฐ์ต๋๋ค.
์ด๊ฒ์ Unity๊ฐ ํ ์ ์๋ ๊ฐ๋จํ ์ผ์ด ์๋๋๋ค. ์ปดํ์ผ๋ ์ฝ๋๊ฐ ์ค๋น๋๊ธฐ ์ ์ JS ๊ธ๋ฃจ๊ฐ ์คํ๋ ์ ์๋๋ก emcc๊ฐ ๋ด๋ณด๋ด๋ ์ฝ๋๋ฅผ ํฌ๊ฒ ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค.
์๋ง๋ ์ฐ๋ฆฌ๋ ๋ฐฉ์ถ๋ JS์ ์ ๋ชจ๋ธ, ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ํ ํ๋์ JS ํ์ผ, ๋๋จธ์ง๋ฅผ ์ํ ํ๋์ JS ํ์ผ์ ๊ณ ๋ คํ๊ณ ์ถ์ต๋๊น? ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ์ตํธ์ธ(opt-in)์ด ๋ ๊ฒ์ด๊ณ , ๊ทธ๋์ ์ฐ๋ฆฌ๋ ์๋ฌด๋ ๋ฐฉํดํ์ง ์์ ๊ฒ์ ๋๋ค. ์ด์จ๋ ๋ง์ ๊ณ ๋ ค ์ฌํญ์ด ์์ผ๋ฉฐ ์ธก์ ์์ด๋ ๋ฌด์์ด ์ต์ ์ธ์ง ์ถ์ธกํ๊ธฐ ์ด๋ ต์ต๋๋ค.
@kripken XHR ์ด์ ์ด ์๋๋ผ ์๋ฃ๋ ํ, ๊ทธ๋ฆฌ๊ณ ๋ด๋ณด๋ด๊ธฐ ๊ฐ์ฒด์ ๋๊ธฐ์ ์ก์ธ์ค๋ฅผ ์ํ๋ ์คํฌ๋ฆฝํธ ์คํ์ ์์ํ๊ธฐ ์ผ๋ง ์ ์. ์ธ์คํด์คํ๊ฐ ํด๊ฒฐ๋ ๋ ํธ์ถ๋๋ ์ผ๋ถ ์ฝ๋ฐฑ์ ๋ด๋ณด๋ด๊ธฐ ์ฌ์ฉ ์ฝ๋๋ฅผ ๋ฃ๋ ๊ฒ์ฒ๋ผ ๊ฐ๋จํ ์ ์์ต๋๋ค.
ํ , ์ฃ์กํฉ๋๋ค(ํนํ ๋น๋๊ธฐ๊ฐ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ๊ณผ ์ํธ ์์ฉํ๋ ์ด์ ๋ฅผ ์ดํดํ์ง ๋ชปํฉ๋๋ค. ๊ฐ์ ธ์ค๊ธฐ๊ฐ ๋๊ธฐ์ ์ผ๋ก ์๋ํ์ง ์๋ ์ด์ ์ด ์์๊น์?). ๊ทธ๋ฌ๋ ์์์ ์ธ๊ธํ ๋ฌธ์ ๋ XHR์ด ์๋ฃ๋ ํ์๋ ์ฌ์ ํ ๊ด๋ จ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ฆ, ์ด์ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์์ฑํ๊ณ ๋ด๋ณด๋ด๊ธฐ๋ ์์ ํ๋ ๋จ์ผ ์คํฌ๋ฆฝํธ๊ฐ ์์ต๋๋ค. ์ด๋ฅผ ๋๋๋ฉด ์ ์ถฉ์ ์ด ์๊ธธ ์ ์์ต๋๋ค. ์๊ฐ์ด ์์ ๋ ์ธก์ ํ๋ฉด ๋ฉ๋๋ค.
์ฝ๋ฐฑ์ ๋ด๋ณด๋ด๊ธฐ ์ฌ์ฉ ์ฝ๋๋ฅผ ๋ฃ๋ ๊ฒ๊ณผ ๊ด๋ จํ์ฌ ์ฌํ๊ฒ๋ ์์์ ์ธ๊ธํ ์ด์ ๋ก๋ง ์๋ํ์ง๋ ์์ง๋ง ์๋ก์ด ์ปดํ์ผ ๋ชจ๋๋ฅผ ์ถ๊ฐํ๋ ์ธก์ ์ ์ผ๋ถ๋ก ์กฐ์ฌํ ์ ์์ต๋๋ค.
instantiate
์ ์๋ช
์ WebAssembly.instantiate(bytes, importObj)
์ด๋ฏ๋ก ๋น๋๊ธฐ ์ปดํ์ผ+์ธ์คํด์คํ๋ฅผ ์์ํ๋ ค๋ฉด importObj
๋ฅผ ์ ๋ฌํด์ผ ํฉ๋๋ค.
์คํ๋ผ์ธ์์ @lukewagner ๋ ์ฌ๊ธฐ์ ์ฃผ์ ๋ฌธ์ ๊ฐ ๋ชจ๋์ ์ปดํ์ผํ๋ ๋์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์๋ค๋ ์ ์ ๊น์ ์ธ์์ ๋ฐ์์ต๋๋ค. ์ ๋ฐ์ ์ผ๋ก ์ด ์๋ก์ด API๋ฅผ ์ค์ ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ์ผ๋ง๋ ์ฌ์ด์ง์ ๊ด๋ จ๋ ์ธ ๊ฐ์ง ๋ฌธ์ ๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
ํ์ฌ ํด์ฒด์ธ์ด ์๋ํ๋ ๋ฐฉ์์ ๊ณ ๋ คํ ๋ ์์์ ์ค๋ช ํ ๊ฒ์ฒ๋ผ 2 + 3์ ์ํํ๋ ๊ฒ์ ๊ธฐ์กด ์ฌ์ฉ์๋ฅผ ์์์ํค๊ธฐ ๋๋ฌธ์ ์ด๋ ต์ต๋๋ค. ์ฐ๋ฆฌ๋ ํ ์ ์์ง๋ง ๊ธฐ๋ณธ์ ์ผ๋ก ์ผ๊ธฐ๋ฅผ ์ํ์ง ์์ ์๋ ์์ต๋๋ค. ์ ์ด๋ ์ฒ์์๋ ๊ทธ๋ ์ง ์์ต๋๋ค. ์ปค๋ฎค๋ํฐ ๊ตฌ์ฑ์๊ณผ ์์ํด์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ค์ ๋ก ์ ํ๋ ค๋ฉด - ์๋ก์ด ์ค๋ฒํค๋๊ฐ ์์ต๋๋ค - ์๊ฐ๊ณผ ์์ ์ด ํ์ํฉ๋๋ค(๋น ๋ฅด๊ฒ ํ๋ฉด ์์ ๋๋ ์์ถ์ ๊ฐ์ ๊ณ์ธต์ ์ถ๊ฐํ์ฌ ์ํ).
๊ทธ๋ฌ๋ ์ผ๋ถ ๋ค๋ฅธ ์ต์ ์ ์ฌ์ฉํ๊ธฐ๊ฐ ๋งค์ฐ ์ฝ์ต๋๋ค.
instantiate(bytes, Memory) -> Promise
์ ๊ฐ์ ์ API๊ฐ ํ์ํฉ๋๋ค. ์ด๊ฒ์ด ์ฌ์ฉํ๊ธฐ ์ฌ์ด ์ด์ ๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ด์จ๋ ์ผ์ฐ ์์ฑ๋ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค(๊ฑฐ์ ๋ค๋ฅธ ๊ฐ์ ธ์ค๊ธฐ๋ JS ํจ์์ด๋ฉฐ ์ด๊ธฐ์๋ ๊ฐ์ง ์ ์์).new Instance(bytes, imports)
. ์ฆ, ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ + ๊ฐ์ ธ์ค๊ธฐ์ ๋ํ ๋๊ธฐ ์ปดํ์ผ์
๋๋ค. ์ด๊ฒ์ด ์ฌ์ฉํ๊ธฐ ์ฌ์ด ์ด์ ๋ ํ์ฌ ์ฝ๋๊ฐ instance = new WebAssembly.Instance(new WebAssembly.Module(getBinary()), imports)
ํ๋ฏ๋ก ์ด๋ฅผ 1๊ฐ์ API ํธ์ถ๋ก ์ ์ ๊ฒ์
๋๋ค.๋๋ ๋ง์ง๋ง ์ต์ ์ด ์๋ฏธ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ API์ ๋๊ธฐํ ๋ฒ์ ์ ์ถ๊ฐํ์ฌ ๊ธฐ์กด ๋๊ธฐ์ ์ปดํ์ผ ์ต์ ๊ณผ ๋ ๋์นญ์ ์ผ๋ก ๋ง๋๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ปดํ์ผ ํ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋ ์๋ก์ด ์ต์ ํ๋ฅผ ๋น๋๊ธฐ ์ปดํ์ผ์ ๋ฌถ์ ์ด์ ๊ฐ ๋ณด์ด์ง ์์ต๋๊น? (๋น๋๊ธฐ๋ ํ๋ฅญํ์ง๋ง ๋ณ๋์ ๋ฌธ์ ์ ๋๊น?)
์ปดํ์ผํ๊ธฐ ์ ์ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ํ ๋น ํด์ผ ํ๋ค๋ ์ ์ฝ์ ๊นจ๊ธฐ ์ํด ๊ฐ์ ธ์ค๊ธฐ(๋ฉ๋ชจ๋ฆฌ)๋ฅผ ์ค๋ช
ํ๋ ๋ฉํ ๊ฐ์ฒด๋ฅผ ์ ์ํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด instantiate
๋ฉ์๋๋ ์ ๊ณต๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์์ํ ๊ฒ๊ณผ ์ผ์นํ์ง ์๊ณ ์ฌ์ปดํ์ผ์ด ์ง์ฐ๋์ง ์๋ ๊ฒฝ์ฐ ์ค๋ฅ๋ฅผ ๋์ง ์ ์์ต๋๋ค.
๋ํ ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ์ด ์๋ ์ฅ์น์ ์ ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๊ธฐ ์ ์ ์ปดํ์ผํ ์ ์๊ณ ์ ํ ์ฃผ์ ๊ณต๊ฐ์์ 0์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ํด ์ปดํ์ผ์ ์ต์ ํํ ์ ์๊ณ ๋ณดํธ ์์ญ์ด ์๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ํด ์ต์ ํํ ์ ์๋ ๊ฒ๋ ๋งค์ฐ ์ ์ฉํฉ๋๋ค. 2์ ๊ฑฐ๋ญ์ ๊ณฑ์ ์ ์ถ ์์ญ์ ๋ํ ๊ณ ์ ๋ ์ต๋ ํฌ๊ธฐ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ต์ ํํฉ๋๋ค. ์ด ๋ฉํ ๊ฐ์ฒด๋ ๋ํ ํ์๋ ๋ฉ๋ชจ๋ฆฌ ํน์ฑ์ ์ต์ ํ๋ ์ฝ๋๋ฅผ ๋ฐฉ์ถํ๊ธฐ ์ํด wasm ์ฌ์ฉ์ ๋์ฝ๋/์ฌ์์ฑ๊ธฐ์ ์ํด ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
์ด๊ฒ์ ๋ช ๋ ์ ์ด ํ๋ก์ ํธ๊ฐ ์์๋ ๋ฌด๋ ต์ ํ์์ ๋ฐ๋ผ ์ ์๋ ๊ฒ์ ๋๋ค!
@kripken ๋๊ธฐํ API๊ฐ ๊ธฐ์ ์ ์ผ๋ก ํ์ํ๋ค๊ณ ์๊ฐํ์ง๋ง ํ์คํ ๊ถ์ฅํ์ง ์๋ ๊ฒฝ๋ก์ฌ์ผ ํฉ๋๋ค.
๋๊ธฐ ์ปดํ์ผ/์ธ์คํด์คํ๋ฅผ ๋ช ์์ ์ผ๋ก ๊ธ์งํด์ผ ํ๋ ์ด์ (๋๋ ๊ณผ๊ฑฐ์ ์ฃผ์ฅํ ๊ฒ์ฒ๋ผ ํ์ฉํ์ง ์๋ ๊ฒฝ์ฐ๋ ์์)์ ๋ํ ๋ ๋์ ์๋ฅผ ์ ๊ณตํ๋ ค๋ ์๋์์ต๋๋ค. ๋ฐ๋ผ๊ฑด๋ ์ด๊ฒ์ ํ ๋ก ์ ์ํ ์ถ๊ฐ ์๋ฃ๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ ์ ์ถ์ํ๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ํด ์ด์ผ๊ธฐํด ๋ณด๊ฒ ์ต๋๋ค.
๋ค์์ AngryBots ๋ฐ๋ชจ๋ฅผ ๋น๋๊ธฐ์์ผ๋ก(asm.js๋ฅผ ํตํด) ๋ก๋ํ๋
๋๊ธฐ ์ปดํ์ผ์ ๋์ฐํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๊ณ ์งํ๋ฅ ํ์์ค์ด๋ ์์ฉ ํ๋ก๊ทธ๋จ ๋ก๋ฉ์ ๋ํ ๊ธฐํ ์๊ฐ์ ํ์๋ฅผ ๊นจ๋จ๋ฆฝ๋๋ค.
๋ ธ๋ ฅ์ด ๋ฌด์์ด๋ ์๊ด์์ด Emscripten, Unity ๋ฐ ๊ธฐํ ๋๊ตฌ๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก WebAssembly๋ฅผ ๋ก๋ํ๋ ๋น๋๊ธฐ์์ผ๋ก ๋ด๋ณด๋ด๋๋ก ํจ๊ป ํ๋ ฅํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. cc @jechter @juj ๋ฟ๋ง ์๋๋ผ ๊ฐ๋ฐ์๊ฐ ๋๊ธฐ ๋ก๋ฉ ์ฝ๋๋ฅผ ์์ฑํ๋ ํจ์ ์ ๋น ์ง๋ ๊ฒ์ ์์ฒญ๋๊ฒ ์ด๋ ต๊ฒ ๋ง๋ค์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
WebAssembly.compile
& WebAssembly.instantiate
์ ๋ช
์์ ์ผ๋ก ๊ถ์ฅํ๊ณ new WebAssembly.Module
& new WebAssembly.Instance
๊ถ์ฅํ์ง ์์ต๋๋ค.
WebAssembly์ ๊ฒฝ์ฐ ์ค๋ฅธ์ชฝ์ ์๋ ์งํ๋ฅ ํ์์ค์ด ์ผ๋ง๋ ๋์์ง ์ข ๋ ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๋ค์์ DevTools ์ฑ๋ฅ ํจ๋๋ก ์บก์ฒํ ์ถ์ ์ ๋๋ค.
MacBook Air์์ ์งํ๋ฅ ํ์์ค์ ํ์ํ๋ ๋ฐ 30์ด๊ฐ ๊ฑธ๋ฆฝ๋๋ค.
์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ๋ฉ์ธ ์ค๋ ๋๊ฐ ์์ ํ ์ ๊ฒจ ์์ ๋ wasm ๋ชจ๋์ด ๋ค์ด๋ก๋๋ ํ ~20์ด๋ก ํ๋ํด ๋ณด๊ฒ ์ต๋๋ค.
์ปดํ์ผ์๋ ~20์ด๊ฐ ๊ฑธ๋ฆฌ๊ณ ์ธ์คํด์คํ์๋ ~2์ด๊ฐ ๊ฑธ๋ฆฝ๋๋ค.
์ด ๊ฒฝ์ฐ Unity ๋ก๋๋ ์ง์๋๋ ๊ฒฝ์ฐ ์ด๋ฏธ ๋น๋๊ธฐ WebAssembly.compile
ํธ์ถํ๊ณ ์์ผ๋ฏ๋ก 20๋
๋๋ V8์ด ์ฌ์ ํ ๋ด๋ถ์์ ๋๊ธฐ ์ปดํ์ผ์ ์ํํ๊ธฐ ๋๋ฌธ์
๋๋ค. cc @titzer @flagxor ์ด๊ฒ์ V8์ด ์ ๋ง๋ก ์์ ํด์ผ ํ ๋ถ๋ถ์
๋๋ค.
2์ด ์ธ์คํด์คํ ๋ฒ๋ฒ
๊ฑฐ๋ฆผ์ ๋๊ธฐ new WebAssembly.Instance
ํธ์ถํ๋ Unity ๋ก๋ ์ฝ๋๋ก ์ธํ ๊ฒ์
๋๋ค. ์ด๊ฒ์ด Unity ์ฝ๋์ Emscripten์์ ๋ชจ๋ ์์ ํด์ผ ํ๋ ๋ถ๋ถ์
๋๋ค.
์ด๊ฒ์ ๊ฐ๋ฐ์๊ฐ ๋ฐ์ ์ด์ ์๊ฑฐ๋ ํ์ง ์๋ _๋จ์ํ_ ์ํ์ด ์๋๋ผ๋ ์ ๋ ์ธ๊ธํ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ๊ท ์ ์ธ ์น ํ์ด์ง์๋ ์์ญ ๊ฐ์ ํ์ฌ ์คํฌ๋ฆฝํธ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ์ด๋ฌํ ์คํฌ๋ฆฝํธ๋ ๋ชจ๋ ์ต์์ ๋ฌธ์ ๋ฒ๋ฒ ๊ฑฐ๋ฆผ WebAssembly๋ฅผ ํฌํจํ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.
(์ถ์ ์ ๋ ์์ธํ ์ดํด๋ณด๊ณ ์ถ๋ค๋ฉด https://chromedevtools.github.io/timeline-viewer/?loadTimelineFromURL=https://www.dropbox.com/s/์์ ์ ์ฒด ํ์๋ผ์ธ์ ๋ณผ ์ ์์ต๋๋ค. noqjwql0pq6c1wy/wasm?dl=0)
async๊ฐ ํ๋ฅญํ๋ค๋ ๋ฐ 100% ๋์ํฉ๋๋ค. ํ์ง๋ง ๋ชจ๋์ ์ปดํ์ผํ๋ฉด์ ๋์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ป๋ ์ต์ ํ์ ์ง๊ตํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ async + that ์ต์ ํ๋ฅผ ์ฝ๊ฒ ์ป์ ์ ์๋ค๋ ๊ฒ - ์ฐ๋ฆฌ๋ ๊ทธ ์ฝค๋ณด๋ฅผ ์ป์ ์ ์์ง๋ง ์ฝ๊ฐ์ ์ค๋ฒ ํค๋๋ฅผ ํฌ์ํ๊ฑฐ๋ ์๋ก์ด ํ๋๊ทธ๋ฅผ ๋์ ํ๊ณ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋จ๊ณ์ ์ผ๋ก ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ฐพ์ผ๋ฉด ์๊ฐ์ด ๊ฑธ๋ฆฝ๋๋ค. .
๋ฐ๋ผ์ ๋ฉ๋ชจ๋ฆฌ/์ปดํ์ผ ์ต์ ํ๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ผ์ ธ ์๊ณ ์ต๋ ํจ์จ์ฑ์ ์ํ๋ค๋ฉด ์ด๋ฅผ ๋น๋๊ธฐ์์ผ๋ก ๋ฌถ๋ ๊ฒ๋ ๋ฌธ์ ์ ๋๋ค. ๊ทธ๋ฌ๋ ๊ธด๊ธํ์ง ์๊ฑฐ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ผ์ ธ ์์ง ์์๋ ๊ด์ฐฎ๊ฑฐ๋ ์๋ก์ด ์ค๋ฒํค๋๊ฐ ์์ด๋ ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค.
๊ฐ๋ฐ์๊ฐ wasm์ ์ ํํ๊ธฐ ๋๋ฌธ์ ์๋ก์ด ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ต์์ ๊ตฌ์กฐ๋ฅผ ์ฝ๊ฐ ๋ณ๊ฒฝํ ๊ธฐํ๋ฅผ ์ก๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค(ํ์ํ ๊ฒฝ์ฐ ์ด์ ๋์์ ์ ํํ๋ ๋ฐฉ๋ฒ ํฌํจ). ๋๊ธฐํ๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋๋ค
@kripken ์ , @lukewagner ๋ฐ @s3ththompson ์ด ๊ฐ์ง ๊ฒฐ๋ก ๊ณผ ๋ค๋ฅธ ๊ฒฐ๋ก ์ ๋๋ฌํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๋ํ๋ฉด ๊ฐ์ฅ ์ค์ํ ๋ถ๋ถ์ ๊ธฐ์กด ๊ฐ๋ฐ์์๊ฒ asm.js์์ ์ํํ ์ ํ์ ์ ๊ณตํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ด ์ฌ๋ฐ๋ฅธ์ง?
๋๋ ์ด๊ฒ์ด ํ๋นํ ์ฐ๋ ค๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค. WebAssembly๋ฅผ ์ฌ์ฉํ IMO๊ฐ asm.js๋ณด๋ค ๋ ๋ง์ ๊ฐ๋ฐ์๋ฅผ ๋ถ๋ฌ๋ค์๊ธฐ ๋๋ฌธ์ ๋ ๋ฎ์ ๋ฌด๊ฒ๋ฅผ ๋ก๋๋ค. ์ผ๋ฆฌ ์ด๋ตํฐ๋ฅผ ํ์ฐ๋ ๊ฒ์ ํผํ๊ณ ์ถ์ง๋ง IIUC ๊ธฐ์กด ๊ฐ๋ฐ์๋ ๋งค์ฐ ์ ์ฐ ํ๊ณ ๋น๋๊ธฐ ์ปดํ์ผ์
๊ทธ๋ค์ด ๋น๋๊ธฐ ์ปดํ์ผ์ ์ํ๊ณ ์ด๋ฅผ ์ป๊ธฐ ์ํด ์ผ๋ถ๋ฅผ ๋ฆฌํฉํ ๋งํ ์ํฅ์ด ์๋ค๊ณ ๊ฐ์ ํ๋ฉด ๋จ์ ๊ฒ์ ์ปดํ์ผ ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ๋ ๊ฒ๋ฟ์ ๋๋ค. ์ด๊ฒ์ด ์ด API๊ฐ ์ ๊ณตํ๋ ๊ฒ์ ๋๋ค. ํจ์ ์ ํผํ๊ธฐ ๋๋ฌธ์ ๋งค์ฐ ๋ฐ๋์งํฉ๋๋ค.
์ด์ ์ ์ด๋ฅผ ์ง์ํ๊ธฐ ์ํด Emscripten ์ธก์ ๊ด๋ จ๋ ์์ ์ ์์ ๋ํด ์ฐ๋ ค๋ฅผ ํ๋ช ํ์ต๋๋ค. ์์ง๋ ์ด๊ฒ์ด ๋ฌธ์ ๋ผ๊ณ ์๊ฐํ์ญ๋๊น?
FWIW, Unity 5.6์ WebAssembly.instantiate๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์กฐ๋์ค
2016๋ 12์ 28์ผ ์คํ 11์ 42๋ถ์ Seth Thompson [email protected]์ด ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
๋๊ธฐ ์ปดํ์ผ/์ธ์คํด์คํ๋ฅผ ๋ช ์์ ์ผ๋ก ๊ธ์งํด์ผ ํ๋ ์ด์ (๋๋ ๊ณผ๊ฑฐ์ ์ฃผ์ฅํ ๊ฒ์ฒ๋ผ ํ์ฉํ์ง ์๋ ๊ฒฝ์ฐ๋ ์์)์ ๋ํ ๋ ๋์ ์๋ฅผ ์ ๊ณตํ๋ ค๋ ์๋์์ต๋๋ค. ๋ฐ๋ผ๊ฑด๋ ์ด๊ฒ์ ํ ๋ก ์ ์ํ ์ถ๊ฐ ์๋ฃ๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ ์ ์ถ์ํ๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ํด ์ด์ผ๊ธฐํด ๋ณด๊ฒ ์ต๋๋ค.
๋ค์์ ๋น๋๊ธฐ ํธ์ถ(asm.js๋ฅผ ํตํด), ์ผ์ชฝ ๋ฐ ๋๊ธฐ ํธ์ถ(ํ์ฌ WebAssembly ๊ตฌํ)์ ์ฌ์ฉํ์ฌ AngryBots ๋ฐ๋ชจ๋ฅผ ๋ก๋ํ๋ ๊ฒ(์ค๋ฅธ์ชฝ)์ ๋น๊ตํ ๊ฒ์ ๋๋ค.
๋๊ธฐ ์ปดํ์ผ์ ๋์ฐํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๊ณ ์งํ๋ฅ ํ์์ค์ด๋ ์์ฉ ํ๋ก๊ทธ๋จ ๋ก๋ฉ์ ๋ํ ๊ธฐํ ์๊ฐ์ ํ์๋ฅผ ๊นจ๋จ๋ฆฝ๋๋ค.
๋ ธ๋ ฅ์ด ๋ฌด์์ด๋ ์๊ด์์ด Emscripten, Unity ๋ฐ ๊ธฐํ ๋๊ตฌ๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก WebAssembly๋ฅผ ๋ก๋ํ๋ ๋น๋๊ธฐ์์ผ๋ก ๋ด๋ณด๋ด๋๋ก ํจ๊ป ํ๋ ฅํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. cc @jechter @juj ๋ฟ๋ง ์๋๋ผ ๊ฐ๋ฐ์๊ฐ ๋๊ธฐ ๋ก๋ฉ ์ฝ๋๋ฅผ ์์ฑํ๋ ํจ์ ์ ๋น ์ง๋ ๊ฒ์ ์์ฒญ๋๊ฒ ์ด๋ ต๊ฒ ๋ง๋ค์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
WebAssembly.compile & WebAssembly.instantiate๋ฅผ ๋ช ์์ ์ผ๋ก ๊ถ์ฅํ๊ณ ์๋ก์ด WebAssembly.Module ๋ฐ ์๋ก์ด WebAssembly.Instance๋ฅผ ๊ถ์ฅํ์ง ์์์ผ ํฉ๋๋ค.
WebAssembly์ ๊ฒฝ์ฐ ์ค๋ฅธ์ชฝ์ ์๋ ์งํ๋ฅ ํ์์ค์ด ์ผ๋ง๋ ๋์์ง ์ข ๋ ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๋ค์์ DevTools ์ฑ๋ฅ ํจ๋๋ก ์บก์ฒํ ์ถ์ ์ ๋๋ค.
MacBook Air์์ ์งํ๋ฅ ํ์์ค์ ํ์ํ๋ ๋ฐ 30์ด๊ฐ ๊ฑธ๋ฆฝ๋๋ค.
์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ๋ฉ์ธ ์ค๋ ๋๊ฐ ์์ ํ ์ ๊ฒจ ์์ ๋ wasm ๋ชจ๋์ด ๋ค์ด๋ก๋๋ ํ ~20์ด๋ก ํ๋ํด ๋ณด๊ฒ ์ต๋๋ค.
์ปดํ์ผ์๋ ~20์ด๊ฐ ๊ฑธ๋ฆฌ๊ณ ์ธ์คํด์คํ์๋ ~2์ด๊ฐ ๊ฑธ๋ฆฝ๋๋ค.
์ด ๊ฒฝ์ฐ Unity ๋ก๋๋ ์ง์๋๋ ๊ฒฝ์ฐ ์ด๋ฏธ ๋น๋๊ธฐ์ WebAssembly.compile์ ํธ์ถํ๊ณ ์์ผ๋ฏ๋ก 20๋๋ V8์ด ์ฌ์ ํ ๋ด๋ถ์์ ๋๊ธฐ์ ์ปดํ์ผ์ ์ํํ๊ธฐ ๋๋ฌธ์ ๋๋ค. cc @titzer @flagxor ์ด๊ฒ์ V8์ด ์ ๋ง๋ก ์์ ํด์ผ ํ ๋ถ๋ถ์ ๋๋ค.
2์ด ์ธ์คํด์คํ ๋ฒ๋ฒ ๊ฑฐ๋ฆผ์ ๋๊ธฐ์ ์ WebAssembly.Instance๋ฅผ ํธ์ถํ๋ Unity ๋ก๋ ์ฝ๋๋ก ์ธํด ๋ฐ์ํฉ๋๋ค. ์ด๊ฒ์ด Unity ์ฝ๋์ Emscripten์์ ๋ชจ๋ ์์ ํด์ผ ํ๋ ๋ถ๋ถ์ ๋๋ค.
์ด๊ฒ์ ๊ฐ๋ฐ์๊ฐ ๋ฐ์ ์ด์ ์๊ฑฐ๋ ๋ง๊ฑฐ๋ํ๋ ์ํ์ด ์๋๋ผ๋ ์ ๋ ์ธ๊ธํ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ๊ท ์ ์ธ ์น ํ์ด์ง์๋ ์์ญ ๊ฐ์ ํ์ฌ ์คํฌ๋ฆฝํธ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ์ด๋ฌํ ์คํฌ๋ฆฝํธ๋ ๋ชจ๋ ์ต์์ ๋ฌธ์ ๋ฒ๋ฒ ๊ฑฐ๋ฆผ WebAssembly๋ฅผ ํฌํจํ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.
(์ถ์ ์ ๋ ์์ธํ ์ดํด๋ณด๊ณ ์ถ๋ค๋ฉด https://chromedevtools.github.io/timeline-viewer/?loadTimelineFromURL=https://www.dropbox.com/s/์์ ์ ์ฒด ํ์๋ผ์ธ์ ๋ณผ ์ ์์ต๋๋ค. noqjwql0pq6c1wy/wasm?dl=0)
โ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub์์ ๋ณด๊ฑฐ๋ ์ค๋ ๋๋ฅผ ์์๊ฑฐํ์ธ์.
@jfbastien "๊ฒฐ๋ก "์ด ๋ฌด์์ ์๋ฏธํ๋์ง ์ดํดํ์ง ๋ชปํ ์๋ ์์ต๋๋ค. ๋๋ ์ฃผ๋ก ์ฌ๊ธฐ์ ์ต์ ์ ์ ์ํ๊ณ ์์ต๋๋ค. ๋ ์์ ๋ ๊ฒฐ๋ก ์ด ์๋ค.
์ง๊ธ ๋ฐ๋ก ์ปดํ์ผ ์ ๋ฉ๋ชจ๋ฆฌ ์ต์ ์ ์ํ๋ ๊ฒฝ์ฐ ํ์ฌ ๋๊ธฐํ ์ปดํ์ผ์ ๊ฐ๋จํ๊ฒ ์์ ํ์ฌ ์ต๋ํ ๋นจ๋ฆฌ ์ฌ์ฉํ ์ ์๋ ๋ช ๊ฐ์ง ์ต์ ์ ์ ์ํ์ต๋๋ค.
๋๋ ์ง๊ธ ๋น๋๊ธฐ ๋ฐฉ์์ผ๋ก ํด๋น ์ต์ ์ ์ ํํ๋ ค๋ ๊ฒฝ์ฐ ์ต๋ํ ๋นจ๋ฆฌ ์ฌ์ฉํ ์ ์๋ ์ต์ ("1 + 3", ์ฆ ์ปดํ์ผ ํ์์ ๋ชจ๋ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์์ ํ์ง ์๊ณ ๋ฉ๋ชจ๋ฆฌ๋ง ์์ )์ ์ ์ํ์ต๋๋ค.
๋๋ ํ์ฌ API("1 + 3"์ด ์๋)๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น opt์ ๋น๋๊ธฐ ๋ฒ์ ์ ์ง์คํ๊ณ ์ถ๋ค๋ฉด ๊ทธ๊ฒ๋ ์ป์ ์ ์์ต๋๋ค. ์ค์ํ ๋ณ๊ฒฝ ์ฌํญ์ด๊ธฐ ๋๋ฌธ์ ์ฝ๊ฐ์ ์ ์คํ ๊ณํ์ด ํ์ํ ๊ฒ์ ๋๋ค. ๊ธฐ์กด ์ฌ์ฉ์๋ฅผ ์ค๋จํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ ๊ฒ์ ์ฌ๊ธฐ์์ ์ฐ๋ฆฌ๊ฐ ์ ํํ ์ ์๋ ์ต์ ์ด ์๋๋ผ๊ณ ์๊ฐํ๋ฏ๋ก ์ปค๋ฎค๋ํฐ์ ์์ํด์ผ ํฉ๋๋ค. ์ฐ๋ ค ์ฌํญ์ด ๊ฑฐ์ ์๊ณ ๊ทธ๋ฅ ํ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ์ผ๋ง๋ ๋ง์ ๋ ธ๋ ฅ์ด ์ผ๋ง๋ ๋ง์ ์ค๋ฒํค๋๋ฅผ ํ์ฉํ ์ํฅ์ด ์๋์ง์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค. ์ค๋ฒํค๋๋ฅผ ์ ํ ์์ฉํ ์ ์๋ค๋ฉด ๋ง์ ๋ ธ๋ ฅ์ด ํ์ํ ์ ์์ต๋๋ค. ๋๋ ๋ด ๊ฐ์ธ์ ์ธ ์ง๊ฐ์ธ ์ฐ๋ ค๊ฐ ์์ ์ ์์ต๋๋ค. ๋ชจ๋ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ง์ ์ผ๋ก ์ํ๋์ด์ผ ํฉ๋๋ค. ์ด ๊ฒฝ์ฐ ์๊ฐ์ด ๋ ์ค๋ ๊ฑธ๋ฆฌ๋ฏ๋ก ์๋ก์ด ์ต์ ์ผ๋ก ์์ํ์ฌ ๊ฒฐ๊ตญ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ค์ ํ ๊ณํ์ ๋๋ค.
๋ค์ ๋งํ์ง๋ง, ๋์๊ฒ์ ๊ฒฐ๋ก ์ด ๋์ง ์์ต๋๋ค. ์์ ๋ชจ๋ ๊ฒ์ ์ต์ ์ ๋๋ค. ๊ทธ๊ฒ์ ์ ๋ง๋ก ๋น์ ์ด ๋ ์ ๊ฒฝ ์ฐ๋ ๊ฒ์ ๋ฌ๋ ค ์์ต๋๋ค: Memory-at-Compile-time, async, ๋๋ ๋ ๋ค; ๊ทธ๋ฆฌ๊ณ ์๋ก์ด ์ค๋ฒํค๋๋ฅผ ํ์ฉํ๋ ๊ฒ๊ณผ ํ์ฉํ์ง ์๋ ๊ฒ์ ๋ฌธ์ ; ๊ธด๊ธํ ์ํ๋์ง ์๋๋ฉด ๊ธฐ๋ค๋ฆด ์ ์๋์ง ๋ฑ. ์ฌ๋๋ค์ด ๊ฒฐ์ ํ๋ ๋ฐฉ์์ ์๊ด์์ด ์์ ์ฌํญ์ ๋ํด emscripten ์ธก์์ ๊ธฐ๊บผ์ด ๋์๋๋ฆฌ๊ฒ ์ต๋๋ค.
๋๋ ํ์ฌ API("1 + 3"์ด ์๋)๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น opt์ ๋น๋๊ธฐ ๋ฒ์ ์ ์ง์คํ๊ณ ์ถ๋ค๋ฉด ๊ทธ๊ฒ๋ ์ป์ ์ ์์ต๋๋ค. ์ค์ํ ๋ณ๊ฒฝ ์ฌํญ์ด๊ธฐ ๋๋ฌธ์ ์ฝ๊ฐ์ ์ ์คํ ๊ณํ์ด ํ์ํ ๊ฒ์ ๋๋ค. ๊ธฐ์กด ์ฌ์ฉ์๋ฅผ ์ค๋จํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ ๊ฒ์ ์ฌ๊ธฐ์์ ์ฐ๋ฆฌ๊ฐ ์ ํํ ์ ์๋ ์ต์ ์ด ์๋๋ผ๊ณ ์๊ฐํ๋ฏ๋ก ์ปค๋ฎค๋ํฐ์ ์์ํด์ผ ํฉ๋๋ค. ์ฐ๋ ค ์ฌํญ์ด ๊ฑฐ์ ์๊ณ ๊ทธ๋ฅ ํ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ์ผ๋ง๋ ๋ง์ ๋ ธ๋ ฅ์ด ์ผ๋ง๋ ๋ง์ ์ค๋ฒํค๋๋ฅผ ํ์ฉํ ์ํฅ์ด ์๋์ง์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค. ์ค๋ฒํค๋๋ฅผ ์ ํ ์์ฉํ ์ ์๋ค๋ฉด ๋ง์ ๋ ธ๋ ฅ์ด ํ์ํ ์ ์์ต๋๋ค. ๋๋ ๋ด ๊ฐ์ธ์ ์ธ ์ง๊ฐ์ธ ์ฐ๋ ค๊ฐ ์์ ์ ์์ต๋๋ค. ๋ชจ๋ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ง์ ์ผ๋ก ์ํ๋์ด์ผ ํฉ๋๋ค. ์ด ๊ฒฝ์ฐ ์๊ฐ์ด ๋ ์ค๋ ๊ฑธ๋ฆฌ๋ฏ๋ก ์๋ก์ด ์ต์ ์ผ๋ก ์์ํ์ฌ ๊ฒฐ๊ตญ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ค์ ํ ๊ณํ์ ๋๋ค.
ํ์คํ ์ดํดํ๋ ค๋ฉด:
๋ค์ ๋งํด์ ๋ฌดํํ ์๊ฐ์ด ์๊ณ "๋ ๊ฑฐ์"๊ฐ ์๋ ๊ฒฝ์ฐ WebAssembly์ ์ด์์ ์ธ ์ต์ข ์ํ๋ ๋ฌด์์ ๋๊น? ๋๋ ์ฐ๋ฆฌ๊ฐ ์ด์์ ์ธ ์ต์ข ์ํ๋ฅผ ์ํด ์ค๊ณํ๋ค๊ณ ์๊ฐํ๊ณ ๋น์ ์ ๊ทธ ๊ณผ์ ์์ ์ฅ์ ๋ฌผ์ ์ง์ ํ๊ณ ์์ง๋ง ์ฌ์ ํ ๊ทธ๊ฒ์ด ์ฌ์ค์ธ์ง ํ์ ํ ์ ์์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด WebAssembly์ ์ ํ์ ์ฉ์ดํ๊ฒ ํ๊ธฐ ์ํด ์์๋ฐฉํธ์ด ํ์ํ์ง ๋๋ Emscripten ์ฌ์ฉ์์ ํ์ ์งํฉ(๋ฐ ์ด๋ค ์ฌ์ฉ์)์๊ฒ ์ผ์์ ์ธ ๋ถ๋ด์ด ํ์ฉ๋๋์ง ํ์ ํ๊ธฐ์ ์ถฉ๋ถํ ์ ๋ณด๊ฐ ์๋์ง ํ์ ํ ์ ์์ต๋๋ค.
์ผ๋ถ ์ต์ ์ ์ค๋ฒํค๋์ ๋ํด: ์์์ ์ค๋ช ํ ๊ฒ์ฒ๋ผ ๊น๋ค๋ก์ด ์ ์ ํ์ฌ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ๋ณด๋ด๊ณ ๋ด๋ณด๋ด๊ธฐ๋ฅผ ๋๊ธฐ์ ์ผ๋ก ์์ ํด์ผ ํ๋ฉฐ JS๊ฐ ์ค๋น๋ ๋๊น์ง JS ๊ฐ์ ธ์ค๊ธฐ๊ฐ ์๋ค๋ ๊ฒ์ ๋๋ค. !). ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ ๊ฐ์ ธ์ค๊ธฐ ๋๋ ๋ด๋ณด๋ด๊ธฐ์ ๊ฐ์ ๊ณ์ธต์ ์ถ๊ฐํ๋ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด, ์์ฃผ ์ด๊ธฐ์(JS ์ด์ ์ HTML์์) ์ค์ ๊ฐ์ ธ์ค๊ธฐ ๋์ ์ฝํฌ๋ฅผ ์ ๊ณตํ ์ ์์ผ๋ฏ๋ก ๋๊ธฐ์ ์ผ๋ก ์ ๊ณตํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค(๊ทธ๋ฌ๋ JS๊ฐ ์๊ธฐ ์ ์๋ ์์ฑํ๊ธฐ ์ฌ์ด ์ฝํฌ์ผ ๋ฟ์ ๋๋ค). . ๊ทธ๋ฐ ๋ค์ ๋์ค์ JS๊ฐ ์์ผ๋ฉด ์ฌ๋ฐ๋ฅธ ์์น๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ์ฝํฌ๋ฅผ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ค๋ฅธ JS ํธ์ถ์ ์ค๋ฒํค๋์ ๊ฐ ๊ฐ์ ธ์ค๊ธฐ ํธ์ถ์ ๋ํ JS ๊ฐ์ฒด ์กฐํ๊ฐ ์ถ๊ฐ๋ฉ๋๋ค. ๋ํ ์ฝ๋ ํฌ๊ธฐ ๋ฐ ์์ ์ ์ฝ๊ฐ์ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํฉ๋๋ค.
์ฌ์ฉ์ ๊นจ๊ธฐ: ์ฐ๋ฆฌ๋ ๊ธฐ์กด emscripten ์ฌ์ฉ์๊ฐ ํ๋๊ทธ ๋ฅผ ์ํฉ๋๋ค . ๋ง์ ์ฌ์ฉ์์ ํํธ๋๊ฐ ์ด์ ๋ํด ๋ง์กฑํ๊ณ ์์ต๋๋ค. ์ด๋ฅผ ํตํด asm.js์ wasm์ ๋น๊ตํ ์ ์์ผ๋ฉฐ ์๋ก์ด ์ด์ ๋ ธ๋ ฅ ์์ด๋ wasm์ ์ด์ ์ ์ป์ ์ ์์ต๋๋ค. ๋ํ was๋ก ์ด์ํ๋ ๋์ ์์ ์ฝ๋๋ฅผ ๋น๋๊ธฐํํด์ผ ํ๋ ๊ฒฝ์ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด wasm์ ๋ถํ์ํ๊ฒ ๋น๋ํ ์ ์๋ ์ํ์ ํผํ ์ ์์ต๋๋ค.
JS๊ฐ ์ค๋น๋ ๋๊น์ง JS ๊ฐ์ ธ์ค๊ธฐ๊ฐ ์์ต๋๋ค(ํ์ง๋ง ๋ฉ๋ชจ๋ฆฌ๋ ์์ต๋๋ค!)
์ด๋ ๋ถ์์ ์ธ ๊ฒ์ผ๋ก ๋ณด์ด๋ฉฐ API๋ก ์์ํ ์ ์๊ฐ์ ๊ตฌ์์ผ ํ๋ ๊ฒ์ ์๋๋๋ค. ๊ฒ๋ค๊ฐ @s3ththompson์ด ์ค๋ช ํ ์ด์ ๋๋ฌธ์ ์ปดํ์ผ ์ ๋ฉ๋ชจ๋ฆฌ ๋ฌธ์ ๋ฅผ ๋ฌด์ํ๋๋ผ๋ ํฉ๋๋ค . ๊ทธ๋์ ์ ๋ @jfbastien ์ ์ด์์ ์ธ ์ต์ข ์ํ API๊ฐ ์์ผ๋ฉฐ ์ฌ๊ธฐ์ ํํํด์๋
์ฌ์ฉ์ ์ค๋จ ์ ๋ณด: "onload" ์ด๋ฒคํธ/์ฝ์๊ณผ ๊ฐ์ ๊ฐ๋จํ ๋ง์ด๊ทธ๋ ์ด์ ๊ฒฝ๋ก๋ฅผ ์ ๊ณตํ๋ ๊ฒฝ์ฐ ์ฌ์ฉ์๊ฐ ๋ง์ด๊ทธ๋ ์ด์ ํ๊ธฐ๊ฐ ๊ฐํธํด์ผ ํ๋ฉฐ ๋น๊ทผ์ด ๋ชจ๋ ์ฃผ์ ์ฑ๋ฅ์ด ์น๋ฆฌํฉ๋๋ค. ์ ํํ asm.js ์์ค backcompat์ด ๊ธฐ๋ณธ ๊ตฌ์ฑ์ ๋ํ ์ด๋ ค์ด ์๊ตฌ ์ฌํญ์ด๋ผ๋ ์ฆ๊ฑฐ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ ๋ฐ๋์ ์๊ฐ ๋ง์ด ์์ต๋๋ค. ์ฌ์ฉ์๋ ์ต์ ์ ์ฑ๋ฅ์ ๋ฌ์ฑํ๊ธฐ ์ํด ๋ฌด์์ด๋ ๊ธฐ๊บผ์ด ํ๋ ค๊ณ ํฉ๋๋ค. ์๋ํ๋ฉด ๊ทธ๊ฒ์ด ๋ฌผ๋ก ์์ ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
@lukewagner์ ์คํ๋ผ์ธ์ผ๋ก ๋ํํ๋ฉด์ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ emscripten์ ๊ธฐ๋ณธ ๊ถ์ฅ ์ค์ ์์ wasm์ ๋ํ ์ธ์คํด์คํ๋ฅผ ํ์ฑํํ๋ ๊ฒ๋ถํฐ ์์ํ๋ ๊ฒ์ ๋๋ค. ์ด๋ ์์์ ์ค๋ช ํ ๋๋ก ๋ด๋ณด๋ด๊ธฐ์์) ๊ฐ์ ๊ณ์ธต์ ์ถ๊ฐํ์ฌ ์์ํ๋ ๊ฒ์ ๋๋ค. ๋๋ถ๋ถ์ ์ฌ์ฉ ์ฌ๋ก์์ ๋ฌด์ํ ์ ์๋ ์ค๋ฒํค๋๊ฐ ์์ ๊ฒ์ ๋๋ค. ๊ทธ๋์ ์ด๊ฒ์ ์ฐ๋ฆฌ ๋ชจ๋๊ฐ ์ฌ๊ธฐ์ ์ํ๋ ์ด์ ์ ์ป์ต๋๋ค.
๊ฒฐ๊ตญ ์ฐ๋ฆฌ๋ ๊ทธ ์์ ์ค๋ฒํค๋๋ฅผ ์์จ ์ ์์ง๋ง ๋ถ๋ช ํ ์ข์/์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ด ์๊ธฐ ๋๋ฌธ์ ๋ ๋ง์ ๊ณํ๊ณผ ๋ฉ์ผ๋ง ๋ฆฌ์คํธ ํ ๋ก ๋ฑ์ด ํ์ํ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ ๊ฒ์์ ๊นจ๋ฌ์์ต๋๋ค. ํ์ง๋ง ๊ฐ์ ๊ณ์ธต์ ์ค๋ฒํค๋๊ฐ ๋งค์ฐ ๋ฎ๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ์ด ๋ถ๋ถ์ ์๊ธํ์ง ์์ต๋๋ค.
@kripken ๋๋จํด! ๋ค์ํ ์ธ์คํด์ค / JS / ๊ฐ์ ธ์ค๊ธฐ / ๋ด๋ณด๋ด๊ธฐ / ๋ฉ๋ชจ๋ฆฌ / ํ ์ด๋ธ์ ๋ณด์ฌ์ฃผ๋ ๋ค์ด์ด๊ทธ๋จ์ด ์์ผ๋ฉด ๋์์ด ๋ ๊ฒ์ ๋๋ค. ์ด ํ ๋ก ์ ๋ค๋ฅธ ๊ณณ์ผ๋ก ์ฎ๊ธฐ์๊ฒ ์ต๋๊น(Emscripten / binaryen repo)? ๋๋ C++ ์ฝ๋๊ฐ ๋ฌด์์ผ๋ก ๊ตฌ์ฑ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํ๋์ง์ ๋ํ ์ ์ ์ ๊ทธ๋ฆผ์ ๊ฐ์ง๊ณ ์์ง๋ง, ์ง๊ธ์ฏค ๋น์ ์ด ๊ฐ์ ๊ทธ๋ฆผ์ ๊ฐ์ง๊ณ ์์ง ์๋ค๋ ๊ฒ์ ๊ฝค ๋ถ๋ช ํฉ๋๋ค! ๋น์ ์ ๊ทธ๊ณณ์์ ๋ ๋ง์ ๊ฒฝํ์ ํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋๋ ๊ทธ๊ณณ์์ ๋ฐฐ์ฐ๊ณ ๋ด๊ฐ ํ ์ ์๋ ํ ๋์์ ๋๋ฆฌ๊ณ ์ถ์ต๋๋ค.
@jfbastien : ๋ฌผ๋ก ์ ๋๋ค. ๋๋ ๋น์ ์ด ๋ค์ด์ด๊ทธ๋จ์์ ๋ฌด์์ ์ฐพ๊ณ ์๋์ง ์์ง ๋ช ํํ์ง ์์ง๋ง ์, ์๋ง๋ ๋ค๋ฅธ ๊ณณ์ด ๋ ๋์ ๊ฒ์ ๋๋ค. emscripten์์ ์ด๋ฅผ ๊ตฌํํ๊ธฐ ์ํด ์ด์ ์ ์ธ๊ธํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. https://github.com/kripken/emscripten/issues/4711 , ์ํ๋ ๊ฒ์ ๋ค๋ฃจ์ง ์๋ ๊ฒฝ์ฐ ๋ค๋ฅธ ๋ฌธ์ ๋ ์์ ๋กญ๊ฒ ์ฌ์ญ์์ค.
IIUC Emscripten์ ์ด์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๊ฒ์ ์ฌ์ฉํฉ๋๋ค. ํ์.
@s3ththompson comment ์ ๋ํ ํ์ ์กฐ์น๋ฅผ ์ํด์๋ ๋๊ธฐ ์ปดํ์ผ ๋ฐ ์ธ์คํด์คํ๊ฐ ์ ์ฉํฉ๋๋ค. ํนํ, ์ต๊ทผ์ Node.js( v7.7.2
)์์ WebAssembly ๋ชจ๋์ ๋๊ธฐ์ ์ผ๋ก ๋ก๋ํ๊ณ ์ปดํ์ผํ๋ ค๋ ์ํฉ์ ๋ถ๋ช์ณค์ต๋๋ค. ์ฝ์์ ๋ฐํํ๋ API๋ง ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ ๋๊ธฐ ๋ด๋ณด๋ด๊ธฐ๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
๋น๋๊ธฐ, ๋๊ธฐํ ๋๋ ๋ API๋ฅผ ๋ชจ๋ ์ ๊ณตํ ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ ๋ ๋ธ๋ผ์ฐ์ ์ปจํ ์คํธ๊ฐ ์ฌ๋๋ค์ด WebAssembly๋ฅผ ์ฌ์ฉํ๋ ค๋ ์ ์ผํ ํ๊ฒฝ์ด ์๋๋ผ๋ ์ ์ ๊ธฐ์ตํ์ญ์์ค. ์ ๋ฅผ ํฌํจํ์ฌ ๋ง์ ์ฌ๋๋ค์ด JVM๊ณผ ์ ์ฌํ Node.js ๋ฐํ์๊ณผ ๊ฒฐํฉ๋ ํจ์จ์ ์ธ ์ปดํ์ผ ๋์์ผ๋ก์ WebAssembly์ ์ ์ฌ๋ ฅ์ ๊ด์ฌ์ด ์์ต๋๋ค. ๋น๋๊ธฐ ๊ฐ์ ธ์ค๊ธฐ/๋ด๋ณด๋ด๊ธฐ ๊ฐ Node.js์
@kgryte ๋ด ์๊ฒฌ์ ์ฃผ๋ก ๋ธ๋ผ์ฐ์ ์ ์คํ ์ปจํ ์คํธ๋ก ๊ด๋ จ๋์ด ์์์ ๋ถ๋ช ํ ํ์ด์ผ ํ์ต๋๋ค. ๋๊ธฐ API๋ฅผ ์ฌ์ ํ ๋ ธ์ถํ๋ API ํ๋ฉด์ ๋๋ฌํ์ต๋๋ค. ๋ธ๋ผ์ฐ์ ๋ ๋๊ธฐ API์ ์ ๋ฌ๋ ๋ชจ๋์ ํฌ๊ธฐ ์ ํ์ ๋ถ๊ณผํ ์ ์์ง๋ง(์: Chrome์ ์ด๋ฏธ ์ํ) ํด๋น ์ ํ์ ์๋ฒ ๋์์ ๊ตฌ์ฑํ ์ ์์ผ๋ฉฐ Node.js์ ์ ์ฉํ ํ์๊ฐ ์์ต๋๋ค.
@s3ththompson ์ค๋ช ๊ฐ์ฌํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@kgryte ๋ด ์๊ฒฌ์ ์ฃผ๋ก ๋ธ๋ผ์ฐ์ ์ ์คํ ์ปจํ ์คํธ๋ก ๊ด๋ จ๋์ด ์์์ ๋ถ๋ช ํ ํ์ด์ผ ํ์ต๋๋ค. ๋๊ธฐ API๋ฅผ ์ฌ์ ํ ๋ ธ์ถํ๋ API ํ๋ฉด์ ๋๋ฌํ์ต๋๋ค. ๋ธ๋ผ์ฐ์ ๋ ๋๊ธฐ API์ ์ ๋ฌ๋ ๋ชจ๋์ ํฌ๊ธฐ ์ ํ์ ๋ถ๊ณผํ ์ ์์ง๋ง(์: Chrome์ ์ด๋ฏธ ์ํ) ํด๋น ์ ํ์ ์๋ฒ ๋์์ ๊ตฌ์ฑํ ์ ์์ผ๋ฉฐ Node.js์ ์ ์ฉํ ํ์๊ฐ ์์ต๋๋ค.