WebAssembly("wasm")๋ Native Client์ ์ ์ฌํ์ง๋ง ๋ค๋ฅธ ๋ธ๋ผ์ฐ์ ์์ ์ด๋ฅผ ๊ตฌํํ ๊ณํ์ด๋ผ๋ ์ ์์ ํนํ ๋ค๋ฆ ๋๋ค.
์ด๊ฒ์ ๋ช ๋ฒ ์์ฒญ๋์์ผ๋ฏ๋ก ์ด๊ฒ์ ์ถ์ ๋ฒ๊ทธ์ ๋๋ค.
cmd/compile, gccgo ๋๋ llvm-go๋ฅผ ํตํด ์ป๋ ์ฌ๊ธฐ์ ์ ๋ฐ์ดํธ๋ฅผ ๊ฒ์ํ ์ ์์ต๋๋ค.
@cherrymui ์ ๋๋ wasm GC ํฌํธ์ ๊ฐ๋ฅ์ฑ์ ๋ํด ์ค๋ซ๋์ ๋
ผ์ํ์ต๋๋ค.
์ง๋ ๋ฉฐ์น :
์ฐ๋ฆฌ์ ํ์ฌ ๊ฒฐ๋ก ์ ํจ๊ณผ์ ์ธ ๊ตฌํ ๋ฐฉ๋ฒ์ด ์๋ค๋ ๊ฒ์
๋๋ค.
ํ์ฌ setjmp/longjmp ๊ธฐ๋ฅ์ด๋ฏ๋ก ์คํ ๊ฐ๋ฅํ ๋์์ด ์๋๋๋ค.
gc ํฌํธ์. ์ค์ ์คํ์ด ํ๋ฆด ๋๊น์ง ๊ธฐ๋ค๋ ค์ผ ํ๊ณ
์์ธ ์ฒ๋ฆฌ ์ง์.
๋ค๋ฅธ ๋ชจ๋ ์ธก๋ฉด์ ๊ด์ฐฎ์ ๋ณด์๊ณ wasm์์ Go ABI๊น์ง ์ค๊ณํ์ต๋๋ค.
(wasm ์คํ์์ g ๋ฐ SP๋ฅผ ์ ๋ฌํ๊ณ ์๋ฎฌ๋ ์ดํธ๋ Go ์คํ์์ ๋ค๋ฅธ ๋ชจ๋ ๊ฒ์ ์ ๋ฌ) ๋ฐ
MIPS๋ฅผ ์๋ฎฌ๋ ์ดํธํ์ฌ wasm์ ์ง์ํ๋๋ก ํ์ฌ MIPS ๋ฐฑ์๋๋ฅผ ์์ ํ๋ ๋ฐฉ๋ฒ
wasm ์ง์ญ ๋ณ์๋ก ๋ฑ๋กํฉ๋๋ค.
์๋ง๋ GopherJS๋ wass๋ฅผ ๋ ์ฝ๊ฒ ์ง์ํ ์ ์์ต๋๋ค.
gopherjs/gopherjs#432์์:
๊ทธ๋ฌ๋ GopherJS๊ฐ ์ฌ์ฉํ ์ ์๋ ๊ธฐ์ ์ ์๋๋๋ค. GopherJS๋ ๊ธฐ๊ณ์ด ์์ค์ด ์๋ AST ์์ค์์ ์ปดํ์ผํฉ๋๋ค.
WebAssembly๋ ์ผ๋ฐ Go ์ปดํ์ผ๋ฌ์ ๋ฐฑ์๋๋ก ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
@minux ์ค๋ ๋ ๋๋ ๋น๋๊ธฐ i/o์ ๋ถ์กฑ์ wasm quirks ๋๋ฌธ์ ์ฐ๋ฆฌ๊ฐ ํด์ผ ํ๋ ABI ํด๊ฒฐ ๋ฐฉ๋ฒ๋ณด๋ค ๋ ํฐ ๋ฌธ์ ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
@minux , @cherrymui
๋น์ ์ด ํ ์ผ๊ณผ ์ฑ์ทจํ ์ผ์ ๋ ์์ธํ ์ด๋๊ฐ์ ๊ฒ์ํ ์ ์์ต๋๊น?
์์๋ค์ํผ go-interpreter ์ปค๋ฎค๋ํฐ๋ LLVM ๋๋ wasm ๋ฐ์ดํธ์ฝ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ์ธํฐํ๋ฆฌํฐ ์์ฑ์ ๊ณ ๋ คํ๊ณ ์์ต๋๋ค.
(์ฐ๋ฆฌ๋ GSoC ํ์์ด wasm ๋ฐ์ดํธ์ฝ๋ ์ธํฐํ๋ฆฌํฐ [1] ์์
์ ํ๊ณ ์์ ์๋ ์์ผ๋ฏ๋ก "Go ๊ธฐ๋ฐ ํด์ฒด์ธ์ ํตํ ๋ฐ์ดํธ์ฝ๋ ์์ฑ" ๋ถ๋ถ์ด ์๋ "๋ฐ์ดํธ์ฝ๋ ์๋น" ๋ถ๋ถ๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ค๋ณต๋ ๋ ธ๋ ฅ์ ์๊ณผ ๋ค์ํ ๊ตฌ์ฑ ์์ ๊ฐ์ ์ํผ๋์ค ๋ถ์ผ์น๋ฅผ ์ต์ํํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ ๋ต์ ์ธ ๊ธฐ๋ฅ์ผ๋ก ์ ๊ทน ์ถ์ฒํฉ๋๋ค. ๋ถ๊ณผ ๋ช ๋ ์์ ์น ํ๋ก๊ทธ๋๋จธ๊ฐ ์น ์ด์ ๋ธ๋ฆฌ๋ก ์ปดํ์ผํ ์ธ์ด๋ฅผ ์ ํํ๊ธฐ ์ํด ๋ฌด๋ฆฌ๋ฅผ ์ง์ด ๋ชฐ๋ ค๋ค ๊ฒ์ด๋ผ๋ ์ ์ ๊ณ ๋ คํ์ญ์์ค. ๊ฒฝ์ฃผ์ ๋นจ๋ฆฌ ์ฐธ๊ฐํ ์๋ก ์ข์ต๋๋ค. Mozilla๋ Rust๋ฅผ ์น ์ด์ ๋ธ๋ฆฌ ์ธ์ด๋ก ๊ฐ๋ ฅํ๊ฒ ๋ฐ์ด๋ถ์ด๊ณ ์์ต๋๋ค...
@RaananHadar ๊ฐ ๋งํ ๋ ๋ฒ์งธ์ ๋๋ค. ์ฌ์์ด Go์ ์๊ตฌ์ ๋ง์ง ์๋๋ค๋ฉด, ํนํ Go์ ๋ฐํ์์ด ๊ณ ์ ํ ์ ์๋ค๋ ์ ์ ๊ณ ๋ คํ ๋ ์ ๊ฐ์ ๋๋ค.
ํธ์ง: ์ด ๋๊ธ์ MeToo ํน์ฑ์ ๋ํด ์ฌ๊ณผ๋๋ฆฝ๋๋ค :) ํฌ์ธํฐ Brad์๊ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
์๋ฆผ: https://golang.org/wiki/NoMeToo
WebAssembly ์คํ ๋จธ์ ์ปจํ ์คํธ๋ ์ ํ ๋ฉ๋ชจ๋ฆฌ์ ์์ ์คํ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. IIUC, VM ์ปจํ ์คํธ ์ ์ฅ์ ๋ค์์ ์ ์ฅํ์ฌ ์ํํ ์ ์์ต๋๋ค.
VM ์ปจํ ์คํธ ๊ตฌ์กฐ์ฒด์ ์ ์ฅ๋ ์ปจํ ์คํธ์ ์ ์ญ ๋ชฉ๋ก(์๋ ๊ฒฝ์ฐ).
๋ฐ๋ผ์ setjump๋ ๋จ์ํ ์ด๋ฌํ ๊ฐ์ ๋ณต์ํ๊ณ ํ์์ ๊ฐ์ด ์ธํฐํ๋ฆฌํฐ ๋ฃจํ๋ฅผ ๊ณ์ํด์ผ ํฉ๋๋ค(์ด๋ emacs ๋ฐ์ดํธ์ฝ๋ VM์ด ์ ํธ๋ฅผ ๊ตฌํํ๋ ๋ฐฉ์๊ณผ ์ ์ฌํฉ๋๋ค: https://github.com/emacs-mirror/emacs/blob/master/src /bytecode.c#L785). ์ด ์์ ์์ธ ์์คํ ์ ๊ตฌํํ ์ ์์ง๋ง ์ด๊ฒ์ด ์ผ๋ง๋ ์ฑ๋ฅ์ด ์ข์์ง๋ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๋ํ ์น ์ด์ ๋ธ๋ฆฌ ์ฌ์ ์ ๋ฐ์ดํธ ์ฝ๋์ ๋ชจ๋ ์๊ฐ์ ์คํ ๋์ด๊ฐ ์ ์ ์ผ๋ก ์๋ ค์ ธ ์์ผ๋ฏ๋ก ๋ชจ๋ ์คํ ์์ ์ ์คํ์ ๊ฐ ์์น์ ๊ณ ์ ํ ๋ ์ง์คํฐ ์์ ๊ณผ ๋์ผํ๊ฒ ๋ง๋ ๋ค๊ณ ์ธ๊ธํฉ๋๋ค. ์ด ๋ฌธ์ ์์๋ ์คํ ๋จธ์ ์ฝ๋๋ฅผ ๋ค์ดํฐ๋ธ ์ฝ๋๋ก ๋ณํํ๊ธฐ ์ํ ์คํ -> ๋ ์ง์คํฐ ๋งคํ์ ๋ฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํ๊ณ ํ์์ฒ๋ผ setjmp/longjmp๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํธ์ง: panic()
๋ฐ recover()
๋ฅผ ์์ธ ์ ํธ์ ํน๋ณํ WasmException{}
๊ฐ๊ณผ ํจ๊ป ์ฌ์ฉํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น? recover
๋ ์ด๋ฏธ ์คํ ํด์ ๋ผ๋ ์ด๋ ค์ด ์์
์ ์ํํ๋ฏ๋ก catch๋ ์์ธ์์ ๋ณต๊ตฌํ ํ ์ธํฐํ๋ฆฌํฐ ๋ฃจํ๋ฅผ ๋ณต์ํ๋ ๊ฒ์ด ์ด๋ ต์ง ์์์ผ ํฉ๋๋ค.
๋ค, ๊ธฐ๋ณธ์ ์ผ๋ก @cherrymui์์ ํ ๋ก ์์๋ ๋น์ทํ ๊ฒฐ๊ณผ๊ฐ ๋์์ต๋๋ค.
@cherrymui ๋ฅผ ์ฌ์ฉํ ์ด๊ธฐ ๋์์ธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
(์ด ๋จ๊ณ๋ $GOROOT/test/sieve.go๊ฐ ์๋ํ๋๋ก ํ๋ ๋ฐ ์ค์ ์ ๋๋ฉฐ ๋น๋๊ธฐ IO๋
์กด๊ฒฝ๋ฐ๋.)
MIPS ํฌํธ๋ฅผ ์ฌ์ฌ์ฉํ์ฌ 31๊ฐ์ MIPS ๋ ์ง์คํฐ๋ฅผ WASM ๋ก์ปฌ๋ก ๋งคํํฉ๋๋ค.
๋ณ์ ๋ฐ WASM ์คํ๋ง ์ฌ์ฉ
์ค๊ฐ ๊ฒฐ๊ณผ๋ฅผ ์ํด. WASM์ ํจ์ ํธ์ถ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋๋ถ๋ถ์ Go ๊ธฐ๋ฅ ๋๋ฌธ์
์คํ ํด์ ์ง์ ๋ถ์กฑ.
mips objlink(cmd/internal/obj)๋ฅผ ๋ณ๊ฒฝํ์ฌ ๊ฐ MIPS ๋ช
๋ น์ด๋ฅผ ์๋ฎฌ๋ ์ดํธํฉ๋๋ค.
๊ฐ๊ฐ์ WASM ์ง์นจ๊ณผ ํจ๊ป.
์ด๊ฒ์ setjmp/longjmp(์ผ๋ช
runtime.gogo) ๊ตฌํ์ ๊ฐ๋จํ๊ฒ ๋ง๋ค๊ณ
๊ธฐ์กด ๋
ธ๋ ฅ์ ๋ง์ด ์ฌ์ฌ์ฉํฉ๋๋ค.
Go๋ ์ด๋ฏธ WASM ์คํ๊ณผ ๋ณ๋๋ก ์์ฒด ์คํ์ ๊ตฌํํด์ผ ํฉ๋๋ค.
Go๋ ๋ณต์ฌ ๊ฐ๋ฅํด์ผ ํ๊ธฐ ๋๋ฌธ์
์คํ, ์คํ ํฌ์ธํฐ ๋งต ๋ฐ ์คํ ํด์ ์ง์,
WASM์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
(์ด ์ ๋ต์ LLVM ํฌํธ์๋ ์ผ์นํ๋ฏ๋ก LLVM ์คํ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ฑฐ์ ๊ฐ์ ์ด์
(์คํ ํฌ์ธํฐ๋ฅผ ์ธ์ฝ๋ฉํ๋ ๋ฐ ์ ์ ํ LLVM์ ์ฌ์ฉ์ ์ ์ ๋ฐฑ์๋ ํจ์ค๋ฅผ ์ถ๊ฐํ์ง ์๋ ํ
์ง๋).)
๊ฐ์ ์ ํ๋ฅผ ์ค๋ ๋ํ๋ ค๋ฉด ํฐ ์ค์์น๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๊น? ์ด๊ฒ์
NestedVM์ ์ ๊ทผ ๋ฐฉ์๊ณผ ์ ์ฌํฉ๋๋ค.
http://nestedvm.ibex.org/
๋ค์ดํฐ๋ธ WASM ๋ฐฑ์๋๋ฅผ ๊ตฌํํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ ์ ์์ต๋๋ค.
Go ABI๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
(์๋ฎฌ๋ ์ดํธ๋) Go ์คํ์ ๋ชจ๋ ๋งค๊ฐ๋ณ์(๊ฒฐ๊ณผ ํฌํจ),
ํจ์ ํญ๋ชฉ์์ ๋ค์์ WASM ์คํ์ ์์ต๋๋ค.
์๋ฎฌ๋ ์ดํธ๋ SP, g.
ํ ๋ก ์ ํ ๋ฌ ์ด์ ์ ์ ์์๊ณ ์๋ง๋ ์ผ๋ถ๋ฅผ ์์ด ๋ฒ๋ ธ์ ๊ฒ์
๋๋ค.
์ด ์์ ์์ ์ธ๋ถ ์ฌํญ.
IIUC, WASM ์คํ์ ์์ ํ ํ๊ธฐํ ์ ์์ต๋๋ค(์ฌ์์ ๋ฐ๋ผ). ํ์ฅ ๊ฐ๋ฅํ๊ณ ๋ณต์ฌ ๊ฐ๋ฅํ go ์คํ์ ์ฌ์ ํ โโ์กฐ์ฌํด์ผ ํ ์ฌํญ์ ๋๋ค.
๋ค, ์ ๊ฐ ์ธ๊ธํ ์ด๊ธฐ ๋์์ธ์ WASM ์คํ๋ง ์ฌ์ฉํฉ๋๋ค.
๊ณ์ฐ์ ์ฌ์ฉ๋๋ ์ค๊ฐ์ฒด. ๋ชจ๋ ๋ฐ์ดํฐ๋ Go ํ(์ ํ
๋ฉ๋ชจ๋ฆฌ) ๋๋ WASM ์ง์ญ ๋ณ์์ ์์ฌ ๋ ์ง์คํฐ.
WASM ์ฌ์์ด ์ด๋/๋ถํ ๋ฐ ๋ณต์ฌ ์คํ์ ํตํฉํ ๊ฒ์ผ๋ก ๊ธฐ๋ํ์ง ์์ต๋๋ค.
WASM์ ๋์์ด ๋๋ ์ฃผ๋ฅ ์ธ์ด์์๋ ๊ฑฐ์ ์ฌ์ฉ๋์ง ์์ต๋๋ค.
@bradfitz @minux @vibhavp golang์์ wasm์ ํ์ฌ ์ํ๋ ๋ฌด์์ ๋๊น? 3์ 13์ผ ์ดํ๋ก ์๋ฌด ์ผ๋ ์ผ์ด๋์ง ์์์ต๋๋ค! ๋ฏธ๋์ golang์ wass๋ก ๋ณํํ๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๊น? ์๋ง๋ ๊ทธ ๊ฒฝ๋ก ๋งต์ด ์์ต๋๊น?
๋๊ตฐ๊ฐ๊ฐ was ์ง์์ ๊ตฌํํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ฉด ๋น์ ์ญ์ ์์ ์ ์๊ฐ์ ํ ์ ํ ์ ์์ต๋๋ค.
@SerkanSipahi , ์๋ฌด๋ ์ด๊ฒ์ ๋ํด ์์ ํ์ง ์์ต๋๋ค. ์ด ๋ฒ๊ทธ๋ LongTerm์ผ๋ก ํ์๋ฉ๋๋ค. ์ด๋ค ์ผ์ด ์ผ์ด๋๊ธฐ ์์ํ๋ฉด ์ฌ๊ธฐ์์ ์ ๋ฐ์ดํธ๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
์ข์ ๋ก๋๋งต?
GUI๋ก golang์ ๋๋ฒ๊น
ํ๊ธฐ ์ํ DELVE ๋ฐ GDLV๊ฐ ์์ต๋๋ค. ๋ชจ๋ ๋ฐ์คํฌํ์์๋ ์ ์๋ํ๋ฉฐ ์ฑ๋ฅ๋ ๋ฐ์ด๋ฉ๋๋ค.
https://github.com/derekparker/delve
https://github.com/aarzilli/gdlv
์ด์ GDLV๋ ๋ฉ์ง ์ถ์ํ๋ก ๋น๋๋ NUCULAR๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค.
https://github.com/aarzilli/nucular
๊ทธ๋์ ์ ๋ ์ด๊ฒ์ด ์ด๋ฏธ ์ฌ๊ธฐ์์ ์ํ๋ ์์ ์ ์ํํ๊ธฐ ์ํ ์ข์ ๊ธฐ์ด๊ฐ ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค.
์ด์ 5๊ฐ์ WASM go ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์์ต๋๋ค.
https://github.com/search?l=Go&q=webassembly&ref=simplesearch&type=Repositories&utf8=%E2%9C%93
NaCl์ด ์ข
๋ฃ๋์์ต๋๋ค - https://blog.chromium.org/2017/05/goodbye-pnacl-hello-webassembly.html
๋ฐ๋ผ์ ์ด๊ฒ์ ์๋ง๋ ์ ๋ฆฌ๋์ด์ผ ํฉ๋๋ค - https://github.com/golang/go/tree/master/misc/nacl
๋ฐ๋ ์ํ๊ณ์ ๋ค์ํ ๋ถ๋ถ์์ NaCl์ด ์ฌ์ฉ๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฆ, Chrome์์๋ง ์ฌ์ฉ๋๋ ๊ฒ์ ์๋๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด์จ๋ ๋ธ๋ก๊ทธ ๋ฐํ๋ PNaCl์ ๊ดํ ๊ฒ์ธ๋ฐ, ์ด๋ NaCl๊ณผ ์ ์ฌํ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง๋ง ์ค์ ๋ก๋ ๋ค๋ฅธ ๊ธฐ์ ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ์์ ํ ๋ค๋ฅธ ์ ํ์ ๋๋ค. ๋ฐ๋ผ์ Go์์ NaCl ์ง์์ ์ ๊ฑฐํ๋ ๊ฒ์ ํ์ฌ ์๊ธฐ์์กฐ์ ๋๋ค.
์ด์จ๋ Go์์ NaCl์ ์ ๊ฑฐํ๋์ง ์ฌ๋ถ๋ ์น ์ด์ ๋ธ๋ฆฌ์ ๋ํ ์ง์์ ์ถ๊ฐํ๋์ง ์ฌ๋ถ์ ๊ด๋ จ์ด ์์ต๋๋ค.
PNaCl์ ํ๋ซํผ ๋ ๋ฆฝ์ ์ธ ์ฝ๋ https://developer.chrome.com/native-client/nacl-and-pnacl ๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด NaCl์ ๋ํ ํ์ฅ์ผ ๋ฟ์ด๋ผ๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค. ์ฌ๊ธฐ์ NaCl ์ฌ์ฉ ์ค๋จ์ ๋ํด ์ง๋ฌธ ํ์ต๋๋ค. com/d/topic/native-client-discuss/wgN2ketXybQ/discussion
NaCl์ด ์ฌ์ ํ ์ฌ์ฉ๋๋ Go ์ํ๊ณ์ ๋ค์ํ ๋ถ๋ถ ๋ชฉ๋ก์ ์ป์ ์ ์๋ค๋ฉด?
ํ๋์ฉ ์ดํด๋ณด๋ฉด WebAssembly๋ก์ ์ ํ์ด ๋์ฑ ํฅ๋ฏธ๋ก์์ง ๊ฒ์
๋๋ค.
PNaCl์ NaCl์ ๋ํ ํ์ฅ์ผ ๋ฟ์ ๋๋ค.
๋น์ ์ด ์ํ๋ ๊ฒ์ ๋ฌด์์ด๋ ๋งํ ์ ์์ง๋ง ๊ทธ๊ฒ์ด ๋น์ ์ด ์ณ๋ค๋ ๊ฒ์ ์๋ฏธํ์ง๋ ์์ต๋๋ค. ๊ทธ๊ฒ๋ค์ ์์ ํ ๋ค๋ฅธ ISA์ด๊ณ NaCL์ ์ฝ๊ฐ์ ์ ํ์ด ์๋ ๋์ ISA(x86/arm)์ผ ๋ฟ์ธ ๋ฐ๋ฉด PNaCl์ ์ถ์ ์์คํ ์ ๋ํ ์์ ํ ๋ค๋ฅธ ISA์ ๋๋ค.
Go๋ PNaCL์ ์ง์ํ ์ ์ด ์์ผ๋ฉฐ Go NaCL ํฌํธ๋ ์ด์จ๋ Chrome์ ์ ํฉํ์ง ์์์ต๋๋ค. ํฌ๋กฌ๊ณผ๋ ๊ด๋ จ์ด ์์๊ณ ๋ธ๋ผ์ฐ์ ์์ ์ฌ์ฉํ ์ ์์์ต๋๋ค. Chrome์ด NaCL์ ํฌ๊ธฐํ๋์ง PNaCL์ ํฌ๊ธฐํ๋์ง ์ฌ๋ถ๋ Go์ ๊ด๋ จ์ด ์์ต๋๋ค. ๋๋ค, nil, no ๊ด๋ จ์ฑ . ์ด ๋ง์ ๋ช ๋ฒ์ ๋ ํด์ผ ํ ๊น? ๋ฌผ๋ก NaCL์ด ์์ ํ ํฌ๊ธฐ๋๋ฉด Go๋ ์ธ์ ๊ฐ๋ ํฌ๊ธฐํด์ผ ํฉ๋๋ค.
Go์ WebAssembly ์ง์์ NaCL๊ณผ ์ ํ ๊ด๋ จ์ด ์์ต๋๋ค. Go๋ WebAssembly ์ง์์ ๋ฐ์ ์๋ ์๊ณ ๋ฐ์ง ์์ ์๋ ์์ต๋๋ค. ์ด๋ฌํ ์ง์์ ๋ฐ์ ์ ์๋ ๊ฒฝ์ฐ ๋๋ NaCL ํฌํธ์ ์ํ์ ๊ด๋ จ์ด ์์ต๋๋ค.
๋ค์์ nacl์ ์ฌ์ฉํ๋ ์ํ๊ณ์ ๋งค์ฐ ์ค์ํ ๋ถ๋ถ์ ๋๋ค. https://play.golang.org/p/MfJIq8wb5-
(nacl-in-a-browser๊ฐ ์๋ ์๋ฒ ์ธก์์ ์คํ)
Chrome์ด NaCL์ ํฌ๊ธฐํ๋์ง PNaCL์ ํฌ๊ธฐํ๋์ง ์ฌ๋ถ๋ Go์ ๊ด๋ จ์ด ์์ต๋๋ค. ๋๋ค, nil, ๊ด๋ จ ์์.
๊ทธ๋ฌ๋ฉด ๋๊ฐ ์๋๋ฐ์ค ๋ก๋์ ํด์ฒด์ธ์ ์ง์ํ ๊ฒ์ ๋๊น? WebAssembly๋ก ๋ ธ๋ ฅ์ ์ ํํ Chrome ํ๋ก์ ํธ์์ ๊ฐ์ ธ์ต๋๋ค. Go ํ๋ ์ด๊ทธ๋ผ์ด๋๊ฐ ์ด๋ฏธ NaCl ์๋๋ฐ์ค์์ WebAssembly ์๋๋ฐ์ค๋ก ์ด์๋ ์ ์๋์ง ํ์ธํ๋ ๊ฒ์ด ํ๋ช ํ์ง ์์๊น์? ์๋ฒ ์ธก์์๋ ์คํํ ์ ์์ต๋๋ค.
๋๋ ๋ชจ๋๊ฐ WebAssembly๋ฅผ ์ง์ํ๋ ๊ฒ์ ์ฐฌ์ฑํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
NaCl์์ ๋ฒ์ด๋๋ ๊ฒ์ ๋ํด ๋ ผ์ํ ์๊ฐ์ WebAssembly๊ฐ ์์ ํ ์๋ํ ํ์ ๋๋ค. ๊ทธ ์ ์ ๋ ผ์ํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
@ianlancetaylor , "WebAssembly๊ฐ ์์ ํ ์๋ํ ํ"๋ฅผ ๋ช ํํ ํ ์ ์์ต๋๊น?
์ผํ ๋ณด๋ฉด webassembly.org ์ "WebAssembly์ ์ด๊ธฐ ๋ฒ์ ์ด ๋ธ๋ผ์ฐ์ ๊ฐ ํฉ์์ ๋๋ฌํ์ต๋๋ค"๋ผ๊ณ ๋์ ์์ผ๋ฉฐ wasm์ ๋ชจ๋ ๋ธ๋ผ์ฐ์ ๊ณต๊ธ์ ์ฒด ์ ํ์ฌ ๋๋ ๋ฏธ๋ ๋ธ๋ผ์ฐ์ ๋ฒ์ ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
@vine77 ๋ด ๋ง์ WebAssembly๊ฐ Go ํ๋ก๊ทธ๋จ์์ ์์ ํ ์๋ํ ํ ์ ์ด๋ NaCl์ด ์ค๋๋ ์๋ํ๋ ๊ฒ์ฒ๋ผ ๋ง์ ๋๋ค.
๊ทธ๋ ๋ค๋ฉด WebAssembly๊ฐ Go ํ๋ก๊ทธ๋จ์์ ์๋ํ๊ธฐ ์ํด ํต๊ณผํด์ผ ํ๋ ๋ค์ ํ ์คํธ๋ ๋ฌด์์ ๋๊น?
@techtonik ์ฌ๊ธฐ์ ์ฝ๊ฐ์ ํผ๋์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค. WebAssembly๊ฐ Go ํ๋ก๊ทธ๋จ์์ ์๋ํด์ผ ํ๋ค๋ ๋ง์ Go ์ปดํ์ผ๋ฌ๊ฐ ๋ธ๋ผ์ฐ์ ์์ ์คํํ ์ ์๋ WebAssembly ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ๋ค๋ ์๋ฏธ์
๋๋ค. ์ฐ๋ฆฌ๋ GOOS=wasm go build hello.go
์ ๊ฐ์ ๊ฒ์ ์์ฑํ ์ ์์ด์ผ ํ๊ณ ๋ธ๋ผ์ฐ์ ๋ด์์ ์คํํ ์ ์๋ ํ๋ก๊ทธ๋จ์ ์ป์ ์ ์์ด์ผ ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๊ฑฐ๊ธฐ์ ์์ฃผ ๊ฐ๊น์ง๋ ์์ต๋๋ค. ์์๋ ํ์ง ์์์ต๋๋ค. ๋ฐ๋ผ์ "๋ค์ ํ
์คํธ"๋ ์์ต๋๋ค. ํด์ผ ํ ์ผ์ด ๋ง์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ด๊ฐ ์๋ ํ ์๋ฌด๋ ๊ทธ๊ฒ์ ๋ํด ์ ๊ทน์ ์ผ๋ก ๋
ธ๋ ฅํ๊ณ ์์ง ์์ต๋๋ค.
@ ์ด์๋์คํ
์ผ๋ฌ
golang์๋ 4๊ฐ์ง ๊ตฌํ์ด ์์ต๋๋ค. ํ๋๋ ์ฌ๊ฐํ๊ฒ ์ธ์์ ์
๋๋ค. ๋งํฌ์ ๋ํ ๋ด ์ด์ ์๊ฒฌ์ ์ฐธ์กฐํ์ญ์์ค.
Boy ์ด ์ค๋ ๋๋ ๋ท์ข์์์ ์์ด๋ค์ด "์ฐ๋ฆฌ ์์ง ๊ฑฐ๊ธฐ์ ์์ด"๋ผ๊ณ ์๋ฆฌ์น๋ ๋ชจ์ต์ ๋ณธ Chevy Chase ์๋์ฐจ์ ๊ฐ์ต๋๋ค. :)
@joeblew99 : ๊ทธ ์ด๋ค ๋งํฌ๋ Go to WebAssembly๋ฅผ ์ปดํ์ผํ ์ ์๋ ๊ฒ์ด ์๋๋๋ค.
๊ทธ๋ค์ Go๋ก ์์ฑ๋ WebAssembly -> amd64 ์ปดํ์ผ๋ฌ์ ๊ฐ์ ๊ฒ์
๋๋ค.
๋น์ ์ด ๊ทธ๋ ๊ฒ ๋งํ ๊น๋ด ๋๋ ค์ ์ด์. ๊ทธ๋ด ์ ์์ง.
๊ทธ๋ ๋ค๋ฉด "๊ธฐ๋ฆ"์ ํ์ํ ๊ฒ์ ๋ฌด์์
๋๊น? ๊ทธ๋์ ๋ค๋ค ์์ฃ ...
Gopherjs๋ ์ปดํ์ผ๋ฌ ๋๊ตฌ ์ฒด์ธ ์ํคํ
์ฒ/์ฝ๋ ์์ฑ์์ ์ฌ๋ฐ๋ฅธ ์์ค์ ์์ง ์์ ๊ฒ๊ณผ ๊ฐ์ ์ค์๋ฅผ ์ ์ง๋ ์ต๋๊น?
๊ธด ๋ชฉ๋ก์ด ์์ต๋๋ค. ๋๋ถ๋ถ์ ์ด๋ค ์์ผ๋ก๋ ๊ฐ๋น์ง ์์ง๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค.
๊ทธ๊ฒ์ ์๋ง๋ ์์ ํ ๋ชฉ๋ก์ด ์๋ ๊ฒ์ ๋๋ค.
WebAssembly๊ฐ Go ํ๋ก๊ทธ๋จ์์ ์๋ํด์ผ ํ๋ค๋ ๋ง์ Go ์ปดํ์ผ๋ฌ๊ฐ ๋ธ๋ผ์ฐ์ ์์ ์คํํ ์ ์๋ WebAssembly ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ๋ค๋ ์๋ฏธ์ ๋๋ค.
@ianlancetaylor ์น์ด ์๋ ๋์์ ๋จผ์ ํ๊ฒํ ํ๋ ๊ฒ์ด ๋ ์ฌ์ธ๊น์? NaCl๋ ๋ธ๋ผ์ฐ์ ์์ ๋จผ์ ์คํ๋๋๋ก ์ค๊ณ๋์์ง๋ง ํ์ฌ Go์์ ์ฌ์ฉํ๋ ๋ธ๋ผ์ฐ์ ๋ ๋ฆฝ ๋ก๋๊ฐ ์์ต๋๋ค. ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ WebAssembly - http://webassembly.org/docs/non-web/ - ํ ์คํธ๋ฅผ ์ํ ์ต์ ์ ธ์ ๋ํด ์ค๋ช ํฉ๋๋ค.
@ randall77 ์ด ๋ชฉ๋ก์์ ์คํ ๊ฐ๋ฅํ ์ฒดํฌ๋ฆฌ์คํธ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๊น? ๊ฐ ์ธก๋ฉด์ ๋ ์์ธํ ์กฐ์ฌํ๋ ๋ฌธ์ ์ ๋ํ ๋งํฌ๊ฐ ์๋ ๋ง์คํฐ ๋ฌธ์ ์ฒ๋ผ?
@techtonik wrt non-web: @vibhavp ๋ ๋ด๊ฐ ์์ ๋ช ๊ฐ์ง ๊ฒ์๋ฌผ์์ ์ธ๊ธํ GSoC ์ธํด์ญ์ ๋งฅ๋ฝ์์ ์์
ํ๊ณ ์์ต๋๋ค.
์ ์ชฝ์ ์์ด์: https://github.com/go-interpreter/wagon
@techtonik : ๊ทธ๋ฐ ์ฒดํฌ๋ฆฌ์คํธ์ ๋ํ ์ ์ ํ ์ฅ์๋ wasm ์ง์์ ๋ํ ์ ์ ๋ฌธ์๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ฌํ ์ ์์ด ์๋ฝ๋๊ณ ์ฌ๋๋ค์ด ์ ๊ทน์ ์ผ๋ก ์์ ์ ์ฐธ์ฌํ๋ฉด ๊ฐ๋ณ ์์ ์ ๋ฌธ์ ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํ์ฌ๋ก์๋ ์๊ธฐ์์กฐ์ ๋๋ค. (์ ์์ด๋ ์ฝ๋) ์ ๊ทน์ ์ผ๋ก ์์ ํ๋ ์ฌ๋์ด ์๋ฌด๋ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
์ ์ ๋ฌธ์์ ๋์ํฉ๋๋ค.
๋ด๊ฐ ํ๋ ๋ชจ๋ /๋ชจ์์ ์ด ์ค๋ ๋์ ์์ผ๋ฉฐ ์ํ/๋ณด์ ๊ท ํ์ ๋จ๊ณ์ ์ผ๋ก ํ์ฉํ๋ ๋ก๋๋งต๊ณผ ํจ๊ป ํจ๊ป ํฌ์ฅ๋๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
๋๋ ๋ํ ๊ทธ๊ฒ์ด ๋์๊ฒ ์ํ ์์ง์๊ฐ๋ฝ์ฒ๋ผ ํ์ด๋์ ์๊ธฐ ๋๋ฌธ์ ๊ทธ๋ํฝ์ ๋ค๋ฃจ๋ ๊ฒ์ ๋ณด๊ณ ์ถ์ต๋๋ค.
์ ๋ Go to JavaScript์ ์ปดํ์ผ๋ฌ์ธ GopherJS ์ ์ ์์ ๋๋ค. ๋๋ ๋ธ๋ผ์ฐ์ ์์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ํ ๋์, Go ๋ฐ ๊ธฐํ์ ๊ฐ์ ๋์์ด ์์ด์ผ ํ๋ค๊ณ ๊ฐ๋ ฅํ ๋ฏฟ๊ธฐ ๋๋ฌธ์ ๊ทธ ํ๋ก์ ํธ๋ฅผ ์์ฑํ์ต๋๋ค. ๋๋ ์ปดํ์ผ๋ฌ, SSA, ๊ธฐ๊ณ ์ํคํ ์ฒ ๋ฑ์ ๋ํด ์๋นํ ์ง์์ ๊ฐ์ง๊ณ ์์ง๋ง ์์ง ๊ธฐ๊ณ ์ฝ๋์ ๋ํ ์ปดํ์ผ๋ฌ ๋ฐฑ์๋๋ฅผ ์์ฑํ์ง ์์๊ธฐ ๋๋ฌธ์ ๋ง์ ์ธ๋ถ ์ฌํญ์ ๋์น๊ณ ์์ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ด ๋ด๊ฐ ์์ ํ ์ ์ ๋ฌธ์๋ฅผ ์์ฑํ ์๊ฒฉ์ด ์๋ค๊ณ ๋๋ผ๋ ์ด์ ์ ๋๋ค. ๊ทธ๋๋ Go์ WebAssembly์ ๋ํ ์ ์๊ฐ์ ๋ํด ๋นํ์ ์ธ ํผ๋๋ฐฑ์ ๋ฐ๊ณ ์ถ์ต๋๋ค.
WebAssembly๋ฅผ ๋ณด๋ฉด x86์ด๋ arm๊ณผ ๊ฐ์ ์ผ๋ฐ์ ์ธ ๊ธฐ๊ณ์ด ์ฝ๋ ๋์๊ณผ ๋งค์ฐ ๋ค๋ฅด๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ํคํ ์ฒ๋ ๋ ์ง์คํฐ ๋จธ์ ๋์ ์คํ ๋จธ์ ์ ๋๋ค. ์ด๊ฒ์ x86 ๋ฐ ์น๊ตฌ๋ค ์์ ์๋ Go ์ปดํ์ผ๋ฌ์ ๋ง์ง๋ง ๋จ๊ณ์์ ๋จ์ํ ๋ ๋ค๋ฅธ ๋์์ผ๋ก ์ฆ์ ์ ํฉํ์ง ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ํ ๊ฐ์ง ์๋ฃจ์ ์ ๊ฑฐ๊ธฐ์ ๋์ง ์๊ณ WebAssembly ์์ฑ์ ๋ํด ์๋นํ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ ๊ฒ์ผ ์ ์์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์ํ ์ฝ๋๋ ๊ธฐ์กด ์ปดํ์ผ๋ฌ ๋จ๊ณ ์ธ์ ์์ด์ผ ํ๋ฏ๋ก ์ ํ ์ข์ง ์์ต๋๋ค. ์ด ์๋๋ฆฌ์ค์์ ์ปดํ์ผ๋ฌ์ ํฌํฌ๋ฅผ ๊ณ ๋ คํ ์๋ ์์ต๋๋ค. ์์ปจ๋: ๋๋ ์ด๊ฒ์ด ์ผ์ด๋๋ ๊ฒ์ ๋ณด์ง ๋ชปํ๋ค.
๋์์ด ์์ ์ ์์ต๋๋ค. ํ์ํ ๊ฒ์ ๋ชจ๋ฐฉํฉ๋๋ค. ์คํ ๋จธ์ ์ ์ฌ์ฉํ์ฌ ๋ ์ง์คํฐ ๋จธ์ ์ ์๋ฎฌ๋ ์ดํธํ๊ณ ํฉ๋ฆฌ์ ์ผ๋ก ์ฑ๋ฅ์ด ์ข์ ๋ฐฉ์์ผ๋ก ์ํํ ์ ์์ต๋๋ค. WebAssembly์๋ ๋ก๋ ๋ฐ ์ ์ฅ ๋ช
๋ น์ด ์๋ ์ ํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์์ด ์ข์ต๋๋ค. ์ฐ๋ฆฌ๋ WebAssembly์ call
๋ช
๋ น์ด๋ฅผ ์ ํ ์ฌ์ฉํ์ง ์๊ณ ๋์ ์์ฒด ์คํ ๊ด๋ฆฌ ๋ฐ ํธ์ถ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํฉ๋๋ค. ์คํ์ ํด๋น ์ ํ ๋ฉ๋ชจ๋ฆฌ์ ์กด์ฌํ๋ฉฐ Go ๋ฐํ์์ ์ํด ๊ด๋ฆฌ๋ฉ๋๋ค. ์คํ ํฌ์ธํฐ๋ ์ ์ญ ๋ณ์๊ฐ ๋ฉ๋๋ค. ๋ชจ๋ ์ฝ๋๋ ๋จ์ผ WebAssembly ํจ์์ ์์ต๋๋ค. ์ต์์ ์์ค์ ๊ฐ ๊ธฐ๋ฅ์ ๋ํด ํ๋์ ๋ถ๊ธฐ๊ฐ ์๋ ๊ฑฐ๋ํ switch ๋ฌธ(๋๋ WebAssembly์ br_table
๊ธฐ๋ฐ ๋ฑ๊ฐ๋ฌผ)์ด ๋ ๊ฒ์
๋๋ค. ๊ฐ ๊ธฐ๋ฅ์๋ SSA ๊ธฐ๋ณธ ๋ธ๋ก๋น ํ๋์ ๋ถ๊ธฐ๊ฐ ์๋ ๋ ๋ค๋ฅธ ์ค์์น ๋ฌธ์ด ์์ต๋๋ค. ์ฌ๊ธฐ์ ์๋ตํ๊ณ ์๋ ๋ช ๊ฐ์ง ์ธ๋ถ ์ฌํญ์ด ์์ง๋ง ํฐ ๊ทธ๋ฆผ์์ ์ด๊ฒ์ ๋์๊ฒ ๊ด์ฐฎ์ ๋ ์ง์คํฐ ๊ธฐ๊ณ์ฒ๋ผ ๋ณด์
๋๋ค. ๋ฌผ๋ก ์ด๊ฒ์ ์ฑ๋ฅ์ WebAssembly๊ฐ ์ด๋ฌํ ๊ตฌ์ฑ์ ์ค์ ๊ธฐ๊ณ ์ฝ๋๋ก ์ผ๋ง๋ ์ ๋ณํํ ์ ์๋์ง์ ํฌ๊ฒ ์์กดํฉ๋๋ค.
๊ทธ๋ฌ๋ ๋งํด์ฃผ์ธ์. ์ ๊ฐ ์์ ํ ์์งํ๊ณ ๋ฏธ์ณค์ต๋๊น? ๊ทธ๋ฐ ๋ค์ ๋ ๋ง์ ๊ฒ์ ๋ฐฐ์ธ ๋๊น์ง ์๊ฐ์ ๋ฏธ๋ฃจ๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค. ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ์ค์ ์ ์ ๋ฌธ์์ ์์์ ์ด ๋ ์ ์์ต๋๋ค. ๊ฐ์ฌ ํด์.
Go ์ธก์์ ํ์ํ ๋ชจ๋ ์์ ์ธ์๋ Go ๋ฐํ์์ด ๋์์ ์ง์ ํ๊ธฐ ์ ์ WebAssembly๊ฐ ํ์ํ ์ ์๋ ๋ช ๊ฐ์ง ์ฌํญ์ด ์์ต๋๋ค.
WebAssembly์๋ ์์ง ์ค๋ ๋๊ฐ ์์ง๋ง ๋ก๋๋งต์ ์๊ณ ์ฌ์์ด ์์ต๋๋ค. https://github.com/WebAssembly/threads
๊ฐ๋น์ง ์์ง๊ณผ ๊ด๋ จํ์ฌ Lin Clark์ ๋ํ https://youtu.be/HktWin_LPf4?t=28m31s ์ ๋ฐ๋ฅด๋ฉด ํฅํ ์ฌ๋ฌ ์ต์ ์ด ์์ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
28:31
๋ฐ๋ผ์ ์ค๋, ์ํ๋ค๋ฉด ์ฝ๋์ ํจ๊ป ์์ ์ ๊ฐ๋น์ง ์์ง๊ธฐ๋ฅผ ์ ๊ณตํ ์ ์์ง๋ง
๋ช ๊ฐ์ง ์ด์ ๋ก ๋๋ฆฌ๊ณ ์ปค๋ฎค๋ํฐ ๊ทธ๋ฃน์์ WebAssembly ์ฝ๋๋ฅผ ๊ฐ๋ฅํ๊ฒ ๋ง๋ค๊ณ ์์ต๋๋ค.
๋ธ๋ผ์ฐ์ ์ ์ต์ ํ๋ ๋ด์ฅ GC์ ํจ๊ป ์ฌ์ฉ
์์ ์ค์ด๋ฏ๋ก ๋น ๋ฅด๊ฒ ์คํ๋๊ณ ํตํฉ์ด ๊ฐ๋ฅํฉ๋๋ค.
gomobile๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์์๋ผ ์ธ์ด ๋ค๋ฆฌ๊ฐ ์์ต๋๋ค.
@randall77 ์ ๋ํ GC์ ์๊ตฌ ์ฌํญ์ผ๋ก ์ค๋ ๋๋ฅผ ์ธ๊ธํ์ต๋๋ค. ์ด๊ฒ์ด ์ ๋ง ์ฒซ ๋ฒ์งธ ๋ฒ์ ์ ๋ํ ์ด๋ ค์ด ์๊ตฌ ์ฌํญ์ ๋๊น? ๋์์ฑ์ ๋จ์ผ ์ค๋ ๋์์๋ ์ํํ ์ ์์ต๋๋ค.
GC ๊ตฌํ๊ณผ ๊ด๋ จํ์ฌ ๋ด ๊ฐ์ธ์ ์ธ ์๊ฒฌ์ ํ๋์ GC๊ฐ ๋ชจ๋ ๊ฒ์ ์ง๋ฐฐํ๋ค๊ณ ๋ฏฟ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. Go์ Go ๊ด๋ จ GC๊ฐ ์๊ณ Python์ Python ๊ด๋ จ GC๊ฐ ์๋ ๊ฒ์ ์ ํธํฉ๋๋ค. WebAssembly์ ์ ํ ๋ฉ๋ชจ๋ฆฌ์์ ์์ฒด ํ๊ณผ ์คํ์ ์์ ํ ๊ด๋ฆฌํจ์ผ๋ก์จ ํ์ฌ ๋ณผ ์ ์๋ ํ Go๊ฐ ์ด๋ฏธ ๊ฐ์ง๊ณ ์๋ GC๋ฅผ ์ฌ์ฉํ ์ ์์ด์ผ ํฉ๋๋ค.
@neelance ๋ค, ์ฌ๋ฌ ๊ฐ์ ์ค์ WebAssembly ์ค๋ ๋๊ฐ ์์ผ๋ฉด ์ข์ ๊ฒ์ด์ง ์๊ฒฉํ ์๊ตฌ ์ฌํญ์ ์๋๋๋ค.
WebAssembly์ ๋ํ GC ์ ์์ ์์ง ์งํ ์ค์ ๋๋ค. ๊ด์ฌ ์๋ ๋น์ฌ์๋ ์ฌ๊ธฐ์์ ์ฐธ์ฌํ ์ ์์ต๋๋ค.
@neelance , ์ปดํ์ผ๋ฌ, SSA, ๊ธฐ๊ณ ์ํคํ ์ฒ ๋ฑ์ ๋ํด ์๋ ๊ฒ์ด ์์ต๋๋ค. ์ค๋ช ํ์ ๋ด์ฉ์ด ๋ฐ์ด๋๋ฆฌ ํฌ๊ธฐ์ ์ด๋ค ์ํฅ์ ๋ฏธ์น๋์ง ๋ง์ํด ์ฃผ์๊ฒ ์ต๋๊น? ๋ด๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ๊ณ ์๋ค๋ฉด ํฌ๊ธฐ ํจ์จ์ฑ์ WebAssembly์ ์์ ์์ค ๋ชฉํ ์ค ํ๋์์ต๋๋ค. ์ด Go->WebAssembly ์ปดํ์ผ๋ฌ๋ ์ฐ์ ์์ ์ค ํ๋์ฌ์ผ ํฉ๋๋ค. ๋ง์ฃ ?
@alxkchr ๋ด ๊ฒฝํ์ ๋ฐ๋ฅด๋ฉด ์ฝ๋ ์์ฑ ์์ฉ๊ตฌ๋ก ์ธํ ๋ฐ๋ณต์ gzip์ ์ ์ฉํ์ฌ ๋ง์ด ๋ณด์๋ ์ ์์ต๋๋ค. ๊ทธ๋๋ ๋ด ์ ์์ ๋ฐ์ด๋๋ฆฌ ํฌ๊ธฐ์ ๊ด๋ จํ์ฌ ๊ฐ์ฅ ํจ์จ์ ์ธ ์๋ฃจ์ ์ด ์๋๋๋ค. ๊ทธ๋๋ ํฉ๋ฆฌ์ ์ธ ์๊ฐ ์์ ๊ตฌํํ ์ ์๋ ์๋ฃจ์ ์ ์๋ฃจ์ ์ด ์๋ ๊ฒ๋ณด๋ค ๋ซ์ง ์์ต๋๊น? ;-) ๋ํ ๊ฐ์ธ์ ์ผ๋ก ๋ฐ์ด๋๋ฆฌ ํฌ๊ธฐ๋ ์ต์ฐ์ ์์๊ฐ ์๋๋๋ค.
์ฐธ๊ณ ๋ก ์ ๋ ์ด๊ฒ์ ๊ตฌํํ๊ธฐ ์์ํ์ต๋๋ค.
@neelance ์ต๊ณ ์ ๋ด์ค :) ์ฌ์์ ๋ฐ๋ฅด์ญ๋๊น? (๋๋ ํฌ๋ง)
๊ณ ์คํ? ์ผ๋ฐ Go ์ปดํ์ผ๋ฌ์ ์๋ก์ด ๋ฐฑ์๋/ํ๊ฒ์ด๋ฏ๋ก ์ฌ์์ด ์ด๋ฏธ ์์ต๋๋ค. ;)
๋๋ ์ฌ์์ ์๋ฏธํฉ๋๋ค :)
@neelance
์ฐธ๊ณ ๋ก ์ ๋ ์ด๊ฒ์ ๊ตฌํํ๊ธฐ ์์ํ์ต๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ด๋ค ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ ๊ฒ์ธ์ง ๊ณต์ ํด ์ฃผ์ญ์์ค.
์ฐ๋ฆฌ์ ํ์ฌ ๊ฒฐ๋ก ์ ํจ๊ณผ์ ์ธ ๊ตฌํ ๋ฐฉ๋ฒ์ด ์๋ค๋ ๊ฒ์ ๋๋ค.
ํ์ฌ setjmp/longjmp ๊ธฐ๋ฅ์ด๋ฏ๋ก ์คํ ๊ฐ๋ฅํ ๋์์ด ์๋๋๋ค.
gc ํฌํธ์. ์ค์ ์คํ์ด ํ๋ฆด ๋๊น์ง ๊ธฐ๋ค๋ ค์ผ ํ๊ณ
์์ธ ์ฒ๋ฆฌ ์ง์.
(https://github.com/golang/go/issues/18892#issuecomment-276858667)
@neelance : ์์ง ์ด๊ธฐ ๋จ๊ณ๋ผ๋ ๊ฒ์ ์๊ณ ์์ง๋ง wasm ์ด๋ฆ์ GOARCH wasm32
๋ก ์ง์ ํ๋ ๊ฒ์ด ๋ ํ๋ช
ํ ๊ฒ ๊ฐ์ต๋๋ค(ํจํค์ง๋ ๋ง์ฐฌ๊ฐ์ง)
@sbinet ARM ์ํคํ
์ฒ/ํจํค์ง์ ์ด๋ฆ์ด $ arm32
arm
๋ฐ arm64
(์ ์ฌํ๊ฒ mips
๋ฐ mips64
)์ด๋ผ๋ ์ ์ ๊ณ ๋ คํด ๋ณผ ๊ฐ์น๊ฐ ์์ต๋๋ค. ๋ฐ arm64
. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ด ์ข์ ์์ธ์ง ๋์ ์์ธ์ง๋ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
@SerkanSipahi ์ ๋ ์ฒ์์ V8(nodejs/chrome)์ ๋์์ผ๋ก ํ๊ณ ์์ผ๋ฉฐ ์ํํ ์์ ์ ๋ํ ๋ฌธ์๋ก https://webassembly.github.io/spec/ ์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
@stuart-warren ์, ๋ด WIP๋ ํด๋น ์ง์ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์์ง ์ฌ์ฉํ๋ ค๊ณ ์๋ํ์ง ๋ง์ญ์์ค. ์ง๊ธ์ ์ฝ๊ฒ ๊ตฌ์ถํ ์ ์์ผ๋ฉฐ ๋ณต์ฌ๋ ์ฝ๋์ ์คํ /ํต์ผ๋ก ๊ฐ๋ํฉ๋๋ค. ์ํ ์ํ๊ฐ ๋๋ฉด ์ฌ๊ธฐ์์ ๋ฐํํ๊ฒ ์ต๋๋ค.
@cznic ์์์ ์ด ๊ฒ์ฒ๋ผ ๋๋ wasm์ call
๋ช
๋ น์ด๋ฅผ ์ ํ ์ฌ์ฉํ์ง ์๊ณ ์ ํ ๋ฉ๋ชจ๋ฆฌ์์ ์์ฒด ์คํ์ ๊ด๋ฆฌํ๊ณ ์์ต๋๋ค. ๋ฐ๋ผ์ setjmp/longjmp๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค.
@sbinet ์ค์ ๋ก wasm์๋ 64๋นํธ ์ฐ์ฐ์ด ์์ผ๋ฏ๋ก 64๋นํธ ์ํคํ ์ฒ๊ฐ ๋ฉ๋๋ค.
@neelance ์์ ํ ์๋๋๋ค. WebAssembly ์ฌ์์ ํ์ฌ 32๋นํธ ์ฃผ์ ๊ณต๊ฐ๋ง ์ง์ ํ๋ฉฐ wasm64
์ฌ์์ ๋์ค์ ๊ณํ๋ฉ๋๋ค .
ํฅ๋ฏธ๋กญ๋ค์, ๋งํฌ ๊ฐ์ฌํฉ๋๋ค. ๋์ค์ ๋ค์ ์ดํด๋ณด๊ณ ์ถ์ ์๋ ์์ต๋๋ค. ํ์ฌ ๋๋ ๋ชจ๋ ๊ฒ์ 64๋นํธ ๋ณ์์ ์ ์ฅํ๋ฏ๋ก int
, uint
๋ฐ uintptr
๋ชจ๋ 64๋นํธ์ ํฌ๊ธฐ๋ฅผ ๊ฐ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฒ์ 32๋นํธ๋ง ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ ์ง์ ์ ์ฌ์ฉ๋ฉ๋๋ค. ์ด๊ฒ์ ์ฒ์์ ๊ตฌํํ๊ธฐ๊ฐ ๋ ์ฝ์ต๋๋ค.
๊ทธ๊ฒ์ wasm64p32 (nacl ๋ช
๋ช
์ ๋ฐ๋ฅด๊ธฐ ์ํด) ๋๋ ๋ฌด์ธ๊ฐ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค.
๋น์ทํ.
2017๋ 11์ 4์ผ ์ค์ 5์ 28๋ถ์ "Richard Musiol" [email protected] ์ด ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
ํฅ๋ฏธ๋กญ๋ค์, ๋งํฌ ๊ฐ์ฌํฉ๋๋ค. ๋์ค์ ๋ค์ ์ดํด๋ณด๊ณ ์ถ์ ์๋ ์์ต๋๋ค.
ํ์ฌ ๋๋ ๋ชจ๋ ๊ฒ์ 64๋นํธ ๋ณ์์ ์ ์ฅํ๋ฏ๋ก int, uint ๋ฐ uintptr
๋ชจ๋ 64๋นํธ์ ํฌ๊ธฐ๋ฅผ ๊ฐ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฒ์ 32๋นํธ๋ง ์ฌ์ฉ๋ฉ๋๋ค.
๋ฉ๋ชจ๋ฆฌ ์ฃผ์ ์ง์ . ์ด๊ฒ์ ์ฒ์์ ๊ตฌํํ๊ธฐ๊ฐ ๋ ์ฝ์ต๋๋ค.โ
์ด ์ค๋ ๋์ ๊ฐ์ ํ๊ธฐ ๋๋ฌธ์ ์ด ๋ฉ์์ง๋ฅผ ๋ฐ๊ณ ์์ต๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/golang/go/issues/18892#issuecomment-341889653 ๋๋ ์์๊ฑฐ
์ค๋ ๋
https://github.com/notifications/unsubscribe-auth/AAgwpPTbfHRmoYNXLQfcPMVnARxb0UGrks5szEpjgaJpZM4L0o7D
.
๊ทธ๊ฒ์ wasm64p32 (nacl ๋ช ๋ช ์ ๋ฐ๋ฅด๊ธฐ ์ํด) ๋๋ ๋ฌด์ธ๊ฐ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค.
๋น์ทํ.
๋๋ ์ค์ง ํ๋์ ์ํคํ ์ฒ(์ฃผ์ ๊ณต๊ฐ ํฌ๊ธฐ ์ ํ ํฌํจ)๋ง ์์ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ ๊ฐ์ ์ซ์๋ฅผ ๊ฐ๋ ๊ฒ์ด ์๋ฏธ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. webassembly.org ์์ :
wasm32์ wasm64๋ ๋ ๋ค ๋ชจ๋ ํค๋์ ํ๋๊ทธ์ ์ํด ์ ํ๋๋ WebAssembly์ ๋ชจ๋์ผ ๋ฟ์ด๋ฉฐ ์ ํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ฒ๋ฆฌ๋๋ ๋ฐฉ์ ์ด์ธ์ ์๋ฏธ๋ก ์ ์ฐจ์ด๋ฅผ ์๋ฏธํ์ง ์์ต๋๋ค.
๋๋ ์ค์ง ํ๋์ ์ํคํ ์ฒ(์ฃผ์ ๊ณต๊ฐ ํฌ๊ธฐ ์ ํ ํฌํจ)๋ง ์์ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ ๊ฐ์ ์ซ์๋ฅผ ๊ฐ๋ ๊ฒ์ด ์๋ฏธ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. webassembly.org์์:
wasm32์ wasm64๋ ๋ ๋ค ๋ชจ๋ ํค๋์ ํ๋๊ทธ์ ์ํด ์ ํ๋๋ WebAssembly์ ๋ชจ๋์ผ ๋ฟ์ด๋ฉฐ ์ ํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ฒ๋ฆฌ๋๋ ๋ฐฉ์ ์ด์ธ์ ์๋ฏธ๋ก ์ ์ฐจ์ด๋ฅผ ์๋ฏธํ์ง ์์ต๋๋ค.
์ด๋งํ๋ ๋ฐ์ธ์ ๋๋ค. ์ฌ์ค๋ก ํ๋ช ๋ ์๋ ์์ง๋ง WebAssembly CG/WG๋ ๊ทธ ์ง์ ์ด ์ ํํ๋ค๊ณ ํ์ ํ ๋งํผ wasm64๋ฅผ ์ถฉ๋ถํ ํ์ํ์ง ์์์ต๋๋ค.
@neelance๊ฐ ์๋ํ๋๋ก ํฉ์๋ค. ์ด๋ฆ์ ๋์ค์ ๋ณ๊ฒฝํ๊ธฐ ์ฝ์ต๋๋ค.
Go๊ฐ ๊ธฐ๊ณ ๋ช ๋ น(AFAIK)์ผ๋ก ์ง์ ์ปดํ์ผ๋๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง ๋๊ตฐ๊ฐ Go๋ฅผ C๋ก ์ปดํ์ผํ ์ ์ด ์๋์ง ์ค์ค๋ก ๊ถ๊ธํฉ๋๋ค. Go --> C --> wasm์ ์๋ํ๋ ๊ฒ์ ํฅ๋ฏธ๋ก์ธ ๊ฒ์ ๋๋ค(๋งค์ฐ ํจ์จ์ ์ด์ง๋ ์์ง๋ง).
@TomerHeber ์ปดํ์ผ์ด ์๋ C++๋ก์ ๋ฒ์ญ ํํ๋ก ๊ฐ๋ฅํ ์ ์์ง๋ง ์๋ง๋ ์ด๊ฒ์ wasm ์์ฒด์ ๋ํ ์ปดํ์ผ๋ณด๋ค ๋ ๋ง์ ์์ ์ด ๋ ๊ฒ์ ๋๋ค
์๋ ํ์ธ์ ์ฌ๋ฌ๋ถ. ์ฌ๊ธฐ ๋ด ์์ ์ ๋ํ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๋ค. ๋๋ ์ง๊ธ๊น์ง Go ํ๊ณผ ๊ธฐ์ฌ์๋ค์ ํ๋ฅญํ ์์ ๋๋ถ์ ๋งค์ฐ ์ข์ ์ง์ ์ ์ด๋ฃจ๊ณ ์์ต๋๋ค. ๋๋ถ๋ถ์ ์ฝ๋๋ ์ํคํ ์ฒ/ํ๋ซํผ ๊ฐ์ ๊ณต์ ๋๋ฏ๋ก ๊ตฌํํด์ผ ํ ํ์๊ฐ ์์๋ณด๋ค ๋ง์ง ์์์ต๋๋ค.
๋ค์์ ์ด๋ฏธ ์ ์๋ํ๋ ๋ช ๊ฐ์ง ๋ชฉ๋ก์ ๋๋ค.
bytes, container/heap, container/list, container/ring, encoding/ascii85, encoding/asn1, encoding/base32, encoding/binary, encoding/csv, encoding/hex, errors, flag, hash/adler32, hash/crc32, hash/crc64, hash/fnv, html, image, image/color, index/suffixarray, math, math/bits, path, sort, strconv, strings, text/scanner, text/tabwriter, unicode, unicode/utf8, unicode/utf16
์์ง ์์ ์ด ํ์ํ ๋ช ๊ฐ์ง ์ฌํญ:
๋๋ ํ ๋ฌ ๋ฐ ๋์์ ์งํ ์ํฉ์ ๋ํด ๋งค์ฐ ๊ธฐ์ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌ๊ฐ ์๊ฐ์๋ง ๊ฐ๋ฅํฉ๋๋ค. Go 1.11์ ์ด๊ฒ์ ๋ฃ์ ์ ์๋ ์ข์ ๊ธฐํ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. 1์์ ๋ค์ ์ ๋ฐ์ดํธ๋ฅผ ๊ธฐ๋ํ์ธ์. ์ ๊ฐ ํด๊ฐ๋ฅผ ๋ค๋ ์จ ํ ํด์ผ์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ด๋ฌํ ์์ ์ค ์ผ๋ถ๋ฅผ ๋ณ๋ ฌํํ ์ ์์ต๋๊น? ์ผ๋ถ ๋นํธ๋ ํด์ผ ํดํน์ ํฅ๋ฏธ๋ก์ ๋ณด์ ๋๋ค.
์์ ๋กญ๊ฒ ์ดํด๋ณด๊ณ ๋ด ํฌํฌ์ PR์ ์์ฑํ์ญ์์ค. Gophers Slack์์๋ ์ ๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.
์กฐ์ฌ ์์ญ ์ค ํ๋๋ ์คํ ์ฌ์ฉ์ ์ต์ ํํ๋ ๊ฒ์
๋๋ค. ์ง๊ธ์ ๋ ์ง์คํฐ ํ ๋น ๋จ๊ณ์์ ๋ชจ๋ ์์
์ ๋ํด ๋ ์ง์คํฐ(wasm์ ๋ก์ปฌ ๋ณ์)๋ฅผ ํ ๋นํฉ๋๋ค. get_local
๋ฐ set_local
๋ ํญ์ ๋ชจ๋ ์์
์ ํ์ ์ฌ์ฉ๋ฉ๋๋ค. ๊ฐ์ด ๋์ค์ ์ผ๋ถ ์์
์์ ์ฌ์ฉํ๊ธฐ ์ํด ์คํ์ ๋จ์ ์์ ์ ์๋ ๊ฒฝ์ฐ์๋ ํ์ํ์ง ์์ต๋๋ค. ์์ฌ ๋ ์ง์คํฐ REG_STACK
๋ฅผ ์ถ๊ฐํ๊ณ ์ด ๋ ์ง์คํฐ๊ฐ ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ ๋ช
๋ น์ด ์์ฑ๊ธฐ๊ฐ get_local
๋ฐ set_local
๋ฅผ ๊ฑด๋๋ฐ๋๋ก ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ ์ ํ ๊ฒฝ์ฐ regalloc
๊ฐ ์ด ๋ ์ง์คํฐ๋ฅผ ์ฌ์ฉํ๋๋ก ํฉ๋๋ค.
๋ต์ฅ:
๋ฉ์ง JS interop ๋ ์ด์ด
ํ์ฌ wasm์ ๋ํด ์ด๊ฒ์ ๊ตฌํํ๋ ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ด ์์ต๋๊น? ๋๋ Dom/js interop์ด wasm์ ์ฌ์ ํ ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค. ์ด๊ฒ์ด ๊ฐ๋ฅํ๋ค๋ฉด ๊ทธ๊ฒ์ ์์ฒญ๋ ๊ฒ์ ๋๋ค!
float64
๋ฐ int32
์ธ์๋ฅผ ๊ฐ์ง ์ ์๋ ํจ์๋ฅผ ๊ฐ์ ธ์ค๊ณ ๋ด๋ณด๋ผ ์ ์์ผ๋ฉฐ ๊ณต์ ์ ํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์์ต๋๋ค. ๋ค๋ฅธ ๋ชจ๋ ๊ฒ์ ๊ทธ ์ฃผ์์ ๊ตฌ์ถ๋ ์ ์์ต๋๋ค. ๊ฐ๋น์ง ์์ง ๋ง ๊ทธ๋ ๊ฒ ์ข์ง ์์ ๊ฒ์
๋๋ค.
(๋๋ ์ด๊ฒ์ (@neelance) ๋ฆฌํฌ์งํ ๋ฆฌ์ ๊ฒ์ํ๋ ค๊ณ ํ์ง๋ง ๋ฌธ์ ๋ฅผ ๊ฒ์ํ๋ ๋ฐฉ๋ฒ์ ์ ์ ์์์ต๋๋ค...)
js.foo
ํธ์ถ/๊ฐ์ ธ์ค๊ธฐ ๋์ wabt
ํด์ฒด์ธ์ ์ฌ์ฉํ ์ ์์ต๋๊น?
์ ์ฒด nodejs
์ค์น ๋์ wabt
์ ์ํธ ์์ฉํ๋ ๊ฒ์ด ๋ ์ฝ๋ค๋ ๊ฒ์ ์์์ต๋๋ค. :)
(์ฌ๊ธฐ์ a.wasm
๋ก ๋ฒ์ญ๋ ๊ฐ๋จํ main.go
ํ๋ก๊ทธ๋จ๋ ํด์ํ๋ ค๊ณ ํฉ๋๋ค: go-interpreter/wagon#36...)
๋ด ํฌํฌ์์ ๋ฌธ์ ๋ฅผ ํ์ฑํํ์ต๋๋ค. ์์ ๋กญ๊ฒ ๊ฒ์ํ์ธ์.
๋๋ ๋น์ ์ ์ง๋ฌธ์ ์ ๋ง๋ก ์ดํดํ์ง ๋ชปํฉ๋๋ค. wasm-interp
๋ง์ํ์๋ ๊ฑด๊ฐ์? wasm ๋ฐ์ดํธ์ฝ๋๋ฅผ ์ปดํ์ผ ๋ฐ ์คํํด์ผ ํ๊ณ ๋๋จธ์ง ์์คํ
๊ณผ ์ํธ์์ฉํ ์ ์๋ JS ํ๊ฒฝ์ด ํ์ํฉ๋๋ค(์: ์ฝ์๋ก ์ธ์ํ๊ธฐ).
์ด๊ฒ์ ํ๋ฅญํฉ๋๋ค. Go to wasm์ ์ปดํ์ผํ๊ณ ์คํํ๋ ค๋ ์ฌ๋๋ค์ ์ํด -
GOOS=js GOARCH=wasm ./bin/go build -o out.wasm wasm.go
./misc/wasm/go_js_wasm_exec out.wasm
์ฆ๊ธฐ๋ค !
go_js_wasm_exec
๋ฅผ PATH์ ์ฐ๊ฒฐํ๋ฉด go run
๋ฅผ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. ;-)
์ฌ๋ฌ๋ถ, Go for WASM์ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ํฉ์ ์ด๋ป์ต๋๊น? ์ฐ๋ฆฌ ๋ Crystal์ ๊ฐ์ ธ์ค๋ ๊ฒ์ ๋ํด ์ด์ผ๊ธฐํ๊ธฐ ์์ํ์ผ๋ฉฐ Crystal์ Go๊ฐ ํ์ฌ GC์ ๋์ผํ ๋ฌธ์ ๋ฅผ ๊ณต์ ํ๊ณ ์๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค. ์ด ์ํฉ์์ WebAssembly ์์ ๊ทธ๋ฃน์ ํ๋ ฅํ๊ฑฐ๋ ๋์ธ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
์์ ์ธ๊ธ๋ ์ค๋ ๋์ ์์ ๋กญ๊ฒ ์ฐธ์ฌํ๊ฑฐ๋ ์ด ๋ฌธ์ ์ ๋ํด ์ฑํ /ํ์ ํ ์ ์๋ ๊ณณ์ ์๋ ค์ฃผ์ญ์์ค.
WASM์ด ์ด ์์ญ์์ ์ฑ์ํ๊ธฐ ์ ๊น์ง๋ ํ์ฌ๋ก์๋ Opal ๊ฒฝ๋ก๊ฐ ๋ ๊ฑด์ ํ ์ ๊ทผ ๋ฐฉ์์ผ ์ ์์ง๋ง ๊ทธ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ๊ฐ๊ธฐ ์ ์ ํ์คํ ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
์๋ ํ์ธ์ ์ฌ๋ฌ๋ถ, ๋ง์ ๊ธฐ๋ณธ ์ฝ๋๊ฐ ๊ด๋ จ์ด ์๋ค๊ณ ์๊ฐํ ์ดํ๋ก ์ง๋ ๋ช ๋ฌ ๋์ ์์ ํ ๋ด์ฉ์ ๊ณต์ ํ๊ณ ์ถ์์ต๋๋ค. https://github.com/matthewmueller/joy
์ง๊ธ์ JS(ES3)๋ฅผ ๋์์ผ๋ก ํ๊ณ ์์ง๋ง ์ปดํ์ผ๋ฌ๋ ๋ชจ๋ ์ ์ธ(ํจ์, ๋ณ์ ๋ฑ)์ ๋ํด ์ข ์์ฑ ๊ทธ๋ํ๋ฅผ ๊ตฌํํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๊ทธ๋ํ๋ฅผ ์ ๋ ฌํ๊ณ ํ๋ก๊ทธ๋จ์์ ์ฌ์ฉ๋๋ ์ ์ธ๋ง ๋ณํํฉ๋๋ค.
์ด ๊ทธ๋ํ๋ฅผ ์ฌ์ฉํ์ฌ WebAssembly๋ฅผ ๋์์ผ๋ก ํ๋ ๊ฒ์ ๊ทธ๋ฆฌ ์ด๋ ต์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ ๋ ์ ๊ฐ ํ ์ ์๋ ํ ์ด๋ป๊ฒ๋ ๋๊ณ ํ๋ ฅํ๊ณ ์ถ์ต๋๋ค.
์์ธํ ๋ด์ฉ์ ๊ด๋ จ ๋งํฌ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
์์ Crystal์ ๋ํ GC ๋ฌธ์ ์ ๊ด๋ จํ์ฌ Go์ ๋ํ ์์ฉ ํ๋ก๊ทธ๋จ์ด ์์ ์๋ ์์ต๋๋ค. @kripken ์ ์ค๋ช ๊ณผ ๋ค์ ํ ๋ก ์ ์ฐธ๊ณ ํ์ธ์. https://github.com/WebAssembly/binaryen/issues/1312#issuecomment -348409211
์ ์ฌ์ ์ผ๋ก https://github.com/AppCypher/webassemblylanguage?
๋ชจ๋๋ค ์ฆ๊ฑฐ์ด ์ฐํด ๋ณด๋ด์ จ๊ธธ ๋ฐ๋๋๋ค. ์ฝ์๋ ์ ๋ฐ์ดํธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋ง์ง๋ง ์ ๋ฐ์ดํธ ์ดํ๋ก ๋ฐ์ฌ, ์คํ ์ฆ๊ฐ ๋ฐ ๊ฐ๋น์ง ์์ง์ ์์ํ๊ณ ์คํํ ์ ์์์ต๋๋ค. ์ถ๊ฐ ๊ฐ์ ์ฌํญ์ผ๋ก 136๊ฐ์ stdlib ํจํค์ง ์ค 104๊ฐ์ ํ ์คํธ๊ฐ ํ์ฌ ํต๊ณผํ๊ณ ์์ต๋๋ค. ๋ํ ๋ง์ ์ปดํ์ผ๋ฌ ํ ์คํธ๊ฐ ๋ น์์ ๋๋ค. ์ข์ ์งํ!
์ ๋ ํ์ฌ ๊ธฐ๋ฅ ์ง์ ๋ฐ ์ ํ์ฑ์ ์ง์คํ๊ณ ์์์ ๋ช ์ฌํ์ญ์์ค. ์์ง ์ฑ๋ฅ์ด๋ ์ถ๋ ฅ ํฌ๊ธฐ์ ๋ํ ์ต์ ํ๋ฅผ ์ํํ์ง ์์์ต๋๋ค.
๋๋ ์คํ์ ๋ฐ์๋ฅผ ๋ณด๋
๋๋ค. (๊ทธ๋ฆฌ๊ณ Promise
์ ๋นํด ๋ฐ์ด๋ ๊ณ ๋ฃจํด์ ๋ํ GopherJS์ @neelance ty , ๋น์ ์ ์๋ง๋ ์ ๋ฅผ C++์์ ๊ตฌํด ๋์ ๊ฒ์
๋๋ค!), ๊ทธ๋์ ๋ค์์ ๋จ์ง ์ ์ฌ์ ์ผ๋ก ์ ์ฉํ ์ ๋ณด๋ฅผ ์ถ๊ฐํ๋ ค๋ ์๋์ผ ๋ฟ์
๋๋ค. ์๋ง๋ Go์ WASM ๋์ ๊ฐ์ ๋ถ์ผ์น์ ๋ํ ์ธ์์ ๋์ด๊ธฐ ์ํด์์ผ ์๋ ์์ต๋๋ค. ๋ํ ์ ์ฌ์ ์ผ๋ก ์ผ๋ถ ๋
์๋ฅผ ์ํด ๋ฌธ์ ๋ฅผ ๋ช
ํํ ํ ์ ์์ต๋๋ค. ๋ํ ๊ณ ๋ฃจํด๊ณผ ๊ฐ์ ๊ฒ์ WASM์ผ๋ก ์ปดํ์ผํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๋
๋ฆฝ์ ์ผ๋ก ์๊ฐํ ๋ ์ฐพ์ ๋ค์ @rossberg ์ธ์ฉ๋ฌธ์ ๋คํํ ์ ์ ํ ์ฅ์๋ฅผ ์ํ๊ธฐ ๋๋ฌธ์
๋๋ค.
@neelance ๋ ๋ค์๊ณผ ๊ฐ์ด ๋๋ต ํ์ต๋๋ค.
@cznic์ ๋ค์๊ณผ ๊ฐ์ด ๋๋ต ํ์ต๋๋ค.
@neelance ๋ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค .
WebAssembly์
call
๋ช ๋ น์ ์ ํ ์ฌ์ฉํ์ง ์๊ณ ๋์ ์์ฒด ์คํ ๊ด๋ฆฌ ๋ฐ ํธ์ถ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํฉ๋๋ค. ์คํ์ ํด๋น ์ ํ ๋ฉ๋ชจ๋ฆฌ์ ์กด์ฌํ๋ฉฐ Go ๋ฐํ์์ ์ํด ๊ด๋ฆฌ๋ฉ๋๋ค. ์คํ ํฌ์ธํฐ๋ ์ ์ญ ๋ณ์๊ฐ ๋ฉ๋๋ค. ๋ชจ๋ ์ฝ๋๋ ๋จ์ผ WebAssembly ํจ์์ ์์ต๋๋ค. ์ต์์ ์์ค์ ๊ฐ ๊ธฐ๋ฅ์ ๋ํด ํ๋์ ๋ถ๊ธฐ๊ฐ ์๋ ๊ฑฐ๋ํ switch ๋ฌธ(๋๋ WebAssembly์br_table
๊ธฐ๋ฐ ๋ฑ๊ฐ๋ฌผ)์ด ๋ ๊ฒ์ ๋๋ค. ๊ฐ ๊ธฐ๋ฅ์๋ SSA ๊ธฐ๋ณธ ๋ธ๋ก๋น ํ๋์ ๋ถ๊ธฐ๊ฐ ์๋ ๋ ๋ค๋ฅธ ์ค์์น ๋ฌธ์ด ์์ต๋๋ค.๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ด๋ค ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ ๊ฒ์ธ์ง ๊ณต์ ํด ์ฃผ์ญ์์ค.
@minux ๋ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค .
์ฐ๋ฆฌ์ ํ์ฌ ๊ฒฐ๋ก ์ ํจ๊ณผ์ ์ธ ๊ตฌํ ๋ฐฉ๋ฒ์ด ์๋ค๋ ๊ฒ์ ๋๋ค.
ํ์ฌ setjmp/longjmp ๊ธฐ๋ฅ์ด๋ฏ๋ก ์คํ ๊ฐ๋ฅํ ๋์์ด ์๋๋๋ค.
gc ํฌํธ์. ์ค์ ์คํ์ด ํ๋ฆด ๋๊น์ง ๊ธฐ๋ค๋ ค์ผ ํ๊ณ
์์ธ ์ฒ๋ฆฌ ์ง์.@cznic ์์์ ์ด ๊ฒ์ฒ๋ผ ๋๋ wasm์
call
๋ช ๋ น์ด๋ฅผ ์ ํ ์ฌ์ฉํ์ง ์๊ณ ์ ํ ๋ฉ๋ชจ๋ฆฌ์์ ์์ฒด ์คํ์ ๊ด๋ฆฌํ๊ณ ์์ต๋๋ค. ๋ฐ๋ผ์ setjmp/longjmp๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค.
WASM์ "๊ณต๋ ๋์์ด๋" ๋ฐ "์ฌ์ ์์ฑ์" ์ ๋ฐ๋ฅด๋ฉด call
์ ๋ํ ์ ํ์ Go์ ์ ํฉํ์ง ์์ผ๋ฉฐ ๋ณด์/์์ ๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค.
@rossberg ๋ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค .
๋ฐํ ์ฃผ์(*)๋ฅผ ๊ตฌ์ฒดํํ ๋ฐฉ๋ฒ์ด ์๊ธฐ ๋๋ฌธ์ ํธ์ถ ์คํ์ ์ฝ๊ฒ "๊ต์ฒด"ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํ์ํ ๊ฒฝ์ฐ ์ ํ ๋ฉ๋ชจ๋ฆฌ์์ ๋ก์ปฌ ๋ณ์์ ๋ํ ์๋ ์คํ์ ๊ตฌํํ ์ ์์ต๋๋ค.
์ฌ์ค, WebAssembly๋ ํ์ฌ ๋ด์ฅ "์คํ"์ ๊ฐ๋ ์ ์ ํ ๋ ธ์ถํ์ง ์์ต๋๋ค. ๋ค๋ฅธ ๋ง์ ๋์์ธ ๊ฒฐ์ ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ด๊ฒ์ด ์ค์ํฉ๋๋ค. Wasm์ ์น์์ ์คํ๋๊ธฐ ๋๋ฌธ์ "์์ "ํด์ผ ํฉ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ ํ์ด ์ง์ ๋๊ณ , ์ ์๋์ง ์์ ๋์์ด ์์ผ๋ฉฐ, ์ฝ๋๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ๋ถ๋ฆฌ๋๊ณ (์ฃผ์๋ฅผ ์ง์ ํ ์ ์์), ํจ์ ์ ํ์ ๋ํ ์บ์คํธ๊ฐ ํ์ธ๋ฉ๋๋ค. ํจ์์ ๋ช ์์ ๊ฐ๋ ์ ๊ฐ๋ ๊ฒ์ ํจ๊ณผ์ ์ธ ๋ ์ง์คํฐ ํ ๋น, ๋ณ๋ ฌ ๋๋ ์ง์ฐ๊ณผ ๊ฐ์ ๋ค๋ฅธ ์ด์ ๋ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ์ปดํ์ผ, ์ ์ฉํ ๋๋ฒ๊ทธ ๋๊ตฌ ๋ฑ
์ ์ด ํ๋ฆ์ ์ค์ ๋ก ๋ฐ๊ตฌ์กฐ์ ์ ๋๋ค. ๋ถ๊ธฐ๋ ์ค์ ๋ก ์ค๋จ๋๊ณ ๊ณ์๋ ๋ฟ์ด๋ฏ๋ก ์ถ์ํ ์ ์๋ ์ ์ด ํ๋ฆ์ ๊ตฌ์ฑํ ์ ์์ต๋๋ค. ๊ทธ๊ฒ๋ ํน์ง์ ๋๋ค.
[โฆ]
(*) ์ ์ฒด ํ๋ก๊ทธ๋จ์ ๋จ์ผ ๋ฃจํ ํจ์๋ก ์ปดํ์ผํ์ฌ ์ธ๋ฑ์ค๊ฐ ์๋ ๋ช ์์ ๋ฐํ ์ฃผ์๋ฅผ ๊ฑฐ๋ํ ํ ์ด๋ธ ์ ํ๋ก ์๋ฎฌ๋ ์ดํธํ ์ ์์ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ์๋ง๋ ๊ฝค ๋๋ฆฌ๊ณ WebAssembly ์ํ๊ณ์ ๋ง์ ๋ถ๋ถ์ ๋ฌด๋๋จ๋ฆด ๊ฒ ์ ๋๋ค.
๋ฐ๋ผ์ @neelance ๊ฐ ์๋ํ๋ WASM ์ํ๊ณ์์ ์ฑ๋ฅ ๋ฐ ์ํธ ์ด์ฉ์ฑ์ ์ฐจ์ ์ฑ ์ด ๋ ๊น์?
@neelance์ GopherJS ์ฑ๋ฅ ์ต์ ํ ๊ธฐ์ ์ ์ธ์ฉํฉ๋๋ค.
"WASM ์ํ๊ณ์์ ์ํธ ์ด์ฉ์ฑ"์ด ๋ฌด์์ ์๋ฏธํ๋์ง ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ ์ด์ ๋ํด ์ธ๊ธํ ์ ์์ต๋๋ค. ์ฑ๋ฅ๊ณผ ๊ด๋ จํ์ฌ ๋ค์๊ณผ ๊ฐ์ด ๋งํ ์ ์์ต๋๋ค.
์, ํ์ฌ ์ ๊ทผ ๋ฐฉ์์ WebAssembly์์ ์ ์ด ํ๋ฆ์ ํํํ๋ ๊ฐ์ฅ ์ต์ ์ ๋ฐฉ๋ฒ์ ์๋์ง๋ง ์ค๋๋ ์๋ํฉ๋๋ค. ์๋ง๋ ๋ฏธ๋์๋ WebAssembly์ call
๋ช
๋ น์ด๋ฅผ ๋ ๋ง์ด ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ๋ฅํ ๊ฒ์
๋๋ค. ํ์ง๋ง ์ด๋ฅผ ์ํด์๋ WebAssembly๊ฐ ๋ช ๊ฐ์ง ๊ธฐ๋ฅ์ ๋ ์ถ๊ฐํด์ผ ํ๋ฉฐ Go ์ธก์์ ๋ ๋ง์ ์์
์ด ํ์ํฉ๋๋ค. ๋๋ 100%๊ฐ ์์ง๋ง ๊ฐ์์ ๋ถ๊ณผํ ๊ฒ๋ณด๋ค ์ค์ ๋ก ์๋ํ๋ ์ฑ๋ฅ์ 80%๊ฐ ์๋ ๊ฒ์ ์ํฉ๋๋ค. ;-)
๋ ์์ธํ ๊ธฐ์ ์ ๋ณด์ ๊ด์ฌ์ด ์์ผ์๋ฉด https://invite.slack.golangbridge.org/์ #webassembly์์ ์ ์๊ฒ ์ด์ผ๊ธฐํ์ญ์์ค.
"WASM ์ํ๊ณ์์ ์ํธ ์ด์ฉ์ฑ"์ด ๋ฌด์์ ์๋ฏธํ๋์ง ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ ์ด์ ๋ํด ์ธ๊ธํ ์ ์์ต๋๋ค.
์๋ง๋ @rossberg ๊ฐ _"WebAssembly ์์ฝ์์คํ
์ ๋ง์ ๋ถ๋ถ์ ๋ฌผ๋ฆฌ์น๋ค"_๋ก ์ธ๊ธํ ๊ฒ์ call
๋ฐ ๋ณดํธ๋ ํธ์ถ ์คํ์ ๋ณธ์ง์ ์ผ๋ก ์๋ฎฌ๋ ์ด์
ํ์ง ์๋ ์์ฝ์์คํ
์ ๋๊ตฌ ๋ฐ ๊ธฐํ ์ธ์ด์์ ์ํธ ์ด์ฉ์ฑ์
๋๋ค. switch
ํ
์ด๋ธ์ ์ฌ์ฉํ๋ ์์ ์ ์ฐ์ ์์
?
ํ์ง๋ง ์ด๋ฅผ ์ํด WebAssembly๋ ๋ช ๊ฐ์ง ๊ธฐ๋ฅ์ ๋ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
๋๋ WASM Promise
๊ณ ๋ฃจํด(๋
น์ ์ค๋ ๋)์ด ์๋ ์ธ์ด๋ฅผ ๋ ์ ์์ฉํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๋๋ 100%๊ฐ ์์ง๋ง ๊ฐ์์ ๋ถ๊ณผํ ๊ฒ๋ณด๋ค ์ค์ ๋ก ์๋ํ๋ ์ฑ๋ฅ์ 80%๊ฐ ์๋ ๊ฒ์ ์ํฉ๋๋ค. ;-)
์ค, ์ ์ ์ผ๋ก ๋์ํฉ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ด์ ๊ฒ์๋ฌผ์ ๊ทํ์ ๋ง์ ๋ ธ๋ ฅ์ ๋ฐ์๋ฅผ ๋ณด๋ ๋๋ค.
์น/WASM์์ ๋ ๋์ค์ ์ผ์๋ก Go ๋๋ ๋
น์ ์ค๋ ๋๊ฐ ์๋ ๋ค๋ฅธ ์ธ์ด๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ๊ถ๊ทน์ ์ผ๋ก ๋ ๋์ ์ฑ๋ฅ์ ์ํด ๋ ๋์ WASM ๊ธฐ๋ณธ ์์(์: gcc์ -fsplit-stack
?)๋ฅผ ์ป์ ๊ฐ๋ฅ์ฑ์ด ๋ ๋์์ง๋๋ค. .
๊ทํ์ ๊ตฌํ์ด WASM์ ํ์ฌ ํ๊ณ ๋ด์์ ์ต์ ์ ์ฑ๋ฅ์ 80%๋ฅผ ์ง์ ์ผ๋ก ๋ฌ์ฑํ๋ค๋ฉด ๋๋ ์ฆ๊ฒ๊ฒ ๋๋ ๊ฒ์
๋๋ค. ์ฑ๋ฅ ๊ฒฐ๊ณผ๊ฐ ์ง๋์น๊ฒ ๋์๋ฉด JavaScript Promise
์ฝ๋ฐฑ ๊ธฐ๋ฐ ๋ชจ๋ธ์ ๋นํด ๊ทธ๋ฆฐ ์ค๋ ๋์ ์ธ๊ธฐ๋ฅผ ์
์ฆํ๋ ๋ฐ ์ ํ์ด ์์ ์ ์์ต๋๋ค("WebAssembly ์์ฝ์์คํ
์ ๋๋ถ๋ถ์ ๋ฌด์ฐ๋ฅธ๋ค"๋ ์์ด๋ฌ๋์ ๊ฐ๋ฅ์ฑ์ด ์๋ค๊ณ ๊ฐ์ ํ๋ค๋ฉด). ๋์์ธ์ JavaScript ์ต์ ํ์ ๋ํ ์ฐ์ ์์์ ์ํด ์ฃผ๋๋์์ต๋๋ค :-) .
๋ํ ์ ๋ typeclass ์ ๋ค๋ฆญ์ Go์ ํธ๋์คํ์ผ๋ฌ๋ก ์ถ๊ฐํ๋ ๊ฒ์ ๊ณ ๋ คํ๊ณ ์์ต๋๋ค(๊ทธ๋ฆฌ๊ณ Go 2์ ๋ํ ์ ๋ค๋ฆญ ์ ์์ ๋ํ ๋ถ์ ์ ๊ณต). ์ธ๊ธฐ.
@shelby3 ํ ์คํธ๋ฅผ ์ฝ์ ์ ์์ ์ ๋๋ก ์๊ฒ ๋ง๋๋ ์์ ์ฌ์ฉ์ ์ค์งํ์ญ์์ค. ์ด๋ค ๊ฒ์ด ์ฌ๋๋ค์ด ์ฝ์ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํ๋ค๋ฉด ์ ์ด์ ์ฐ์ง ๋ง์ญ์์ค. ์จ๊ฒจ์ง ๋ด์ฉ์ ๋ํ ํํธ๋ฅผ ์ ๊ณตํ์ง ์๊ณ ์ฝ์ ์ ์๋๋ก ๋ง๋๋ ๊ฒ์ ๋ ์๊ฐ ์ํธ๋ฅผ ํด๋ ํ๋ ๋ฐ ๋ ๋ฐฐ(๋๋ ๊ทธ ์ด์) ์๊ฐ์ ์๋นํ๊ฒ ๋ง๋ญ๋๋ค. ์๋ ์๋์ ๋ฐ๋๋ผ๊ณ ์๊ฐํฉ๋๋ค.
@shelby3 ์์ ํ ์คํธ ์์์ ์ฌ์ฉํ์ง ์๋๋ก ๊ฒ์๋ฌผ์ ์์ ํ์ต๋๋ค. ๊ทธ๋ง ํ์ธ์.
https://golang.org/cl/102835 ์์ ์ด ๋ฌธ์ ๋ฅผ ์ธ๊ธ ๋ณ๊ฒฝ: go/build, cmd/dist: add js/wasm architecture
https://golang.org/cl/103255 ์์ ์ด ๋ฌธ์ ๋ฅผ ์ธ๊ธ ๋ณ๊ฒฝ: wasm: add scripts for running WebAssembly binaries
https://golang.org/cl/103256 ์์ ์ด ๋ฌธ์ ๋ฅผ ์ธ๊ธ ๋ณ๊ฒฝ: cmd/compile: add SSA config options noAvg and noHmul
https://golang.org/cl/103275 ์์ ์ด ๋ฌธ์ ๋ฅผ ์ธ๊ธ ๋ณ๊ฒฝ: cmd/compile/internal/gc: factor out beginning of SSAGenState.Call
๋ณ๊ฒฝ https://golang.org/cl/103295 ์์ ์ด ๋ฌธ์ ๋ฅผ ์ธ๊ธํฉ๋๋ค. cmd/compile: add wasm architecture
๋ณ๊ฒฝ https://golang.org/cl/103535 ์์ ์ด ๋ฌธ์ ๋ฅผ ์ธ๊ธํฉ๋๋ค. cmd/compile: wasm stack optimization
https://golang.org/cl/103795 ์์ ์ด ๋ฌธ์ ๋ฅผ ์ธ๊ธ ๋ณ๊ฒฝ: cmd/link: add wasm architecture
https://golang.org/cl/103877 ์์ ์ด ๋ฌธ์ ๋ฅผ ์ธ๊ธ ๋ณ๊ฒฝ: runtime: add js/wasm architecture
https://golang.org/cl/103915 ์์ ์ด ๋ฌธ์ ๋ฅผ ์ธ๊ธ ๋ณ๊ฒฝ: internal/bytealg: add wasm architecture
์ข์, ๋ง์ CL์ด ๋ ์๊ฐ๊ธฐ ์์ํ ๊ฒ ๊ฐ๋ค.
์ด์ ์ ์ฑ
๊ณผ ๊ด๋ จํ์ฌ ์ฐ๋ฆฌ๋ ์ด๋ป๊ฒ ํ๊ณ ์์ต๋๊น: https://github.com/golang/go/wiki/PortingPolicy ?
ํนํ, ๊ฑด์ถ์
์๋ ์ด๋ค ๋ชจ์ต์ผ๊น์?
@neelance ์์ ํฌํธ ์ ์ง ๊ด๋ฆฌ์ ๊ฐ์
ํ๋ค๊ณ ๊ฐ์ ํฉ๋๊น?
(CL ์ค ํ๋๊ฐ ์ด ๋ชจ๋ ๊ฒ์ ์ฒ ์ํ ๊ฒฝ์ฐ ์ฌ๊ณผ๋๋ฆฝ๋๋ค. ์ ๋ ๋ชจ๋ ์ฝ์ง ์์์ต๋๋ค.)
์, ํญ๊ตฌ๋ฅผ ์ ์งํ๊ฒ ์ต๋๋ค. @bradfitz ๋ ํ์ฌ ๋น๋ ์ค์ ์ ๊ฒํ ์ค์ ๋๋ค.
https://golang.org/cl/106995 ์์ ์ด ๋ฌธ์ ๋ฅผ ์ธ๊ธ ๋ณ๊ฒฝ: sync/atomic: add wasm architecture
https://golang.org/cl/106996 ์์ ์ด ๋ฌธ์ ๋ฅผ ์ธ๊ธ ๋ณ๊ฒฝ: math: add wasm architecture
https://golang.org/cl/106997 ์์ ์ด ๋ฌธ์ ๋ฅผ ์ธ๊ธ ๋ณ๊ฒฝ: time: add wasm architecture
https://golang.org/cl/106998 ์์ ์ด ๋ฌธ์ ๋ฅผ ์ธ๊ธ ๋ณ๊ฒฝ: mime: add wasm architecture
https://golang.org/cl/109195 ์์ ์ด ๋ฌธ์ ๋ฅผ ์ธ๊ธ ๋ณ๊ฒฝ: syscall/js: add package
https://golang.org/cl/109976 ์์ ์ด ๋ฌธ์ ๋ฅผ ์ธ๊ธ ๋ณ๊ฒฝ: syscall: enable some nacl code to be shared with js/wasm
https://golang.org/cl/109977 ์์ ์ด ๋ฌธ์ ๋ฅผ ์ธ๊ธ ๋ณ๊ฒฝ: os: add js/wasm architecture
https://golang.org/cl/109995 ์์ ์ด ๋ฌธ์ ๋ฅผ ์ธ๊ธ ๋ณ๊ฒฝ: net: add js/wasm architecture
https://golang.org/cl/110095 ์์ ์ด ๋ฌธ์ ๋ฅผ ์ธ๊ธ ๋ณ๊ฒฝ: crypto: add js/wasm architecture
https://golang.org/cl/110096 ์์ ์ด ๋ฌธ์ ๋ฅผ ์ธ๊ธ ๋ณ๊ฒฝ: all: skip unsupported tests for js/wasm
๋ณ๊ฒฝ https://golang.org/cl/112736 ์์ ์ด ๋ฌธ์ ๋ฅผ ์ธ๊ธํฉ๋๋ค. env/js-wasm, dashboard: add start of a js-wasm builder
https://golang.org/cl/113515 ์์ ์ด ๋ฌธ์ ๋ฅผ ์ธ๊ธ ๋ณ๊ฒฝ: misc/wasm: make wasm_exec.js more flexible
Go ๋ฌธ์์ ์น ์ด์
๋ธ๋ฆฌ ์ํคํ
์ฒ, ํนํ Node์ 'fs' ๋ชจ๋์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ JavaScript syscall ๊ตฌํ์ ๋ํ ์น ์ด์
๋ธ๋ฆฌ ์ํคํ
์ฒ๋ฅผ ์ฝ์ ํ ๋ธ๋ผ์ฐ์ ์ธก์์๋ ๋๋ถ๋ถ ๊ตฌํ๋์ง ์์์ต๋๋ค. _new_ ๋ธ๋ผ์ฐ์ API? ํนํ, FileSystem API ์ฌ์์ ์ ์ด๋ ์ผ๋ถ ์์คํ
ํธ์ถ์ ์ง์ํ ์ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค. (FileSystem์ ์ฌ์ ํ โโEditor's Draft์ด๋ฉฐ FireFox, Chrome ๋ฐ Opera์์๋ง ๊ตฌํ๋ฉ๋๋ค. ๋ํ ํ์์ ๋ ๊ฐ์ง์ ์ ๋์ฌ๊ฐ 'webkit-'์
๋๋ค.)
์ด๊ฒ์ด ๊ด์ฐฎ์ ์ ๊ทผ ๋ฐฉ์์ด๋ผ๊ณ ์๊ฐํ๋ค๋ฉด ๊ฐ๋
์ฆ๋ช
์ ์๋ํ ์ ์์ต๋๋ค.
https://golang.org/cl/114197 ์์ ์ด ๋ฌธ์ ๋ฅผ ์ธ๊ธ ๋ณ๊ฒฝ: runtime, sycall/js: add support for callbacks from JavaScript
์๋
ํ์ธ์ ์ฌ๋ฌ๋ถ, ์ ๋ @neelance ๊ฐ ์ํํ ์์
์ ์ฌ๋ํ๊ณ ์์ผ๋ฉฐ ์ด WASM ๊ตฌํ(์: ์ฒซ ๋ฒ์งธ ๋ฆด๋ฆฌ์ค)์ผ๋ก cgo
๋ ์ฌ์ฉํ ์ ์๋์ง ๊ถ๊ธํฉ๋๋ค. C ์ฝ๋๋ฅผ ํฌํจํ๊ณ GO๋ก ์ปดํ์ผํ๊ณ WASM์ผ๋ก ์ปดํ์ผํฉ๋๋ค. ๊ทธ๊ฒ์ ๋น์ด๋จน์ ์ด๊ฐ๋๊ตญ์ด ๋ ๊ฒ์
๋๋ค. ๋น์ ์ ๋ชจ๋ ๋ฉ์ง ์ผ์ํ๊ณ ์์ต๋๋ค. ์์ฒญ๋.
@cmaster11 ๋ง์ ์ ๋์
จ๋ค๋ ๋คํ์
๋๋ค. :) ๊ทํ์ ์ง๋ฌธ์: cgo
๋ C๋ฅผ Go๋ก ์ปดํ์ผํ์ง ์๊ณ ๋์ ๋ ์ธ์ด๋ฅผ ๊ฐ๊ฐ์ ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ๊ณ์ด๋ก ์ปดํ์ผํ ๋ค์ ๊ฒฐ๊ณผ๋ฅผ ๋จ์ผ ๋ฐ์ด๋๋ฆฌ๋ก ๋ณํฉํฉ๋๋ค. ์ด๋ฏธ emscripten์ ์ฌ์ฉํ์ฌ C ์ฝ๋๋ฅผ WebAssembly๋ก ์ปดํ์ผํ ์ ์์ต๋๋ค. ์ด๋ก ์์ผ๋ก๋ ๋ฐํ์์ ๋ WebAssembly ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋ก๋ํ๊ณ ์ํธ ์์ฉํ ์ ์์ด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ Go ํ๋ก์ ํธ๊ฐ ๊ฐ๊น์ด ์ฅ๋์ ์ด ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ด์งํ๋ ๋ฐ ์๊ฐ์ ํ ์ ํ ๊ฒ ๊ฐ์ง๋ ์์ต๋๋ค.
๋๋ถ๋ถ ๋ฐ๋ ๋์ผ ์ธ๋์ธ ๋ฏ
@shelby3 ๋๋ ์๋ง๋ ๋น์ ๋ณด๋ค ๋์ด๊ฐ ๋ง๊ณ ๋น์ ์ ๋ฐ๋ํฉ๋๋ค. ์ฌ๊ธฐ์ ๋ฌธ์ ๋ ๋จ์ํ ์์ฌ ์ํต ๋ฅ๋ ฅ์ด ์๋ค๋ ๊ฒ์ ๋๋ค.
๊ถ๋ ฅ์ ๋ฌธ์ ๊ฐ ์๋๋๋ค. @andybons ๋ ์ค์ ๋ก ๋ค๋ฅธ ์ฌ๋๋ค์ด ์ฝ์ ์ ์๋๋ก ๊ฒ์๋ฌผ์ ํธ์งํ์ฌ ๊ทํ์๊ฒ ํธ์๋ฅผ ๋ฒ ํ์์ต๋๋ค.
webidl์ด ์๋ js/wasm ์ง์์ ์น ๋ธ๋ผ์ฐ์ ๋ด์์ ๋ค๋ฅธ ์ธ์ด์ ๋ง์ ์ํธ ์ด์ฉ์ด ๋ถ๊ฐ๋ฅํจ์ ์๋ฏธํฉ๋๋ค. was Architecture๋ webidl์ ๋ํด ์ธ๊ธํ์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ด C++ Foo ํด๋์ค์ ์ ์ฉํ์ ๋ emscripten webidl python ๋๊ตฌ๋ฅผ ์ ์ดํด๋ณด์์ต๋๋ค.
Foo ํด๋์ค์ ๊ฐ์ ๋ฐฉ์์ผ๋ก webidl์ ํตํด golang duck ์ ํ์ด ๋
ธ์ถ๋๋ ๊ฒ์ ๋ณด๊ณ ์ถ์ต๋๋ค.
๊ทธ ๊ทผ๊ฑฐ๋ ๋์์ ๋ก๋๋๋ ๋ค๋ฅธ wasm ๋ชจ๋๊ณผ ์ํธ ์ด์ฉ๋์ง๋ง ๋ง์ฌ๋ง ์คํ
์ ํฌํจํ๊ณ ํธ์ถํ ์ ์์ผ๋ ค๋ฉด idl์ ์ฌ์ฉํ ์ ์์ด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ค๋ฅธ wasm ํ์ผ์์ ์ฌ์ฉํ ์ ์๋ ํธ์ถ ์๋ช
์ ๊ฒฐ์ ํ๊ธฐ ์ํด ์ผ์ข
์ ๊ฐ์ฒด ๋ทฐ์ด๊ฐ ํ์ํฉ๋๋ค.
python /usr/lib/emscripten/tools/webidl_binder.py Foo.idl glue
This generates:
glue.cpp
glue.js
WebIDLGrammar.pkl
emcc -v Foo.cpp my_glue_wrapper.cpp --post-js glue.js -o output.js
This generates:
output.js
output.wasm
emrun --list_browsers
emrun --browser chrome handcrafted_Foo.html
emrun --browser firefox handcrafted_Foo.html
firefox handcrafted_Foo.html &
chrome handcrafted_Foo.html &
$ cat Foo.h
#ifndef FOO_H
#define FOO_H (1)
class Foo {
public:
int getVal();
void setVal(int v);
private:
int nValue;
};
#endif
$ cat Foo.cpp
#include "Foo.h"
int Foo::getVal() {
return nValue;
}
void Foo::setVal(int v) {
nValue = v;
}
$ cat my_glue_wrapper.cpp
#include "Foo.h"
#include "glue.cpp"
$ cat Foo.idl
interface Foo {
void Foo();
long getVal();
void setVal(long v);
};
$ cat handcrafted_Foo.html
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>WebAssembly Sample</title>
</head>
<body>
<h1>Web Assembly</h1>
<div class="output">
<pre id="log"></pre>
</div>
<script src="output.js"></script>
<script>
"use strict";
function log() {
document.querySelector('#log').textContent += Array.prototype.join.call(arguments, '') + '\n';
}
Module.onRuntimeInitialized = _ => {
log(`blah `);
var f = new Module.Foo();
f.setVal(200);
alert(f.getVal());
log(`blah `);
};
</script>
</body>
</html>
@ omac777 , ๋ค๋ฅธ ์ธ์ด์์ ์ํธ ์ด์ฉ์ฑ์ Go์ 1.11 ์ด๊ธฐ WebAssembly ์ง์์ ๋ชฉํ๊ฐ ์๋๋๋ค.
ํ์ธ. webidl์ด ๋จ๊ธฐ ๋ชฉํ๊ฐ ์๋๋ผ๋ ๊ฒ์ ์ดํดํ ์ ์์ง๋ง wasm ์ถ๋ ฅ์ ์ ์ฉํ๊ฒ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ํ ์ง๋ฌธ์ด ์์ต๋๋ค. ๋จผ์ idl๊ณผ ํจ๊ป emscripten C++์ ํจ๊ป ์ฌ์ฉํ๊ธฐ ์ํด ์์์ ์ ์ํ ์์ Foo ํด๋์ค๋ก ๋์๊ฐ๋๋ค. ๊ฑฐ๊ธฐ์ ๋ง๋ ๊ณจ๋์ค๋ฆฌ ํ์ ์ ๋ง๋ค์๋ค๊ณ ํด๋ด ์๋ค. ๊ทธ๋ฐ ๋ค์ C++ Foo SetVal ๋ฐ GetVal ๊ตฌํ์์ ํธ์ถํ ์ ์๋๋ก ํด๋น ํจ์๋ฅผ C ํจ์๋ก ๋ด๋ณด๋ ๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ์๋๊ฐ ๋๋ ค์ง ๊ฒ์ด๋ผ๋ ๊ฒ์ ์๊ณ ์์ง๋ง ๋ชจ๋ ๊ตฌํ์ go ๋ด์์ ๊ตฌ์ถํ๋ ๊ฒ์ด ์ฅ๊ธฐ์ ์ธ ๋ชฉํ๊ฐ ๋ ๊ฒ์ ๋๋ค.
foo.go.wasm.a ๋ฐ foo.go.wasm.so๋ ์ด๋ป๊ฒ ์์ฑํฉ๋๊น? ๋ชจ๋ foo.wasm์๋ ์์ฒด foo.go.js๊ฐ ํ์ํฉ๋๊น?
๋ค๋ฅธ foos๋ก ๊ฐ๋ ์ฐฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ฑ๋๋ฉด otherfoos.go.a.js๋ ์์ฑ๋ฉ๋๊น?
go.wasm.a ๋ฐ go.wasm.so๋ฅผ ๋ค์์ ์ง์ ๋ ๋๋ก ์์ฑ๋ emcc output.wasm์ ์ด๋ป๊ฒ ์ฐ๊ฒฐํฉ๋๊น?
emcc -v Foo.cpp my_glue_wrapper.cpp --post-js glue.js -o output.js foo.go.wasm otherfoos.go.wasm.a
์๋ฅผ ๋ค์ด go ๋ด์์ wasm์์ emcc๊ฐ ์ง์ํ๋ sdl ๊ธฐ๋ฅ์ ์ฐ๊ฒฐํ๋ ๋ฐฉ๋ฒ.
์ ์ฒด ๊ณ ๋ฃจํด, MAXCPUCores, ์ฑ๋์ ๋ํ ์ง์์ ์ธ์ wasm์ ๋ํด ๋ํ๋ฉ๋๊น?
๋ค์ ํ๋ฒ ๊ฐ์ฌํฉ๋๋ค.
@ omac777 , Go 1.11์ ๋ฒ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Go ์ฝ๋๋ WebAssembly ๋ชจ๋๋ก ์ปดํ์ผ๋๊ณ ๋ธ๋ผ์ฐ์ ์์ ์คํ๋๋ฉฐ JavaScript ๊ฐ์ ์๋ค๋ก ํธ์ถํ ์ ์์ต๋๋ค.
*.a ๋๋ *.so ํ์ผ์ด๋ C ๋๋ GCC ๋๋ emcc ๋๋ SDL๊ณผ์ ์ํธ ์ด์ฉ์ฑ์ ๋ํ ๋ชจ๋ ๊ฒ์ ๋ฌด์ํ์ญ์์ค. ๊ทธ ์ค ์ด๋ ๊ฒ๋ ๋ฒ์์ ์์ผ๋ฉฐ ์๋ํ์ง ์์ต๋๋ค.
์ ์ฒด ๊ณ ๋ฃจํด, MAXCPUCores, ์ฑ๋์ ๋ํ ์ง์์ ์ธ์ wasm์ ๋ํด ๋ํ๋ฉ๋๊น?
๊ณ ๋ฃจํด๊ณผ ์ฑ๋์ ์๋ฒฝํ๊ฒ ์ง์ํฉ๋๋ค(์ด๋ Go์ ์ผ๋ถ์ด๋ฉฐ ํ์์). WebAssembly๋ MAXCPUCores
๊ฐ ์๋ฏธํ๋ ๊ฒฝ์ฐ ๋จ์ผ ์ฝ์ด๋ง ์ง์ํฉ๋๋ค. ์ด๊ฒ์ Go๋ Go์ WebAssembly ์ง์์ ํ๊ณ๊ฐ ์๋๋๋ค.
๊ทธ๋์ ๋น์ ์ ๋ด๊ฐ ๊ณง ์ด๋ฐ ๊ฒ์ ๋ณผ ์ ์๋ค๋ ๋ง์
๋๊น?
GOARCH=wasm GOOS=js go build -o awesome.wasm.so -buildmode=c-shared foo.go
๋ฐ๋ผ์ 4๊ฐ์ ์ฝ์ด ๋๋ 20๊ฐ์ ์ฝ์ด๊ฐ ์๋ ์น ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ ๊ฒฝ์ฐ go ์์ฑ๋ wasm์ ์น ๋ธ๋ผ์ฐ์ ์์ ํด๋น ์ฝ์ด ์ค ํ๋๋ง ์ฌ์ฉํ ๊น์? ๋๋ ๊ทธ๊ฒ์ด go or go webassembly ์ง์์ ์ ํ์ด ์๋๋ผ๋ ๊ฒ์ ์ด๋ป๊ฒ ์ค๋ช ํ๋์ง ์ดํดํ์ง ๋ชปํฉ๋๋ค. WEBASSEMBLY.org ์ฌ์ ์์ฒด์ ํ๊ณ๋ผ๊ณ ๋ง์ํ์ญ๋๊น?
@ omac777 - ์, ํ์ฌ Go ๊ตฌํ์ด ์๋๋ผ WebAssembly ์์ฒด์ ํ๊ณ๋ผ๊ณ ์๊ฐํฉ๋๋ค.
@omac777 WASM์ ๋ฉํฐ์ค๋ ๋ฉ ์ง์์ ์งํ ์ค์ธ ์์ ์ด๋ฉฐ ๋ธ๋ผ์ฐ์ ์์ ์ถ์๋ ๋๊น์ง ์๊ฐ์ด ๊ฑธ๋ฆด ๊ฒ์ ๋๋ค.
https://github.com/WebAssembly/threads/blob/master/proposals/threads/Overview.md
๊ทธ๋์ ๋น์ ์ ๋ด๊ฐ ๊ณง ์ด๋ฐ ๊ฒ์ ๋ณผ ์ ์๋ค๋ ๋ง์ ๋๊น?
GOARCH=wasm GOOS=js go build -o Awesome.wasm.so -buildmode=c-shared foo.go
์๋ง๋ Go 1.12์ ์์ ๊ฒ์ ๋๋ค.
C/C++๋ฅผ ํธ์ถํ๋ Go์ ๊ฒฝ์ฐ JavaScript๋ก C ํจ์๋ฅผ ๋ํํ ๋ค์ Go 1.11์ ์ฌ์ฉํ์ฌ Go์์ JavaScript ๋ํผ๋ฅผ ํธ์ถํ๋ ๊ฒ์ด ๊ฐ๋ฅํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋๋ ์ด๊ฒ์ด ์ค๋ ๋์ ์ผ๋ถ๊ฐ ์๋๋ผ๋ ๊ฒ์ ์๊ณ ์์ง๋ง go v1.11์์ WebAssembly(์ปดํ์ผ ๋ฑ)๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๋ฌธ์/์์ต์๊ฐ ์์ต๋๊น?
@SerkanSipahi ์์ง ์๋๋๋ค. ๊ทธ๋ฌ๋ ๋ฆด๋ฆฌ์ค ์ ์ ๋ฌธ์๊ฐ ์์ ๊ฒ์ ๋๋ค.
์ฌ์ ํ ๊ด๋ จ์ฑ์ด ์๋ ์ด ๊ฒ์๋ฌผ๋ ์์ต๋๋ค.
https://blog.gopheracademy.com/advent-2017/go-wasm/
์ฐ๋ฆฌ๋ (IIRC) wasm ๋ชจ๋์ export
์น์
์ ๋ค์ด๊ฐ๋ ๊ฒ์ ๋ํ ๋งคํ(๋๋ ๋ฉ์ปค๋์ฆ)์ ์ ํํ ์ง์ ํ์ง ์์์ต๋๋ค.
#25612๋ฅผ ์ ์ถํ์ต๋๋ค.
wasm ๋์์ ์ฌ์ฉํ์ฌ ๋ค์์ผ๋ก ์ด๋ํ๋ ๋ฐฉ๋ฒ์ ๋ช
ํํ/๋ฌธ์ํํ์ญ์์ค.
- go๋ฅผ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ์ธ์ด์์ ์ฌ์ฉํ ์ ์๋๋ก wasm์ผ๋ก go ๊ธฐ๋ฅ์ ๋ด๋ณด๋ด๊ฑฐ๋ ๊ฐ์ ธ์ต๋๋ค.
- sdl2/webgl/qt๋ฅผ golang ๋ฐ์ด๋๋ฆฌ์ ์ฐ๊ฒฐ
-๋ชจ๋ sdl2/webgl/qt ์ด๋ฒคํธ ์ก๊ธฐ
- ๋ฃจํ์ ์๋ ๊ฒฝ์ฐ ์ ์ ๋ชจ๋๋ก CPU ์๊ฐ์ OS๋ก ์ผ์์ ์ผ๋ก ์๋ํฉ๋๋ค. ์๋ฅผ ๋ค์ด
emscripten emscripten_sleep(10)
go ๋๊ตฌ์ output.html ํ์ผ์ output.html์ด ์ฑ๊ณต์ ์ผ๋ก ๋น๋๋ ๊ฒฝ์ฐ์๋ firefox/chrome ๋ชจ๋์์ ์ผ๊ด๋๊ฒ ์ฑ๊ณตํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค. output.html์ด ์๋ํ๋๋ก ํ๋ ค๋ฉด ๋ ๋ง์ ์์ ์ ์ํํด์ผ ํฉ๋๋ค. ์ฑ๊ณต์ด๋ผ๊ณ ํ๊ธฐ ์ ์.
@ omac777 , ์ฐ๋ฆฌ๋ ์์ ๋๋ถ๋ถ์ ํด๊ฒฐํ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ค๋ฅธ ์ฌ๋๋ค์ ์ํด:
wasm ๋์์ ์ฌ์ฉํ์ฌ ๋ค์์ผ๋ก ์ด๋ํ๋ ๋ฐฉ๋ฒ์ ๋ช ํํ/๋ฌธ์ํํ์ญ์์ค.
- go๋ฅผ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ์ธ์ด์์ ์ฌ์ฉํ ์ ์๋๋ก wasm์ผ๋ก go ๊ธฐ๋ฅ์ ๋ด๋ณด๋ด๊ฑฐ๋ ๊ฐ์ ธ์ต๋๋ค.
- sdl2/webgl/qt๋ฅผ golang ๋ฐ์ด๋๋ฆฌ์ ์ฐ๊ฒฐ
-๋ชจ๋ sdl2/webgl/qt ์ด๋ฒคํธ ์ก๊ธฐ
์์ ๋ด์ฉ ์ค ์ด๋ ๊ฒ๋ Go 1.11์ ๋ฒ์์ ํฌํจ๋์ง ์์ต๋๋ค. ์ง์๋์ง๋, ๋ฌธ์ํ๋์ง๋ ์์ผ๋ฉฐ, ๊ฐ๋ฅํ์ง๋ ์์ ๊ฒ์ ๋๋ค.
- ๋ฃจํ์ ์๋ ๊ฒฝ์ฐ ์ ์ ๋ชจ๋๋ก CPU ์๊ฐ์ OS๋ก ์ผ์์ ์ผ๋ก ์๋ํฉ๋๋ค. ์๋ฅผ ๋ค์ด
@neelance ๋ JS์ Go ์ค์ผ์ค๋ฌ ๊ฐ์ ์ฝ๋ฐฑ ๋ฐ ์ํธ ์ด์ฉ์ฑ์ ์ป์์ผ๋ฏ๋ก ์ผ๋ฐ time.Sleep
๋ฐ ์น๊ตฌ๋ ์์๋๋ก ์๋ํด์ผ ํฉ๋๋ค.
๋๋ Go 1.11์ด ์ด๊ฒ๋ค ์ค ์ด๋ ๊ฒ๋ ๊ฐ์ง์ง ์์ ๊ฒ์ด๋ผ๋ ๊ฒ์ ์ดํดํ์ง๋ง, ์์ ์ด๋ค ๊ฒ์ด go์ ๋ํด ์ผ๋ง๋ ๋ฉ๋ฆฌ/์ค๋ ๊ณ ๋ ค๋ ๊ฒ์ธ๊ฐ. qt๊ฐ go์ ๊น๋ํ๊ฒ ํตํฉ๋๋ ๊ฒ์ ๋ณด๊ณ ์ถ์ดํ๋ ์ฌ๋๋ค์ด ์์ผ๋ฉฐ ํ์ฌ ์ํฉ์ ํด๋น ๋ ์ํผ/qt์ ๋ํด ํ์ฌ์ ์์กดํ๊ณ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ด๋ ๋ชจ๋ ์ข์ง๋ง ์ ํ ์ฌํญ์ด ์์ต๋๋ค(ํ์ฌ wasm qt ๋ฐ qt 64๋นํธ arm ํ๊ฒ ์์ ์ง์). autocad์๋ emscripten, C++ ๋ฐ react๋ฅผ ์ฌ์ฉํ๋ Windows ๋ฐ macos์ฉ ์น ์ด์ ๋ธ๋ฆฌ ์๋ฃจ์ ์ด ์์ต๋๋ค. ๋๋ ์ฌ์ ํ golang์ด C++๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ณณ๊ณผ ๋ฌ๋ฆฌ ํน์ ์ฌ์ฉ ์์ญ์์ ์ฌ์ ํ ์ ์ฝ์ ๋ฐ๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
C++์ ์ ๊ทผ ๋ฐฉ์์๋ ๋ง์ ํ์ด ์์ต๋๋ค.
emcc --clear-cache --clear-ports
em++ -v -std=c++1y hello_world_sdl.cpp -s USE_SDL=2 -s USE_SDL_IMAGE=2 EMTERPRETIFY=1 -s EMTERPRETIFY_ASYNC=1 -s WASM=1 -o hello_world_sdl.html
์ golang์ ๋น์ทํ ํ๋์ ํ ์ ์์ต๋๊น?
์
๋ฐ์ดํธ: ์ ์ ํฉ๋๋ค. Golang์ go ์ฝ๋์ ํฌํจ๋ cgo ์ปดํ์ผ ์ง์๋ฌธ ๋๋ฌธ์ "-s" ์ค์์น๊ฐ ํ์ํ์ง ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๋ค๋ฅธ golang ๋น๋ ๋ฒ์ (์: go1.9์์ go1.10)์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ ๋ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก ์บ์ ์ง์ฐ๊ธฐ์ ํฌํธ ์ง์ฐ๊ธฐ๋ ์ข์ ์๊ฐ์
๋๋ค. go1.10.3์์ go1.11(vgo ๋ผ์ดํ์คํ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ ๋). ๋๋ ์ต๊ทผ์ go build ๋ฒ์ ์ฌ์ด์ "go build -"๋ฅผ ์ํํด์ผ ํ์ต๋๋ค.
GOARCH=wasm GOOS=js go --clear-cache --clear-ports
์ golang์ ๋น์ทํ ํ๋์ ํ ์ ์์ต๋๊น?
GOARCH=wasm GOOS=js go --clear-cache --clear-ports
FWIW, Go์ ์บ์๋ ์ ํ์ฑ์ ์ํด ๋ช ์์ ์ผ๋ก ์ง์ธ ํ์๊ฐ ์์ต๋๋ค.
@neelance - ์ด์ ์ฝ๋ฐฑ์ด ๋ค์ด์์ผ๋ฏ๋ก ๊ธฐ๋ณธ ์ง์์ด ์๋ฃ๋์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด ๋ฒ๊ทธ๋ฅผ ๋ซ์์ผ ํ ๊น์? ์๋๋ฉด ์ผ๋์ ๋ ๋ค๋ฅธ ๊ฒ์ด ์์ต๋๊น?
์, ์ด์ ๋ซ์ ์ ์์ต๋๋ค. ๐
ํ๋ฅญํ ์ผ!!! @neelance
์ด๊ฒ์ ๊ต์ฅํ๊ณ ํ๋ฅญํ ์ํ์ ๋๋ค @neelance!
https://golang.org/cl/120057 ์์ ์ด ๋ฌธ์ ๋ฅผ ์ธ๊ธ ๋ณ๊ฒฝ: doc/go1.11: mention GOOS/GOARCH values of WebAssembly port explicitly
https://golang.org/cl/120575 ์์ ์ด ๋ฌธ์ ๋ฅผ ์ธ๊ธ ๋ณ๊ฒฝ: cmd/dist: skip non-std tests on js/wasm
ํ์ผ ํฌ๊ธฐ ์ค์ด๊ธฐ์ ๋ํ ๋ฌธ์ ๋ฅผ ์ฌ๋ ๊ฒ์ด ์ ์ ํฉ๋๊น(๊ฐ๋ฅํ ๊ฒฝ์ฐ)? ์๋๋ฉด ๋ค๋ฅธ ๊ณณ์์ ์ถ์ ๋๊ณ ์์ต๋๊น?
@matthewp ์ํ๋ ๊ฒฝ์ฐ ์น ์ด์ ๋ธ๋ฆฌ๋ณ ํฌ๊ธฐ ๋ฒ๊ทธ๋ฅผ ์์ ๋กญ๊ฒ ์ฌ์ญ์์ค. ์ผ๋ฐ์ ์ธ ๊ฒ์ #6853์ ๋๋ค.
https://golang.org/cl/120958 ์์ ์ด ๋ฌธ์ ๋ฅผ ์ธ๊ธ ๋ณ๊ฒฝ: net: re-implement built-in simulated network on JS and NaCl
golang ์ปดํ์ผ๋ฌ์ ์ ์ด ํ๋ฆ ๋ฌด๊ฒฐ์ฑ(CFI)์ด ๋ด์ฅ๋์ด ์์ต๋๊น? ๋๋ ์ต๊ทผ์ clang ์ปดํ์ผ๋ฌ์ ๋ด์ฅ๋ CFI๋ก ๋ฐฉ์ง๋ WASM์ ์ทจ์ฝ์ ๊ณผ ๊ด๋ จํ์ฌ ๋ค์์ ์ดํด๋ณด์์ต๋๋ค.
https://www.fastly.com/blog/hijacking-control-flow-webassembly-program
https://github.com/trailofbits/clang-cfi-showcase/blob/master/cfi_vcall.cpp
๋์ถฉ ํ์ด๋ณด๋ ๊ธ์ด "WebAssembly๋ JavaScript์ ๊ฐ์ ๊ณ ๊ธ ์ธ์ด๊ฐ ์๋๋ผ ์ ๊ธ ์ธ์ด์ด๋ฏ๋ก ์์ค ์ธ์ด(C ๋๋ Go)์์ ํ์ฉํ๋ ๊ฒฝ์ฐ ํน์ ํด๋์ค์ ๋ฒ๊ทธ๊ฐ ์ ์ฉ๋ ์ ์์ต๋๋ค. ." ๋๋ผ์์ด ์์ต๋๋ค. ์ฆ, Go์ ์ด๋ฌํ ๋ฌธ์ ๊ฐ ์์ผ๋ฉด WebAssembly๋ฟ๋ง ์๋๋ผ ๋ค๋ฅธ ์ํคํ ์ฒ์๋ ์ ์ฉ๋ฉ๋๋ค.
WebAssembly๋ ๋๋ถ๋ถ ์ฌ์
ํ WebAssembly ์ฝ๋๋ก๋ถํฐ ๋ธ๋ผ์ฐ์ ๋ฅผ ๋ณดํธํ๋ ๊ฒ์
๋๋ค. WebAssembly ์ธ์คํด์ค ๋ด์์ ๋ณด์ฅ์ ์ ๊ณตํ๋ ๊ฒ์ ๊ทธ๋ค์ง ์ค์ํ์ง ์์ต๋๋ค(์ผ๋ถ๋ ์๊ธฐ๋ ํ์ง๋ง). @neelance ๊ฐ ๋งํ๋ฏ์ด ํ์ํ ์์ ๋ณด์ฅ์ ์ ๊ณตํ๋ ๊ฒ์ LanguageX->WebAssembly ์ปดํ์ผ๋ฌ์ ๋ฌ๋ ค ์์ต๋๋ค.
Go์๋ CFI๊ฐ ์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ์ฝ์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ฉ์๋๊ฐ ์์๋๋ ์ง์ ์์ ์ฐ๋ฆฌ๋ ์ด๋ฏธ vtable์ ์์ด๋ฒ๋ ธ์ต๋๋ค. vtable์ด ์ฌ์ฉ๋์๋ค๋ ์ฌ์ค์กฐ์ฐจ ์์ด๋ฒ๋ ธ์ต๋๋ค.
Go๋ ๋ณ๋ ฌ ์ฒ๋ฆฌ๊ฐ ์๋ ๊ฒฝ์ฐ ์ด ์ต์คํ๋ก์์ ์ทจ์ฝํฉ๋๋ค. ํ์ฌ๋ก์๋ ์ ์ด๋ WebAssembly Go ํฌํธ(๋ฐ WebAssembly, ๋ง์นจํ)์๋ ๋ณ๋ ฌ ์ฒ๋ฆฌ๊ฐ ์์ผ๋ฏ๋ก ์ด ์ต์คํ๋ก์์ ์ด๋ก ์ ์ผ ๋ฟ์
๋๋ค. ๊ทธ๋ฌ๋ WebAssembly ์ฌ๋๋ค์ ์ด๋ ์์ ์์ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ๊ตฌํํ ๊ณํ์
๋๋ค.
@randall77 ์ด๊ฒ์ด ์ผ๋ฐ linux/amd64
์ ์ด๋ค ์ํฅ์ ์ค๋๊น? WebAssembly์ ๊ฒฝ์ฐ ์ํ์ด ๋ ํฝ๋๊น?
์ํ์ ์ํคํ
์ฒ์ ๊ด๊ณ์์ด ๋์ผํฉ๋๋ค(WebAssembly์๋ ์์ง ์ค๋ ๋๊ฐ ์์ผ๋ฏ๋ก ํ์ฌ๋ก์๋ WebAssembly์ ๋ํด ์ค์ ๋ก 0์
๋๋ค). ๋ฐ์ดํฐ ๊ฒฝ์์ unsafe
๋ฅผ ๊ฐ์ ธ์ค์ง ์๊ณ unsafe
๋ฅผ ์๋ฎฌ๋ ์ด์
ํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ทธ๋ฌํ ์ทจ์ฝ์ ์ ์
์ฉํ๋ ๊ฒ์ ์ด๋ ค์ธ ๊ฒ์
๋๋ค. ์ ๋ขฐํ ์ ์๋ ์ฝ๋๋ก ๋งํฌํ๊ฑฐ๋ ์ธํฐํ์ด์ค ๊ฐ์ ๋ํ ๋ฐ์ดํฐ ๊ฒฝํฉ์ ์ํํ๋ ๊ธฐ์กด ๋ฐ์ด๋๋ฆฌ์์ ๊ฐ์ ฏ์ ์ฐพ์ ํธ๋ฆฌ๊ฑฐํ ๋ค์ ๊ฒฐ๊ณผ์์ ๋ฉ์๋๋ฅผ ํธ์ถํด์ผ ํฉ๋๋ค.
์, Go ์ฝ๋์ ๋ฐ์ดํฐ ๊ฒฝํฉ์ด ์๋ค๋ฉด ๊ด์ฐฎ์ ๊ฒ์
๋๋ค. ๋ํ WebAssembly๋ก ์ ๋ขฐํ ์ ์๋ ์ฝ๋๋ฅผ ์คํํ ๋ ๋ฐ์ดํฐ ๊ฒฝ์์ด ์๊ฑฐ๋ ๋จ์ํ unsafe
๋ฅผ ์ฌ์ฉํ ์ ์๋๋ผ๋ WebAssembly ํ๊ฒฝ์ ๋ฒ์ด๋ ์ ์๋๋ก ํ ์ ์์ต๋๋ค. ํฅ๋ฏธ๋ก์ด ํต์ฐฐ๋ ฅ์ ๊ฐ์ฌ๋๋ฆฌ๋ฉฐ ์ด ๋ฌธ์ ์ ์ฃผ์ ์์ ์ฝ๊ฐ ๋ฒ์ด๋ ์ ์ ๋ํด ์ ๊ฐ์ค๋ฝ๊ฒ ์๊ฐํฉ๋๋ค.
golang ๋ด์์ ์ด javascript ์ฌ์ฉ๋ฒ์ ๋ ๋ง์ด ์กฐ์ฌํ ์๋ก golang ์ฝ๋์ ํ์ง๊ณผ ์ฅ๊ธฐ์ ์ธ ์ ์ง ๊ด๋ฆฌ๋ฅผ ์ ํ์ํค๋ ๊ฐ์ผ์ผ๋ก ๋ ๋ง์ด ์ธ์ํ๊ฒ ๋ฉ๋๋ค. ์ค๋ช ํ๊ฒ ์ต๋๋ค. ๋ค์์ ์ธ์์ ์ธ ๋ ์ฌํ ๋ง์ ์ ์ํํ๋ ๋ฉ์ง wass golang ์ฑ์ ์์ ๋๋ค.
https://github.com/stdiopt/gowasm-experiments/blob/master/bouncy/main.go
๊ฒฐ๊ณผ๋ ์ธ์์ ์ ๋๋ค. ์ค์ ๋ก ๋ฐ์ํ๋ ์ฝ๋๋ฅผ ์์ธํ ์ดํด๋ณด๋ ๊ฒ์ ์ค๋ง์ค๋ฌ์ ์ต๋๋ค. ์๋ํ๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ ์ธก์์ ๋ฌด์ธ๊ฐ๋ฅผ ํธ์ถํ ๋๋ง๋ค ๋งค๋ฒ ์๋ฐ์คํฌ๋ฆฝํธ ํจ์์ ์ด๋ฆ์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ ๋ฌธ์์ด๋ก ์ค๋ช ํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. . ๊ฒฐ๊ณผ์ ์ผ๋ก golang ์ปดํ์ผ๋ฌ๊ฐ ์ปดํ์ผ ํ์์ ์๋ฐ์คํฌ๋ฆฝํธ ์ ํ์ฑ์ ํ์ธํ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ๋ฐํ์์ "๊ธฐ๋๋ก ๋ ์๋ผ"์ ๋๋ค. ์ฅ๊ธฐ ์ ์ง ๊ด๋ฆฌ๋ฅผ ์ํด ์ด๋์์๋ golang ํจ์/๋ณ์/์ ํ์ ๋ณด๋ ๊ฒ์ ์ ํธํฉ๋๋ค. BTW ๋๋ ์๋ฐ ์คํฌ๋ฆฝํธ๋ฅผ ์ซ์ดํ๊ณ ํญ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๋๋ฌด ์์ ๋ถ๋ฐฉํด์. ๊ทธ๋ฐ ์ธ์ด๊ฐ ์น ๋ธ๋ผ์ฐ์ ์์ ์ง์๋๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ๋๋ต์ ๋๋ฅผ ํ์ถํฉ๋๋ค.
๋ค์ด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
๋ฌธ์์ด์ ์ฌ์ฉํ์ฌ JS๋ฅผ ํธ์ถํ๋ ๊ฒ์ด ๋ ๋์ ๊ฒฝํ์ด ์๋๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค. ์น ํ๋ซํผ ์ฌ์ IDL์์ Go ์ธํฐํ์ด์ค๋ฅผ ์์ฑํ ์๋ ์์ต๋๋ค. ๋จ์ ์ ์คํ๋ ๋ธ๋ผ์ฐ์ ์ ๋ฐ๋ผ API๋ฅผ ์ฌ์ฉํ ์ ์๋ ๋ฐ๋ฉด ์น ํ๋ซํผ์ด ๋ฐ์ ํจ์ ๋ฐ๋ผ ์๋ก์ด ์ฌ์์ด ๊ณ์ ์ ๊ณต๋๊ธฐ ๋๋ฌธ์ ์ฌ์์ ์ ์งํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
@omac777 ๋์ํฉ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋๋ถ๋ถ์ ์ฌ์ฉ์๊ฐ syscall/js
๋ฅผ ์ง์ ๋ง์ง ํ์๊ฐ ์๋๋ก JS ์ ์์ค ์ฃผ๋ณ์ ๋ฉ์ง Go ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. syscall
ํจํค์ง์ ์ ์ฌํ๊ฒ ๋ณด๊ธฐ ํํ๊ณ ์ง์ ์ฌ์ฉํ๋ ์ฌ๋์ ๊ฑฐ์ ์์ต๋๋ค. ;-)
@omac777 GopherJS์ ๊ฒฝ์ฐ ๋ง์ ์ฌ๋๋ค์ด ์ ์์ค js
ํจํค์ง๋ฅผ ์ง์ ์ฌ์ฉํ๋ ๋์ ๋ค์ํ ๋ธ๋ผ์ฐ์ API์ ๋ํด ๊ณ ์์ค ๋ฐ์ธ๋ฉ์ ์ฌ์ฉํฉ๋๋ค. ๋๋ ์ ์ฌํ ์ ๊ทผ ๋ฐฉ์์ด Wasm์์๋ ๊ฐ์ฅ ์ธ๊ธฐ๊ฐ ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ง์ GopherJS ๋ฐ์ธ๋ฉ์ด ๋์ผํ ํจํค์ง์ Wasm์ ๋ํ ์ง์์ ์ถ๊ฐํ๊ณ ํ์์ ๋ฐ๋ผ ์ ํจํค์ง๊ฐ ์์ฑ๋ ๊ฒ์ผ๋ก ๊ธฐ๋ํฉ๋๋ค.
์ฐธ๊ณ ๋ก https://github.com/gopherjs/gopherjs/wiki/Bindings , https://dmitri.shuralyov.com/talks/2016/Go-in-the-browser/Go-in-the-browser๋ฅผ ์ฐธ์กฐํ์ธ์. ์ฌ๋ผ์ด๋ #11 (๋ฐ ๋ค์ 4๊ฐ์ ์ฌ๋ผ์ด๋) ๋ฐ https://github.com/dominikh/go-js-dom/issues/57.
๋ํ ์ฐ๋ฆฌ๋ ์น ์ด์ ๋ธ๋ฆฌ ๋ก๋๋งต์ ๋ง์ ๊ฒ๋ค์ด ์๋ค๋ ๊ฒ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
https://webassembly.org/docs/future-features/
๊ทธ๋ฌ๋ฉด ์ฅ๊ธฐ์ ์ผ๋ก syscall
์คํ ๋ฆฌ๊ฐ ์๋นํ ๊ฐ์ ๋ ๊ฒ์
๋๋ค.
WebAssembly ์ฝ๋์์ ์ง์ DOM ๋ฐ ๊ธฐํ ์น API ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํฉ๋๋ค.
JavaScript๋ฅผ ํตํด ํธ์ถํ์ง ์๊ณ WebAssembly์์ ์ง์ Web API(ํ๋ฆฌ๋ฏธํฐ๋ธ ๋๋ DOM/GC/Web API ๊ฐ์ฒด ์ ๋ฌ)๋ฅผ ํธ์ถํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ
WebAssembly ์ฝ๋์์ ์ง์ GC ๊ฐ์ฒด๋ฅผ ํจ์จ์ ์ผ๋ก ํ ๋นํ๊ณ ์กฐ์ํฉ๋๋ค.
์ด์จ๋ @neelance et. ๊ฐ์ฌํฉ๋๋ค. ์. ์ด๊ธฐ ๋ฒ์ ์ ๊ตฌํํ๊ธฐ ์ํด. ๋๋ฌด ๋ฉ์ ธ! ๐ฅ
DOM์ Go ๊ตฌํ์ด ์๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
๋ฌธ์์ ์คํฌ๋ฆฝํธ๋ ์ ํ ์์คํ ์ ์ฌ์ฉํ์ฌ Go๋ก ์์ฑ ๋ฐ ์คํํ ์ ์์ต๋๋ค.
๊ทธ๋ฐ ๋ค์ Go DOM์์ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
@fractalbach : WebAssembly์ ํธ์คํธ ๋ฐ์ธ๋ฉ ์ด ์์ ๊ทธ๋ฃน์์ ํ์ธ ๋ฐ ๊ตฌํ๋๋ฉด ์ค์ ๋ก WebAssembly๋ฅผ ํตํด DOM ์กฐ์์ ์ํํ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ DOM, ๋ฌธ์ ๋ฐ ์คํฌ๋ฆฝํธ๋ฅผ ์ถ์ํํ๋ ๊ณ ๊ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ ๋๋ค.
๊ทธ๋ฌ๋ ๊ทธ ์ ์ ํ๋ ๊ฒ์ ๊ทธ๋ค์ง ๋งค๋ ฅ์ ์ด์ง ์์ต๋๋ค.
Go WebAssembly: JS ์ฐธ์กฐ์ ๊ตฌ์กฐ ๋ฐ์ธ๋ฉ
https://medium.com/@nlepage/go -webassembly-binding-structures-to-js-references-4eddd6fd4d23
์ ๊ทผ ๋ฐฉ์์ด ๋งค๋ ฅ์ ์ ๋๋ค. ์ฌ์ฉ๋ฒ์ ๊ตฌ์กฐ์ฒด ๋ด์์ json ๋ง์ฌ๋ง/๋ง์ฌ๋ง ํด์ ์ ์ ์ฌํฉ๋๋ค. ์ฝ๊ฒ ์ฎ๊ธธ ์ ์๋ ์คํฌ์ ๋๋ค.
ํ ๊ฐ์ง ๋น ์ง ๊ฒ์ ์ค๋ฆฌ ํ์ดํ์ ๋์ผํ ์ ๊ทผ ๋ฐฉ์์ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ๋๋ ๊ตฌ์กฐ ๋ด์์ ํจ์ ์ ์ธ์ ํ์ง ์๊ณ , ๋ ํ์ดํ๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๊ตฌ์กฐ ์ธ๋ถ์์ ๋ ๋ฆฝํ์ผ๋ก ์ ์ธํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค. ์๋น์ค๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ ๊ฒํ๋ฉด ์ํ๋ ๋ค๋ฅธ ๋น ๊ธฐ๋ฅ ๊ฐ์ ๋ณด์ ํ๋ ํต์ฌ ๊ตฌ์กฐ์ฒด์ ์ํฅ์ ๋ฏธ์น์ง ์๊ณ ์ฝ๊ฒ ์์ ํ ์ ์์ต๋๋ค. ์ค๋ฆฌ ํ์ดํ ๋ฐ์!
๋ชจ๋ ์์
์ ๋ํด @neelance ์ ๋ค์ ํ ๋ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๋๋จํ ๊ฐ์ฌํฉ๋๋ค.
์๊ฒฌ์ ์ฃผ์ Nicolas Lepage ์จ์๊ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๊ทธ๋ค์ ์ง์ ์ ์ธ wasm ์ธํฐํ์ด์ค๊ฐ ์๋ฃ๋ ๋๊น์ง ์ ์ ๋์ ์ด ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋
ธ์ด์ฆ์ ์ํธ ์ด์ฉํ๊ธฐ ์ํ ๋ ๋์ ๊ฒฝ๋ก๊ฐ ๋ ์ ์๋ ๊ฒ์ ๊ฒฐ์ ํ๋ ๋ฐ ์ค์ ๋ก ๋์์ด ๋ฉ๋๋ค.
์๋ ํ์ธ์ ์ฌ๋ฌ๋ถ, ์ด๊ฒ์ ๋ง์ ์ฌ๋๋ค์ด ๊ตฌ๋ ํ๋ ํธ๋ํฝ์ด ๋ง์ ์ค๋ ๋์ ๋๋ค. ์ด์ ๊ฐ์ ์ผ๋ฐ์ ์ธ ํ ๋ก ์ ๊ฐ๋ ๊ฒ์ Go์ ๋ํ WebAssembly ์ง์์ ๊ฐ๋ ์๋ ๋ฌธ์ ์ ๋ํด ์ฐ๋ คํ๋ ์ฌ๋๋ค์๊ฒ ์ ์ตํ์ง ์์ต๋๋ค.
์ ์ ํ ํฌ๋ผ(golang-nuts/golang-dev)์์ ์์ ๋กญ๊ฒ ํ ๋ก ์ ๊ณ์ํ์ญ์์ค. ๋๋ ํน๋ณํ ์ผ๋์ ๋๊ณ ์๋ ๊ฒ์ด ์์ผ๋ฉด ์ ๋ฌธ์ ๋ฅผ ์ฌ์ญ์์ค.
๊ฐ์ฌํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์๋ ํ์ธ์ ์ฌ๋ฌ๋ถ. ์ฌ๊ธฐ ๋ด ์์ ์ ๋ํ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๋ค. ๋๋ ์ง๊ธ๊น์ง Go ํ๊ณผ ๊ธฐ์ฌ์๋ค์ ํ๋ฅญํ ์์ ๋๋ถ์ ๋งค์ฐ ์ข์ ์ง์ ์ ์ด๋ฃจ๊ณ ์์ต๋๋ค. ๋๋ถ๋ถ์ ์ฝ๋๋ ์ํคํ ์ฒ/ํ๋ซํผ ๊ฐ์ ๊ณต์ ๋๋ฏ๋ก ๊ตฌํํด์ผ ํ ํ์๊ฐ ์์๋ณด๋ค ๋ง์ง ์์์ต๋๋ค.
๋ค์์ ์ด๋ฏธ ์ ์๋ํ๋ ๋ช ๊ฐ์ง ๋ชฉ๋ก์ ๋๋ค.
bytes, container/heap, container/list, container/ring, encoding/ascii85, encoding/asn1, encoding/base32, encoding/binary, encoding/csv, encoding/hex, errors, flag, hash/adler32, hash/crc32, hash/crc64, hash/fnv, html, image, image/color, index/suffixarray, math, math/bits, path, sort, strconv, strings, text/scanner, text/tabwriter, unicode, unicode/utf8, unicode/utf16
์์ง ์์ ์ด ํ์ํ ๋ช ๊ฐ์ง ์ฌํญ:
๋๋ ํ ๋ฌ ๋ฐ ๋์์ ์งํ ์ํฉ์ ๋ํด ๋งค์ฐ ๊ธฐ์ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌ๊ฐ ์๊ฐ์๋ง ๊ฐ๋ฅํฉ๋๋ค. Go 1.11์ ์ด๊ฒ์ ๋ฃ์ ์ ์๋ ์ข์ ๊ธฐํ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. 1์์ ๋ค์ ์ ๋ฐ์ดํธ๋ฅผ ๊ธฐ๋ํ์ธ์. ์ ๊ฐ ํด๊ฐ๋ฅผ ๋ค๋ ์จ ํ ํด์ผ์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค.