Go: ๋ชจ๋‘: WebAssembly("wasm") ์ง€์›

์— ๋งŒ๋“  2017๋…„ 02์›” 02์ผ  ยท  147์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: golang/go

WebAssembly("wasm")๋Š” Native Client์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ด๋ฅผ ๊ตฌํ˜„ํ•  ๊ณ„ํš์ด๋ผ๋Š” ์ ์—์„œ ํŠนํžˆ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

http://webassembly.org/

์ด๊ฒƒ์€ ๋ช‡ ๋ฒˆ ์š”์ฒญ๋˜์—ˆ์œผ๋ฏ€๋กœ ์ด๊ฒƒ์€ ์ถ”์  ๋ฒ„๊ทธ์ž…๋‹ˆ๋‹ค.

cmd/compile, gccgo ๋˜๋Š” llvm-go๋ฅผ ํ†ตํ•ด ์–ป๋“  ์—ฌ๊ธฐ์— ์—…๋ฐ์ดํŠธ๋ฅผ ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Arch-Wasm NeedsFix

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„. ์—ฌ๊ธฐ ๋‚ด ์ž‘์—…์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ง€๊ธˆ๊นŒ์ง€ Go ํŒ€๊ณผ ๊ธฐ์—ฌ์ž๋“ค์˜ ํ›Œ๋ฅญํ•œ ์ž‘์—… ๋•๋ถ„์— ๋งค์šฐ ์ข‹์€ ์ง„์ „์„ ์ด๋ฃจ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์ฝ”๋“œ๋Š” ์•„ํ‚คํ…์ฒ˜/ํ”Œ๋žซํผ ๊ฐ„์— ๊ณต์œ ๋˜๋ฏ€๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ•  ํ•„์š”๊ฐ€ ์˜ˆ์ƒ๋ณด๋‹ค ๋งŽ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์ด๋ฏธ ์ž˜ ์ž‘๋™ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค.

  • ๋ธŒ๋ผ์šฐ์ €์™€ Node.js์—์„œ ์ƒ์„ฑ๋œ wasm ์ฝ”๋“œ ์‹คํ–‰
  • ๊ธฐ๋ณธ ์ž‘์—…, ๋ณ€ํ™˜ ๋“ฑ
  • ์ธํ„ฐํŽ˜์ด์Šค
  • ๊ณ ๋ฃจํ‹ด๊ณผ ์ฑ„๋„
  • ์—ฐ๊ธฐ/๊ณตํ™ฉ/๊ตฌ์ถœ
  • Node.js๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋””์Šคํฌ์—์„œ ํŒŒ์ผ ์ฝ๊ธฐ
  • ๋‹ค์Œ ํŒจํ‚ค์ง€์˜ ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 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

์•„์ง ์ž‘์—…์ด ํ•„์š”ํ•œ ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ:

  • ๋ฐ˜์‚ฌ
  • ๊ณ ๋ฃจํ‹ด ์Šคํƒ ๋Š˜๋ฆฌ๊ธฐ
  • ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜
  • ์„ฑ๋Šฅ ์ตœ์ ํ™”
  • wasm ํŒŒ์ผ ํฌ๊ธฐ ์ตœ์ ํ™”
  • ๋ฉ‹์ง„ JS interop ๋ ˆ์ด์–ด
  • ๋” ๋งŽ์€ ํŒจํ‚ค์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜๊ธฐ ์œ„ํ•œ ๋‹ค๋ฅธ ๋งŽ์€ ๋ฌธ์ œ

๋‚˜๋Š” ํ•œ ๋‹ฌ ๋ฐ˜ ๋™์•ˆ์˜ ์ง„ํ–‰ ์ƒํ™ฉ์— ๋Œ€ํ•ด ๋งค์šฐ ๊ธฐ์ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ฐ€ ์‹œ๊ฐ„์—๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. Go 1.11์— ์ด๊ฒƒ์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ๊ธฐํšŒ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. 1์›”์— ๋‹ค์Œ ์—…๋ฐ์ดํŠธ๋ฅผ ๊ธฐ๋Œ€ํ•˜์„ธ์š”. ์ œ๊ฐ€ ํœด๊ฐ€๋ฅผ ๋‹ค๋…€์˜จ ํ›„ ํœด์ผ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  147 ๋Œ“๊ธ€

@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์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

WebAssembly ์Šคํƒ ๋จธ์‹  ์ปจํ…์ŠคํŠธ๋Š” ์„ ํ˜• ๋ฉ”๋ชจ๋ฆฌ์™€ ์ž‘์—… ์Šคํƒ์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. IIUC, VM ์ปจํ…์ŠคํŠธ ์ €์žฅ์€ ๋‹ค์Œ์„ ์ €์žฅํ•˜์—ฌ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ํ˜„์žฌ PC, ๋ฐ”์ดํŠธ ์ฝ”๋“œ ๋ฌธ์ž์—ด
  2. ์„ ํ˜• ๋ฉ”๋ชจ๋ฆฌ ๋ฐ
  3. ์ž‘์—… ์Šคํƒ

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๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ๋„๊ตฌ ์ฒด์ธ ์•„ํ‚คํ…์ฒ˜/์ฝ”๋“œ ์ƒ์„ฑ์—์„œ ์˜ฌ๋ฐ”๋ฅธ ์ˆ˜์ค€์— ์žˆ์ง€ ์•Š์€ ๊ฒƒ๊ณผ ๊ฐ™์€ ์‹ค์ˆ˜๋ฅผ ์ €์งˆ๋ €์Šต๋‹ˆ๊นŒ?

๊ธด ๋ชฉ๋ก์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์€ ์–ด๋–ค ์‹์œผ๋กœ๋“  ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • SSA ๋ฐฑ์—”๋“œ์—์„œ WebAssembly ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋ฐฑ์—”๋“œ๋Š” ๋จธ์‹ ์„ ๋“ฑ๋กํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ WebAssembly์˜ ์Šคํƒ ๋จธ์‹ ์— ์ ์‘ํ•˜๋ ค๋ฉด ์•ฝ๊ฐ„์˜ ์ž‘์—…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ํฌ์ธํ„ฐ๊ฐ€ ๋ญ”๊ฐ€์š”? WebAssembly์—๋Š” ํฌ์ธํ„ฐ ์œ ํ˜•์ด ์—†์Šต๋‹ˆ๋‹ค.
  • ์Šคํƒ์„ ์–ด๋–ป๊ฒŒ ๋‚ด๋ถ€ ์กฐ์‚ฌํ•ฉ๋‹ˆ๊นŒ? ๋ฌผ๋ก  ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘์„ ์œ„ํ•ด ํ•„์š”ํ•˜์ง€๋งŒ ํŒจ๋‹‰/๋ณต๊ตฌ, ์—ญ์ถ”์  ์ธ์‡„ ๋“ฑ์—๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ณ ๋ฃจํ‹ด์„ ์–ด๋–ป๊ฒŒ ์ผ์‹œ์ค‘๋‹จ/์žฌ๊ฐœํ•˜๋‚˜์š”?
  • ์–ด๋–ป๊ฒŒ ํž™์„ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? WebAssembly๋Š” ๋ณธ์งˆ์ ์œผ๋กœ sbrk๋งŒ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ณด๋‹ค ์ผ๋ฐ˜์ ์ธ ์ฃผ์†Œ ๊ณต๊ฐ„ ๋ ˆ์ด์•„์›ƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ฒ”์œ„, ptr/nonptr ๋น„ํŠธ ๋“ฑ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์–ด๋””์— ์ €์žฅํ•ฉ๋‹ˆ๊นŒ?
  • ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ. WebAssembly์—๋Š” ํ˜„์žฌ ์Šค๋ ˆ๋“œ์— ๋Œ€ํ•œ ๊ฐœ๋…์ด ์—†์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋™์‹œ GC๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ์ž ๊ธˆ๊ณผ ์›์ž์  ์—ฐ์‚ฐ๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • os ๋ฐ net๊ณผ ๊ฐ™์€ ํŒจํ‚ค์ง€์— ๋Œ€ํ•ด ์™ธ๋ถ€ ์„ธ๊ณ„์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ์–ด๋–ป๊ฒŒ ์ œ๊ณตํ•ฉ๋‹ˆ๊นŒ?
  • WebAssembly๋Š” "goto"๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ์•„๋งˆ๋„ ์™„์ „ํ•œ ๋ชฉ๋ก์ด ์•„๋‹ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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 ์ œ์•ˆ์€ ์•„์ง ์ง„ํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค. ๊ด€์‹ฌ ์žˆ๋Š” ๋‹น์‚ฌ์ž๋Š” ์—ฌ๊ธฐ์—์„œ ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/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 ํŒ€๊ณผ ๊ธฐ์—ฌ์ž๋“ค์˜ ํ›Œ๋ฅญํ•œ ์ž‘์—… ๋•๋ถ„์— ๋งค์šฐ ์ข‹์€ ์ง„์ „์„ ์ด๋ฃจ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์ฝ”๋“œ๋Š” ์•„ํ‚คํ…์ฒ˜/ํ”Œ๋žซํผ ๊ฐ„์— ๊ณต์œ ๋˜๋ฏ€๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ•  ํ•„์š”๊ฐ€ ์˜ˆ์ƒ๋ณด๋‹ค ๋งŽ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์ด๋ฏธ ์ž˜ ์ž‘๋™ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค.

  • ๋ธŒ๋ผ์šฐ์ €์™€ Node.js์—์„œ ์ƒ์„ฑ๋œ wasm ์ฝ”๋“œ ์‹คํ–‰
  • ๊ธฐ๋ณธ ์ž‘์—…, ๋ณ€ํ™˜ ๋“ฑ
  • ์ธํ„ฐํŽ˜์ด์Šค
  • ๊ณ ๋ฃจํ‹ด๊ณผ ์ฑ„๋„
  • ์—ฐ๊ธฐ/๊ณตํ™ฉ/๊ตฌ์ถœ
  • Node.js๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋””์Šคํฌ์—์„œ ํŒŒ์ผ ์ฝ๊ธฐ
  • ๋‹ค์Œ ํŒจํ‚ค์ง€์˜ ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 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

์•„์ง ์ž‘์—…์ด ํ•„์š”ํ•œ ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ:

  • ๋ฐ˜์‚ฌ
  • ๊ณ ๋ฃจํ‹ด ์Šคํƒ ๋Š˜๋ฆฌ๊ธฐ
  • ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜
  • ์„ฑ๋Šฅ ์ตœ์ ํ™”
  • wasm ํŒŒ์ผ ํฌ๊ธฐ ์ตœ์ ํ™”
  • ๋ฉ‹์ง„ JS interop ๋ ˆ์ด์–ด
  • ๋” ๋งŽ์€ ํŒจํ‚ค์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜๊ธฐ ์œ„ํ•œ ๋‹ค๋ฅธ ๋งŽ์€ ๋ฌธ์ œ

๋‚˜๋Š” ํ•œ ๋‹ฌ ๋ฐ˜ ๋™์•ˆ์˜ ์ง„ํ–‰ ์ƒํ™ฉ์— ๋Œ€ํ•ด ๋งค์šฐ ๊ธฐ์ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ฐ€ ์‹œ๊ฐ„์—๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. 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์„ ์ปดํŒŒ์ผํ•˜๊ณ  ์‹คํ–‰ํ•˜๋ ค๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด -

  1. ์ฝ˜์†”์— ์ถœ๋ ฅํ•˜๋Š” ๊ฐ„๋‹จํ•œ hello world ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  2. GOOS=js GOARCH=wasm ./bin/go build -o out.wasm wasm.go
  3. ./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)์—์„œ ์ž์œ ๋กญ๊ฒŒ ํ† ๋ก ์„ ๊ณ„์†ํ•˜์‹ญ์‹œ์˜ค. ๋˜๋Š” ํŠน๋ณ„ํžˆ ์—ผ๋‘์— ๋‘๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ์žˆ์œผ๋ฉด ์ƒˆ ๋ฌธ์ œ๋ฅผ ์—ฌ์‹ญ์‹œ์˜ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰