Design: ์ž„์˜ ๋ ˆ์ด๋ธ” ๋ฐ ๊ณ ํ† ์Šค๋ฅผ ์ง€์›ํ•˜์‹ญ์‹œ์˜ค.

์— ๋งŒ๋“  2016๋…„ 09์›” 08์ผ  ยท  159์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: WebAssembly/design

๋‚˜๋Š” ์›น ์–ด์…ˆ๋ธ”๋ฆฌ ์ž‘์—…์— ์ฐธ์—ฌํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” ์ ์„ ์ง€์ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
ํฌ๊ฑฐ๋‚˜ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์œ ์ง€ ๊ด€๋ฆฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๋‚ด ์ž์‹ ์˜
์žฅ๋‚œ๊ฐ ๊ฐ™์€ ์–ธ์–ด, QBE ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐฑ์—”๋“œ์— ๋Œ€ํ•œ ์‚ฌ์†Œํ•œ ๊ธฐ์—ฌ ๋ฐ
IBM ์ปดํŒŒ์ผ๋Ÿฌ ํŒ€์—์„œ ์ธํ„ด์‹ญ), ํ•˜์ง€๋งŒ ๊ฒฐ๊ตญ ์•ฝ๊ฐ„์˜ ์š•์„ค์„ ๋“ฃ๊ณ 
๋” ๋„๋ฆฌ ๊ณต์œ ํ•˜๋„๋ก ๊ถŒ์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‚ด๊ฐ€ ๋›ฐ์–ด๋“ค์–ด ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์ด ์•ฝ๊ฐ„ ๋ถˆํŽธํ•˜์ง€๋งŒ
๋‚ด๊ฐ€ ์ž‘์—…ํ•˜์ง€ ์•Š์€ ํ”„๋กœ์ ํŠธ์— ... ์—ฌ๊ธฐ์— ๊ฐ„๋‹ค :

๋‚ด ๋ถˆ๋งŒ ์‚ฌํ•ญ:

์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์ƒ์œ„ ๋ ˆ๋ฒจ์—์„œ ๊ฐ€์žฅ ๋จผ์ € ํ•˜๋Š” ์ผ์€
๊ตฌ์กฐ -- ๋ฃจํ”„, if ๋ฌธ ๋“ฑ -- ์˜๋ฏธ๋ก ์— ๋Œ€ํ•ด ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.
์œ ํ˜• ๊ฒ€์‚ฌ ๋“ฑ์„ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค. ๋‚ด๊ฐ€ ๊ทธ๋“ค๊ณผ ํ•จ๊ป˜ํ•˜๋Š” ๋‘ ๋ฒˆ์งธ ์ผ์€ ๊ทธ๋ƒฅ ๋˜์ง€๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๊ธฐ๋ณธ ๋ธ”๋ก์œผ๋กœ, ๊ทธ๋ฆฌ๊ณ  ๊ฐ€๋Šฅํ•˜๋ฉด SSA ํ˜•์‹์œผ๋กœ ํ‰ํ‰ํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ถ€๋ถ„์—์„œ๋Š”
์ปดํŒŒ์ผ๋Ÿฌ ์„ธ๊ณ„์—์„œ ์ธ๊ธฐ ์žˆ๋Š” ํ˜•์‹์€ ์—ฐ์† ์ „๋‹ฌ ์Šคํƒ€์ผ์ž…๋‹ˆ๋‹ค. ๋‚œ ์•„๋‹ˆ๋‹ค
์—ฐ์† ์ „๋‹ฌ ์Šคํƒ€์ผ๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ๋ฐ ์ „๋ฌธ๊ฐ€์ด์ง€๋งŒ ์–ด๋Š ์ชฝ๋„ ์•„๋‹Œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์›น ์–ด์…ˆ๋ธ”๋ฆฌ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋Š” ๋ฃจํ”„ ๋ฐ ๋ฒ”์œ„๊ฐ€ ์ง€์ •๋œ ๋ธ”๋ก์— ์ ํ•ฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
ํฌ์˜น.

๋” ํ‰ํ‰ํ•˜๊ณ  goto ๊ธฐ๋ฐ˜ ํ˜•์‹์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ›จ์”ฌ ๋” ์œ ์šฉํ•˜๋‹ค๊ณ  ์ฃผ์žฅํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
์ปดํŒŒ์ผ๋Ÿฌ ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ๋Œ€์ƒ์ด๋ฉฐ ํฌ๊ฒŒ ๋ฐฉํ•ดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํด๋ฆฌํ•„ ์ž‘์„ฑ.

๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” ๋˜ํ•œ ์ค‘์ฒฉ๋œ ๋ณต์žกํ•œ ํ‘œํ˜„์˜ ์—ด๋ ฌํ•œ ํŒฌ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์กฐ๊ธˆ
ํŠนํžˆ ๋‚ด๋ถ€ ๋…ธ๋“œ์— ๋ถ€์ž‘์šฉ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ์†Œ๋น„ํ•˜๊ธฐ๊ฐ€ ๋” ๋ณต์žกํ•˜์ง€๋งŒ,
์ปดํŒŒ์ผ๋Ÿฌ ๊ตฌํ˜„์ž๋กœ์„œ ๊ฐ•๋ ฅํ•˜๊ฒŒ ๋ฐ˜๋Œ€ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค -- ์›น ์–ด์…ˆ๋ธ”๋ฆฌ
JIT๋Š” ๊ทธ๊ฒƒ๋“ค์„ ์†Œ๋น„ํ•  ์ˆ˜ ์žˆ๊ณ , ๋‚˜๋Š” ๊ทธ๊ฒƒ๋“ค์„ ๋ฌด์‹œํ•˜๊ณ  ๋งคํ•‘ํ•˜๋Š” ์ง€์นจ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‚ด IR์—. ๊ทธ๋“ค์€ ๋‚ด๊ฐ€ ํ…Œ์ด๋ธ”์„ ๋’ค์ง‘๊ณ  ์‹ถ๊ฒŒ ๋งŒ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋” ํฐ ๋ฌธ์ œ๋Š” ๋ฃจํ”„, ๋ธ”๋ก ๋ฐ ๊ธฐํƒ€ ๊ตฌ๋ฌธ ์š”์†Œ๋กœ ๊ท€๊ฒฐ๋ฉ๋‹ˆ๋‹ค.
์ตœ์ ํ™” ์ปดํŒŒ์ผ๋Ÿฌ ์ž‘์„ฑ์ž๋กœ์„œ ์—ฌ๋Ÿฌ๋ถ„์€
๊ฐ€์žฅ์ž๋ฆฌ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ถ„๊ธฐ๊ฐ€ ์žˆ๋Š” ๊ทธ๋ž˜ํ”„; ๋ช…์‹œ์  ์ œ์–ด ํ๋ฆ„ ๊ตฌ์„ฑ
๋ฐฉํ•ด๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์™„๋ฃŒํ•œ ํ›„ ๊ทธ๋ž˜ํ”„์—์„œ ์žฌ๊ตฌ์„ฑ
์›ํ•˜๋Š” ์ตœ์ ํ™”๋Š” ํ™•์‹คํžˆ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ
๋” ๋ณต์žกํ•œ ํ˜•์‹์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ณต์žก์„ฑ. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ๋‚˜๋ฅผ ๊ท€์ฐฎ๊ฒŒํ•ฉ๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค
์ƒ์‚ฐ์ž์™€ ์†Œ๋น„์ž๋Š” ์™„์ „ํžˆ ๋ฐœ๋ช…๋œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๋ณต์žกํ•œ ์ œ์–ด ํ๋ฆ„ ๊ตฌ์„ฑ์„ ๊ฐ„๋‹จํžˆ ์‚ญ์ œํ•˜๋ฉด ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์›น ์–ด์…ˆ๋ธ”๋ฆฌ์—์„œ.

๋˜ํ•œ ๋” ๋†’์€ ์ˆ˜์ค€์˜ ๊ตฌ์„ฑ์„ ์ฃผ์žฅํ•˜๋ฉด ์ผ๋ถ€
๋ณ‘๋ฆฌํ•™ ์  ์‚ฌ๋ก€. ์˜ˆ๋ฅผ ๋“ค์–ด Duff์˜ ์žฅ์น˜๋Š” ๋”์ฐํ•œ ์›น์œผ๋กœ ๋๋‚ฉ๋‹ˆ๋‹ค.
The Wasm Explorer ์—์„œ
๊ทธ๋Ÿฌ๋‚˜ ์—ญ์€ ์‚ฌ์‹ค์ด ์•„๋‹™๋‹ˆ๋‹ค. ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ
์›น ์–ด์…ˆ๋ธ”๋Ÿฌ์—์„œ๋Š” ์ผ๋ถ€์—์„œ ๋™๋“ฑํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ณ€ํ™˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ตฌ์กฐํ™”๋˜์ง€ ์•Š์€ goto ๊ธฐ๋ฐ˜ ํ˜•์‹์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ตœ์†Œํ•œ ์›น ์–ด์…ˆ๋ธ”๋ฆฌ ํŒ€์ด ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•˜๋„๋ก ์ œ์•ˆํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
์ž„์˜์˜ ๋ ˆ์ด๋ธ” ๋ฐ goto ์ง€์›. ๊ทธ๋“ค์ด ๋” ๋†’์€ ๊ฒƒ์„ ์œ ์ง€ํ•˜๊ธฐ๋กœ ์„ ํƒํ•œ๋‹ค๋ฉด
์ˆ˜์ค€ ๊ตฌ์„ฑ, ๊ทธ๊ฒƒ์€ ์•ฝ๊ฐ„์˜ ๋‚ญ๋น„์ ์ธ ๋ณต์žก์„ฑ์ด ๋  ๊ฒƒ์ด์ง€๋งŒ ์ ์–ด๋„
๋‚˜ ๊ฐ™์€ ์ปดํŒŒ์ผ๋Ÿฌ ์ž‘์„ฑ์ž๋Š” ๋ฌด์‹œํ•˜๊ณ  ์ถœ๋ ฅ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ณง์žฅ.

ํด๋ฆฌํ•„๋ง:

์ด์— ๋Œ€ํ•ด ๋…ผ์˜ํ•  ๋•Œ ๋“ค์—ˆ๋˜ ์šฐ๋ ค ์ค‘ ํ•˜๋‚˜๋Š” ๋ฃจํ”„๊ฐ€
๋ธ”๋ก ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ๋กœ ์›น ์–ด์…ˆ๋ธ”๋ฆฌ์˜ ํด๋ฆฌํ•„๋ง์ด ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค.
์ด๊ฒƒ์ด ์™„์ „ํžˆ ์ž˜๋ชป๋œ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ๊ฐ„๋‹จํ•œ ํด๋ฆฌํ•„ ์†”๋ฃจ์…˜์ด
๋ ˆ์ด๋ธ” ๋ฐ gotos๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ตœ์ ์˜ ์ƒํƒœ๊ฐ€ ์•„๋‹ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
์ˆœ์„œ๋Œ€๋กœ ๋ฐ”์ดํŠธ ์ฝ”๋“œ์— ์•ฝ๊ฐ„์˜ ์ถ”ํ•จ์„ ์ค„ ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
๊ธฐ์ˆ  ๋ถ€์ฑ„๊ฐ€ ๋‚ด์žฅ๋œ ์ƒˆ๋กœ์šด ๋„๊ตฌ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

์›น ์–ด์…ˆ๋ธ”๋ฆฌ์— ๋Œ€ํ•œ ๊ตฌ๋ฌธ๊ณผ ๊ฐ™์€ LLVM(๋˜๋Š” QBE)์„ ๊ฐ€์ •ํ•˜๋ฉด ์ผ๋ถ€ ์ฝ”๋“œ๋Š”
๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ž…๋‹ˆ๋‹ค.

int f(int x) {
    if (x == 42)
        return 123;
    else
        return 666;
}

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 func @f(%x : i32) {
    %1 = test %x 42
jmp %1 iftrue iffalse

 L0:
    %r =i 123
jmp LRet
 L1:
    %r =i 666
jmp LRet
 Lret:
    ret %r
 }

์ด๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ํด๋ฆฌํ•„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

function f(x) {
    var __label = L0;
    var __ret;

    while (__label != LRet) {
        switch (__label) {
        case L0:
            var _v1 = (x == 42)
            if (_v1) {__lablel = L1;} else {label = L2;}
            break;
        case L1:
            __ret = 123
            __label = LRet
            break;
        case L2;
            __ret = 666
            __label = LRet
            break;
        default:
            assert(false);
            break;
    }
}

๋ชป์ƒ๊ฒผ์–ด? ์‘. ์ƒ๊ด€์ด ์žˆ๋‚˜? ์›น์–ด์…ˆ๋ธ”๋ฆฌ๊ฐ€ ๋ณธ๊ฒฉํ™”๋˜๋ฉด
์˜ค๋ž˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ:

๊ธ€์Ž„์š”, ๋งŒ์•ฝ ์ œ๊ฐ€ ์›น ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ ๋ชฉํ‘œ๋กœ ์‚ผ๊ฒŒ ๋œ๋‹ค๋ฉด, ์ €๋Š” ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
ํด๋ฆฌํ•„์—์„œ ์–ธ๊ธ‰ํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ณ  ์ตœ์„ ์„ ๋‹คํ•ด
์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€
์ด ํŒจํ„ด์„ ์žก์•„๋ผ.

๊ทธ๋Ÿฌ๋‚˜ ์ฝ”๋“œ ์ƒ์„ฑ์˜ ์–‘๋ฉด์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ง€์ •๋œ ํ˜•์‹์„ ํ•ด๊ฒฐํ•˜์‹ญ์‹œ์˜ค.

control flow

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

๊ณง ์ถœ์‹œ๋  Go 1.11 ๋ฆด๋ฆฌ์Šค์—๋Š” WebAssembly์— ๋Œ€ํ•œ ์‹คํ—˜์  ์ง€์›์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๊ณ ๋ฃจํ‹ด, ์ฑ„๋„ ๋“ฑ์„ ํฌํ•จํ•œ Go์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์™„์ „ํ•œ ์ง€์›์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ƒ์„ฑ๋œ WebAssembly์˜ ์„ฑ๋Šฅ์€ ํ˜„์žฌ ๊ทธ๋‹ค์ง€ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ฃผ๋กœ ๋ˆ„๋ฝ๋œ goto ๋ช…๋ น ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. goto ๋ช…๋ น์–ด๊ฐ€ ์—†์œผ๋ฉด ๋ชจ๋“  ํ•จ์ˆ˜์—์„œ ์ตœ์ƒ์œ„ ๋ฃจํ”„์™€ ์ ํ”„ ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. relooper ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์šฐ๋ฆฌ์—๊ฒŒ ์„ ํƒ ์‚ฌํ•ญ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ณ ๋ฃจํ‹ด ๊ฐ„์— ์ „ํ™˜ํ•  ๋•Œ ํ•จ์ˆ˜์˜ ๋‹ค๋ฅธ ์ง€์ ์—์„œ ์‹คํ–‰์„ ์žฌ๊ฐœํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. relooper๋Š” ์ด๊ฒƒ์„ ๋„์šธ ์ˆ˜ ์—†์œผ๋ฉฐ goto ๋ช…๋ น๋งŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

WebAssembly๊ฐ€ Go์™€ ๊ฐ™์€ ์–ธ์–ด๋ฅผ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋Š” ์ง€๊ฒฝ์— ์ด๋ฅด๊ฒŒ ๋œ ๊ฒƒ์€ ๊ต‰์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ง„์ •ํ•œ ์›น ์–ด์…ˆ๋ธ”๋ฆฌ๊ฐ€ ๋˜๋ ค๋ฉด WebAssembly๊ฐ€ ๋‹ค๋ฅธ ์–ด์…ˆ๋ธ”๋ฆฌ ์–ธ์–ด์™€ ๋™๋“ฑํ•˜๊ฒŒ ๊ฐ•๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Go์—๋Š” ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ ํ”Œ๋žซํผ์— ๋Œ€ํ•ด ๋งค์šฐ ํšจ์œจ์ ์ธ ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ณ ๊ธ‰ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์›น์„ ์œ„ํ•œ ํšจ์œจ์ ์ธ ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” ๋ฐ ์ด ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ด ์ฃผ๋กœ WebAssembly์˜ ์ œํ•œ์ด๊ณ  Go ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์ œํ•œ์ด ์•„๋‹ˆ๋ผ๊ณ  ์ฃผ์žฅํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

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

@oridb Wasm์€ ์†Œ๋น„์ž๊ฐ€ SSA ํ˜•์‹์œผ๋กœ ๋น ๋ฅด๊ฒŒ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹ค์†Œ ์ตœ์ ํ™”๋˜์–ด ์žˆ์œผ๋ฉฐ, ์—ฌ๊ธฐ์„œ ๊ตฌ์กฐ๊ฐ€ ์ผ๋ฐ˜์ ์ธ ์ฝ”๋“œ ํŒจํ„ด์— ๋„์›€์ด ๋˜๋ฏ€๋กœ ๊ตฌ์กฐ๊ฐ€ ๋ฐ˜๋“œ์‹œ ์†Œ๋น„์ž์—๊ฒŒ ๋ถ€๋‹ด์ด ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‚˜๋Š” '์ฝ”๋“œ ์ƒ์„ฑ์˜ ์–‘์ชฝ์ด ์ง€์ •๋œ ํ˜•์‹์„ ์ค‘์‹ฌ์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค'๋Š” ๊ท€ํ•˜์˜ ์ฃผ์žฅ์— ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Wasm์€ ๋‚ ์”ฌํ•˜๊ณ  ๋น ๋ฅธ ์†Œ๋น„์ž์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋” ์–‡๊ณ  ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ œ์•ˆ์ด ์žˆ๋‹ค๋ฉด ๊ฑด์„ค์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

DAG๋กœ ์ฃผ๋ฌธํ•  ์ˆ˜ ์žˆ๋Š” ๋ธ”๋ก์€ ๊ท€ํ•˜์˜ ์˜ˆ์™€ ๊ฐ™์ด wasm ๋ธ”๋ก ๋ฐ ๋ถ„๊ธฐ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šค์œ„์น˜ ๋ฃจํ”„๋Š” ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ์Šคํƒ€์ผ์ด๋ฉฐ ์•„๋งˆ๋„ ์†Œ๋น„์ž๋Š” ์—ฌ๊ธฐ์—์„œ ๋„์›€์„ ์ฃผ๊ธฐ ์œ„ํ•ด ์ ํ”„ ์Šค๋ ˆ๋”ฉ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐฑ์—”๋“œ์— ๋Œ€ํ•œ ๋งŽ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” binaryen์„ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค.

๋ณด๋‹ค ์ผ๋ฐ˜์ ์ธ CFG ์ง€์›์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ์š”์ฒญ์ด ์žˆ์—ˆ๊ณ  ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์–ธ๊ธ‰๋˜์—ˆ์ง€๋งŒ ํ˜„์žฌ ๋‹ค๋ฅธ ๊ณณ์—์„œ ์ดˆ์ ์„ ๋งž์ถ”๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ธ์ฝ”๋”ฉ์—์„œ ๋ช…์‹œ์ ์œผ๋กœ '์—ฐ์† ์ „๋‹ฌ ์Šคํƒ€์ผ'์„ ์ง€์›ํ•  ๊ณ„ํš์€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๋ธ”๋ก ๋ฐ ๋ฃจํ”„์—์„œ ์ธ์ˆ˜(๋žŒ๋‹ค์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ)๋ฅผ ํŒํ•‘ํ•˜๊ณ  ์—ฌ๋Ÿฌ ๊ฐ’(์—ฌ๋Ÿฌ ๋žŒ๋‹ค ์ธ์ˆ˜)์„ ์ง€์›ํ•˜๊ณ  ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์–ธ๊ธ‰์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. pick ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ •์˜(๋žŒ๋‹ค ์ธ์ˆ˜)๋ฅผ ๋” ์‰ฝ๊ฒŒ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ตฌ์กฐ๋Š” ์—ฌ๊ธฐ์—์„œ ์ผ๋ฐ˜์ ์ธ ์ฝ”๋“œ ํŒจํ„ด์— ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

์›น ์–ด์…ˆ๋ธ”๋ฆฌ๊ฐ€ ์ ์šฉํ•˜๋Š” ์ œํ•œ๋œ ๋ฃจํ”„ ๋ฐ ๋ธ”๋ก ํ•˜์œ„ ์ง‘ํ•ฉ์— ๋น„ํ•ด ์ž„์˜ ๋ ˆ์ด๋ธ”์— ๋Œ€ํ•œ ๋ถ„๊ธฐ ์ธก๋ฉด์—์„œ ๋” ์‰ฝ๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ๋ฐ˜์ ์ธ ์ฝ”๋“œ ํŒจํ„ด์€ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ํŠน์ • ์–ธ์–ด ํด๋ž˜์Šค์— ๋Œ€ํ•œ ์ž…๋ ฅ ์ฝ”๋“œ์™€ ๋งค์šฐ ์œ ์‚ฌํ•˜๊ฒŒ ๋งŒ๋“ค๋ ค๋Š” ์‹œ๋„๊ฐ€ ์žˆ์—ˆ๋‹ค๋ฉด ์•ฝ๊ฐ„์˜ ์ด์ ์„ ๋ณผ ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ ๊ทธ๊ฒƒ์ด ๋ชฉํ‘œ์ธ ๊ฒƒ ๊ฐ™์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

DAG๋กœ ์ฃผ๋ฌธํ•  ์ˆ˜ ์žˆ๋Š” ๋ธ”๋ก์€ ๊ท€ํ•˜์˜ ์˜ˆ์™€ ๊ฐ™์ด wasm ๋ธ”๋ก ๋ฐ ๋ถ„๊ธฐ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ, ๊ทธ๋Ÿด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์–ด๋–ค ๊ฒƒ์ด ์ด๋Ÿฐ ์‹์œผ๋กœ ํ‘œํ˜„๋  ์ˆ˜ ์žˆ๋Š”์ง€, ์–ด๋–ค ๊ฒƒ์ด ์ถ”๊ฐ€ ์ž‘์—…์ด ํ•„์š”ํ•œ์ง€ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ ์ž‘์—…์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ๊ฐ•๋ ฅํžˆ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ํ˜„์‹ค์ ์œผ๋กœ๋Š” ์ถ”๊ฐ€ ๋ถ„์„์„ ๊ฑด๋„ˆ๋›ฐ๊ณ  ํ•ญ์ƒ ์Šค์œ„์น˜ ๋ฃจํ”„ ํ˜•์‹์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ๋‚ด ์ฃผ์žฅ์€ ๋ฃจํ”„์™€ ๋ธ”๋ก์ด ๋ชจ๋“  ๊ฒƒ์„ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋“ค์ด ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์€ ๊ธฐ๊ณ„๊ฐ€ goto, goto_if ๋ฐ ์ž„์˜์˜ ๊ตฌ์กฐํ™”๋˜์ง€ ์•Š์€ ๋ ˆ์ด๋ธ”๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋” ๊ฐ„๋‹จํ•˜๊ณ  ์‰ฝ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐฑ์—”๋“œ์— ๋Œ€ํ•œ ๋งŽ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” binaryen์„ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค.

๋‚˜๋Š” ์ด๋ฏธ ์ƒ๋‹นํžˆ ๋งŒ์กฑํ•˜๋Š” ์„œ๋น„์Šค ๊ฐ€๋Šฅํ•œ ๋ฐฑ์—”๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ๋‚ด ์–ธ์–ด๋กœ ์ „์ฒด ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์™„์ „ํžˆ ๋ถ€ํŠธ์ŠคํŠธ๋žฉํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค. ๋ฃจํ”„/๋ธ”๋ก์„ ๊ฐ•์ œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์†Œ ํฐ ์ถ”๊ฐ€ ์ข…์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ ์Šค์œ„์น˜ ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ฝ”๋“œ๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” ๊ฒƒ์€ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์›น ์–ด์…ˆ๋ธ”๋ฆฌ์— ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ฒ™ ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋ถˆ์พŒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋” ์ผ๋ฐ˜์ ์ธ CFG ์ง€์›์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ์š”์ฒญ์ด ์žˆ์—ˆ๊ณ  ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์–ธ๊ธ‰๋˜์—ˆ์ง€๋งŒ ์•„๋งˆ๋„ ํ˜„์žฌ ๋‹ค๋ฅธ ๊ณณ์— ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์—ฌ์ „ํžˆ ๋ฃจํ”„๊ฐ€ ์–ด๋–ค ์ด์ ์ด ์žˆ๋Š”์ง€ ํ™•์‹ ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋ฃจํ”„๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์€ goto์™€ ๋ ˆ์ด๋ธ”๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ”Œ๋žซ ๋ช…๋ น ๋ชฉ๋ก์—์„œ SSA๋กœ ๋น ๋ฅด๊ณ  ์ž˜ ์•Œ๋ ค์ง„ ๋ณ€ํ™˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

CPS๊ฐ€ ์ง„ํ–‰๋˜๋Š” ํ•œ ๋‚˜๋Š” ๋ช…์‹œ์ ์ธ ์ง€์›์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. FP ์„œํด์—์„œ ์ธ๊ธฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด์…ˆ๋ธ”๋ฆฌ๋กœ ์ง์ ‘ ๋ณ€ํ™˜ํ•˜๊ธฐ๊ฐ€ ์ƒ๋‹นํžˆ ์‰ฝ๊ณ  ์ถ”๋ก  ์ธก๋ฉด์—์„œ SSA์™€ ์œ ์‚ฌํ•œ ์ด์ ์„ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค(http:// mlton.org/pipermail/mlton/2003-January/023054.html); ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ์ „๋ฌธ๊ฐ€๋Š” ์•„๋‹ˆ์ง€๋งŒ ๋‚ด๊ฐ€ ๊ธฐ์–ตํ•˜๋Š” ๋ฐ”์— ๋”ฐ๋ฅด๋ฉด ํ˜ธ์ถœ ์—ฐ์†์„ฑ์€ ๋ ˆ์ด๋ธ”, ๋ช‡ ๋ฒˆ์˜ ์ด๋™ ๋ฐ ๊ณ ํ† ๋กœ ๋‚ฎ์•„์กŒ์Šต๋‹ˆ๋‹ค.

@oridb 'ํ”Œ๋žซ ๋ช…๋ น ๋ชฉ๋ก์—์„œ SSA๋กœ์˜ ๋น ๋ฅด๊ณ  ์ž˜ ์•Œ๋ ค์ง„ ๋ณ€ํ™˜์ด ์žˆ์Šต๋‹ˆ๋‹ค'

๊ทธ๋“ค์ด wasm SSA ๋””์ฝ”๋”์™€ ์–ด๋–ป๊ฒŒ ๋น„๊ต๋˜๋Š”์ง€ ์•„๋Š” ๊ฒƒ์ด ํฅ๋ฏธ๋กœ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์ค‘์š”ํ•œ ์งˆ๋ฌธ์ž…๋‹ˆ๊นŒ?

Wasm์€ ํ˜„์žฌ ๊ฐ’ ์Šคํƒ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๊ตฌ์กฐ ์—†์ด๋Š” ์ผ๋ถ€ ์ด์ ์ด ์‚ฌ๋ผ์ง€๊ณ  ๋””์ฝ”๋” ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ’ ์Šคํƒ์ด ์—†์œผ๋ฉด SSA ๋””์ฝ”๋”ฉ๋„ ๋” ๋งŽ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋ ˆ์ง€์Šคํ„ฐ ๊ธฐ๋ณธ ์ฝ”๋“œ๋ฅผ ์‹œ๋„ํ–ˆ์ง€๋งŒ ๋””์ฝ”๋”ฉ์ด ๋” ๋Š๋ ธ์Šต๋‹ˆ๋‹ค(์–ผ๋งˆ๋‚˜ ์ค‘์š”ํ•œ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Œ).

๊ฐ’ ์Šคํƒ์„ ์œ ์ง€ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ๋ ˆ์ง€์Šคํ„ฐ ๊ธฐ๋ฐ˜ ๋””์ž์ธ์„ ์‚ฌ์šฉํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๊ฐ’ ์Šคํƒ์„ ์œ ์ง€ํ•˜๋ฉด CIL ๋ณต์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๊ณ  wasm ์„ฑ๋Šฅ์„ CIL๊ณผ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์‹ค์ œ๋กœ ์ด๊ฒƒ์„ ํ™•์ธํ•˜๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๊ฐ’ ์Šคํƒ์„ ์œ ์ง€ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ๋ ˆ์ง€์Šคํ„ฐ ๊ธฐ๋ฐ˜ ๋””์ž์ธ์„ ์‚ฌ์šฉํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์ €๋Š” ์‚ฌ์‹ค ๊ทธ๋Ÿฐ ๋ถ€๋ถ„์— ๋Œ€ํ•ด ๊ฐ•ํ•œ ๊ฐ์ •์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ธ์ฝ”๋”ฉ์˜ ๊ฐ„๊ฒฐํ•จ์ด ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ ˆ์ง€์Šคํ„ฐ ๋””์ž์ธ์€ ๊ฑฐ๊ธฐ์—์„œ ์ž˜ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” gzip์„ ํ†ตํ•ด ํ™˜์ƒ์ ์œผ๋กœ ์••์ถ•๋˜๋Š” ๊ฒƒ์œผ๋กœ ํŒ๋ช…๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ๋จธ๋ฆฌ๋กœ๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์„ฑ๋Šฅ์€ ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ์ด์ง€๋งŒ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ถœ๋ ฅ์„ ์บ์‹œํ•˜๋Š” ๊ธฐ๋Šฅ๊ณผ ๋‹ค์šด๋กœ๋“œ ์‹œ๊ฐ„์ด ๋””์ฝ”๋”ฉ๋ณด๋‹ค ํ›จ์”ฌ ๋” ์ค‘์š”ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๊ฐ์•ˆํ•  ๋•Œ ์„ฑ๋Šฅ์ด ๋œ ์ค‘์š”ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋“ค์ด wasm SSA ๋””์ฝ”๋”์™€ ์–ด๋–ป๊ฒŒ ๋น„๊ต๋˜๋Š”์ง€ ์•„๋Š” ๊ฒƒ์ด ํฅ๋ฏธ๋กœ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์ค‘์š”ํ•œ ์งˆ๋ฌธ์ž…๋‹ˆ๊นŒ?

SSA๋กœ ๋””์ฝ”๋”ฉํ•˜๋Š” ๊ฒฝ์šฐ ์ ์ ˆํ•œ ์–‘์˜ ์ตœ์ ํ™”๋„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์šฐ์„  ๋””์ฝ”๋”ฉ ์„ฑ๋Šฅ์ด ์–ผ๋งˆ๋‚˜ ์ค‘์š”ํ•œ์ง€ ๋ฒค์น˜๋งˆํ‚นํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋„ค, ํ™•์‹คํžˆ ์ข‹์€ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค.

์งˆ๋ฌธ๊ณผ ์šฐ๋ ค์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๋งŽ์€ ๋””์ž์ด๋„ˆ์™€ ๊ตฌํ˜„์ž๊ฐ€
WebAssembly๋Š” ๊ณ ์„ฑ๋Šฅ, ์‚ฐ์—…์šฉ JIT๋ฟ๋งŒ ์•„๋‹ˆ๋ผ
JavaScript(V8, SpiderMonkey, Chakra, JavaScriptCore) ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ
LLVM ๋ฐ ๊ธฐํƒ€ ์ปดํŒŒ์ผ๋Ÿฌ. ๊ฐœ์ธ์ ์œผ๋กœ Java์šฉ JIT 2๊ฐœ๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.
๋ฐ”์ดํŠธ์ฝ”๋“œ์ด๊ณ  ๋ฌด์ œํ•œ goto๊ฐ€ ์žˆ๋Š” ์Šคํƒ ๋จธ์‹ ์ด ์žˆ์Œ์„ ์ฆ๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋””์ฝ”๋”ฉ, ํ™•์ธ ๋ฐ ๊ตฌ์„ฑ์— ์ƒ๋‹นํ•œ ๋ณต์žก์„ฑ์ด ๋„์ž…๋ฉ๋‹ˆ๋‹ค.
์ปดํŒŒ์ผ๋Ÿฌ IR. ์‚ฌ์‹ค ์ž๋ฐ”๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ํŒจํ„ด์€ ๋งŽ๋‹ค
C1๊ณผ C2๋ฅผ ๋ชจ๋‘ ํฌํ•จํ•˜์—ฌ ๊ณ ์„ฑ๋Šฅ JIT๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๋ฐ”์ดํŠธ์ฝ”๋“œ
HotSpot์€ ๋‹จ์ˆœํžˆ ํฌ๊ธฐํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ๋‹ค์Œ์—์„œ๋งŒ ์‹คํ–‰๋˜๋„๋ก ๊ฐ•๋“ฑํ•ฉ๋‹ˆ๋‹ค.
ํ†ต์—ญ์‚ฌ. ๋Œ€์กฐ์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์œผ๋กœ๋ถ€ํ„ฐ ์ปดํŒŒ์ผ๋Ÿฌ IR์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
JavaScript๋‚˜ ๋‹ค๋ฅธ ์–ธ์–ด์˜ AST๋„ ์ œ๊ฐ€ ํ•œ ์ผ์ž…๋‹ˆ๋‹ค. ๊ทธ๋งŒํผ
AST์˜ ์ถ”๊ฐ€ ๊ตฌ์กฐ๋Š” ์ด ์ž‘์—…์˜ ์ผ๋ถ€๋ฅผ ํ›จ์”ฌ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

WebAssembly์˜ ์ œ์–ด ํ๋ฆ„ ๊ตฌ์กฐ์˜ ์„ค๊ณ„๋Š” ๋‹ค์Œ์„ ํ†ตํ•ด ์†Œ๋น„์ž๋ฅผ ๋‹จ์ˆœํ™”ํ•ฉ๋‹ˆ๋‹ค.
๋น ๋ฅด๊ณ  ๊ฐ„๋‹จํ•œ ๊ฒ€์ฆ, ์†์‰ฌ์šด, SSA ์–‘์‹์œผ๋กœ์˜ ์›ํŒจ์Šค ๋ณ€ํ™˜ ๊ฐ€๋Šฅ
(์‹ฌ์ง€์–ด ๊ทธ๋ž˜ํ”„ IR), ํšจ๊ณผ์ ์ธ ๋‹จ์ผ ํŒจ์Šค JIT ๋ฐ (ํ›„๋ถˆ ์ฃผ๋ฌธ ๋ฐ
์Šคํƒ ๋จธ์‹ ) ๋น„๊ต์  ๊ฐ„๋‹จํ•œ ์ œ์ž๋ฆฌ ํ•ด์„. ๊ตฌ์กฐํ™”
์ œ์–ด๋Š” ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„ ๊ทธ๋ž˜ํ”„๋ฅผ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
๋””์ฝ”๋”์™€ ์ปดํŒŒ์ผ๋Ÿฌ์— ๋Œ€ํ•œ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ๋ถˆ์พŒํ•œ ์ฝ”๋„ˆ ์ผ€์ด์Šค. ๋˜ํ•œ
WASM ๋ฐ”์ดํŠธ์ฝ”๋“œ์—์„œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๋‹จ๊ณ„๋ฅผ ๋ฉ‹์ง€๊ฒŒ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
์ด๋ฏธ ์ƒ์‚ฐ๊ณผ ํ•จ๊ป˜ ํ”„๋กœํ† ํƒ€์ž…์„ ๊ฐœ๋ฐœ ์ค‘์ž…๋‹ˆ๋‹ค.
๊ตฌํ˜„.

์šฐ๋ฆฌ๋Š” ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ํšŒ์›๋“ค ์‚ฌ์ด์—์„œ ๋งŽ์€ ๋‚ด๋ถ€ ํ† ๋ก ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.
๋ฐ”์ดํŠธ์ฝ”๋“œ์˜ ๊ฒฝ์šฐ ์ฃผ์ œ์™€ ๊ฐ€์žฅ ๋‹ค๋ฅธ ๊ฒƒ ์ค‘ ํ•˜๋‚˜์ด๊ธฐ ๋•Œ๋ฌธ์—
๋‹ค๋ฅธ ๊ธฐ๊ณ„ ์ˆ˜์ค€ ๋ชฉํ‘œ. ํ•˜์ง€๋งŒ ํƒ€๊ฒŸํŒ…๊ณผ ๋‹ค๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
JavaScript(์š”์ฆ˜ ๋งŽ์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š”)์™€ ๊ฐ™์€ ์†Œ์Šค ์–ธ์–ด ๋ฐ
๊ตฌ์กฐ๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋ธ”๋ก์„ ์•ฝ๊ฐ„๋งŒ ์žฌ๊ตฌ์„ฑํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ฑฐ๊ธฐ
์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์•Œ๋ ค์ง„ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋„๊ตฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ผ๋ถ€๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค
์ž„์˜์˜ CFG๋กœ ์‹œ์ž‘ํ•˜๋Š” ์ƒ์‚ฐ์ž๋ฅผ ์œ„ํ•œ ๋” ๋‚˜์€ ์ง€์นจ
์ด๊ฒƒ์„ ๋” ์ž˜ ์ „๋‹ฌํ•˜์‹ญ์‹œ์˜ค. AST์—์„œ ์ง์ ‘ WASM์„ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ์–ธ์–ด์˜ ๊ฒฝ์šฐ
(์‹ค์ œ๋กœ V8์ด ํ˜„์žฌ asm.js ์ฝ”๋“œ์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์ž…๋‹ˆ๋‹ค.
JavaScript AST๋ฅผ WASM ๋ฐ”์ดํŠธ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜), ๊ตฌ์กฐ ์กฐ์ •์ด ์—†์Šต๋‹ˆ๋‹ค.
ํ•„์š”ํ•œ ๋‹จ๊ณ„. ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์ด ๋งŽ์€ ์–ธ์–ด ๋„๊ตฌ์˜ ๊ฒฝ์šฐ์ผ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค.
๋‚ด๋ถ€์— ์ •๊ตํ•œ IR์ด ์—†๋Š” ์ŠคํŽ™ํŠธ๋Ÿผ ์ „๋ฐ˜์— ๊ฑธ์ณ.

2016๋…„ 9์›” 8์ผ ๋ชฉ์š”์ผ ์˜ค์ „ 9์‹œ 53๋ถ„, Ori Bernstein [email protected]
์ผ๋‹ค:

๊ฐ’ ์Šคํƒ์„ ์œ ์ง€ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ๋ ˆ์ง€์Šคํ„ฐ ๊ธฐ๋ฐ˜ ๋””์ž์ธ์„ ์‚ฌ์šฉํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์ €๋Š” ์‚ฌ์‹ค ๊ทธ๋Ÿฐ ๋ถ€๋ถ„์— ๋Œ€ํ•ด ๊ฐ•ํ•œ ๊ฐ์ •์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ƒ์ƒํ•  ๊ฒƒ์ด๋‹ค
์ธ์ฝ”๋”ฉ์˜ ์••์ถ•์ด ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์ฒ˜๋Ÿผ
์–ธ๊ธ‰๋œ ์„ฑ๋Šฅ์€ ๋˜ ๋‹ค๋ฅธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋“ค์ด wasm SSA ๋””์ฝ”๋”์™€ ์–ด๋–ป๊ฒŒ ๋น„๊ต๋˜๋Š”์ง€ ์•„๋Š” ๊ฒƒ์ด ํฅ๋ฏธ๋กœ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ค‘์š”ํ•œ ์งˆ๋ฌธ์ž…๋‹ˆ๊นŒ?

SSA๋กœ ๋””์ฝ”๋”ฉํ•˜๋Š” ๊ฒฝ์šฐ
ํ•ฉ๋ฆฌ์ ์ธ ์–‘์˜ ์ตœ์ ํ™”. ๋ฒค์น˜๋งˆํ‚น ๋ฐฉ๋ฒ•์ด ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.
์ค‘์š”ํ•œ ๋””์ฝ”๋”ฉ ์„ฑ๋Šฅ์ด ์šฐ์„ ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ๋„ค, ๊ทธ๊ฑด
ํ™•์‹คํžˆ ์ข‹์€ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค.

โ€”
์ด ์Šค๋ ˆ๋“œ์— ๊ฐ€์ž…ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/WebAssembly/design/issues/796#issuecomment -245521009,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/ALnq1Iz1nn4--NL32R9ev0JPKfEnDyvqks5qn77cgaJpZM4J3ofA
.

@titzer๋‹˜ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. Wasm์˜ ๊ตฌ์กฐ๊ฐ€ asm.js์™€์˜ ์œ ์‚ฌ์„ฑ ์ด์ƒ์˜ ๋ชฉ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ์˜์‹ฌ์„ ํ‚ค์šฐ๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. Java ๋ฐ”์ดํŠธ์ฝ”๋“œ(๋ฐ CIL)๋Š” CFG ๋˜๋Š” ๊ฐ’ ์Šคํƒ์„ ์ง์ ‘ ๋ชจ๋ธ๋งํ•˜์ง€ ์•Š์œผ๋ฉฐ JIT์—์„œ ์ถ”๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Wasm์—์„œ(ํŠนํžˆ ๋ธ”๋ก ์„œ๋ช…์ด ์ถ”๊ฐ€๋œ ๊ฒฝ์šฐ) JIT๋Š” ๊ฐ’ ์Šคํƒ ๋ฐ ์ œ์–ด ํ๋ฆ„์—์„œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ CFG(๋˜๋Š” ๊ตฌ์ฒด์ ์œผ๋กœ ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„)๊ฐ€ ๋ฃจํ”„ ๋ฐ ๋ธ”๋ก์ฒ˜๋Ÿผ ๋ช…์‹œ์ ์œผ๋กœ ๋ชจ๋ธ๋ง๋˜์—ˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋‹น์‹ ์ด ์ƒ๊ฐํ•˜๊ณ  ์žˆ๋Š” ๋ถˆ์พŒํ•œ ์ฝ”๋„ˆ ์ผ€์ด์Šค์˜ ๋Œ€๋ถ€๋ถ„์„ ํ”ผํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

๋ถ„๊ธฐ ์˜ˆ์ธก์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„์— ์˜์กดํ•˜๋Š” ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์ด ๊น”๋”ํ•œ ์ตœ์ ํ™”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค...

@oridb

๋” ํ‰ํ‰ํ•˜๊ณ  goto ๊ธฐ๋ฐ˜ ํ˜•์‹์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ›จ์”ฌ ๋” ์œ ์šฉํ•˜๋‹ค๊ณ  ์ฃผ์žฅํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
์ปดํŒŒ์ผ๋Ÿฌ ๊ฐœ๋ฐœ์ž ๋Œ€์ƒ

goto๊ฐ€ ๋งŽ์€ ์ปดํŒŒ์ผ๋Ÿฌ์— ๋งค์šฐ ์œ ์šฉํ•˜๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— Binaryen๊ณผ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด gotos ๋ฅผ ์‚ฌ์šฉ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋ฅผ ๋งค์šฐ ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์œผ๋กœ WebAssembly๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

WebAssembly๋ฅผ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์†Œ๋น„ํ•˜๋„๋ก ์ตœ์ ํ™”๋œ ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค( @titzer๊ฐ€ ์ง€์ ํ•œ ๋Œ€๋กœ). ๋Œ€๋ถ€๋ถ„์˜ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” WebAssembly๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ์˜คํžˆ๋ ค Binaryen๊ณผ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ goto๋ฅผ ๋‚ด๋ณด๋‚ด๊ณ  ๋งŽ์€ ์ตœ์ ํ™”๋ฅผ ๋ฌด๋ฃŒ๋กœ ์–ป์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ WebAssembly์˜ ์ €์ˆ˜์ค€ ๋ฐ”์ด๋„ˆ๋ฆฌ ํ˜•์‹ ์„ธ๋ถ€ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ IR์„ ๋ฐฉ์ถœํ•ฉ๋‹ˆ๋‹ค).

๋‹น์‹ ์ด ์–ธ๊ธ‰ํ•œ while-switch ํŒจํ„ด์„ ์‚ฌ์šฉํ•œ ํด๋ฆฌํ•„๋ง๊ณผ ๊ด€๋ จํ•˜์—ฌ: emscripten์—์„œ ์šฐ๋ฆฌ๋Š” ๋ฃจํ”„๋ฅผ ์žฌ์ƒ์„ฑํ•˜๋Š” "relooper" ๋ฐฉ๋ฒ•์„ ๊ฐœ๋ฐœํ•˜๊ธฐ ์ „์— ๊ทธ๋Ÿฐ ์‹์œผ๋กœ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. while-switch ํŒจํ„ด์€ ํ‰๊ท ์ ์œผ๋กœ ์•ฝ 4๋ฐฐ ๋” ๋Š๋ฆฝ๋‹ˆ๋‹ค(๊ทธ๋Ÿฌ๋‚˜ ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ํ›จ์”ฌ ์ ๊ฑฐ๋‚˜ ๋” ๋งŽ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ž‘์€ ๋ฃจํ”„๊ฐ€ ๋” ๋ฏผ๊ฐํ•ฉ๋‹ˆ๋‹ค). ์ด๋ก ์ ์œผ๋กœ ์ ํ”„ ์Šค๋ ˆ๋”ฉ ์ตœ์ ํ™”๊ฐ€ ์†๋„๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์— ๋™์˜ํ•˜์ง€๋งŒ ์ผ๋ถ€ VM์ด ๋‹ค๋ฅธ VM๋ณด๋‹ค ๋” ์ž˜ ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ ์„ฑ๋Šฅ์„ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ฝ”๋“œ ํฌ๊ธฐ ์ธก๋ฉด์—์„œ ํ›จ์”ฌ ๋” ํฝ๋‹ˆ๋‹ค.

WebAssembly๋ฅผ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์†Œ๋น„ํ•˜๋„๋ก ์ตœ์ ํ™”๋œ ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค( @titzer๊ฐ€ ์ง€์ ํ•œ ๋Œ€๋กœ). ๋Œ€๋ถ€๋ถ„์˜ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” WebAssembly๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  Binaryen๊ณผ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค...

๋‚˜๋Š” ์—ฌ์ „ํžˆ ์ด ์ธก๋ฉด์ด ๊ทธ๋ ‡๊ฒŒ ์ค‘์š”ํ•  ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋น„์šฉ์ด ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๋Š” ์ง€์—ฐ์„ ์ง€๋ฐฐํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ๋กœ ํฐ ๋น„์šฉ์€ ๊ตฌ๋ฌธ ๋ถ„์„ ๋ฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ฐ€ ์•„๋‹ˆ๋ผ ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. . ๋‚˜๋Š” ๋˜ํ•œ ๋ฐ”์ดํŠธ์ฝ”๋“œ๊ฐ€ ๋ฒ„๋ ค์ง€๊ณ  ์ปดํŒŒ์ผ๋œ ์ถœ๋ ฅ์ด ์บ์‹œ๋  ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •/ํฌ๋งํ•˜์—ฌ ์ปดํŒŒ์ผ์„ ํšจ๊ณผ์ ์œผ๋กœ ์ผํšŒ์„ฑ ๋น„์šฉ์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์›น ๋ธŒ๋ผ์šฐ์ € ์†Œ๋น„๋ฅผ ์œ„ํ•ด ์ตœ์ ํ™”ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ์›น ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ SSA๋กœ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์ด๋Š” ๋‚ด๊ฐ€ ์˜ˆ์ƒํ•˜๋Š” ๊ฒƒ๊ณผ ๋” ์ผ์น˜ํ•˜๊ณ  SSA๋กœ '๋ณ€ํ™˜'ํ•˜๋Š” ๋ฐ ๋“œ๋Š” ๋…ธ๋ ฅ์ด ๋œํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

๋‹ค์šด๋กœ๋“œํ•˜๋Š” ๋™์•ˆ ๊ตฌ๋ฌธ ๋ถ„์„ ๋ฐ ์ปดํŒŒ์ผ์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ผ๋ถ€ VM์€ ์ „์ฒด ์ปดํŒŒ์ผ์„ ๋ฏธ๋ฆฌ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ๋ฅผ ๋“ค์–ด ๋‹จ์ˆœํ•œ ๊ธฐ์ค€์„ ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ). ๋”ฐ๋ผ์„œ ๋‹ค์šด๋กœ๋“œ ๋ฐ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์€ ์˜ˆ์ƒ๋ณด๋‹ค ์งง์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ฒฐ๊ณผ์ ์œผ๋กœ ๊ตฌ๋ฌธ ๋ถ„์„ ๋ฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ฐ€ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ‘œ์‹œ๋˜๋Š” ์ด ์ง€์—ฐ ์‹œ๊ฐ„์˜ ์ค‘์š”ํ•œ ์š”์†Œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SSA ํ‘œํ˜„๊ณผ ๊ด€๋ จํ•˜์—ฌ ์ฝ”๋“œ ํฌ๊ธฐ๊ฐ€ ํฐ ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. SSA๋Š” ์ฝ”๋“œ ์ตœ์ ํ™”์—๋Š” ์ ํ•ฉํ•˜์ง€๋งŒ ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ง๋ ฌํ™”ํ•˜๋Š” ๋ฐ์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@oridb '..., ๊ฐ„๋‹จํ•œ ๊ฒ€์ฆ, ์‰ฝ๊ฒŒ, ํ•˜๋‚˜์˜ ํŒจ์Šค ๋ณ€ํ™˜ SSA์— ์–‘์‹ ๋น ๋ฅธ ๊ฐ€๋Šฅํ•˜๊ฒŒํ•จ์œผ๋กœ์จ WebAssembly์˜ ์ œ์–ด ํ๋ฆ„ ๊ตฌ์กฐ ๋‹จ์ˆœํ™” ์†Œ๋น„์ž์˜ ๋””์ž์ธ'@titzer์œผ๋กœ ์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค - ๊ทธ๊ฒƒ์€ ํ•œ ๋ฒˆ์— _verified_ SSA๋ฅผ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. wasm์ด ์ธ์ฝ”๋”ฉ์— SSA๋ฅผ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ wasm ์ œ์–ด ํ๋ฆ„ ์ œํ•œ์œผ๋กœ ์‰ฝ๊ฒŒ ๋„๋ฏธ๋„ค์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ํ™•์ธํ•ด์•ผ ํ•˜๋Š” ๋ถ€๋‹ด์ด ์žˆ์Šต๋‹ˆ๋‹ค.

wasm์˜ ์ธ์ฝ”๋”ฉ ํšจ์œจ์„ฑ์˜ ๋Œ€๋ถ€๋ถ„์€ ์ •์˜๊ฐ€ ์Šคํƒ ์ˆœ์„œ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋‹จ์ผ ์šฉ๋„๋ฅผ ๊ฐ–๋Š” ๊ณตํ†ต ์ฝ”๋“œ ํŒจํ„ด์— ๋Œ€ํ•ด ์ตœ์ ํ™”๋œ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. SSA ์ธ์ฝ”๋”ฉ๋„ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋น„์Šทํ•œ ์ธ์ฝ”๋”ฉ ํšจ์œจ์„ฑ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์„ ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์ด์•„๋ชฌ๋“œ ํŒจํ„ด์— ๋Œ€ํ•œ if_else ๊ฐ™์€ ์—ฐ์‚ฐ์ž๋„ ๋งŽ์€ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ wasm ๊ตฌ์กฐ๊ฐ€ ์—†์œผ๋ฉด ๋ชจ๋“  ๊ธฐ๋ณธ ๋ธ”๋ก์ด ๋ ˆ์ง€์Šคํ„ฐ์—์„œ ์ •์˜๋ฅผ ์ฝ๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ ˆ์ง€์Šคํ„ฐ์— ์จ์•ผ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋ฉฐ ๊ทธ๋ ‡๊ฒŒ ํšจ์œจ์ ์ด์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, wasm์€ ์Šคํƒ์˜ ์œ„์ชฝ๊ณผ ๊ธฐ๋ณธ ๋ธ”๋ก ๊ฒฝ๊ณ„๋ฅผ ๋„˜์–ด ๋ฒ”์œ„๊ฐ€ ์ง€์ •๋œ ์Šคํƒ ๊ฐ’์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” pick ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ›จ์”ฌ ๋” ๋‚˜์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” was๊ฐ€ SSA ์Šคํƒ€์ผ๋กœ ๋Œ€๋ถ€๋ถ„์˜ ์ฝ”๋“œ๋ฅผ ์ธ์ฝ”๋”ฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๊ณผ ๊ทธ๋ฆฌ ๋ฉ€์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ •์˜๊ฐ€ ๊ธฐ๋ณธ ๋ธ”๋ก ์ถœ๋ ฅ์œผ๋กœ ๋ฒ”์œ„ ํŠธ๋ฆฌ ์œ„๋กœ ์ „๋‹ฌ๋˜๋ฉด ์™„๋ฃŒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. SSA ์ธ์ฝ”๋”ฉ์ด CFG ๋ฌธ์ œ์™€ ์ง๊ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด wasm CFG ์ œํ•œ์ด ์žˆ๋Š” SSA ์ธ์ฝ”๋”ฉ์ด ์žˆ์„ ์ˆ˜ ์žˆ๊ณ  CFG ์ œํ•œ์ด ์žˆ๋Š” ๋ ˆ์ง€์Šคํ„ฐ ๊ธฐ๋ฐ˜ VM์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

wasm์˜ ๋ชฉํ‘œ๋Š” ์ตœ์ ํ™” ๋ถ€๋‹ด์„ ๋Ÿฐํƒ€์ž„ ์†Œ๋น„์ž ๋ฐ–์œผ๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ณต๊ฒฉ ํ‘œ๋ฉด์„ ์ฆ๊ฐ€์‹œํ‚ค๊ธฐ ๋•Œ๋ฌธ์— ๋Ÿฐํƒ€์ž„ ์ปดํŒŒ์ผ๋Ÿฌ์— ๋ณต์žก์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๊ฐ•ํ•œ ์ €ํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์„ค๊ณ„์ƒ์˜ ๋ฌธ์ œ ์ค‘ ๋งŽ์€ ๋ถ€๋ถ„์ด ์„ฑ๋Šฅ ์ €ํ•˜ ์—†์ด ๋Ÿฐํƒ€์ž„ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ฌป๋Š” ๊ฒƒ์ด๋ฉฐ ๋งŽ์€ ํ† ๋ก ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค!

๊ธ€์Ž„, ์ง€๊ธˆ์€ ๋„ˆ๋ฌด ๋Šฆ์—ˆ์„์ง€ ๋ชจ๋ฅด์ง€๋งŒ, ๋ฆฌ๋ฃจํผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋˜๋Š” ๊ทธ ๋ณ€ํ˜•์ด ๋ชจ๋“  ๊ฒฝ์šฐ์— "์ถฉ๋ถ„ํžˆ ์ข‹์€" ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์•„์ด๋””์–ด์— ์˜๋ฌธ์„ ์ œ๊ธฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์†Œ์Šค ์ฝ”๋“œ์—๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„์ด ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ์— ๋ถ„๋ช…ํžˆ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ์ ํ™”๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ผ์„ ๋„ˆ๋ฌด ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค์ง€ ์•Š์œผ๋ฉฐ, ์˜ˆ๋ฅผ ๋“ค์–ด ์ค‘๋ณต ๋ธ”๋ก ๋ณ‘ํ•ฉ์˜ ์ผ๋ถ€๋กœ ๊ทธ๋ ‡๊ฒŒ ํ•œ๋‹ค๋ฉด ์•„๋งˆ๋„ ๊ฐ€๋ฅด์น  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ณ‘๋ฆฌํ•™ ์  ์‚ฌ๋ก€๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋‹ค์Œ ์˜์‚ฌ C์™€ ๊ฐ™์€ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„ ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ๋ณ€ํ™˜ํ•œ ์ฝ”๋ฃจํ‹ด์ด ์žˆ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

void transformed_coroutine(struct autogenerated_context_struct *ctx) {
    int arg1, arg2; // function args
    int var1, var2, var3, โ€ฆ; // all vars used by the function
    switch (ctx->current_label) { // restore state
    case 0:
        // initial state, load function args caller supplied and proceed to start
        arg1 = ctx->arg1;
        arg2 = ctx->arg2;
        break;
    case 1: 
        // restore all vars which are live at label 1, then jump there
        var2 = ctx->var2; 
        var3 = ctx->var3;
        goto resume_1;
    [more casesโ€ฆ]
    }

    [main body goes here...]
    [somewhere deep in nested control flow:]
        // originally a yield/await/etc.
        ctx->var2 = var2;
        ctx->var3 = var3;
        ctx->current_label = 1;
        return;
        resume_1:
        // continue on
}

๋”ฐ๋ผ์„œ ๋Œ€๋ถ€๋ถ„ ์ •์ƒ์ ์ธ ์ œ์–ด ํ๋ฆ„์„ ๊ฐ€์ง€์ง€๋งŒ ๊ทธ ์ค‘๊ฐ„์— ์ผ๋ถ€ goto๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋Œ€๋žต LLVM ์ฝ”๋ฃจํ‹ด์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹ ์ž…๋‹ˆ๋‹ค.

'์ •์ƒ' ์ œ์–ด ํ๋ฆ„์ด ์ถฉ๋ถ„ํžˆ ๋ณต์žกํ•˜๋‹ค๋ฉด ์ด์™€ ๊ฐ™์€ ๊ฒƒ์„ ๋‹ค์‹œ ๋ฐ˜๋ณตํ•˜๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. (ํ‹€๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.) ํ•จ์ˆ˜์˜ ๋ฐฉ๋Œ€ํ•œ ๋ถ€๋ถ„์„ ๋ณต์ œํ•˜์—ฌ ์ž ์žฌ์ ์œผ๋กœ ๋ชจ๋“  ์–‘๋ณด์ ์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ์‚ฌ๋ณธ์ด ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ์ „์ฒด๋ฅผ ๊ฑฐ๋Œ€ํ•œ ์Šค์œ„์น˜๋กœ ๋ฐ”๊พธ ๊ฑฐ๋‚˜ @kripken์— ๋”ฐ๋ฅด๋ฉด ์ผ๋ฐ˜์ ์ธ ์ฝ”๋“œ์—์„œ relooper๋ณด๋‹ค 4๋ฐฐ ๋Š๋ฆฝ๋‹ˆ๋‹ค( ๊ทธ ์ž์ฒด๋Š” ์•„๋งˆ๋„ relooper๊ฐ€ ์ „ํ˜€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒƒ๋ณด๋‹ค ๋‹ค์†Œ ๋Š๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค).

VM์€ ์ ํ”„ ์Šค๋ ˆ๋”ฉ ์ตœ์ ํ™”๋กœ ๊ฑฐ๋Œ€ํ•œ ์Šค์œ„์น˜์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ๋ถ„๋ช…ํžˆ ๋ช…์‹œ์  goto๋ฅผ ์ˆ˜๋ฝํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ฝ”๋“œ๊ฐ€ goto๋กœ ๊ฐ์†Œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ถ”์ธกํ•˜์—ฌ VM์ด ์ด๋Ÿฌํ•œ ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋น„์Œ‰๋‹ˆ๋‹ค. @kripken์ด ๋งํ–ˆ๋“ฏ์ด ์˜ˆ์ธก ๊ฐ€๋Šฅ์„ฑ๋„ ๋‚ฎ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ์ข…๋ฅ˜์˜ ๋ณ€ํ™˜์„ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์€ ๋‚˜์œ ์ƒ๊ฐ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ดํ›„์—๋Š” ์•„๋ฌด ๊ฒƒ๋„ ์ง€๋ฐฐํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ SSA ๊ธฐ๋ฐ˜ ์ตœ์ ํ™”๋Š” ๋งŽ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์–ด์…ˆ๋ธ”๋ฆฌ ์ˆ˜์ค€์—์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ wasm์€ ๊ฒฐ๊ตญ ๊ธฐ๋ณธ ์ฝ”๋ฃจํ‹ด ์ง€์›์„ ๋ฐ›์•„์•ผ ํ• ๊นŒ์š”? ๊ทธ๋Ÿฌ๋‚˜ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ ํ•˜๊ธฐ ์ „์— ๋Œ€๋ถ€๋ถ„์˜ ์ตœ์ ํ™”

์–ด์จŒ๋“  ์ฝ”๋ฃจํ‹ด์€ ํ•˜๋‚˜์˜ ์˜ˆ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ๋˜ ๋‹ค๋ฅธ ์˜ˆ๋Š” VM ๋‚ด VM์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. JIT์˜ ๋” ์ผ๋ฐ˜์ ์ธ ๊ธฐ๋Šฅ์€ goto๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ side exit ์ด์ง€๋งŒ, side entry ๊ฐ€ ํ•„์š”ํ•œ ์ƒํ™ฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ, goto๊ฐ€ ๋ฃจํ”„์˜ ์ค‘๊ฐ„์— ์žˆ์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์ตœ์ ํ™”๋œ ์ธํ„ฐํ”„๋ฆฌํ„ฐ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. wasm์„ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ์ธํ„ฐํ”„๋ฆฌํ„ฐ์™€ ์‹ค์ œ๋กœ ์ผ์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์ตœ์†Œํ•œ ๊ณ„์‚ฐ๋œ goto๋กœ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒํ•˜๊ณ  ๋” ๋งŽ์€ ๊ฒƒ์„ ์œ„ํ•ด ์–ด์…ˆ๋ธ”๋ฆฌ์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์ง€๋งŒ... ๊ณ„์‚ฐ๋œ goto์˜ ๋™๊ธฐ ์ค‘ ์ผ๋ถ€๋Š” ๋” ์ž˜ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ ์‚ฌ๋ก€์— ์ž์ฒด ์ ํ”„ ๋ช…๋ น์„ ์ œ๊ณตํ•˜์—ฌ ๋ถ„๊ธฐ ์˜ˆ์ธก์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์‚ฌ๋ก€๊ฐ€ ๋ชจ๋‘ goto์ธ ๊ฐ opcode ์ฒ˜๋ฆฌ๊ธฐ ๋’ค์— ๋ณ„๋„์˜ ์Šค์œ„์น˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๋ถ€ ํšจ๊ณผ๋ฅผ ๋ณต์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ํ˜„์žฌ ๋ช…๋ น ๋‹ค์Œ์— ์ผ๋ฐ˜์ ์œผ๋กœ ์˜ค๋Š” ํŠน์ • ๋ช…๋ น์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ ์–ด๋„ ํ•˜๋‚˜ ๋˜๋Š” ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ์กฐํ™”๋œ ์ œ์–ด ํ๋ฆ„์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ํŒจํ„ด์˜ ๋ช‡ ๊ฐ€์ง€ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์ง€๋งŒ ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ๋“ฑ๋“ฑโ€ฆ

VM์ด ๋งŽ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๊ณ  ์ž„์˜์˜ ์ œ์–ด ํ๋ฆ„์„ ํ—ˆ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋ถ„๋ช…ํžˆ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ง‰์—ฐํ•œ ์•„์ด๋””์–ด๋Š” ๊นจ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์œ„ ๋ฒ”์œ„๋กœ์˜ ์ ํ”„๊ฐ€ ํ—ˆ์šฉ๋˜๋Š” ์ฒด๊ณ„๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ž…๋ ฅํ•ด์•ผ ํ•˜๋Š” ๋ฒ”์œ„์˜ ์ˆ˜๊ฐ€ ๋Œ€์ƒ ๋ธ”๋ก์— ์ •์˜๋œ ์ œํ•œ๋ณด๋‹ค ์ ์€ ๊ฒฝ์šฐ์—๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ œํ•œ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ 0(์ƒ์œ„ ๋ฒ”์œ„์—์„œ ์ ํ”„ ์—†์Œ)์œผ๋กœ ์„ค์ •๋˜์–ด ํ˜„์žฌ ์˜๋ฏธ ์ฒด๊ณ„๋ฅผ ์œ ์ง€ํ•˜๊ณ  ๋ธ”๋ก์˜ ์ œํ•œ์€ ์ƒ์œ„ ๋ธ”๋ก์˜ ์ œํ•œ + 1(ํ™•์ธํ•˜๊ธฐ ์‰ฌ์›€)๋ณด๋‹ค ํด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  VM์€ ์šฐ์„ฑ ํœด๋ฆฌ์Šคํ‹ฑ์„ "X๊ฐ€ Y์˜ ๋ถ€๋ชจ์ธ ๊ฒฝ์šฐ Y๋ฅผ ์ง€๋ฐฐํ•ฉ๋‹ˆ๋‹ค"์—์„œ "Y์˜ ์ž์‹ ์ ํ”„ ์ œํ•œ๋ณด๋‹ค ๊ฑฐ๋ฆฌ๊ฐ€ ๋” ํฐ Y์˜ ๋ถ€๋ชจ์ธ ๊ฒฝ์šฐ X๊ฐ€ Y๋ฅผ ์ง€๋ฐฐํ•ฉ๋‹ˆ๋‹ค"๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. (์ด๊ฒƒ์€ ์ •ํ™•ํ•œ ์ง€๋ฐฐ์ž ์ง‘ํ•ฉ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์ด ๋ณด์žฅ๋˜์ง€ ์•Š๋Š” ๋ณด์ˆ˜์ ์ธ ๊ทผ์‚ฌ์น˜์ด์ง€๋งŒ ๊ธฐ์กด ํœด๋ฆฌ์Šคํ‹ฑ์˜ ๊ฒฝ์šฐ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ๋‚ด๋ถ€ ๋ธ”๋ก์ด ์™ธ๋ถ€ ๋ธ”๋ก์˜ ์•„๋ž˜์ชฝ ์ ˆ๋ฐ˜์„ ์ง€๋ฐฐํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.) ํ™˜์›ํ•  ์ˆ˜ ์—†๋Š” ์ œ์–ด ํ๋ฆ„์ด ์žˆ๋Š” ์ฝ”๋“œ๋งŒ ์ œํ•œ์„ ์ง€์ •ํ•ด์•ผ ํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ์—๋Š” ์ฝ”๋“œ ํฌ๊ธฐ๊ฐ€ ์ฆ๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘: ํฅ๋ฏธ๋กญ๊ฒŒ๋„ ์ด๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ธ”๋ก ๊ตฌ์กฐ๋ฅผ ์ง€๋ฐฐ ํŠธ๋ฆฌ์˜ ํ‘œํ˜„์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ง์ ‘์ ์œผ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ๊ฐ„๋‹จํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๋ธ”๋ก์˜ ํŠธ๋ฆฌ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ธ”๋ก์€ ํ˜•์ œ, ์กฐ์ƒ ๋˜๋Š” ์ง๊ณ„ ์ž์‹ ๋ธ”๋ก์œผ๋กœ ์ ํ”„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋” ์ด์ƒ์˜ ํ›„์†์œผ๋กœ๋Š” ์ ํ”„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. "๋ธ”๋ก"์ด ํ•˜์œ„ ๋ฃจํ”„๊ฐ€ ์žˆ๋Š” ์—ฌ๋Ÿฌ ๊ธฐ๋ณธ ๋ธ”๋ก์œผ๋กœ ๊ตฌ์„ฑ๋  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์กด ๋ฒ”์œ„ ๊ตฌ์กฐ์— ๊ฐ€์žฅ ์ž˜ ๋งคํ•‘๋˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

FWIW: Wasm์€ "์ค‘์ฒฉ ์ œํ•œ์œผ๋กœ ์ธํ•ด ๋ฃจํ”„ ์™ธ๋ถ€์—์„œ ๋ฃจํ”„ ์ค‘๊ฐ„์œผ๋กœ ๋ถ„๊ธฐํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ " ๋ช‡ ๊ฐ€์ง€ ๋งค์šฐ ์ค‘์š”ํ•œ ๋‹จ์–ด๋กœ ์„ค๋ช…๋˜๋Š” ํŠน์ • ๋””์ž์ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

DAG์ผ ๊ฒฝ์šฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ์—์„œ ๋ถ„๊ธฐ๊ฐ€ ์ˆœ๋ฐฉํ–ฅ์ธ์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฃจํ”„ ์™ธ๋ถ€์—์„œ ๋ฃจํ”„ ์ค‘๊ฐ„์œผ๋กœ ๋ถ„๊ธฐํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ค‘์ฒฉ ๋ธ”๋ก ์„ค๊ณ„๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

CFG๋Š” ์ด ๋””์ž์ธ์˜ ์ผ๋ถ€์ผ ๋ฟ์ด๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๋ฐ์ดํ„ฐ ํ๋ฆ„์ด๋ฉฐ ๊ฐ’ ์Šคํƒ์ด ์žˆ๊ณ  ๋ธ”๋ก์„ ๊ตฌ์„ฑํ•˜์—ฌ ๊ฐ’ ์Šคํƒ์„ ํ’€ ์ˆ˜ ์žˆ์–ด ์†Œ๋น„์ž์—๊ฒŒ ์‹ค์‹œ๊ฐ„ ๋ฒ”์œ„๋ฅผ ๋งค์šฐ ์œ ์šฉํ•˜๊ฒŒ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์–ด SSA๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ž‘์—…์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. .

wasm์„ SSA ์ธ์ฝ”๋”ฉ์œผ๋กœ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค( pick , ๋ธ”๋ก์ด ์—ฌ๋Ÿฌ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ—ˆ์šฉ, ๋ฃจํ”„ ํ•ญ๋ชฉ์ด ๊ฐ’์„ ํŒํ•˜๊ฒŒ ํ•จ). ๋”ฐ๋ผ์„œ ํฅ๋ฏธ๋กญ๊ฒŒ๋„ ํšจ์œจ์ ์ธ SSA ๋””์ฝ”๋”ฉ์— ํ•„์š”ํ•œ ์ œ์•ฝ ์กฐ๊ฑด์ด ํ•„์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ SSA๋กœ ์ธ์ฝ”๋”ฉ๋˜์—ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค)! ์ด๊ฒƒ์€ ๊ธฐ๋Šฅ์  ์–ธ์–ด๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค(ํšจ์œจ์„ฑ์„ ์œ„ํ•ด ์Šคํƒ ์Šคํƒ€์ผ ์ธ์ฝ”๋”ฉ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Œ).

์ด๊ฒƒ์ด ์ž„์˜์˜ CFG๋ฅผ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ™•์žฅ๋œ ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ SSA ์Šคํƒ€์ผ ์ธ์ฝ”๋”ฉ์ด๋ฏ€๋กœ ๊ฐ’์€ ์ƒ์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋ชจ๋“  ์„ธ๋ถ€ ์‚ฌํ•ญ์ด ํ™•์‹คํ•˜์ง€ ์•Š์€ ์Šคํƒ ์Šคํƒ€์ผ์— ๋Œ€๋ถ€๋ถ„ ๋งž๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ blocks ๋‚ด์—์„œ ํ•ด๋‹น ์„ธํŠธ์˜ ๋‹ค๋ฅธ ๋ ˆ์ด๋ธ”์ด ์ง€์ •๋œ ๋ธ”๋ก์— ๋ถ„๊ธฐ๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์ œ์–ด๋ฅผ ๋‹ค๋ฅธ ๋ธ”๋ก์œผ๋กœ ์ „์†กํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋‹ค๋ฅธ ๊ทœ์น™์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ธ”๋ก ๋‚ด์˜ ์ฝ”๋“œ๋Š” ์Šคํƒ ์ƒ์œ„์— ์žˆ๋Š” ๊ฐ’ ์Šคํƒ์˜ ๊ฐ’์„ ์—ฌ์ „ํžˆ ์œ ์šฉํ•˜๊ฒŒ ์ฐธ์กฐํ•˜์—ฌ ๋ชจ๋“  ๊ฐ’์„ ์ „๋‹ฌํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค.

(func f1 (arg1)
  (let ((c1 10)) ; Some values up the stack.
    (blocks ((b1 (a1 a2 a3)
                   ... (br b3)
               (br b2 (+ a1 a2 a3 arg1 c1)))
             (b2 (a1)
                 ... (br b1 ...))
             (b3 ()
                 ...))
   .. regular structured wasm ..
   (br b2 ...)
   ....
   (br b3)
    ...
   ))

๊ทธ๋Ÿฌ๋‚˜ ์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ด๊ฒƒ์„ ๋‚ด๋ถ€์ ์œผ๋กœ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

์Šคํƒ ๋จธ์‹ ์— ๋Œ€ํ•œ ๋ฐฐ๊ฒฝ ์ง€์‹์ด ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์ฝ”๋“œ ํŒจํ„ด์„ ์ธ์‹ํ•˜๊ณ  ์ด๋ฅผ ์Šคํƒ ์ธ์ฝ”๋”ฉ๊ณผ ์ผ์น˜์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์—ฌ๊ธฐ http://bboissin.appspot.com/static/upload/bboissin-thesis-2010-09-22.pdf ์— ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ฃจํ”„์— ๋Œ€ํ•œ ํฅ๋ฏธ๋กœ์šด ํ† ๋ก ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋น ๋ฅธ ํŒจ์Šค๋กœ ๋”ฐ๋ผํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ์—”ํŠธ๋ฆฌ ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ํ™˜์› ๋ถˆ๊ฐ€ ๋ฃจํ”„๋ฅผ ํ™˜์› ๋ฃจํ”„๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ์–ธ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค. wasm์˜ ๊ฒฝ์šฐ ํ˜„์žฌ ์†”๋ฃจ์…˜๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ ์ด์— ๋Œ€ํ•œ ์ •์˜๋œ ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ๋ฃจํ”„ ๋‚ด์—์„œ ๋””์ŠคํŒจ์น˜ํ•˜๊ธฐ ์œ„ํ•ด ํŠน๋ณ„ํžˆ ์ •์˜๋œ ์ž…๋ ฅ์„ ๋ฃจํ”„์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๋ฐ”์™€ ๊ฐ™์ด ์ฒ˜๋ฆฌ ๊ณผ์ •์—์„œ ๊ฐ€์ƒํ™”๋˜๊ณ  ์ตœ์ ํ™”๋ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ด์™€ ๊ฐ™์€ ๊ฒƒ์ด ์˜ต์…˜์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด๊ฒƒ์ด ๊ณง ๊ฐ€๋Šฅํ•˜๊ณ  ์ƒ์‚ฐ์ž๊ฐ€ ์ด๋ฏธ ์œ ์‚ฌํ•œ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜์ง€๋งŒ ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์ผ์ฐ ์ƒ์„ฑ๋œ wasm์ด ๊ณ ๊ธ‰ ๋Ÿฐํƒ€์ž„์—์„œ ๋” ๋น ๋ฅด๊ฒŒ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก ์ง€๊ธˆ ๊ณ ๋ คํ•ด ๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ ๋˜ํ•œ ์ด๊ฒƒ์„ ํƒ์ƒ‰ํ•˜๊ธฐ ์œ„ํ•œ ๋Ÿฐํƒ€์ž„ ๊ฐ„์˜ ๊ฒฝ์Ÿ์— ๋Œ€ํ•œ ์ธ์„ผํ‹ฐ๋ธŒ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ •ํ™•ํžˆ ์ž„์˜์˜ ๋ ˆ์ด๋ธ” ๋ฐ goto๊ฐ€ ์•„๋‹ˆ์ง€๋งŒ ๋ฏธ๋ž˜์— ํšจ์œจ์ ์œผ๋กœ ์ปดํŒŒ์ผ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๋ณ€ํ™˜๋  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ ์ €๋Š” ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด @oridb ๋ฐ @comex ์— ๊ฐ•๋ ฅํžˆ ๋™์˜ ํ•ฉ๋‹ˆ๋‹ค.
๋” ๋Šฆ๊ธฐ ์ „์— ํ•ด๊ฒฐํ•ด์•ผ ํ•  ์ค‘์š”ํ•œ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

WebAssembly์˜ ํŠน์„ฑ์„ ๊ฐ์•ˆํ•  ๋•Œ ์ง€๊ธˆ ํ•˜๋Š” ๋ชจ๋“  ์‹ค์ˆ˜๋Š” ์•ž์œผ๋กœ ์ˆ˜์‹ญ ๋…„ ๋™์•ˆ ์œ ์ง€ ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค(Javascript๋ฅผ ๋ณด์„ธ์š”!). ์ด๊ฒƒ์ด ๋ฌธ์ œ๊ฐ€ ๋งค์šฐ ์ค‘์š”ํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค. ์ด์œ ๊ฐ€ ๋ฌด์—‡์ด๋“  ์ง€๊ธˆ goto๋ฅผ ์ง€์›ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค(์˜ˆ: ์ตœ์ ํ™”๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด --- ์†”์งํžˆ ๋งํ•ด์„œ --- ์ผ๋ฐ˜์ ์ธ ๊ฒƒ์— ๋Œ€ํ•œ ํŠน์ • ๊ตฌํ˜„์˜ ์˜ํ–ฅ, ์†”์งํžˆ ๋งํ•ด์„œ ๊ฒŒ์œผ๋ฅธ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค). ๊ทธ๋Ÿฌ๋ฉด ๊ฒฐ๊ตญ ์žฅ๊ธฐ์ ์œผ๋กœ ๋ฌธ์ œ.

๋‚˜๋Š” ์ด๋ฏธ ๋ฏธ๋ž˜(๋˜๋Š” ํ˜„์žฌ, ๊ทธ๋Ÿฌ๋‚˜ ๋ฏธ๋ž˜์—) WebAssembly ๊ตฌํ˜„์ด ๊ทธ๊ฒƒ๋“ค์„ ์ ์ ˆํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋ ˆ์ด๋ธ”์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ฐ˜์ ์ธ while/switch ํŒจํ„ด์„ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ์— ์ธ์‹ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ดํ‚น์ด์•ผ

WebAssembly๋Š” ๊นจ๋—ํ•œ ์ƒํƒœ์ด๋ฏ€๋กœ ์ด์ œ ๋”ํ‹ฐ ํ•ต(๋˜๋Š” ์˜คํžˆ๋ ค ์š”๊ตฌ ์‚ฌํ•ญ)์„ ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@darkuranium :

ํ˜„์žฌ ์ง€์ •๋œ WebAssembly๋Š” ์ด๋ฏธ ๋ธŒ๋ผ์šฐ์ € ๋ฐ ๋„๊ตฌ ์ฒด์ธ์— ์ œ๊ณต๋˜๊ณ  ์žˆ์œผ๋ฉฐ ๊ฐœ๋ฐœ์ž๋Š” ์ด๋ฏธ ํ•ด๋‹น ๋””์ž์ธ์— ๋ฐฐ์น˜๋œ ํ˜•์‹์„ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ํš๊ธฐ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ๋””์ž์ธ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค .

๊ทธ๋Ÿฌ๋‚˜ ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋””์ž์ธ์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ด€๋ จ๋œ ์‚ฌ๋žŒ๋“ค ์ค‘ goto ๊ฐ€ ์“ธ๋ชจ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ์‚ฌ๋žŒ์€ ์•„๋ฌด๋„ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ ๋ชจ๋‘๊ฐ€ ๋ฌธ๋ฒ•์ ์ธ ์žฅ๋‚œ๊ฐ ๋งค๋„ˆ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ •๊ธฐ์ ์œผ๋กœ goto ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด ์‹œ์ ์—์„œ ๋™๊ธฐ๊ฐ€ ์žˆ๋Š” ์‚ฌ๋žŒ์ด ํƒ€๋‹นํ•œ ์ œ์•ˆ์„ ์ œ์‹œํ•˜๊ณ  ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ํ™•์‹คํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•œ๋‹ค๋ฉด ๊ทธ๋Ÿฌํ•œ ์ œ์•ˆ์ด ๊ฑฐ๋ถ€๋˜๋Š” ๊ฒƒ์„ ๋ณด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

WebAssembly์˜ ํŠน์„ฑ์„ ๊ฐ์•ˆํ•  ๋•Œ ์ง€๊ธˆ ํ•˜๋Š” ๋ชจ๋“  ์‹ค์ˆ˜๋Š” ์•ž์œผ๋กœ ์ˆ˜์‹ญ ๋…„ ๋™์•ˆ ์œ ์ง€๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค(Javascript๋ฅผ ๋ณด์„ธ์š”!). ์ด๊ฒƒ์ด ๋ฌธ์ œ๊ฐ€ ๋งค์šฐ ์ค‘์š”ํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค. ์ด์œ ๊ฐ€ ๋ฌด์—‡์ด๋“  ์ง€๊ธˆ goto๋ฅผ ์ง€์›ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค(์˜ˆ: ์ตœ์ ํ™”๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด --- ์†”์งํžˆ ๋งํ•ด์„œ --- ์ผ๋ฐ˜์ ์ธ ๊ฒƒ์— ๋Œ€ํ•œ ํŠน์ • ๊ตฌํ˜„์˜ ์˜ํ–ฅ, ์†”์งํžˆ ๋งํ•˜๋ฉด ๊ฒŒ์œผ๋ฅธ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค). ๊ทธ๋Ÿฌ๋ฉด ๊ฒฐ๊ตญ ์žฅ๊ธฐ์ ์œผ๋กœ ๋ฌธ์ œ.

๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๋‹น์‹ ์˜ ํ—ˆํ’์„ ๋ถ€๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์ด ๋ณด์—ฌ์ฃผ๋Š” ๋™๊ธฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์œ„์—์„œ ์ž์„ธํžˆ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ œ์•ˆ๊ณผ ๊ตฌํ˜„์„ ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ์†”์งํžˆ ๊ฒŒ์œผ๋ฅธ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ฌผ๋ก  ๊ฑด๋ฐฉ์ง„๊ฑฐ์•ผ. ์Šค๋ ˆ๋“œ, GC, SIMD ๋“ฑ์„ ์œ„ํ•ด ์šฐ๋ฆฌ์˜ ๋ฌธ์„ ๋‘๋“œ๋ฆฌ๋Š” ์‚ฌ๋žŒ๋“ค์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. ๋ชจ๋‘ ํ•ด๋‹น ๊ธฐ๋Šฅ์ด ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ด์œ ์— ๋Œ€ํ•ด ์—ด์ •์ ์ด๊ณ  ํ•ฉ๋ฆฌ์ ์ธ ์ฃผ์žฅ์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋œ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์–ธ๊ธ‰ํ•œ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ ์œ„ํ•ด ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ goto ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด ๊ทธ๋ฃน์˜ ๊ธฐ์—ฌ ์ง€์นจ์„ ์ˆ™์ง€ ํ•˜๊ณ  ์žฌ๋ฏธ์— ์ฐธ์—ฌํ•˜์‹ญ์‹œ์˜ค.

๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด goto ๊ฐ€ ํ›Œ๋ฅญํ•œ ๋ฏธ๋ž˜ ๊ธฐ๋Šฅ ์ด๋ผ๊ณ  ์ƒ๊ฐ

์•ˆ๋…•. ์›น์–ด์…ˆ๋ธ”๋ฆฌ์—์„œ IR๋กœ, ๋‹ค์‹œ ์›น์–ด์…ˆ๋ธ”๋ฆฌ๋กœ ๋ฒˆ์—ญ์„ ์ž‘์„ฑํ•˜๋Š” ์ค‘์ด๋ฉฐ ์ด ์ฃผ์ œ์— ๋Œ€ํ•ด ์‚ฌ๋žŒ๋“ค๊ณผ ํ† ๋ก ํ•œ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„์€ ์›น ์–ด์…ˆ๋ธ”๋ฆฌ์—์„œ ํ‘œํ˜„ํ•˜๊ธฐ ์–ด๋ ต๋‹ค๋Š” ์ ์„ ์ง€์ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋•Œ๋•Œ๋กœ ์ถ•์†Œํ•  ์ˆ˜ ์—†๋Š” ์ œ์–ด ํ๋ฆ„์„ ์ž‘์„ฑํ•˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์—ฌ๋Ÿฌ ์ง„์ž…์ ์ด ์žˆ๋Š” ๋ฃจํ”„ ์•„๋ž˜์™€ ๊ฐ™์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

if (x) goto inside_loop;
// banana
while(y) {
    // things
    inside_loop:
    // do things
}

EBB ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋‹ค์Œ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

entry:
    cjump x, inside_loop
    // banana
    jump loop

loop:
    cjump y, exit
    // things
    jump inside_loop

inside_loop:
    // do things
    jump loop
exit:
    return

๋‹ค์Œ์œผ๋กœ ์ด๊ฒƒ์„ ์›น์–ด์…ˆ๋ธ”๋ฆฌ๋กœ ๋ฒˆ์—ญํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์˜ค๋ž˜ ์ „์— ๋””์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์•Œ์•„๋ƒˆ์Œ ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ํ•ญ์ƒ goto๋ฅผ ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ํ๋ฆ„์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฒˆ์—ญ๋˜๊ธฐ ์ „์— ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ด์— ๋Œ€ํ•œ ํŠธ๋ฆญ์„ ์ˆ˜ํ–‰ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฒฐ๊ตญ ์ฝ”๋“œ๋ฅผ โ€‹โ€‹์Šค์บ”ํ•˜๊ณ  ๊ตฌ์กฐ์˜ ์‹œ์ž‘๊ณผ ๋์„ ๋ฐฐ์น˜ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํด์Šค๋ฃจ ์ ํ”„๋ฅผ ์ œ๊ฑฐํ•œ ํ›„ ๋‹ค์Œ ํ›„๋ณด๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

<inside_loop, if(x)>
    // banana
<loop ยฐ>
<exit if(y)>
    // things
</inside_loop, if(x)>
    // do things
</loop โ†‘>
</exit>

๋‹ค์Œ์œผ๋กœ ์ด๊ฒƒ๋“ค๋กœ๋ถ€ํ„ฐ ์Šคํƒ์„ ๊ตฌ์ถ•ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์–ด๋Š ๊ฒƒ์ด ๋ฐ”๋‹ฅ์œผ๋กœ ๊ฐˆ๊นŒ์š”? '๋‚ด๋ถ€ ๋ฃจํ”„'์ด๊ฑฐ๋‚˜ '๋ฃจํ”„'์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์Šคํƒ์„ ์ž˜๋ผ๋‚ด๊ณ  ์ฃผ๋ณ€์— ๋ณต์‚ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

if
    // do things
else
    // banana
end
loop
  br out
    // things
    // do things
end

์ด์ œ ์ด๊ฒƒ์„ ์›น์–ด์…ˆ๋ธ”๋ฆฌ๋กœ ๋ฒˆ์—ญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค๋ก€ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฃจํ”„๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜๋Š”์ง€ ์•„์ง ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์˜ค๋ž˜๋œ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์ƒ๊ฐํ•œ๋‹ค๋ฉด ์ด๊ฒƒ์€ ํŠน๋ณ„ํ•œ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ƒˆ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ์›น ์–ด์…ˆ๋ธ”๋ฆฌ๋กœ ๋ฒˆ์—ญ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฌธ์ œ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์— ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ _decades_ ๋™์•ˆ ๊ธฐ๋ณธ ๋ธ”๋ก์œผ๋กœ ์ œ์–ด ํ๋ฆ„์„ ์ˆ˜ํ–‰ํ–ˆ์œผ๋ฉฐ ๋ชจ๋“  ๊ฒƒ์ด ์ง„ํ–‰๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ์ˆ ์ ์œผ๋กœ ์–ธ์–ด๋Š” ๋ฒˆ์—ญ๋œ ๋‹ค์Œ ๋ฒˆ์—ญ๋ฉ๋‹ˆ๋‹ค. ๋“œ๋ผ๋งˆ ์—†์ด ๊น”๋”ํ•˜๊ฒŒ ๊ฒฝ๊ณ„๋ฅผ ๋„˜์–ด ๊ฐ€์น˜๊ฐ€ ํ๋ฅด๋„๋ก ํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜๋งŒ ์žˆ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ตฌ์กฐํ™”๋œ ํ๋ฆ„์€ ์ฝ”๋“œ๋ฅผ ์ฝ์œผ๋ ค๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋งŒ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

    cjump x, label(1)
    // banana
0: label
    cjump y, label(2)
    // things
1: label
    // do things
    jump label(0)
2: label
    // exit as usual, picking the values from the top of the stack.

์ˆซ์ž๋Š” ์•”์‹œ์ ์ž…๋‹ˆ๋‹ค. ์ฆ‰.. ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ '๋ ˆ์ด๋ธ”'์„ ๋ณผ ๋•Œ ์ƒˆ ํ™•์žฅ ๋ธ”๋ก์„ ์‹œ์ž‘ํ•˜๊ณ  0์—์„œ ์ฆ๊ฐ€ํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋Š” ์ƒˆ ์ธ๋ฑ์Šค ๋ฒˆํ˜ธ๋ฅผ ์ œ๊ณตํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ •์  ์Šคํƒ์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋ ˆ์ด๋ธ”๋กœ ์ ํ”„ํ•  ๋•Œ ์Šคํƒ์— ์žˆ๋Š” ํ•ญ๋ชฉ ์ˆ˜๋ฅผ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ ˆ์ด๋ธ”๋กœ ์ ํ”„ํ•œ ํ›„ ์ผ๊ด€์„ฑ ์—†๋Š” ์Šคํƒ์ด ์žˆ์œผ๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์œ„์˜ ๋‚ด์šฉ์ด ์ž˜๋ชป๋œ ๊ฒฝ์šฐ ๊ฐ ๋ ˆ์ด๋ธ”์— ๋ช…์‹œ์ ์ธ ์Šคํƒ ๊ธธ์ด๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ (์ ˆ๋Œ€๊ฐ’์ด ์••์ถ•์— ์ข‹์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์‹ฑ๋œ ๋ ˆ์ด๋ธ”์˜ ์Šคํƒ ํฌ๊ธฐ๋กœ๋ถ€ํ„ฐ์˜ ๋ธํƒ€์ผ ์ˆ˜ ์žˆ์Œ) ๊ฐ ์ ํ”„์— ๋Œ€ํ•œ ๋งˆ์ปค๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ ํ”„ํ•˜๋Š” ๋™์•ˆ ์Šคํƒ์˜ ๋งจ ์œ„์—์„œ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์ด ์ œ์–ด ํ๋ฆ„์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ์˜ํ•ด ์–ด๋–ค ์‹์œผ๋กœ๋“  gzip์„ ๋Šฅ๊ฐ€ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์žฅ๋‹ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์—ฌ๊ธฐ์—์„œ ๊ฐ€์žฅ ํž˜๋“  ์ผ์„ ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ข‹์€ ํ๋ฆ„์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (๋‚˜๋Š” 'gzip์„ ๋Šฅ๊ฐ€ํ•˜๋Š” ๊ฒƒ'์„ ์œ„ํ•œ ์œ ์—ฐํ•œ ์ปดํŒŒ์ผ๋Ÿฌ ๋„๊ตฌ ๋ชจ์Œ์œผ๋กœ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ๊ฒฝ์šฐ ์ €์—๊ฒŒ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๊ณ  ๋ฐ๋ชจ๋ฅผ ์˜ฌ๋ ค ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค!)

๋‚˜๋Š” ์ง€๊ธˆ ์‚ฐ์‚ฐ์กฐ๊ฐ๋‚œ ๊ธฐ๋ถ„์ด๋‹ค. WebAssembly ์‚ฌ์–‘์„ ๋‹ค์‹œ ์ฝ๊ณ  ํ™˜์›ํ•  ์ˆ˜ ์—†๋Š” ์ œ์–ด ํ๋ฆ„์ด MVP์—์„œ ์˜๋„์ ์œผ๋กœ ๋ˆ„๋ฝ๋˜์—ˆ์Œ์„ ์•Œ์•„์ฐจ๋ ธ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ emscripten์ด ์ดˆ๊ธฐ์— ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

WebAssembly์—์„œ ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์†”๋ฃจ์…˜์€ "Emscripten: An LLVM-to-JavaScript Compiler" ๋ฌธ์„œ์— ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. relooper๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์žฌ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

_b_ = bool(x)
_b_ == 0 if
  // banana
end
block loop
  _b_ if
    // do things
    _b_ = 0
  else
    y br_if 2
    // things
    _b_ = 1
  end
  br 0
end end

ํ•ฉ๋ฆฌ์ ์ธ ๊ฒƒ์€ ๊ตฌ์กฐํ™”๋œ ์ œ์–ด ํ๋ฆ„์ด ์†Œ์Šค ์ฝ”๋“œ ๋คํ”„๋ฅผ ์ฝ๋Š” ๋ฐ ๋„์›€์ด ๋˜๋ฉฐ ํด๋ฆฌํ•„ ๊ตฌํ˜„์— ๋„์›€์ด ๋œ๋‹ค๊ณ  ๋ฏฟ์–ด์ง‘๋‹ˆ๋‹ค.

์›น ์–ด์…ˆ๋ธ”๋ฆฌ์—์„œ ์ปดํŒŒ์ผํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์€ ์•„๋งˆ๋„ ์ถ•์†Œ๋œ ์ œ์–ด ํ๋ฆ„์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐ ์ ์‘ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ:

  • ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด WebAssembly๋Š” ์ด์ œ ์•ˆ์ •์ ์ด๋ฏ€๋กœ ์ œ์–ด ํ๋ฆ„์ด ํ‘œํ˜„๋˜๋Š” ๋ฐฉ์‹์„ ์™„์ „ํžˆ ๋‹ค์‹œ ์ž‘์„ฑํ•  ์‹œ๊ฐ„์€ ์ง€๋‚ฌ์Šต๋‹ˆ๋‹ค.

    • ์–ด๋–ค ์˜๋ฏธ์—์„œ๋Š” ๋ถˆํ–‰ํ•œ ์ผ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋ณด๋‹ค ์ง์ ‘์ ์ธ SSA ๊ธฐ๋ฐ˜ ์ธ์ฝ”๋”ฉ์ด ํ˜„์žฌ ๋””์ž์ธ๊ณผ ๋™์ผํ•œ ๊ฐ„๊ฒฐํ•จ์„ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์‹ค์ œ๋กœ ํ…Œ์ŠคํŠธํ•œ ์‚ฌ๋žŒ์€ ์•„๋ฌด๋„ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

    • ๊ทธ๋Ÿฌ๋‚˜ goto๋ฅผ ์ง€์ •ํ•˜๋ฉด ์ž‘์—…์ด ํ›จ์”ฌ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค! ๋ธ”๋ก ๊ธฐ๋ฐ˜ ๋ช…๋ น์€ ์ด๋ฏธ ๋ฐ”์ดํฌ์…ฐ๋”ฉ์„ ๋„˜์–ด์„ฐ๊ณ  wasm์„ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ํ”„๋กœ๋•์…˜ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ถ•์†Œ ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„์„ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์„ ๊ธฐ๋Œ€ํ•˜๋Š” ๊ฒƒ์€ ํฐ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ทธ๋ ‡๊ฒŒ ์–ด๋ ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฃผ์š” ๋ฌธ์ œ๋Š” ์„ฑ๋Šฅ ๋น„์šฉ ์—†์ด ์ œ์–ด ํ๋ฆ„์˜ ์ž‘์€ ๋ถ€๋ถ„์„ ์‚ฌ์šฉํ•˜์—ฌ ํ‘œํ˜„ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด goto ๋ช…๋ น์–ด๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ฉด ์ „์ฒด ์žฌ์„ค๊ณ„์—์„œ์™€ ๊ฐ™์ด ์ธ์ฝ”๋”ฉ ํšจ์œจ์„ฑ์— ๋Œ€ํ•ด ๊ฑฐ์˜ ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  goto๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๋Š” ์—ฌ์ „ํžˆ ํ•ฉ๋ฆฌ์ ์œผ๋กœ ์••์ถ•๋˜์–ด์•ผ ํ•˜์ง€๋งŒ ์••์ถ•์„ ์œ„ํ•ด ๋‹ค๋ฅธ ๊ตฌ์„ฑ๊ณผ ๊ฒฝ์Ÿํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„๋งŒ์„ ์œ„ํ•œ ๊ฒƒ์ด๋ฉฐ ๋“œ๋ฌผ๊ฒŒ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ํ™˜์›์„ฑ์€ ํŠน๋ณ„ํžˆ ์œ ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    • ๋Œ€๋ถ€๋ถ„์˜ ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐฑ์—”๋“œ๋Š” ๊ธฐ๋ณธ ๋ธ”๋ก๊ณผ ๊ทธ ์‚ฌ์ด์˜ ๋ถ„๊ธฐ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” SSA ํ‘œํ˜„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ถ•์†Œ์„ฑ์ด ๋ณด์žฅ๋˜๋Š” ์ค‘์ฒฉ ๋ฃจํ”„ ๊ตฌ์กฐ๋Š” ์ฒ˜์Œ์—๋Š” ๊ฑฐ์˜ ๋ฒ„๋ ค์ง‘๋‹ˆ๋‹ค.

    • JavaScriptCore, V8 ๋ฐ SpiderMonkey์—์„œ ํ˜„์žฌ WebAssembly ๊ตฌํ˜„์„ ํ™•์ธํ–ˆ๋Š”๋ฐ ๋ชจ๋‘ ์ด ํŒจํ„ด์„ ๋”ฐ๋ฅด๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. (V8์€ ๊ธฐ๋ณธ ๋ธ”๋ก๋ณด๋‹ค ์ผ์ข…์˜ "๋…ธ๋“œ์˜ ๋ฐ”๋‹ค" ํ‘œํ˜„์œผ๋กœ ๋” ๋ณต์žกํ•˜์ง€๋งŒ ์ค‘์ฒฉ ๊ตฌ์กฐ๋„ ๋ฒ„๋ฆฝ๋‹ˆ๋‹ค.)

    • ์˜ˆ์™ธ : ๋ฃจํ”„ ๋ถ„์„์ด ์œ ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋Ÿฌํ•œ ์„ธ ๊ฐ€์ง€ ๊ตฌํ˜„์€ ๋ชจ๋‘ ๋ฃจํ”„์˜ ์‹œ์ž‘์ธ ๊ธฐ๋ณธ ๋ธ”๋ก์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ IR์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. (AOT ์ปดํŒŒ์ผ์„ ์œ„ํ•ด ์„ค๊ณ„๋œ 'heavyweight' ๋ฐฑ์—”๋“œ๋กœ์„œ ์ด๋ฅผ ๋ฒ„๋ฆฌ๊ณ  ๋ฐฑ์—”๋“œ์—์„œ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜๋Š” LLVM๊ณผ ๋น„๊ตํ•˜์‹ญ์‹œ์˜ค. ์ด๊ฒƒ์€ ์†Œ์Šค ์ฝ”๋“œ์—์„œ ๋ฃจํ”„์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š๋Š” ๊ฒƒ์„ ์ฐพ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋” ๊ฐ•๋ ฅํ•ฉ๋‹ˆ๋‹ค. ๋งŽ์€ ์ตœ์ ํ™” ํ›„์—, ๊ทธ๋Ÿฌ๋‚˜ ๋” ๋Š๋ฆฝ๋‹ˆ๋‹ค.)

    • ๋ฃจํ”„ ๋ถ„์„์€ ๋ฃจํ”„ ํ—ค๋”๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๋Š” ๋ฃจํ”„ ์ค‘๊ฐ„์œผ๋กœ ๋ถ„๊ธฐํ•˜๋Š” ๊ฒƒ์„ ๊ธˆ์ง€ํ•˜๋Š” "์ž์—ฐ ๋ฃจํ”„"์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

    • WebAssembly๋Š” loop ๋ธ”๋ก์ด ์ž์—ฐ์Šค๋Ÿฌ์šด ๋ฃจํ”„์ž„์„ ๊ณ„์† ๋ณด์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    • ๊ทธ๋Ÿฌ๋‚˜ ๋ฃจํ”„ ๋ถ„์„์€ ์ „์ฒด ํ•จ์ˆ˜๋ฅผ ์ถ•์†Œํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๊ฑฐ๋‚˜ ๋ฃจํ”„ ๋‚ด๋ถ€๋„ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹จ์ง€ ์™ธ๋ถ€์—์„œ ๋‚ด๋ถ€๋กœ์˜ ๋ถ„๊ธฐ๋ฅผ ๊ธˆ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ํ‘œํ˜„์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ž„์˜์˜ ์ œ์–ด ํ๋ฆ„ ๊ทธ๋ž˜ํ”„์ž…๋‹ˆ๋‹ค.

    • ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ relooper ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ž์ฒด๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ œ์–ดํ•  ์ˆ˜ ์—†๋Š” ์ œ์–ด ํ๋ฆ„์œผ๋กœ ์ธํ•ด WebAssembly๋ฅผ JavaScript(ํด๋ฆฌํ•„๋ง)๋กœ ์ปดํŒŒ์ผํ•˜๊ธฐ๊ฐ€ ๋” ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค.

    • ๊ทธ๋Ÿฌ๋‚˜ WebAssembly๋Š” ์ด๋ฏธ JS๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ์ ‘๊ทผ ๋ฐฉ์‹(์ •๋ ฌ๋˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค ์ง€์› ๋ฐ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ์•ก์„ธ์Šค์— ๋Œ€ํ•œ ํŠธ๋ž˜ํ•‘ ํฌํ•จ)์— ์ƒ๋‹นํ•œ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์—ฌ๋Ÿฌ ๊ฒฐ์ •์„ ๋‚ด๋ ธ์œผ๋ฉฐ ์ด๋Š” ๊ทธ๋‹ค์ง€ ์ค‘์š”ํ•˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค.

    • ๊ทธ์— ๋น„ํ•ด ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์กฐ๊ธˆ ๋” ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ํฐ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

    • ๋”ฐ๋ผ์„œ ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„์— ๋Œ€ํ•œ ์ง€์›์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์„ ์ด์œ ๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  • SSA ํ‘œํ˜„(์„ค๊ณ„์ƒ ํ•œ ๋ฒˆ์— ๊ฐ€๋Šฅํ•ด์•ผ ํ•จ)์„ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ฃผ์š” ์ •๋ณด๋Š” ๋„๋ฏธ๋„ค์ดํ„ฐ ํŠธ๋ฆฌ ์ž…๋‹ˆ๋‹ค.

    • ํ˜„์žฌ ๋ฐฑ์—”๋“œ๋Š” ๊ตฌ์กฐํ™”๋œ ์ œ์–ด ํ๋ฆ„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋„๋ฏธ๋„Œ์Šค๋ฅผ ์ถ”์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์–‘์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ–ˆ๋‹ค๋ฉด ๋‹ค์Œ ์ง€์นจ์€ ๊ธฐ๋ณธ ๋ธ”๋ก์„ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

    • block :



      • ๋ธ”๋ก์„ ์‹œ์ž‘ํ•˜๋Š” BB๋Š” ์ด์ „ BB๊ฐ€ ์ง€๋ฐฐํ•ฉ๋‹ˆ๋‹ค.*


      • ํ•ด๋‹น end ๋‹ค์Œ์— ์˜ค๋Š” BB๋Š” ๋ธ”๋ก์„ ์‹œ์ž‘ํ•˜๋Š” BB๊ฐ€ ์ง€๋ฐฐํ•˜์ง€๋งŒ end ์ด์ „์˜ BB์— ์˜ํ•ด ์ง€๋ฐฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค( br ์•„์›ƒ์ด ์žˆ์œผ๋ฉด ๊ฑด๋„ˆ๋›ฐ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ).



    • loop :



      • ๋ธ”๋ก์„ ์‹œ์ž‘ํ•˜๋Š” BB๋Š” ์ด์ „ BB๊ฐ€ ์ง€๋ฐฐํ•ฉ๋‹ˆ๋‹ค.


      • end ์ดํ›„์˜ BB๋Š” end ์ด์ „์˜ BB์— ์˜ํ•ด ์ง€๋ฐฐ๋ฉ๋‹ˆ๋‹ค( end ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ ์™ธ์—๋Š” end ์ดํ›„์˜ ๋ช…๋ น์— ๋„๋‹ฌํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค).



    • if :



      • if ์ชฝ, else ์ชฝ, end ๋’ค์˜ BB๋Š” ๋ชจ๋‘ if ์•ž์˜ BB๊ฐ€ ์ง€๋ฐฐํ•ฉ๋‹ˆ๋‹ค.



    • br , return , unreachable :



      • ( br , return ๋˜๋Š” unreachable ๋ฐ”๋กœ ๋’ค์˜ BB๋Š” ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.)



    • br_if , br_table :



      • br_if / br_table ์•ž์˜ BB๊ฐ€ ๋’ค์˜ BB๋ฅผ ์ง€๋ฐฐํ•ฉ๋‹ˆ๋‹ค.



    • ํŠนํžˆ ์ด๊ฒƒ์€ ์ถ”์ •์น˜์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ๊ตฌ์„ฑ์— ์˜ํ•ด A๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  B์— ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์„ ๋•Œ๋งŒ ๊ทธ๋ ‡๊ฒŒ ๋งํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฑฐ์ง“ ๊ธ์ •(A๊ฐ€ ์‹ค์ œ๋กœ ๊ทธ๋ ‡์ง€ ์•Š์„ ๋•Œ B๋ฅผ ์ง€๋ฐฐํ•œ๋‹ค๊ณ  ๋งํ•จ)์„ ์ƒ์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ๊ฑฐ์ง“ ๋ถ€์ •์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ณ (์‹ค์ œ๋กœ ๊ทธ๋Ÿด ๋•Œ A๊ฐ€ B๋ฅผ ์ง€๋ฐฐํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋งํ•จ), ๋‚˜๋Š” ๋‹จ์ผ ํ†ต๊ณผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๊ทธ๊ฒƒ๋“ค์„ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(ํ‹€๋ฆด ์ˆ˜ ์žˆ์Œ).

    • ๊ฑฐ์ง“ ๋ถ€์ •์˜ ์˜ˆ:

      ```

      $outer ์ฐจ๋‹จ

      ๊ณ ๋ฆฌ

      br $์™ธ๋ถ€ ;; ๋ฌด์กฐ๊ฑด ๊นจ๊ธฐ ๋•Œ๋ฌธ์— ์€๋ฐ€ํžˆ ๋์„ ์ง€๋ฐฐํ•œ๋‹ค BB

      ๋

      ๋

    • ํ•˜์ง€๋งŒ ๊ดœ์ฐฎ์•„, AFAIK.



      • ์˜ˆ๋ฅผ ๋“ค์–ด ๊ธฐ๋ณธ ๋ธ”๋ก A๊ฐ€ ๊ธฐ๋ณธ ๋ธ”๋ก B๋ฅผ ์ง€๋ฐฐํ•œ๋‹ค๊ณ  ํ•˜๋ฉด B์— ๋Œ€ํ•œ ๊ธฐ๊ณ„์–ด ์ฝ”๋“œ๊ฐ€ A์— ์„ค์ •๋œ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฑฐ์ง“ ๊ธ์ •์€ ๋‚˜์  ๊ฒƒ์ž…๋‹ˆ๋‹ค(๊ทธ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ๋ฎ์–ด์“ฐ๋Š” ์ค‘๊ฐ„ ํ•ญ๋ชฉ์ด ์—†๋Š” ๊ฒฝ์šฐ). A๊ฐ€ ์‹ค์ œ๋กœ B๋ฅผ ์ง€๋ฐฐํ•˜์ง€ ์•Š์œผ๋ฉด ๋ ˆ์ง€์Šคํ„ฐ๊ฐ€ ์“ฐ๋ ˆ๊ธฐ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


      • ๊ฑฐ์ง“ ๋ถ€์ •์€ ๋ณธ์งˆ์ ์œผ๋กœ ๊ฒฐ์ฝ” ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ์œ ๋ น ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ด๋Ÿฌํ•œ ๋ถ„๊ธฐ ๊ฐ€ ๋ฐœ์ƒํ• 



    • ์–ด์จŒ๋“  goto ๋ช…๋ น์–ด๊ฐ€ ๋„๋ฏธ๋„ค์ดํ„ฐ ํŠธ๋ฆฌ ์ธก๋ฉด์—์„œ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•ด์•ผ ํ•˜๋Š”์ง€ ์ƒ๊ฐํ•ด ๋ณด์‹ญ์‹œ์˜ค. A๊ฐ€ B๋ฅผ ์ง€๋ฐฐํ•˜๊ณ  C๋ฅผ ์ง€๋ฐฐํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

    • A์—์„œ C๋กœ ๊ฑด๋„ˆ๋›ธ ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด B๋ฅผ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค(์ง€๋ฐฐ์„ฑ ๊ฐ€์ • ์œ„๋ฐ˜). ์ฆ‰, ์ง๊ณ„๊ฐ€ ์•„๋‹Œ ์ž์†์œผ๋กœ ์ ํ”„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. (๊ทธ๋ฆฌ๊ณ  ๋ฐ”์ด๋„ˆ๋ฆฌ ์ƒ์‚ฐ์ž ์ธก์—์„œ๋Š” ์ง„์ •ํ•œ ๋„๋ฏธ๋„ค์ดํ„ฐ ํŠธ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ–ˆ๋‹ค๋ฉด ๊ทธ๋Ÿฐ ์ ํ”„๋Š” ์ ˆ๋Œ€ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.)

    • A์—์„œ B๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ์ ํ”„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ง๊ณ„ ์ž์†์œผ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์€ ๊ทธ๋‹ค์ง€ ์œ ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์šฐ๋ฆฌ๊ฐ€ ์ด๋ฏธ ํ•  ์ˆ˜ ์žˆ๋Š” if ๋˜๋Š” switch ๋ฌธ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค(๋ฐ”์ด๋„ˆ๋ฆฌ ํ…Œ์ŠคํŠธ๋งŒ ์žˆ๋Š” ๊ฒฝ์šฐ if ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์—ฌ๋Ÿฌ ๊ฐœ์ธ ๊ฒฝ์šฐ br_table ์‚ฌ์šฉ).

    • ๋˜ํ•œ ์•ˆ์ „ํ•˜๊ณ  ๋” ํฅ๋ฏธ๋กœ์šด ๊ฒƒ์€ ํ˜•์ œ๋‚˜ ์กฐ์ƒ์˜ ํ˜•์ œ์—๊ฒŒ ์ ํ”„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ํ˜•์ œ์ž๋งค์—๊ฒŒ ์ ํ”„ํ•œ๋‹ค๋ฉด, ์šฐ๋ฆฌ๋Š” ์šฐ๋ฆฌ ๋ถ€๋ชจ๊ฐ€ ์šฐ๋ฆฌ ํ˜•์ œ์ž๋งค๋ฅผ ์ง€๋ฐฐํ•œ๋‹ค๋Š” ๋ณด์žฅ์„ ๋ณด์กดํ–ˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์—ฌ๊ธฐ์— ์˜ค๊ธฐ ์œ„ํ•ด ์ด๋ฏธ ์šฐ๋ฆฌ ๋ถ€๋ชจ๋ฅผ ์ฒ˜ํ˜•ํ–ˆ์–ด์•ผ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค(๊ทธ๊ฒƒ๋„ ์šฐ๋ฆฌ๋ฅผ ์ง€๋ฐฐํ•˜๊ธฐ ๋•Œ๋ฌธ์—). ์กฐ์ƒ๋“ค์—๊ฒŒ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

    • ์ผ๋ฐ˜์ ์œผ๋กœ ์•…์„ฑ ๋ฐ”์ด๋„ˆ๋ฆฌ๋Š” ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์œ„์Œ์„ฑ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋‚ด๊ฐ€ ๋งํ–ˆ๋“ฏ์ด ์ด๋Š” (a) ์ด๋ฏธ ๊ฐ€๋Šฅํ•˜๊ณ  (b) ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.

  • ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋‹ค์Œ์€ ์ŠคํŠธ๋กœ์šฐ๋งจ ์ œ์•ˆ์ž…๋‹ˆ๋‹ค.

    • ํ•˜๋‚˜์˜ ์ƒˆ๋กœ์šด ๋ธ”๋ก ์œ ํ˜• ๋ช…๋ น์–ด:
    • ๋ผ๋ฒจ์€ * ๋ INSTR N์„ resulttype
    • ์ •ํ™•ํžˆ N๊ฐœ์˜ ์ง๊ณ„ ์ž์‹ ๋ช…๋ น์–ด๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ "์ง๊ณ„ ์ž์‹"์€ ๋ธ”๋ก ์œ ํ˜• ๋ช…๋ น์–ด( loop , block , ๋˜๋Š” labels )์™€ ๊ทธ์— ์ƒ์‘ํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. end ๋˜๋Š” ๋‹จ์ผ ๋น„๋ธ”๋ก ๋ช…๋ น์–ด(์Šคํƒ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์•„์•ผ ํ•จ).
    • labels ๋Š” ๋‹ค๋ฅธ ๋ธ”๋ก ์œ ํ˜• ๋ช…๋ น์ฒ˜๋Ÿผ ๋‹จ์ผ ๋ ˆ์ด๋ธ”์„ ๋งŒ๋“œ๋Š” ๋Œ€์‹  N+1๊ฐœ์˜ ๋ ˆ์ด๋ธ”์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. N์€ N ์ž์‹์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ํ•˜๋‚˜๋Š” labels ๋ธ”๋ก์˜ ๋์„ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค. ๊ฐ ์ž์‹์—์„œ ๋ ˆ์ด๋ธ” ์ธ๋ฑ์Šค 0~N-1์€ ์ˆœ์„œ๋Œ€๋กœ ์ž์‹์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ๋ ˆ์ด๋ธ” ์ธ๋ฑ์Šค N์€ ๋์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

    ๋‹ค์‹œ ๋งํ•ด์„œ, ๋‹น์‹ ์ด ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด
    loop ;; outer labels 3 block ;; child 0 br X end nop ;; child 1 nop ;; child 2 end end

    X์— ๋”ฐ๋ผ br ๋Š” ๋‹ค์Œ์„ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.

    | ์—‘์Šค | ๋Œ€์ƒ |
    | ---------- | ------ |
    | 0 | block ๋ |
    | 1 | ์ž์‹ 0( block ) |
    | 2 | ์•„์ด 1 (์•„๋‹ˆ์˜ค) |
    | 3 | ์•„์ด 2 (์•„๋‹ˆ์˜ค) |
    | 4 | labels ๋ |
    | 5 | ์™ธ๋ถ€ ๋ฃจํ”„์˜ ์‹œ์ž‘ |

    • ์‹คํ–‰์€ ์ฒซ ๋ฒˆ์งธ ์ž์‹์—์„œ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

    • ์‹คํ–‰์ด ์ž์‹ ์ค‘ ํ•˜๋‚˜์˜ ๋์— ๋„๋‹ฌํ•˜๋ฉด ๋‹ค์Œ์œผ๋กœ ๊ณ„์†๋ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ์ž์‹์˜ ๋์— ๋„๋‹ฌํ•˜๋ฉด ์ฒซ ๋ฒˆ์งธ ์ž์‹์œผ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค. (์ž์‹์˜ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์€ ๋Œ€์นญ์„ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.)

    • ์ž์‹ ์ค‘ ํ•˜๋‚˜๋กœ ๋ถ„๊ธฐํ•˜๋ฉด labels ์‹œ์ž‘ ๋ถ€๋ถ„์˜ ๊นŠ์ด๊นŒ์ง€ ํ”ผ์—ฐ์‚ฐ์ž ์Šคํƒ์ด ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค.

    • ๋๊นŒ์ง€ ๋ถ„๊ธฐํ•˜๋Š” ๊ฒฝ์šฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ง€๋งŒ resulttype ์ด ๋น„์–ด ์žˆ์ง€ ์•Š์€ ๊ฒฝ์šฐ block ์™€ ์œ ์‚ฌํ•˜๊ฒŒ ๋์œผ๋กœ ๋ถ„๊ธฐํ•˜๋ฉด ํ”ผ์—ฐ์‚ฐ์ž๊ฐ€ ๋‚˜์˜ค๊ณ  ํ•ด์ œ ํ›„ ํ‘ธ์‹œ๋ฉ๋‹ˆ๋‹ค.

    • Dominance: labels ๋ช…๋ น ์•ž์˜ ๊ธฐ๋ณธ ๋ธ”๋ก์€ ๊ฐ ์ž์‹์„ ์ง€๋ฐฐํ•˜๊ณ  labels ๋์˜ BB๋Š” ๋ฌผ๋ก ์ž…๋‹ˆ๋‹ค. ์•„์ด๋“ค์€ ์„œ๋กœ๋ฅผ ์ง€๋ฐฐํ•˜๊ฑฐ๋‚˜ ๋๊นŒ์ง€ ์ง€๋ฐฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    • ๋””์ž์ธ ๋…ธํŠธ:

    • N์€ ํ•œ ๋ฒˆ์— ์ฝ”๋“œ์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฏธ๋ฆฌ ์ง€์ •๋ฉ๋‹ˆ๋‹ค. labels ๋ธ”๋ก์˜ ๋ ๋ถ€๋ถ„์— ๋„๋‹ฌํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์ด์ƒํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ธ”๋ก ์•ˆ์˜ ์ธ๋ฑ์Šค ๋Œ€์ƒ์„ ์•Œ๊ธฐ ์ „์— ์ž์‹ ์ˆ˜๋ฅผ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    • ๋ ˆ์ด๋ธ” ๊ฐ„์— ํ”ผ์—ฐ์‚ฐ์ž ์Šคํƒ์— ๊ฐ’์„ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๊ฒฐ๊ตญ ์žˆ์–ด์•ผ ํ•˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ block ๋˜๋Š” loop ๊ฐ’์„ ์ „๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ ์ง€์›๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์™€ ํ•จ๊ป˜.

๊ทธ๋ž˜๋„ ๋ฃจํ”„์— ๋›ฐ์–ด๋“ค ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ •๋ง ์ข‹๊ฒ ์ฃ ? IIUC, ๊ทธ ๊ฒฝ์šฐ๊ฐ€ ๊ณ ๋ ค๋œ๋‹ค๋ฉด ๋ถˆ์พŒํ•œ ๋ฃจํ”„ + br_table ์ฝค๋ณด๊ฐ€ ์ ˆ๋Œ€ ํ•„์š”ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค ...

ํŽธ์ง‘: ์˜ค, labels ์—์„œ ์œ„๋กœ ์ ํ”„ํ•˜์—ฌ loop ์—†์ด ๋ฃจํ”„๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ทธ๊ฒƒ์„ ๋†“์ณค๋‹ค๋Š” ๊ฒƒ์„ ๋ฏฟ์„ ์ˆ˜ ์—†๋‹ค.

์ฃผ์–ด์ง„ ๋ฃจํ”„๊ฐ€ ์ž์—ฐ ๋ฃจํ”„๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ @qwertie์˜ wasm ํƒ€๊ฒŸํŒ… ์ปดํŒŒ์ผ๋Ÿฌ ์‚ฌ์šฉํ•˜์—ฌ ํ‘œํ˜„ํ•œ๋‹ค labels ๋Œ€์‹  loop . ๊ทธ๊ฒƒ์ด ๋‹น์‹ ์ด ๋งํ•˜๋Š” ๊ฒƒ์ด๋ผ๋ฉด ์ œ์–ด ํ๋ฆ„์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์Šค์œ„์น˜๋ฅผ ์ถ”๊ฐ€ํ•  ํ•„์š”๊ฐ€ ์ „ํ˜€ ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (๊ฒฐ๊ตญ ์ตœ์•…์˜ ๊ฒฝ์šฐ ํ•จ์ˆ˜์˜ ๋ชจ๋“  ๊ธฐ๋ณธ ๋ธ”๋ก์— ๋Œ€ํ•ด ๋ ˆ์ด๋ธ”์ด ์žˆ๋Š” ํ•˜๋‚˜์˜ ๊ฑฐ๋Œ€ํ•œ labels ๋ธ”๋ก์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์šฐ์„ธ ๋ฐ ์ž์—ฐ ๋ฃจํ”„์— ๋Œ€ํ•ด ์•Œ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋†“์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ labels ๋Š” ํ•ด๋‹น ์ตœ์ ํ™”๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค .)

์ถ•์†Œ์„ฑ์ด ๋ณด์žฅ๋˜๋Š” ์ค‘์ฒฉ ๋ฃจํ”„ ๊ตฌ์กฐ๋Š” ์ฒ˜์Œ์—๋Š” ๊ฑฐ์˜ ๋ฒ„๋ ค์ง‘๋‹ˆ๋‹ค. [...] JavaScriptCore, V8 ๋ฐ SpiderMonkey์—์„œ ํ˜„์žฌ WebAssembly ๊ตฌํ˜„์„ ํ™•์ธํ–ˆ๋Š”๋ฐ ๋ชจ๋‘ ์ด ํŒจํ„ด์„ ๋”ฐ๋ฅด๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ •ํ™•ํ•˜์ง€ ์•Š์Œ: ์ ์–ด๋„ SM์—์„œ IR ๊ทธ๋ž˜ํ”„๋Š” ์™„์ „ํžˆ ์ผ๋ฐ˜์ ์ธ ๊ทธ๋ž˜ํ”„๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ตฌ์กฐํ™”๋œ ์†Œ์Šค(JS ๋˜๋Š” wasm)์—์„œ ์ƒ์„ฑ๋˜๊ณ  ์ข…์ข… ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋‹จ์ˆœํ™” ๋ฐ/๋˜๋Š” ์ตœ์ ํ™”ํ•˜๋Š” ํŠน์ • ๊ทธ๋ž˜ํ”„ ๋ถˆ๋ณ€์„ฑ์„ ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์™„์ „ํžˆ ์ผ๋ฐ˜์ ์ธ CFG๋ฅผ ์ง€์›ํ•˜๋ ค๋ฉด ํŒŒ์ดํ”„๋ผ์ธ์˜ ๋งŽ์€ ํŒจ์Šค๋ฅผ ๊ฐ์‚ฌ/๋ณ€๊ฒฝํ•˜์—ฌ ์ด๋Ÿฌํ•œ ๋ถˆ๋ณ€๋Ÿ‰์„ ๊ฐ€์ •ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜(์ด๋ฅผ ์ผ๋ฐ˜ํ™”ํ•˜๊ฑฐ๋‚˜ ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ๋น„๊ด€ํ™”ํ•˜์—ฌ) ๊ทธ๋ž˜ํ”„๋ฅผ ์ถ•์†Œํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฏธ๋ฆฌ ๋…ธ๋“œ ๋ถ„ํ•  ๋ณต์ œ๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ด๊ฒƒ์€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์ด๊ฒƒ์ด ๋‹จ์ˆœํžˆ wasm์ด ์ธ์œ„์ ์ธ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ์ผ์œผํ‚ค๋Š” ๋ฌธ์ œ๋ผ๋Š” ๊ฒƒ์€ ์‚ฌ์‹ค์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋˜ํ•œ ๋งŽ์€ ์˜ต์…˜์ด ์žˆ๊ณ  ๋‹ค๋ฅธ ์—”์ง„์ด ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์€ ์ƒ์‚ฐ์ž๊ฐ€ ํ™˜์› ๋ถˆ๊ฐ€๋Šฅ์„ฑ์„ ๋ฏธ๋ฆฌ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•˜๋ฉด ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„์ด ์žˆ๋Š” ์ƒํƒœ์—์„œ ๋‹ค์†Œ ๋” ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์„ฑ๋Šฅ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Œ์„ ์‹œ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๊ณผ๊ฑฐ์— ์ž„์˜์˜ goto ์ง€์›์œผ๋กœ wasm์„ ํ™•์žฅํ•˜๊ธฐ ์œ„ํ•œ ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜๋Š” ๊ฒฝ๋กœ์— ๋Œ€ํ•ด ๋…ผ์˜ํ–ˆ์„ ๋•Œ ํ•œ ๊ฐ€์ง€ ํฐ ์งˆ๋ฌธ์€ ์—ฌ๊ธฐ์„œ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ๋ฌด์—‡์ธ์ง€์ž…๋‹ˆ๋‹ค. "์‹ค์ œ๋กœ ํ™˜์›ํ•  ์ˆ˜ ์—†๋Š” ์ œ์–ด ํ๋ฆ„์— ๋Œ€ํ•ด ๋ณด๋‹ค ํšจ์œจ์ ์ธ ์ฝ”๋“œ ์ƒ์„ฑ์„ ํ—ˆ์šฉ"? ์ „์ž๋ผ๋ฉด ์ž„์˜์˜ ๋ ˆ์ด๋ธ”/๊ณ ํ† ๋ฅผ ํฌํ•จํ•˜๋Š” ๋ฐฉ์‹์„ ์›ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ๋น„์šฉ/ํŽธ์ต๊ณผ ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๋ฌธ์ œ๋ฅผ ํ‰๊ฐ€ํ•˜๋Š” ๋ฌธ์ œ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ํ›„์ž์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ์šฐ๋ฆฌ๊ฐ€ ๊ด€์ฐฐํ•œ ํ•œ ๊ฐ€์ง€๋Š” ์•ผ์ƒ์—์„œ Duff์˜ ์žฅ์น˜ ์‚ฌ๋ก€๋ฅผ ๊ฐ€๋” ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ(์‹ค์ œ๋กœ ๋ฃจํ”„๋ฅผ ํ’€๊ธฐ ์œ„ํ•œ ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์ด ์•„๋‹™๋‹ˆ๋‹ค...), ์ข…์ข… ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•œ ๊ณณ์—์„œ ํ™˜์›์„ฑ ํŒ์—…์ด ํ‘œ์‹œ๋˜๋Š” ๊ณณ์€ ์ธํ„ฐํ”„๋ฆฌํ„ฐ ๋ฃจํ”„์ž…๋‹ˆ๋‹ค. ์ธํ„ฐํ”„๋ฆฌํ„ฐ ๋ฃจํ”„๋Š” ๋˜ํ•œ ๊ณ„์‚ฐ๋œ goto๊ฐ€ ํ•„์š”ํ•œ ๊ฐ„์ ‘ ์Šค๋ ˆ๋”ฉ์˜ ์ด์ ์„ ์–ป์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์˜คํ”„๋ผ์ธ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ๋„ ์ธํ„ฐํ”„๋ฆฌํ„ฐ ๋ฃจํ”„๋Š” ์ตœ์•…์˜ ๋ ˆ์ง€์Šคํ„ฐ ํ• ๋‹น์„ ๋ฐ›๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ธํ„ฐํ”„๋ฆฌํ„ฐ ๋ฃจํ”„ ์„ฑ๋Šฅ์ด ๋งค์šฐ ์ค‘์š”ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•œ ๊ฐ€์ง€ ์งˆ๋ฌธ์€ ์—”์ง„์ด ๊ฐ„์ ‘ ์Šค๋ ˆ๋”ฉ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ ์ ˆํ•œ ์žฌ๊ฐˆ๋ก์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์ œ์–ด ํ๋ฆ„ ๊ธฐ๋ณธ ์š”์†Œ๊ฐ€ ์‹ค์ œ๋กœ ํ•„์š”ํ•œ์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. (์ด๊ฒƒ์€ ๋‚˜์—๊ฒŒ ์—ด๋ฆฐ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค.)

@lukewagner
์–ด๋–ค ํŒจ์Šค๊ฐ€ ๋ถˆ๋ณ€๋Ÿ‰์— ์˜์กดํ•˜๋Š”์ง€ ์ž์„ธํžˆ ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ํ๋ฆ„์„ ์œ„ํ•œ ๋ณ„๋„์˜ ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‚ด๊ฐ€ ์ œ์•ˆํ•œ ๋””์ž์ธ์€ LICM๊ณผ ๊ฐ™์€ ์ตœ์ ํ™” ๋‹จ๊ณ„์—์„œ ํ•ด๋‹น ํ๋ฆ„์„ ํ”ผํ•˜๋Š” ๊ฒƒ์ด ์ƒ๋Œ€์ ์œผ๋กœ ์‰ฌ์›Œ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜์ง€ ๋ชปํ•œ ๋‹ค๋ฅธ ์œ ํ˜•์˜ ํŒŒ์†์ด ์žˆ๋Š” ๊ฒฝ์šฐ, ๊ทธ ํŠน์„ฑ์„ ๋” ์ž˜ ์ดํ•ดํ•˜์—ฌ ์ด๋Ÿฌํ•œ ํŒŒ์†์„ ํ”ผํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์™€ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋” ์ž˜ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๊ณผ๊ฑฐ์— ์ž„์˜์˜ goto ์ง€์›์œผ๋กœ wasm์„ ํ™•์žฅํ•˜๊ธฐ ์œ„ํ•œ ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜๋Š” ๊ฒฝ๋กœ์— ๋Œ€ํ•ด ๋…ผ์˜ํ–ˆ์„ ๋•Œ ํ•œ ๊ฐ€์ง€ ํฐ ์งˆ๋ฌธ์€ ์—ฌ๊ธฐ์„œ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ๋ฌด์—‡์ธ์ง€์ž…๋‹ˆ๋‹ค. "์‹ค์ œ๋กœ ํ™˜์›ํ•  ์ˆ˜ ์—†๋Š” ์ œ์–ด ํ๋ฆ„์— ๋Œ€ํ•ด ๋ณด๋‹ค ํšจ์œจ์ ์ธ ์ฝ”๋“œ ์ƒ์„ฑ์„ ํ—ˆ์šฉ"?

์ €์—๊ฒŒ๋Š” ํ›„์ž์ž…๋‹ˆ๋‹ค. ๋‚ด ์ œ์•ˆ์€ ์ƒ์‚ฐ์ž๊ฐ€ ๋„๋ฏธ๋„ค์ดํ„ฐ์™€ ์ž์—ฐ ๋ฃจํ”„๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ฐฑ์—”๋“œ ์ž‘์—…์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ์ „ํžˆ ๋ฆฌ๋ฃจํผ ์œ ํ˜• ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‹คํ–‰ํ•˜๊ณ  ํ•„์š”ํ•  ๋•Œ๋งŒ labels ๋˜๋Œ์•„๊ฐˆ ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ƒ์‚ฐ์ž๋ฅผ ๋” ๋‹จ์ˆœํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ํ™˜์›ํ•  ์ˆ˜ ์—†๋Š” ์ œ์–ด ํ๋ฆ„์— ํฐ ํŽ˜๋„ํ‹ฐ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์ด์ƒ์ ์ธ ์ƒ์‚ฐ์ž๋Š” ์ฝ”๋“œ๋ฅผ ๋ณต์ œํ•˜๋Š” ๊ฒƒ์ด ๋” ํšจ์œจ์ ์ธ์ง€, ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œํ•œ์˜ ๋ณต์ œ๋Ÿ‰ ๋“ฑ์„ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ํœด๋ฆฌ์Šคํ‹ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๋งค์šฐ ์—ด์‹ฌํžˆ ๋…ธ๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์œ ์ผํ•œ ํŽ˜๋„ํ‹ฐ๊ฐ€ ์ž ์žฌ์ ์œผ๋กœ ์ฃผ๋Š” ๊ฒฝ์šฐ ์—… ๋ฃจํ”„ ์ตœ์ ํ™”, ์ด๊ฒƒ์€ ์‹ค์ œ๋กœ ํ•„์š”ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ตœ์†Œํ•œ ์ผ๋ฐ˜ ๊ธฐ๊ณ„ ์ฝ”๋“œ ๋ฐฑ์—”๋“œ(์ž์ฒด ๋ฃจํ”„ ์ตœ์ ํ™”๊ฐ€ ์žˆ์Œ)๋ณด๋‹ค ๋” ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์‹ค์ œ๋กœ ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„์ด ์–ผ๋งˆ๋‚˜ ์ผ๋ฐ˜์ ์ธ์ง€์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹คโ€ฆ

๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ํ๋ฆ„์„ ์ฒ˜๋ฒŒํ•˜๋Š” ๊ฒƒ์€ ๋ณธ์งˆ์ ์œผ๋กœ ์ž์˜์ ์ด๋ฉฐ ๋ถˆํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ „์ฒด ํ”„๋กœ๊ทธ๋žจ ๋Ÿฐํƒ€์ž„์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์€ ์ž‘์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ•ซ์ŠคํŒŸ์— ๊ฐ์†Œํ•  ์ˆ˜ ์—†๋Š” ์ œ์–ด ํ๋ฆ„์ด ํฌํ•จ๋˜๋Š” ๊ฒฝ์šฐ ์‹ฌ๊ฐํ•œ ํŒจ๋„ํ‹ฐ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋ฏธ๋ž˜์—๋Š” WebAssembly ์ตœ์ ํ™” ๊ฐ€์ด๋“œ์— ์ด๊ฒƒ์„ ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ๋กœ ํฌํ•จํ•˜๊ณ  ์ด๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ํ”ผํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ๋ฏฟ์Œ์ด ๋งž๋‹ค๋ฉด ์ด๊ฒƒ์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ ์™„์ „ํžˆ ๋ถˆํ•„์š”ํ•œ ํ˜•ํƒœ์˜ ์ธ์ง€ ์˜ค๋ฒ„ํ—ค๋“œ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ž‘๋”๋ผ๋„ WebAssembly๋Š” ์ด๋ฏธ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ์— ๋น„ํ•ด ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ถฉ๋ถ„ํ•˜๋ฏ€๋กœ ์ถ”๊ฐ€๋ฅผ ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‚ด ๋ฏฟ์Œ์ด ํ‹€๋ ธ๋‹ค๋Š” ํ™•์‹ ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ธํ„ฐํ”„๋ฆฌํ„ฐ ๋ฃจํ”„ ์„ฑ๋Šฅ์ด ๋งค์šฐ ์ค‘์š”ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•œ ๊ฐ€์ง€ ์งˆ๋ฌธ์€ ์—”์ง„์ด ๊ฐ„์ ‘ ์Šค๋ ˆ๋”ฉ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ ์ ˆํ•œ ์žฌ๊ฐˆ๋ก์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์ œ์–ด ํ๋ฆ„ ๊ธฐ๋ณธ ์š”์†Œ๊ฐ€ ์‹ค์ œ๋กœ ํ•„์š”ํ•œ์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค.

ํฅ๋ฏธ๋กญ๊ฒŒ ๋“ค๋ฆด ์ˆ˜ ์žˆ์ง€๋งŒ ๋ณด๋‹ค ๋ฒ”์šฉ์ ์ธ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ, ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋ฅผ ์œ„ํ•ด ๋งž์ถคํ™”๋œ ๊ธฐ๋ณธ ์š”์†Œ๋Š” ์ถ•์†Œํ•  ์ˆ˜ ์—†๋Š” ์ œ์–ด ํ๋ฆ„์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋ฐฑ์—”๋“œ๊ฐ€ ์—ฌ์ „ํžˆ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ด์•Œ์„ ๊นจ๋ฌผ๋ ค๋ฉด ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ๋„ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜๋Š” ๋‚ด ์ œ์•ˆ์ด ์ด๋ฏธ ํ†ต์—ญ์‚ฌ๋ฅผ ์œ„ํ•œ ์ ์ ˆํ•œ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. labels ์™€ br_table ๋ฅผ ๊ฒฐํ•ฉํ•˜๋ฉด ๊ณ„์‚ฐ๋œ goto์™€ ๋‹ค๋ฅด์ง€ ์•Š์€ ํ•จ์ˆ˜์˜ ์ž„์˜ ์ง€์ ์—์„œ ์ ํ”„ ํ…Œ์ด๋ธ”์„ ์ง์ ‘ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์ตœ์†Œํ•œ ์ดˆ๊ธฐ์— ์ œ์–ด ํ๋ฆ„์„ ์Šค์œ„์น˜ ๋ธ”๋ก ๋‚ด์˜ ์ง€์ ์œผ๋กœ ์ง€์‹œํ•˜๋Š” C ์Šค์œ„์น˜์™€ ๋Œ€์กฐ์ ์œผ๋กœ, ๋ชจ๋“  ๊ฒฝ์šฐ๊ฐ€ goto์ธ ๊ฒฝ์šฐ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ถ”๊ฐ€ ์ ํ”„๋ฅผ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜์ง€๋งŒ ์—ฌ๋Ÿฌ '์ค‘๋ณต'์„ ๋ณ‘ํ•ฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช…๋ น๋ฌธ์„ ํ•˜๋‚˜๋กœ ์ „ํ™˜ํ•˜๋ฉด ๊ฐ ๋ช…๋ น ์ฒ˜๋ฆฌ๊ธฐ ๋’ค์— ๋ณ„๋„์˜ ์ ํ”„๊ฐ€ ์žˆ๋‹ค๋Š” ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.) ๋ ˆ์ง€์Šคํ„ฐ ํ• ๋‹น์˜ ๋ฌธ์ œ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

@comex ๋‚˜๋Š” ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„์ด ์žˆ๋Š” ์ƒํƒœ์—์„œ ๊ธฐ๋Šฅ ์ˆ˜์ค€์—์„œ ์ „์ฒด ์ตœ์ ํ™” ๋‹จ๊ณ„๋ฅผ ๊ฐ„๋‹จํžˆ ๋Œ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(SSA ์ƒ์„ฑ, regalloc ๋ฐ ๊ธฐํƒ€ ๋ช‡ ๊ฐ€์ง€๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ ์ž‘์—…์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Œ). ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ด์ „์— ๊ตฌ์กฐํ™”๋œ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ฐ€์ •ํ–ˆ๋˜ ๊ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ฐ์‚ฌํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ๋œ ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„์„ ๊ฐ€์ง„ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ํ’ˆ์งˆ ์ฝ”๋“œ๋ฅผ ์‹ค์ œ๋กœ ์ƒ์„ฑํ•˜๊ธฐ๋ฅผ ์›ํ–ˆ์Šต๋‹ˆ๋‹ค.

>

ํ™˜์›์„ฑ์ด ๋ณด์žฅ๋˜๋Š” ์ค‘์ฒฉ ๋ฃจํ”„ ๊ตฌ์กฐ๋Š”
์ดˆ๋ฐ˜์— ๋งŽ์ด ๋ฒ„๋ ธ์Šต๋‹ˆ๋‹ค. [...] ๋‚˜๋Š” ํ˜„์žฌ๋ฅผ ํ™•์ธํ–ˆ๋‹ค
JavaScriptCore, V8 ๋ฐ SpiderMonkey์˜ WebAssembly ๊ตฌํ˜„ ๋ฐ
๋ชจ๋‘ ์ด ํŒจํ„ด์„ ๋”ฐ๋ฅด๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ •ํ™•ํ•˜์ง€ ์•Š์Œ: ์ ์–ด๋„ SM์—์„œ IR ๊ทธ๋ž˜ํ”„๋Š” ์™„์ „ํžˆ ์ผ๋ฐ˜์ ์ธ ๊ทธ๋ž˜ํ”„๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์šฐ๋ฆฌ
๋‹ค์Œ์—์„œ ์ƒ์„ฑ๋œ ํŠน์ • ๊ทธ๋ž˜ํ”„ ๋ถˆ๋ณ€๋Ÿ‰์„ ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.
๊ตฌ์กฐํ™”๋œ ์†Œ์Šค(JS ๋˜๋Š” wasm) ๋ฐ ์ข…์ข… ๋‹จ์ˆœํ™” ๋ฐ/๋˜๋Š” ์ตœ์ ํ™”
์•Œ๊ณ ๋ฆฌ์ฆ˜.

V8์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๋‘ ๊ฐ€์ง€ ๋ชจ๋‘์—์„œ SSA์— ๋Œ€ํ•œ ๋‚˜์˜ ์ฃผ์š” ๋ถˆ๋งŒ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.
๊ฑฐ์˜ ์ •์˜ํ•˜์ง€ ์•Š๋Š” ๊ฐ๊ฐ์˜ ๋ฌธํ—Œ ๋ฐ ๊ตฌํ˜„
"์ž˜ ๊ตฌ์„ฑ๋œ" CFG๋ฅผ ๊ตฌ์„ฑํ•˜์ง€๋งŒ ์•”์‹œ์ ์œผ๋กœ ๋‹ค์–‘ํ•œ
์–ด์จŒ๋“  ๋ฌธ์„œํ™”๋˜์ง€ ์•Š์€ ์ œ์•ฝ ์กฐ๊ฑด์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฑด์„ค์— ์˜ํ•ด ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค.
์–ธ์–ด ํ”„๋ก ํŠธ์—”๋“œ. ๋‚˜๋Š” ๊ธฐ์กด ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ๋งŽ์€/๋Œ€๋ถ€๋ถ„์˜ ์ตœ์ ํ™”๊ฐ€
์ง„์ •์œผ๋กœ ์ž„์˜์˜ CFG๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@lukewagner๊ฐ€ ๋งํ–ˆ๋“ฏ์ด ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด์˜ ์ฃผ์š” ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ์•„๋งˆ๋„
์ตœ์ ํ™”๋œ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋ฅผ ์œ„ํ•œ "์Šค๋ ˆ๋“œ ์ฝ”๋“œ". ์–ผ๋งˆ๋‚˜ ๊ด€๋ จ์„ฑ์ด ์žˆ๋Š”์ง€ ๋งํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.
Wasm ๋„๋ฉ”์ธ์— ๋Œ€ํ•œ ๊ฒƒ์ด๋ฉฐ, ๊ทธ๊ฒƒ์˜ ๋ถ€์žฌ๊ฐ€ ์‹ค์ œ๋กœ ๊ฐ€์žฅ ํฐ์ง€ ์—ฌ๋ถ€
๋ณ‘๋ชฉ.

๋งŽ์€ ์‚ฌ๋žŒ๋“ค๊ณผ ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„์— ๋Œ€ํ•ด ๋…ผ์˜ํ•œ ํ›„
์ปดํŒŒ์ผ๋Ÿฌ IR์„ ์กฐ์‚ฌํ•  ๋•Œ "๊ฐ€์žฅ ๊นจ๋—ํ•œ" ์†”๋ฃจ์…˜์€ ์•„๋งˆ๋„
์ƒํ˜ธ ์žฌ๊ท€ ๋ธ”๋ก์˜ ๊ฐœ๋…. ๊ทธ๊ฒƒ์€ Wasm์—๊ฒŒ ๋งž๋Š” ์ผ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๊ตฌ์กฐ๋ฅผ ์ž˜ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

LLVM์˜ ๋ฃจํ”„ ์ตœ์ ํ™”๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„์„ ๋ฌด์‹œํ•˜๊ณ  ์ตœ์ ํ™”๋ฅผ ์‹œ๋„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์ด ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๋ฃจํ”„ ๋ถ„์„์€ ์ž์—ฐ ๋ฃจํ”„๋งŒ ์ธ์‹ํ•˜๋ฏ€๋กœ ๋ฃจํ”„๋กœ ์ธ์‹๋˜์ง€ ์•Š๋Š” CFG ์ฃผ๊ธฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋‹ค๋ฅธ ์ตœ์ ํ™”๋Š” ๋ณธ์งˆ์ ์œผ๋กœ ๋” ์ง€์—ญ์ ์ด๋ฉฐ ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ CFG์—์„œ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ์—์„œ, ๊ทธ๋ฆฌ๊ณ  ์•„๋งˆ๋„ ํ‹€๋ฆด ์ˆ˜ ์žˆ์ง€๋งŒ, SPEC2006์€ 401.bzip2์— ๋‹จ์ผ ํ™˜์› ๋ถˆ๊ฐ€ ๋ฃจํ”„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ๊ทธ๊ฒŒ ์ „๋ถ€์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ๋Š” ๋งค์šฐ ๋“œ๋ญ…๋‹ˆ๋‹ค.

Clang์€ ๊ณ„์‚ฐ๋œ goto๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜์—์„œ ๋‹จ์ผ indirectbr ๋ช…๋ น๋งŒ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์Šค๋ ˆ๋“œ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋ฅผ ๋ฃจํ”„ ํ—ค๋”๋กœ indirectbr ๋ธ”๋ก์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž์—ฐ์Šค๋Ÿฌ์šด ๋ฃจํ”„๋กœ ๋ฐ”๊พธ๋Š” ํšจ๊ณผ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. LLVM IR์„ ๋– ๋‚œ ํ›„ ๋‹จ์ผ indirectbr ๋Š” ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ์—์„œ ๊ผฌ๋ฆฌ ๋ณต์ œ๋˜์–ด ์›๋ž˜ ์–ฝํž˜์„ ์žฌ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๊ฐ์†Œํ•  ์ˆ˜ ์—†๋Š” ์ œ์–ด ํ๋ฆ„์— ๋Œ€ํ•œ ๋‹จ์ผ ํŒจ์Šค ๊ฒ€์ฆ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์—†์Šต๋‹ˆ๋‹ค.
๋‚ด๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š”. ๊ฐ์†Œ ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„๋งŒ์„ ์œ„ํ•œ ์„ค๊ณ„ ์„ ํƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์ด ์š”๊ตฌ ์‚ฌํ•ญ์˜ ์˜ํ–ฅ์„ ๋งŽ์ด ๋ฐ›์Šต๋‹ˆ๋‹ค.

์•ž์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„์€ ์ ์–ด๋„ ๋‘ ๊ฐ€์ง€๋ฅผ ๋ชจ๋ธ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹ค๋ฅธ ๋ฐฉ๋ฒ•๋“ค. switch ๋ฌธ์ด ์žˆ๋Š” ๋ฃจํ”„๋Š” ์‹ค์ œ๋กœ ์ตœ์ ํ™”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ฐ„๋‹จํ•œ ๋กœ์ปฌ ์ ํ”„ ์Šค๋ ˆ๋”ฉ์„ ํ†ตํ•ด ์›๋ž˜์˜ ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ทธ๋ž˜ํ”„๋กœ
์ตœ์ ํ™”(์˜ˆ: ์ƒ์ˆ˜ ํ• ๋‹น์ด ์žˆ๋Š” ํŒจํ„ด์„ ์ ‘์Œ์œผ๋กœ์จ
์ง€์—ญ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๋ถ„๊ธฐ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์กฐ๊ฑด ๋ถ„๊ธฐ๋กœ ๋ถ„๊ธฐ๋ฉ๋‹ˆ๋‹ค.
์ฆ‰์‹œ ํ•ด๋‹น ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ์ผญ๋‹ˆ๋‹ค).

๋”ฐ๋ผ์„œ ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด ๊ตฌ์กฐ๋Š” ์ „ํ˜€ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ,
๋ณต๊ตฌ๋ฅผ ์œ„ํ•œ ๋‹จ์ผ ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐฑ์—”๋“œ ๋ณ€ํ™˜์˜ ๋ฌธ์ œ
์›๋ž˜ ๊ธฐ์•ฝ ๊ทธ๋ž˜ํ”„ ๋ฐ ์ตœ์ ํ™”(์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์žˆ๋Š” ์—”์ง„์˜ ๊ฒฝ์šฐ
4๊ฐœ์˜ ๋ธŒ๋ผ์šฐ์ € ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ํ•˜์ง€ ์•Š๋Š” ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
๋‚ด๊ฐ€ ์•„๋Š” ํ•œ).

์ตœ์ƒ์˜,
-๋ฒค

2017๋…„ 4์›” 20์ผ ๋ชฉ์š”์ผ ์˜ค์ „ 5:20, Jakob Stoklund Olesen <
[email protected]>์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

LLVM์˜ ๋ฃจํ”„ ์ตœ์ ํ™”๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„์„ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.
์ตœ์ ํ™”๋ฅผ ์‹œ๋„ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์˜์ง€ ๊ธฐ๋ฐ˜ ๋ฃจํ”„ ๋ถ„์„
์ž์—ฐ์Šค๋Ÿฌ์šด ๋ฃจํ”„๋งŒ ์ธ์‹ํ•˜๋ฏ€๋กœ
๋ฃจํ”„๋กœ ์ธ์‹๋˜์ง€ ์•Š๋Š” CFG ์‚ฌ์ดํด์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋‹ค๋ฅธ
์ตœ์ ํ™”๋Š” ๋ณธ์งˆ์ ์œผ๋กœ ๋” ์ง€์—ญ์ ์ด๋ฉฐ ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ
CFG.

SPEC2006์—๋Š” ๋ฉ”๋ชจ๋ฆฌ์—์„œ, ์•„๋งˆ๋„ ํ‹€๋ฆด ์ˆ˜ ์žˆ๋Š” ๋‹จ์ผ ๋ฃจํ”„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
401.bzip2 ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒŒ ๋‹ค์•ผ. ์‹ค์ œ๋กœ๋Š” ๋งค์šฐ ๋“œ๋ญ…๋‹ˆ๋‹ค.

Clang์€ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜์—์„œ ๋‹จ์ผ indirectbr ๋ช…๋ น๋งŒ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค
๊ณ„์‚ฐ๋œ ๊ณ ํ† . ์ด๊ฒƒ์€ ์Šค๋ ˆ๋“œ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋ฅผ ๋‹ค์Œ์œผ๋กœ ๋ฐ”๊พธ๋Š” ํšจ๊ณผ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฃจํ”„ ํ—ค๋”๋กœ indirectbr ๋ธ”๋ก์ด ์žˆ๋Š” ์ž์—ฐ ๋ฃจํ”„. ๋– ๋‚œ ํ›„
LLVM IR, ๋‹จ์ผ ๊ฐ„์ ‘ BR์€ ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ์—์„œ ๊ผฌ๋ฆฌ ์ค‘๋ณต๋ฉ๋‹ˆ๋‹ค.
์›๋ž˜ ์–ฝํž˜์„ ์žฌ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/WebAssembly/design/issues/796#issuecomment-295352983 ,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/ALnq1K99AR5YaQuNOIFIckLLSIZbmbd0ks5rxkJQgaJpZM4J3ofA
.

๋‚˜๋Š” ๋˜ํ•œ ํ™˜์›ํ•  ์ˆ˜ ์—†๋Š” ๊ตฌ์„ฑ์ด ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
WebAssembly์—์„œ๋Š” TurboFan(V8์˜ JIT ์ตœ์ ํ™”)์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ด๋Ÿฌํ•œ
ํ•จ์ˆ˜๋Š” ๊ฒฐ๊ตญ ํ•ด์„(๋งค์šฐ ๋Š๋ฆผ)๋˜๊ฑฐ๋‚˜
๊ธฐ์ค€ ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค(๋‹ค์†Œ ๋Š๋ฆผ).
๊ฐ์†Œํ•  ์ˆ˜ ์—†๋Š” ์ œ์–ด ํ๋ฆ„์„ ์ง€์›ํ•˜๋„๋ก TurboFan์„ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋Š” ๋ฐ ๋…ธ๋ ฅ์„ ํˆฌ์žํ•˜์‹ญ์‹œ์˜ค.
์ฆ‰, WebAssembly์—์„œ ์ถ•์†Œํ•  ์ˆ˜ ์—†๋Š” ์ œ์–ด ํ๋ฆ„์ด ์žˆ๋Š” ๊ธฐ๋Šฅ์€
์•„๋งˆ๋„ ํ›จ์”ฌ ๋” ๋‚˜์œ ์„ฑ๋Šฅ์œผ๋กœ ๋๋‚  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฌผ๋ก  ๋‹ค๋ฅธ ์˜ต์…˜์€ V8์˜ WebAssembly ์—”์ง„์ด
TurboFan ์ถ•์†Œ ๊ฐ€๋Šฅํ•œ ๊ทธ๋ž˜ํ”„๋ฅผ ์ œ๊ณตํ•˜๋Š” relooper, ๊ทธ๋Ÿฌ๋‚˜ ์ปดํŒŒ์ผ์ด
(๊ทธ๋ฆฌ๊ณ  ์‹œ์ž‘์ด ๋” ๋‚˜๋น ์ง). ์žฌ๋ฃจํ•‘์€ ๋‚ด ์˜คํ”„๋ผ์ธ ์ ˆ์ฐจ๋กœ ๋‚จ์•„ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํ”ผํ•  ์ˆ˜ ์—†๋Š” ์—”์ง„ ๋น„์šฉ์œผ๋กœ ๋๋‚ฉ๋‹ˆ๋‹ค.

์ตœ์ƒ์˜,
-๋ฒค

2017๋…„ 5์›” 1์ผ ์›”์š”์ผ ์˜คํ›„ 12:48 Ben L. Titzer [email protected]์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด๋ฅผ ์œ„ํ•œ ๋‹จ์ผ ํŒจ์Šค ๊ฒ€์ฆ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์—†์Šต๋‹ˆ๋‹ค.
๋‚ด๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” ํ๋ฆ„. ๊ฐ์†Œ ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„๋งŒ์„ ์œ„ํ•œ ์„ค๊ณ„ ์„ ํƒ
์ด ์š”๊ตฌ ์‚ฌํ•ญ์˜ ์˜ํ–ฅ์„ ๋งŽ์ด ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.

์•ž์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„์€ ์ ์–ด๋„ ๋‘ ๊ฐ€์ง€๋ฅผ ๋ชจ๋ธ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹ค๋ฅธ ๋ฐฉ๋ฒ•๋“ค. switch ๋ฌธ์ด ์žˆ๋Š” ๋ฃจํ”„๋Š” ์‹ค์ œ๋กœ ์ตœ์ ํ™”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ฐ„๋‹จํ•œ ๋กœ์ปฌ ์ ํ”„ ์Šค๋ ˆ๋”ฉ์„ ํ†ตํ•ด ์›๋ž˜์˜ ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ทธ๋ž˜ํ”„๋กœ
์ตœ์ ํ™”(์˜ˆ: ์ƒ์ˆ˜ ํ• ๋‹น์ด ์žˆ๋Š” ํŒจํ„ด์„ ์ ‘์Œ์œผ๋กœ์จ
์ง€์—ญ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๋ถ„๊ธฐ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์กฐ๊ฑด ๋ถ„๊ธฐ๋กœ ๋ถ„๊ธฐ๋ฉ๋‹ˆ๋‹ค.
์ฆ‰์‹œ ํ•ด๋‹น ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ์ผญ๋‹ˆ๋‹ค).

๋”ฐ๋ผ์„œ ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด ๊ตฌ์กฐ๋Š” ์ „ํ˜€ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ,
๋ณต๊ตฌ๋ฅผ ์œ„ํ•œ ๋‹จ์ผ ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐฑ์—”๋“œ ๋ณ€ํ™˜์˜ ๋ฌธ์ œ
์›๋ž˜ ๊ธฐ์•ฝ ๊ทธ๋ž˜ํ”„ ๋ฐ ์ตœ์ ํ™”(์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์žˆ๋Š” ์—”์ง„์˜ ๊ฒฝ์šฐ
4๊ฐœ์˜ ๋ธŒ๋ผ์šฐ์ € ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ํ•˜์ง€ ์•Š๋Š” ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
๋‚ด๊ฐ€ ์•„๋Š” ํ•œ).

์ตœ์ƒ์˜,
-๋ฒค

2017๋…„ 4์›” 20์ผ ๋ชฉ์š”์ผ ์˜ค์ „ 5:20, Jakob Stoklund Olesen <
[email protected]>์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

LLVM์˜ ๋ฃจํ”„ ์ตœ์ ํ™”๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„์„ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.
์ตœ์ ํ™”๋ฅผ ์‹œ๋„ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์˜์ง€ ๊ธฐ๋ฐ˜ ๋ฃจํ”„ ๋ถ„์„
์ž์—ฐ์Šค๋Ÿฌ์šด ๋ฃจํ”„๋งŒ ์ธ์‹ํ•˜๋ฏ€๋กœ
๋ฃจํ”„๋กœ ์ธ์‹๋˜์ง€ ์•Š๋Š” CFG ์‚ฌ์ดํด์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋‹ค๋ฅธ
์ตœ์ ํ™”๋Š” ๋ณธ์งˆ์ ์œผ๋กœ ๋” ์ง€์—ญ์ ์ด๋ฉฐ ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ
CFG.

SPEC2006์—๋Š” ๋ฉ”๋ชจ๋ฆฌ์—์„œ, ์•„๋งˆ๋„ ํ‹€๋ฆด ์ˆ˜ ์žˆ๋Š” ๋‹จ์ผ ๋ฃจํ”„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
401.bzip2์— ์žˆ๊ณ  ๊ทธ๊ฒŒ ์ „๋ถ€์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ๋Š” ๋งค์šฐ ๋“œ๋ญ…๋‹ˆ๋‹ค.

Clang์€ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜์—์„œ ๋‹จ์ผ indirectbr ๋ช…๋ น๋งŒ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค
๊ณ„์‚ฐ๋œ ๊ณ ํ† . ์ด๊ฒƒ์€ ์Šค๋ ˆ๋“œ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋ฅผ ๋‹ค์Œ์œผ๋กœ ๋ฐ”๊พธ๋Š” ํšจ๊ณผ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฃจํ”„ ํ—ค๋”๋กœ indirectbr ๋ธ”๋ก์ด ์žˆ๋Š” ์ž์—ฐ ๋ฃจํ”„. ๋– ๋‚œ ํ›„
LLVM IR, ๋‹จ์ผ ๊ฐ„์ ‘ BR์€ ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ์—์„œ ๊ผฌ๋ฆฌ ์ค‘๋ณต๋ฉ๋‹ˆ๋‹ค.
์›๋ž˜ ์–ฝํž˜์„ ์žฌ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/WebAssembly/design/issues/796#issuecomment-295352983 ,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/ALnq1K99AR5YaQuNOIFIckLLSIZbmbd0ks5rxkJQgaJpZM4J3ofA
.

ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„์˜ ์„ ํ˜• ์‹œ๊ฐ„ ๊ฒ€์ฆ์„ ์œ„ํ•œ ํ™•๋ฆฝ๋œ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ๋ชฉํ• ๋งŒํ•œ ์˜ˆ๋Š” JVM์ž…๋‹ˆ๋‹ค. ์Šคํƒ๋งต์„ ์‚ฌ์šฉํ•˜๋ฉด ์„ ํ˜• ์‹œ๊ฐ„ ๊ฒ€์ฆ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. WebAssembly๋Š” ์ด๋ฏธ ๋ชจ๋“  ๋ธ”๋ก๊ณผ ์œ ์‚ฌํ•œ ๊ตฌ์„ฑ์— ๋ธ”๋ก ์„œ๋ช…์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์ œ์–ด ํ๋ฆ„ ๊ฒฝ๋กœ๊ฐ€ ๋ณ‘ํ•ฉ๋˜๋Š” ๋ชจ๋“  ์ง€์ ์—์„œ ๋ช…์‹œ์  ์œ ํ˜• ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ณ ์ • ์†Œ์ˆ˜์  ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

(์ฐธ๊ณ ๋กœ, ์–ผ๋งˆ ์ „์— ๋‚˜๋Š” ๊ฐ€์ƒ์˜ pick ์—ฐ์‚ฐ์ž๊ฐ€ ์ž„์˜์˜ ๊นŠ์ด์—์„œ ๋ธ”๋ก ์™ธ๋ถ€๋ฅผ ์ฝ๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋ฅผ ๋ฌผ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ•˜๋‚˜์˜ ๋Œ€๋‹ต์ž…๋‹ˆ๋‹ค. ์„œ๋ช…์ด ๋ชจ๋“  ๊ฒƒ์„ ์„ค๋ช…ํ•˜๋„๋ก ํ™•์žฅ๋˜์ง€ ์•Š๋Š” ํ•œ pick ์ฝ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, pick ํ•˜๋ฉด ๋” ๋งŽ์€ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.)

์Šค์œ„์น˜๊ฐ€ ์žˆ๋Š” ๋ฃจํ”„ ํŒจํ„ด์€ ๋ฌผ๋ก  ์ ํ”„ ์Šค๋ ˆ๋“œ๋กœ ์ œ๊ฑฐ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ์˜์กดํ•˜๋Š” ๊ฒƒ์€ ์‹ค์šฉ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—”์ง„์ด ์ตœ์ ํ™”ํ•˜์ง€ ์•Š์œผ๋ฉด ํŒŒ๊ดด์ ์ธ ์ˆ˜์ค€์˜ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์—”์ง„์ด ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒฝ์šฐ ์–ธ์–ด ์ž์ฒด์—์„œ ์ถ•์†Œํ•  ์ˆ˜ ์—†๋Š” ์ œ์–ด ํ๋ฆ„์„ ์œ ์ง€ํ•จ์œผ๋กœ์จ ๋ฌด์—‡์„ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•œ์ˆจโ€ฆ ๋” ์ผ์ฐ ๋‹ต์žฅ์„ ๋ณด๋‚ด๋ ค ํ–ˆ์ง€๋งŒ ์‚ถ์— ์ง€์žฅ์ด ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ช‡๋ช‡ JS ์—”์ง„์„ ์ƒ…์ƒ…์ด ๋’ค์ ธ ์™”์œผ๋ฉฐ, '๊ทธ๋ƒฅ ์ž‘๋™ํ•˜๋Š”' ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„์— ๋Œ€ํ•œ ์ฃผ์žฅ์„ ์•ฝํ™”์‹œ์ผœ์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์—ฌ์ „ํžˆ ๊ทธ๊ฒƒ์„ ์ž‘๋™ํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ๊ทธ๋ ‡๊ฒŒ ์–ด๋ ค์šธ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์ง€๋งŒ, ์‹ค์ œ๋กœ ์ด์ต์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ ์‘ํ•˜๊ธฐ ์–ด๋ ค์šธ ๋ช‡ ๊ฐ€์ง€ ๊ตฌ์กฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹คโ€ฆ

๊ธ€์Ž„์š”, ๋…ผ์Ÿ์„ ์œ„ํ•ด ์ตœ์ ํ™” ํŒŒ์ดํ”„๋ผ์ธ์ด ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„์„ ์ ์ ˆํ•˜๊ฒŒ ์ง€์›ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ๋„ˆ๋ฌด ์–ด๋ ต๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ด…์‹œ๋‹ค. JS ์—”์ง„์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•ดํ‚น ๋ฐฉ์‹์œผ๋กœ ์‰ฝ๊ฒŒ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐฑ์—”๋“œ ๋‚ด์—์„œ labels ๋ธ”๋ก์„ ๋งˆ์ง€๋ง‰ ์ˆœ๊ฐ„๊นŒ์ง€ ๋ฃจํ”„+์Šค์œ„์น˜์ธ ๊ฒƒ์ฒ˜๋Ÿผ ์ทจ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, labels ๋ธ”๋ก์„ ๋ณผ ๋•Œ ๊ฐ ๋ ˆ์ด๋ธ”์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฐ”๊นฅ์ชฝ ๊ฐ€์žฅ์ž๋ฆฌ๊ฐ€ ์žˆ๋Š” ๋ฃจํ”„ ํ—ค๋”๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ ˆ์ด๋ธ”์„ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” branch ๋ฅผ ๋ณผ ๋•Œ ๋‹ค์Œ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. labels ํ—ค๋”๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์—์ง€๋Š” ์‹ค์ œ ๋Œ€์ƒ ๋ ˆ์ด๋ธ”์ด ์•„๋‹ˆ๋ผ ์–ด๋”˜๊ฐ€์— ๋ณ„๋„๋กœ ์ €์žฅ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ๋ฃจํ”„+์Šค์œ„์น˜์™€ ๊ฐ™์ด ๋Œ€์ƒ ๋ ˆ์ด๋ธ”์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์‹ค์ œ ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ถ„๊ธฐ ๋ช…๋ น์˜ ์ผ๋ถ€ ํ•„๋“œ์— ๊ฐ’์„ ์ˆจ๊ธฐ๊ฑฐ๋‚˜ ๋ชฉ์ ์„ ์œ„ํ•ด ๋ณ„๋„์˜ ์ œ์–ด ๋ช…๋ น์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ตœ์ ํ™”, ์Šค์ผ€์ค„๋ง, ๋ ˆ์ง€์Šคํ„ฐ ํ• ๋‹น๊นŒ์ง€ ๋ชจ๋‘ ๋‘ ๊ฐœ์˜ ์ ํ”„๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๊ฐ€์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ œ๋กœ ๊ธฐ๋ณธ ์ ํ”„ ๋ช…๋ น์„ ์ƒ์„ฑํ•  ๋•Œ๊ฐ€ ๋˜๋ฉด ํ•ด๋‹น ํ•„๋“œ๋ฅผ ํ™•์ธํ•˜๊ณ  ๋Œ€์ƒ ๋ ˆ์ด๋ธ”๋กœ ์ง์ ‘ ์ ํ”„๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋ถ„๊ธฐ๋ฅผ ๋ณ‘ํ•ฉ/์‚ญ์ œํ•˜๋Š” ์ตœ์ ํ™”์— ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ์„ธ๋ถ€ ์‚ฌํ•ญ์€ ์—”์ง„ ์„ค๊ณ„์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์–ด๋–ค ์˜๋ฏธ์—์„œ ๋‚ด ์ œ์•ˆ์€ @titzer์˜ "๋‹จ์ˆœํ•œ ๋กœ์ปฌ ์ ํ”„ ์Šค๋ ˆ๋”ฉ ์ตœ์ ํ™”"์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” '๋„ค์ดํ‹ฐ๋ธŒ' ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„์„ ๋ฃจํ”„+์Šค์œ„์น˜์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ๋งŒ๋“ค ๊ฒƒ์„ ์ œ์•ˆํ•˜๊ณ  ์žˆ์ง€๋งŒ, ๋Œ€์•ˆ์€ ์‹ค์ œ ๋ฃจํ”„+์Šค์œ„์น˜๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ๋กœ์ปฌ ๋ณ€์ˆ˜๋ฅผ ์ฆ‰์‹œ ์ผœ๋Š” ์กฐ๊ฑด๋ถ€ ๋ถ„๊ธฐ๋กœ ๋ถ„๊ธฐ"ํ•˜๊ณ  ํŒŒ์ดํ”„๋ผ์ธ ํ›„๋ฐ˜์— ๊ฐ„์ ‘ ๋ถ„๊ธฐ๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ตœ์ ํ™”๊ฐ€ ์œ ๋น„์ฟผํ„ฐ์Šคํ™”๋˜๋ฉด ๋ช…์‹œ์  ๋ช…๋ น์— ๋Œ€ํ•œ ์ ์ ˆํ•œ ๋Œ€์ฒด๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์–ด๋Š ์ชฝ์ด๋“ , ํ•ดํ‚น ์ ‘๊ทผ ๋ฐฉ์‹์˜ ๋ช…๋ฐฑํ•œ ๋‹จ์ ์€ ์ตœ์ ํ™”๊ฐ€ ์‹ค์ œ ์ œ์–ด ํ๋ฆ„ ๊ทธ๋ž˜ํ”„๋ฅผ ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งˆ์น˜ ์–ด๋–ค ๋ ˆ์ด๋ธ”์ด ๋‹ค๋ฅธ ๋ ˆ์ด๋ธ”๋กœ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ํšจ๊ณผ์ ์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ๋ ˆ์ง€์Šคํ„ฐ ํ• ๋‹น์€ ๋ณ€์ˆ˜๋ฅผ ๋ชจ๋“  ๋ ˆ์ด๋ธ”์—์„œ ๋ผ์ด๋ธŒ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ์˜์‚ฌ ์ฝ”๋“œ์—์„œ์™€ ๊ฐ™์ด ํ•ญ์ƒ ํŠน์ • ๋ ˆ์ด๋ธ”๋กœ ์ ํ”„ํ•˜๊ธฐ ์ง์ „์— ๋ณ€์ˆ˜๊ฐ€ ํ• ๋‹น๋˜๋”๋ผ๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

a:
  control = 1;
  goto x;
b:
  control = 2;
  goto x;
...
x:
  // use control

์ด๋Š” ์–ด๋–ค ๊ฒฝ์šฐ์— ์‹ฌ๊ฐํ•˜๊ฒŒ ์ฐจ์„ ์˜ ๋ ˆ์ง€์Šคํ„ฐ ์‚ฌ์šฉ์œผ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜์ค‘์— ์–ธ๊ธ‰ํ•˜๊ฒ ์ง€๋งŒ JIT๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ํ™œ์„ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด ์ž‘์—…์„ ์ž˜ ์ˆ˜ํ–‰ํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์–ด๋–ค ๊ฒฝ์šฐ์ด๋“  ์ตœ์ ํ™”๋ฅผ ๋Šฆ๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ์ „ํ˜€ ์ตœ์ ํ™”ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋‚ซ์Šต๋‹ˆ๋‹ค. ๋‹จ์ผ ์ง์ ‘ ์ ํ”„๋Š” ์ ํ”„ + ๋น„๊ต + ๋กœ๋“œ + ๊ฐ„์ ‘ ์ ํ”„๋ณด๋‹ค ํ›จ์”ฌ ์ข‹์Šต๋‹ˆ๋‹ค. CPU ๋ถ„๊ธฐ ์˜ˆ์ธก๊ธฐ๋Š” ๊ฒฐ๊ตญ ๊ณผ๊ฑฐ ์ƒํƒœ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ›„์ž์˜ ๋Œ€์ƒ์„ ์˜ˆ์ธกํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ปดํŒŒ์ผ๋Ÿฌ๋งŒํผ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  'ํ˜„์žฌ ์ƒํƒœ' ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๋ ˆ์ง€์Šคํ„ฐ ๋ฐ/๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋น„๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ‘œํ˜„์— ๊ด€ํ•ด์„œ๋Š” ๋ช…์‹œ์ ( labels ๋ช…๋ น์–ด ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ) ๋˜๋Š” ์•”์‹œ์ (ํŠน์ • ํŒจํ„ด์„ ๋”ฐ๋ฅด๋Š” ์‹ค์ œ ๋ฃจํ”„+์Šค์œ„์น˜ ์ตœ์ ํ™”) ์ค‘ ์–ด๋Š ๊ฒƒ์ด ๋” ๋‚ซ์Šต๋‹ˆ๊นŒ?

์•”์‹œ์  ์ด์ :

  • ์‚ฌ์–‘์„ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

  • ๊ธฐ์กด ๋ฃจํ”„+์Šค์œ„์น˜ ์ฝ”๋“œ๋กœ ์ด๋ฏธ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ๋„จ์ด ์ถฉ๋ถ„ํžˆ ์—„๊ฒฉํ•œ ํŒจํ„ด์„ ๋”ฐ๋ฅด๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ๋“ค์„ ๋ณด์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

  • ์ถ•์†Œํ•  ์ˆ˜ ์—†๋Š” ์ œ์–ด ํ๋ฆ„์„ ํ‘œํ˜„ํ•˜๋Š” ์ถ•๋ณต๋œ ๋ฐฉ๋ฒ•์„ ํ•ดํ‚น์ฒ˜๋Ÿผ ๋Š๋ผ๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์†๋„๊ฐ€ ๋Š๋ฆฌ๊ณ  ๊ฐ€๋Šฅํ•˜๋ฉด ํ”ผํ•ด์•ผ ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๊ฐ•์กฐํ•ฉ๋‹ˆ๋‹ค.

์•”์‹œ์  ๋‹จ์ :

  • ํ•ดํ‚น ๊ฐ™์€ ๋Š๋‚Œ์ž…๋‹ˆ๋‹ค. ์‚ฌ์‹ค, @titzer๊ฐ€ ๋งํ–ˆ๋“ฏ์ด ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„์„ '์ ์ ˆํ•˜๊ฒŒ' ์ง€์›ํ•˜๋Š” ์—”์ง„์— ์‹ค์ œ๋กœ ๋ถˆ๋ฆฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ํŒจํ„ด์„ ์กฐ๊ธฐ์— ์ธ์‹ํ•˜๊ณ  ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— ์›๋ž˜์˜ ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ํ๋ฆ„์„ ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ์‹ค์ œ ์ ํ”„๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๊น”๋”ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

  • WebAssembly๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ JS์™€ ๋น„๊ตํ•˜์—ฌ ํ”ผํ•ด์•ผ ํ•˜๋Š” "์ตœ์ ํ™” ์ ˆ๋ฒฝ"์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์š”์•ฝํ•˜์ž๋ฉด, ์ตœ์ ํ™”ํ•  ๊ธฐ๋ณธ ํŒจํ„ด์€ "๋กœ์ปฌ ๋ณ€์ˆ˜์— ์ƒ์ˆ˜๋ฅผ ํ• ๋‹นํ•œ ๋‹ค์Œ ํ•ด๋‹น ๋กœ์ปฌ ๋ณ€์ˆ˜๋ฅผ ์ฆ‰์‹œ ์ผœ๋Š” ์กฐ๊ฑด ๋ถ„๊ธฐ๋กœ ๋ถ„๊ธฐ"ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์˜ˆ๋ฅผ ๋“ค์–ด ๊ทธ ์‚ฌ์ด์— ๋‹ค๋ฅธ ๋ช…๋ น์ด ์žˆ๊ฑฐ๋‚˜ ํ• ๋‹น์ด ์‹ค์ œ๋กœ wasm const ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ตœ์ ํ™”๋กœ ์ธํ•ด ์ƒ์ˆ˜๋ผ๊ณ  ์•Œ๋ ค์ง„ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ์ผ๋ถ€ ์—”์ง„์€ ์ด ํŒจํ„ด์œผ๋กœ ์ธ์‹ํ•˜๋Š” ์ ์—์„œ ๋‹ค๋ฅธ ์—”์ง„๋ณด๋‹ค ๋” ์ž์œ ๋กœ์šธ ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋ฅผ ํ™œ์šฉํ•˜๋Š” ์ฝ”๋“œ(์˜๋„์ ์ด๋“  ์•„๋‹ˆ๋“ )๋Š” ๋ธŒ๋ผ์šฐ์ € ๊ฐ„์— ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋” ๋ช…์‹œ์ ์ธ ์ธ์ฝ”๋”ฉ์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ธฐ๋Œ€์น˜๊ฐ€ ๋” ๋ช…ํ™•ํ•ด์ง‘๋‹ˆ๋‹ค.

  • ๊ฐ€์ƒ์˜ ํ›„์ฒ˜๋ฆฌ ๋‹จ๊ณ„์—์„œ wasm์„ IR์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. wasm-targeting ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ •์ƒ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๊ฒฐ๊ตญ relooper๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ถ๊ทน์ ์œผ๋กœ wasm์„ ์ƒ์„ฑํ•˜๊ธฐ ์ „์— ๋‚ด๋ถ€ IR์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ์ตœ์ ํ™”/๋ณ€ํ™˜์„ ์ฒ˜๋ฆฌํ•œ๋‹ค๋ฉด ๋งค์ง ๋ช…๋ น์–ด ์‹œํ€€์Šค์˜ ์กด์žฌ๋ฅผ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ”„๋กœ๊ทธ๋žจ์ด wasm ์ฝ”๋“œ ์ž์ฒด์— ๋Œ€ํ•œ ๋ณ€ํ™˜์„ ์‹คํ–‰ํ•˜๋ ค๋ฉด ํ•ด๋‹น ์‹œํ€€์Šค๋ฅผ ๋ถ„ํ•ดํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์„ฑ๊ฐ€์‹  ์ผ์ž…๋‹ˆ๋‹ค.

์–ด์จŒ๋“ , ๋‚˜๋Š” ์–ด๋Š ์ชฝ์ด๋“  ๊ทธ๋‹ค์ง€ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•”์‹œ์  ์ ‘๊ทผ ๋ฐฉ์‹์„ ๊ฒฐ์ •ํ•˜๋Š” ํ•œ ์ฃผ์š” ๋ธŒ๋ผ์šฐ์ €๋Š” ์‹ค์ œ๋กœ ๊ด€๋ จ ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์ „๋…ํ•ฉ๋‹ˆ๋‹ค.

โ€ฆ

๊ธฐ๋ณธ์ ์œผ๋กœ ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ํ๋ฆ„์„ ์ง€์›ํ•˜๋Š” ๋ฌธ์ œ๋กœ ๋Œ์•„๊ฐ€์„œ - ์žฅ์• ๋ฌผ์ด ๋ฌด์—‡์ธ์ง€, ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์ด์ ์ด ์žˆ๋Š”์ง€ - ๋‹ค์Œ์€ ์ด๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š” ์ตœ์ ํ™” ๋‹จ๊ณ„์— ๋Œ€ํ•œ IonMonkey์˜ ๋ช‡ ๊ฐ€์ง€ ๊ตฌ์ฒด์ ์ธ ์˜ˆ์ž…๋‹ˆ๋‹ค.

AliasAnalysis.cpp: ์—ญ์ˆœ์œผ๋กœ ๋ธ”๋ก์„ ๋ฐ˜๋ณตํ•˜๊ณ (ํ•œ ๋ฒˆ), ์ด์ „์— ์•จ๋ฆฌ์–ด์‹ฑ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์ €์žฅ์†Œ๋งŒ ๋ณด๊ณ  ๋ช…๋ น์— ๋Œ€ํ•œ ์ˆœ์„œ ์ง€์ • ์ข…์†์„ฑ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค(InstructionReordering์—์„œ ์‚ฌ์šฉ๋จ). ์ˆœํ™˜ ์ œ์–ด ํ๋ฆ„์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ (๋ช…์‹œ์ ์œผ๋กœ ํ‘œ์‹œ๋œ) ๋ฃจํ”„๋Š” ๋™์ผํ•œ ๋ฃจํ”„์˜ ์ž„์˜์˜ ์ดํ›„ ์ €์žฅ์†Œ์— ๋Œ€ํ•ด ๋ฃจํ”„์˜ ๋ช…๋ น์„ ํ™•์ธํ•˜๋Š” ๋‘ ๋ฒˆ์งธ ๋‹จ๊ณ„๋กœ ํŠน๋ณ„ํžˆ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

-> ๊ทธ๋ž˜์„œ ๋งˆํ‚น ์ผ๋ถ€ ๋ฃจํ”„๊ฐ€์žˆ์„ ๊ฑฐ๋ผ๊ณ  labels ๋ธ”๋ก. ์ด ๊ฒฝ์šฐ ์ „์ฒด labels ๋ธ”๋ก์„ ๋ฃจํ”„๋กœ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ์€ '๊ทธ๋ƒฅ ์ž‘๋™'ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(๊ฐœ๋ณ„ ๋ ˆ์ด๋ธ”์„ ํŠน๋ณ„ํžˆ ํ‘œ์‹œํ•˜์ง€ ์•Š์Œ). ๋ถ„์„์ด ๋„ˆ๋ฌด ๋ถ€์ •ํ™•ํ•˜์—ฌ ๋ฃจํ”„ ๋‚ด์˜ ์ œ์–ด ํ๋ฆ„์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

FlowAliasAnalysis.cpp: ์ข€ ๋” ๋˜‘๋˜‘ํ•œ ๋Œ€์ฒด ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์—ญ์ˆœ์œผ๋กœ ๋ธ”๋ก์„ ๋ฐ˜๋ณตํ•˜์ง€๋งŒ ๊ฐ ๋ธ”๋ก์„ ๋งŒ๋‚˜๋ฉด ๋ฐฑ ์—์ง€๋ฅผ ๊ณ ๋ คํ•˜๋Š” ๋ฃจํ”„ ํ—ค๋”๋ฅผ ์ œ์™ธํ•˜๊ณ  ๊ฐ ์ „์ž„์ž(์ด๋ฏธ ๊ณ„์‚ฐ๋œ ๊ฒƒ์œผ๋กœ ๊ฐ€์ •)์— ๋Œ€ํ•ด ๊ณ„์‚ฐ๋œ ๋งˆ์ง€๋ง‰ ์ €์žฅ ์ •๋ณด๋ฅผ ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

-> Messier๋Š” (a) ๊ฐœ๋ณ„ ๊ธฐ๋ณธ ๋ธ”๋ก์— ๋Œ€ํ•œ ์„ ํ–‰ ์ž‘์—…์ด ๋ฃจํ”„ ๋ฐฑ์—์ง€๋ฅผ ์ œ์™ธํ•˜๊ณ  ํ•ญ์ƒ ๊ทธ ์•ž์— ๋‚˜ํƒ€๋‚˜๊ณ  (b) ๋ฃจํ”„์— ๋ฐฑ์—์ง€๊ฐ€ ํ•˜๋‚˜๋งŒ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์ง€๋งŒ labels ์˜ ๋ช…์‹œ์  ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์„ ํ˜• ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋ ค๋ฉด ์ด ๊ฒฝ์šฐ ์ผ๋ฐ˜ AliasAnalysis ์ฒ˜๋Ÿผ ๊ฝค ์กฐ์žกํ•˜๊ฒŒ ์ž‘๋™ํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

BacktrackingAllocator.cpp: ๋ ˆ์ง€์Šคํ„ฐ ํ• ๋‹น์— ๋Œ€ํ•œ ์œ ์‚ฌํ•œ ๋™์ž‘: ๋ช…๋ น์–ด ๋ชฉ๋ก์„ ํ†ตํ•ด ์„ ํ˜• ์—ญ๋ฐฉํ–ฅ ์ „๋‹ฌ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋ฃจํ”„ ๋ฐฑ์—์ง€๋ฅผ ๋งŒ๋‚  ๋•Œ๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋ช…๋ น์–ด์˜ ๋ชจ๋“  ์‚ฌ์šฉ์ด ํ•ด๋‹น ์ •์˜ ์ดํ›„์— ๋‚˜ํƒ€๋‚  ๊ฒƒ์œผ๋กœ ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค(์ฆ‰, ์ด์ „์— ์ฒ˜๋ฆฌ๋จ). ๋ฃจํ”„์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์—์„œ ๋ผ์ด๋ธŒ๋Š” ๋‹จ์ˆœํžˆ ์ „์ฒด ๋ฃจํ”„๋ฅผ ํ†ตํ•ด ๋ผ์ด๋ธŒ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

-> ๋ชจ๋“  ๋ ˆ์ด๋ธ”์€ ๋ฃจํ”„ ํ—ค๋”์ฒ˜๋Ÿผ ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ํ•˜์ง€๋งŒ ์ „์ฒด ๋ ˆ์ด๋ธ” ๋ธ”๋ก์— ๋Œ€ํ•ด ํ™œ์„ฑ์ด ํ™•์žฅ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ตฌํ˜„ํ•˜๊ธฐ ์–ด๋ ต์ง€๋Š” ์•Š์ง€๋งŒ ๊ฒฐ๊ณผ๋Š” ํ•ดํ‚น ๋ฐฉ์‹๋ณด๋‹ค ๋‚˜์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ œ ์ƒ๊ฐ์—๋Š”.

@comex ์—ฌ๊ธฐ์„œ ๋˜ ๋‹ค๋ฅธ ๊ณ ๋ ค ์‚ฌํ•ญ์€ wasm ์—”์ง„์ด ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋Š”์ง€์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์œ„์—์„œ Ion์˜ AliasAnalysis๋ฅผ ์–ธ๊ธ‰ํ–ˆ์ง€๋งŒ ์ด์•ผ๊ธฐ์˜ ๋‹ค๋ฅธ ์ธก๋ฉด์€ ์ ์–ด๋„ ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ๊ทธ๋žจ์ด ์„ ํ˜• ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋™์•ˆ์—๋Š” WebAssembly ์ฝ”๋“œ์—์„œ ๋ณ„์นญ ๋ถ„์„์ด ๊ทธ๋‹ค์ง€ ์ค‘์š”ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Ion์˜ BacktrackingAllocator.cpp ํ™œ์„ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์•ฝ๊ฐ„์˜ ์ž‘์—…์ด ํ•„์š”ํ•˜์ง€๋งŒ ๊ธˆ์ง€๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. OSR์ด ๋ฃจํ”„์— ์—ฌ๋Ÿฌ ํ•ญ๋ชฉ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€๋ถ€๋ถ„์˜ Ion์€ ์ด๋ฏธ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๋” ๊ด‘๋ฒ”์œ„ํ•œ ์งˆ๋ฌธ์€ WebAssembly ์—”์ง„์ด ์ˆ˜ํ–‰ํ•  ์ตœ์ ํ™” ์ž‘์—…์ž…๋‹ˆ๋‹ค. WebAssembly๊ฐ€ ์ƒ์‚ฐ์ž/๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋Œ€๋ถ€๋ถ„์˜ ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์„ฑ๋Šฅ์„ ๊ฐ–์ถ˜ ์–ด์…ˆ๋ธ”๋ฆฌ์™€ ๊ฐ™์€ ํ”Œ๋žซํผ์ด ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜๋Š” ๊ฒฝ์šฐ ์—”์ง„์ด ์ƒ๋‹นํ•œ ๋ถ€๋‹ด์„ ์ฃผ๋Š” ํฌ๊ณ  ๋ณต์žกํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ํ•„์š”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ถ•์†Œํ•  ์ˆ˜ ์—†๋Š” ์ œ์–ด ํ๋ฆ„์€ ์ƒ๋‹นํžˆ ์ €๋ ดํ•œ ๋น„์šฉ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. . WebAssembly๊ฐ€ ๋” ๋†’์€ ์ˆ˜์ค€์˜ ์ตœ์ ํ™”๋ฅผ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๋” ๋†’์€ ์ˆ˜์ค€์˜ ๋ฐ”์ดํŠธ์ฝ”๋“œ๊ฐ€ ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜๊ณ  ์—”์ง„์ด ๋” ๋ณต์žกํ•˜๋‹ค๋ฉด ์ถ”๊ฐ€ ๋ณต์žก์„ฑ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ถ•์†Œํ•  ์ˆ˜ ์—†๋Š” ์ œ์–ด ํ๋ฆ„์„ ์–ธ์–ด์—์„œ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ๋” ์ค‘์š”ํ•ด์ง‘๋‹ˆ๋‹ค.

BTW๋Š” ๋˜ํ•œ ์ด ํ˜ธ์—์„œ ์–ธ๊ธ‰ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š” Braun et al์˜ on-the-fly SSA ๊ตฌ์„ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ž…๋‹ˆ๋‹ค . ์ด๋Š” ๊ฐ„๋‹จํ•˜๊ณ  ๋น ๋ฅธ on-the-fly SSA ๊ตฌ์„ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ฉฐ ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

WebKit(๋ฐ ์ฝ”๋“œ ์„œ๋ช…์„ ํ™•์ธํ•˜๋Š” ๋™์  ๋ง์ปค)์ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ํ”„๋กœ๊ทธ๋žจ์ธ iOS์—์„œ WebAssembly๋ฅผ qemu ๋ฐฑ์—”๋“œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. Qemu์˜ codegen์€ goto ๋ฌธ์ด codegen์— ํ•„์š”ํ•œ ๋ชจ๋“  ํ”„๋กœ์„ธ์„œ์˜ ์ผ๋ถ€๊ฐ€ ๋  ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜๋ฏ€๋กœ goto๊ฐ€ ์ถ”๊ฐ€๋˜์ง€ ์•Š์œผ๋ฉด WebAssembly ๋ฐฑ์—”๋“œ๊ฐ€ ๊ฑฐ์˜ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

@tbodt - Binaryen์˜ relooper๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ธฐ๋ณธ์ ์œผ๋กœ Wasm-with-goto๋ฅผ ์ƒ์„ฑํ•œ ๋‹ค์Œ ์ด๋ฅผ Wasm์— ๋Œ€ํ•œ ๊ตฌ์กฐํ™”๋œ ์ œ์–ด ํ๋ฆ„์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@eholk ๊ทธ๊ฒƒ์€ ๊ธฐ๊ณ„ ์ฝ”๋“œ๋ฅผ wasm์œผ๋กœ ์ง์ ‘ ๋ฒˆ์—ญํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋Š๋ฆฐ ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค.

@tbodt Binaryen์„ ์‚ฌ์šฉํ•˜๋ฉด ๋„์ค‘์— ์ถ”๊ฐ€ IR์ด ์ถ”๊ฐ€๋˜์ง€๋งŒ ํ›จ์”ฌ ๋Š๋ ค์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ ์†๋„์— ์ตœ์ ํ™”๋˜์–ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์„ ํƒ์ ์œผ๋กœ Binaryen ์ตœ์ ํ™” ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ gotos ๋“ฑ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ ์™ธ์— ์ด์ ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ตœ์ ํ™” ํ”„๋กœ๊ทธ๋žจ์€ qemu ์ตœ์ ํ™” ํ”„๋กœ๊ทธ๋žจ์ด ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š” ์ž‘์—…(wasm ๊ด€๋ จ ์ž‘์—…)์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์‹ค ์ €๋Š” ๋‹น์‹ ์ด ์›ํ•œ๋‹ค๋ฉด ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋‹น์‹ ๊ณผ ํ˜‘๋ ฅํ•˜๋Š” ๋ฐ ๋งค์šฐ ๊ด€์‹ฌ์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. :) Qemu๋ฅผ wasm์œผ๋กœ ์ด์‹ํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์œ ์šฉํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‹ค์‹œ ์ƒ๊ฐํ•ด๋ณด๋ฉด, goto๋Š” ๋ณ„๋กœ ๋„์›€์ด ๋˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Qemu์˜ codegen์€ ๊ธฐ๋ณธ ๋ธ”๋ก์ด ์ฒ˜์Œ ์‹คํ–‰๋  ๋•Œ ๊ธฐ๋ณธ ๋ธ”๋ก์— ๋Œ€ํ•œ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋ธ”๋ก์ด ์•„์ง ์ƒ์„ฑ๋˜์ง€ ์•Š์€ ๋ธ”๋ก์œผ๋กœ ์ ํ”„ํ•˜๋ฉด ๋ธ”๋ก์„ ์ƒ์„ฑํ•˜๊ณ  goto๊ฐ€ ์žˆ๋Š” ์ด์ „ ๋ธ”๋ก์„ ๋‹ค์Œ ๋ธ”๋ก์œผ๋กœ ํŒจ์น˜ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์•„๋Š” ํ•œ ๋™์  ์ฝ”๋“œ ๋กœ๋“œ ๋ฐ ๊ธฐ์กด ๊ธฐ๋Šฅ์˜ ํŒจ์น˜๋Š” ์›น ์–ด์…ˆ๋ธ”๋ฆฌ์—์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—…์ด ์•„๋‹™๋‹ˆ๋‹ค.

@kripken ํ˜‘์—…์— ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฑ„ํŒ…ํ•˜๊ธฐ ๊ฐ€์žฅ ์ข‹์€ ๊ณณ์€ ์–ด๋””์ธ๊ฐ€์š”?

๊ธฐ์กด ๊ธฐ๋Šฅ์„ ์ง์ ‘ ํŒจ์น˜ํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ call_indirect ๋ฐ a WebAssembly.Table ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ง€ํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒ์„ฑ๋˜์ง€ ์•Š์€ ๊ธฐ๋ณธ ๋ธ”๋ก์— ๋Œ€ํ•ด JavaScript๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , WebAssembly ๋ชจ๋“ˆ๊ณผ ์ธ์Šคํ„ด์Šค๋ฅผ ๋™๊ธฐ์ ์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ , ๋‚ด๋ณด๋‚ธ ํ•จ์ˆ˜๋ฅผ ์ถ”์ถœํ•˜๊ณ  ํ…Œ์ด๋ธ”์˜ ์ธ๋ฑ์Šค ์œ„์— ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ดํ›„ ํ˜ธ์ถœ์€ ์ƒ์„ฑ๋œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์•„์ง ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด๊ฒƒ์„ ์‹œ๋„ํ–ˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋งŽ์€ ๊ฑฐ์นœ ๊ฐ€์žฅ์ž๋ฆฌ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ผฌ๋ฆฌ ํ˜ธ์ถœ์ด ๊ตฌํ˜„๋œ ๊ฒฝ์šฐ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์Šคํƒ์ด ๊ฝค ๋นจ๋ฆฌ ์˜ค๋ฒ„ํ”Œ๋กœ๋ฉ๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” ๊ธฐ๋ณธ ํ…Œ์ด๋ธ”์— ๊ณต๊ฐ„์„ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฃผ์†Œ๋ฅผ ํ…Œ์ด๋ธ” ์ธ๋ฑ์Šค์— ์–ด๋–ป๊ฒŒ ๋งคํ•‘ํ•ฉ๋‹ˆ๊นŒ?

๋˜ ๋‹ค๋ฅธ ์˜ต์…˜์€ ๊ฐ๊ฐ์˜ ์ƒˆ๋กœ์šด ๊ธฐ๋ณธ ๋ธ”๋ก์—์„œ wasm ํ•จ์ˆ˜๋ฅผ ์žฌ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์‚ฌ์šฉ๋œ ๋ธ”๋ก์˜ ์ˆ˜์™€ ๋™์ผํ•œ ์žฌ์ปดํŒŒ์ผ ํšŸ์ˆ˜๋ฅผ ์˜๋ฏธํ•˜์ง€๋งŒ ์ปดํŒŒ์ผ ํ›„(ํŠนํžˆ ๋‚ด๋ถ€ ๋ฃจํ”„) ์ฝ”๋“œ๋ฅผ ๋น ๋ฅด๊ฒŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ด๋ฉฐ ์ „์ฒด ์ฝ”๋“œ์ผ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์žฌ์ปดํŒŒ์ผํ•˜๋ฉด ๊ฐ ๊ธฐ์กด ๋ธ”๋ก์— ๋Œ€ํ•ด Binaryen IR์„ ์žฌ์‚ฌ์šฉํ•˜๊ณ  ์ƒˆ ๋ธ”๋ก์— IR์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๋ชจ๋“  ๋ธ”๋ก์— ๋Œ€ํ•ด relooper๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(ํ•˜์ง€๋งŒ qemu๊ฐ€ ๊ฒŒ์œผ๋ฅด์ง€ ์•Š๊ณ  ์ „์ฒด ํ•จ์ˆ˜๋ฅผ ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?)

Binaryen ๊ณผ์˜ ํ˜‘์—…์„ ์œ„ํ•œ @tbodt, ํ•œ ๊ฐ€์ง€ ์˜ต์…˜์€ ์ž‘์—…๊ณผ ํ•จ๊ป˜ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๊ณ (๋ฌธ์ œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ), ๋‹ค๋ฅธ ์˜ต์…˜์€ qemu์šฉ Binaryen์—์„œ ํŠน์ • ๋ฌธ์ œ๋ฅผ ์—ฌ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

qemu์—๋Š” "ํ•จ์ˆ˜"๋ผ๋Š” ๊ฐœ๋…์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— qemu๊ฐ€ ํ•œ ๋ฒˆ์— ์ „์ฒด ํ•จ์ˆ˜๋ฅผ ์ปดํŒŒ์ผํ•˜๋„๋ก ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋ธ”๋ก์˜ ์ „์ฒด ์บ์‹œ๋ฅผ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. qemu์˜ ๋‚ด์žฅ ํ”„๋กœํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋‚ธ ๋‹ค์Œ binaryen์—์„œ ๋ฌธ์ œ๋ฅผ ์—ฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

์‚ฌ์ด๋“œ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‚ด ์ƒ๊ฐ์— WebAssembly๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ์–ธ์–ด๋Š” ํšจ์œจ์ ์ธ ์ƒํ˜ธ ์žฌ๊ท€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์œ ์šฉ์„ฑ์— ๋Œ€ํ•œ ์„ค๋ช…์„ ๋ณด๋ ค๋ฉด ๋‹ค์Œ์„ ์ฝ์–ด๋ณด์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. http://sharp-gamedev.blogspot.com/2011/08/forgotten-control-flow-construct.html

ํŠนํžˆ Cheery ๊ฐ€ ํ‘œํ˜„ํ•œ ํ•„์š”์„ฑ์€ ์ƒํ˜ธ ์žฌ๊ท€ ํ•จ์ˆ˜๋กœ ํ•ด๊ฒฐ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ผฌ๋ฆฌ ์žฌ๊ท€์˜ ํ•„์š”์„ฑ์„ ์ดํ•ดํ•˜์ง€๋งŒ ๊ธฐ๋ณธ ๊ธฐ๊ณ„๊ฐ€ goto๋ฅผ ์ œ๊ณตํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ƒํ˜ธ ์žฌ๊ท€ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด WebAssembly๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ๋ฐ ์–ด๋ ค์›€์„ ๊ฒช์„ ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋งŽ์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๊ฐ€ ์žˆ์„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜์—๊ฒŒ ๊ทธ๊ฒƒ์€ ๊ทธ๋“ค์—๊ฒŒ ์ฐฌ์„ฑํ•˜๋Š” ์ •๋‹นํ•œ ์ฃผ์žฅ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ƒํ˜ธ ์žฌ๊ท€ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋Š” ์ตœ์†Œํ•œ์˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜๋งŒ ์žˆ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค(๊ผฌ๋ฆฌ ์žฌ๊ท€์™€ ํ•จ๊ป˜).

@davidgrenier , Wasm ๋ชจ๋“ˆ์˜ ๊ธฐ๋Šฅ์€ ๋ชจ๋‘ ์ƒํ˜ธ ์žฌ๊ท€์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค์— ๋Œ€ํ•ด ๋น„ํšจ์œจ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ ์„ ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๊ผฌ๋ฆฌ ํ˜ธ์ถœ์ด ์—†๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ๊ฒƒ์„ ์–ธ๊ธ‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

์ผ๋ฐ˜ ํ…Œ์ผ ์ฝœ์ด ์˜ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ผฌ๋ฆฌ ์žฌ๊ท€(์ƒํ˜ธ ๋˜๋Š” ๊ธฐํƒ€)๋Š” ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๋“ค์— ๋Œ€ํ•ด ์–ด๋–ค ๊ฒƒ์ด ๋น„ํšจ์œจ์ ์ด๋ผ๊ณ  ๋งํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‚ด ๋ง์€, ๋‹น์‹ ์ด ๊ทธ๊ฒƒ๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด, ์ƒํ˜ธ ์žฌ๊ท€ ํ•จ์ˆ˜๊ฐ€ WebAssembly๋ฅผ ๋ชฉํ‘œ๋กœ ํ•˜๋Š” ์–ธ์–ด ๊ตฌํ˜„์ž๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์„ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜์ ์ธ goto๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Goto๋Š” ์‹œ๊ฐ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๋‹ค์ด์–ด๊ทธ๋žจ์—์„œ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ง€๊ธˆ์€ ๋น„์ฃผ์–ผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ๊ทธ๋‹ค์ง€ ์ธ๊ธฐ๊ฐ€ ์—†์ง€๋งŒ ๋ฏธ๋ž˜์—๋Š” ๋” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์„ ์–ป์„ ์ˆ˜ ์žˆ๊ณ  wass๋Š” ์ด์— ๋Œ€ํ•œ ์ค€๋น„๊ฐ€ ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์ด์–ด๊ทธ๋žจ ๋ฐ goto์—์„œ ์ฝ”๋“œ ์ƒ์„ฑ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ •๋ณด: http://drakon-editor.sourceforge.net/generation.html

๊ณง ์ถœ์‹œ๋  Go 1.11 ๋ฆด๋ฆฌ์Šค์—๋Š” WebAssembly์— ๋Œ€ํ•œ ์‹คํ—˜์  ์ง€์›์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๊ณ ๋ฃจํ‹ด, ์ฑ„๋„ ๋“ฑ์„ ํฌํ•จํ•œ Go์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์™„์ „ํ•œ ์ง€์›์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ƒ์„ฑ๋œ WebAssembly์˜ ์„ฑ๋Šฅ์€ ํ˜„์žฌ ๊ทธ๋‹ค์ง€ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ฃผ๋กœ ๋ˆ„๋ฝ๋œ goto ๋ช…๋ น ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. goto ๋ช…๋ น์–ด๊ฐ€ ์—†์œผ๋ฉด ๋ชจ๋“  ํ•จ์ˆ˜์—์„œ ์ตœ์ƒ์œ„ ๋ฃจํ”„์™€ ์ ํ”„ ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. relooper ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์šฐ๋ฆฌ์—๊ฒŒ ์„ ํƒ ์‚ฌํ•ญ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ณ ๋ฃจํ‹ด ๊ฐ„์— ์ „ํ™˜ํ•  ๋•Œ ํ•จ์ˆ˜์˜ ๋‹ค๋ฅธ ์ง€์ ์—์„œ ์‹คํ–‰์„ ์žฌ๊ฐœํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. relooper๋Š” ์ด๊ฒƒ์„ ๋„์šธ ์ˆ˜ ์—†์œผ๋ฉฐ goto ๋ช…๋ น๋งŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

WebAssembly๊ฐ€ Go์™€ ๊ฐ™์€ ์–ธ์–ด๋ฅผ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋Š” ์ง€๊ฒฝ์— ์ด๋ฅด๊ฒŒ ๋œ ๊ฒƒ์€ ๊ต‰์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ง„์ •ํ•œ ์›น ์–ด์…ˆ๋ธ”๋ฆฌ๊ฐ€ ๋˜๋ ค๋ฉด WebAssembly๊ฐ€ ๋‹ค๋ฅธ ์–ด์…ˆ๋ธ”๋ฆฌ ์–ธ์–ด์™€ ๋™๋“ฑํ•˜๊ฒŒ ๊ฐ•๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Go์—๋Š” ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ ํ”Œ๋žซํผ์— ๋Œ€ํ•ด ๋งค์šฐ ํšจ์œจ์ ์ธ ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ณ ๊ธ‰ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์›น์„ ์œ„ํ•œ ํšจ์œจ์ ์ธ ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” ๋ฐ ์ด ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ด ์ฃผ๋กœ WebAssembly์˜ ์ œํ•œ์ด๊ณ  Go ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์ œํ•œ์ด ์•„๋‹ˆ๋ผ๊ณ  ์ฃผ์žฅํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

relooper ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์šฐ๋ฆฌ์—๊ฒŒ ์„ ํƒ ์‚ฌํ•ญ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ณ ๋ฃจํ‹ด ๊ฐ„์— ์ „ํ™˜ํ•  ๋•Œ ํ•จ์ˆ˜์˜ ๋‹ค๋ฅธ ์ง€์ ์—์„œ ์‹คํ–‰์„ ์žฌ๊ฐœํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋ช…ํ™•ํžˆํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ฐ˜ goto๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๊ณ„์‚ฐ ๋œ goto ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋งž์Šต๋‹ˆ๊นŒ?

์„ฑ๋Šฅ ๋ฉด์—์„œ ์ผ๋ฐ˜ goto๋กœ ์ถฉ๋ถ„ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๋ธ”๋ก ์‚ฌ์ด์˜ ์ ํ”„๋Š” ์–ด์จŒ๋“  ์ •์ ์ด๋ฉฐ ๊ณ ๋ฃจํ‹ด์„ ์ „ํ™˜ํ•˜๋ ค๋ฉด ๋ถ„๊ธฐ์— goto๊ฐ€ ์žˆ๋Š” br_table ์ด๋ฉด ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ถœ๋ ฅ ํฌ๊ธฐ๋Š” ๋‹ค๋ฅธ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ฐ ๊ธฐ๋Šฅ์— ์ •์ƒ์ ์ธ ์ œ์–ด ํ๋ฆ„์ด ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ์ง€๋งŒ ๊ณ ๋ฃจํ‹ด์„ ์žฌ๊ฐœํ•  ๋•Œ "์ค‘๊ฐ„"์— ์žˆ๋Š” ๊ธฐ๋Šฅ ํ•ญ๋ชฉ์—์„œ ํŠน์ • ๋‹ค๋ฅธ ์œ„์น˜๋กœ ์ ํ”„ํ•˜๋Š” ๊ธฐ๋Šฅ๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์œ„์น˜๊ฐ€ ๋ช‡ ๊ฐœ๋‚˜ ๋ ๊นŒ์š”? ๋ชจ๋“  ๋‹จ์ผ ๊ธฐ๋ณธ ๋ธ”๋ก์ธ ๊ฒฝ์šฐ ๋ฆฌ๋ฃจํผ๋Š” ๋ชจ๋“  ๋ช…๋ น์ด ํ†ต๊ณผํ•˜๋Š” ์ตœ์ƒ์œ„ ๋ฃจํ”„๋ฅผ ๊ฐ•์ œ๋กœ ๋ฐฉ์ถœํ•ด์•ผ ํ•˜์ง€๋งŒ, ๋ช‡ ๊ฐœ์ผ ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (๊ทธ๊ฒƒ์€ ์‹ค์ œ๋กœ emscripten์—์„œ setjmp ์ง€์›์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ์ผ์ž…๋‹ˆ๋‹ค. LLVM์˜ ๊ธฐ๋ณธ ๋ธ”๋ก ์‚ฌ์ด์— ์ถ”๊ฐ€๋กœ ํ•„์š”ํ•œ ๊ฒฝ๋กœ๋ฅผ ๋งŒ๋“ค๊ณ  relooper๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.)

๋‹ค๋ฅธ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ๋ชจ๋“  ํ˜ธ์ถœ์€ ์ด๋Ÿฌํ•œ ์œ„์น˜์ด๋ฉฐ ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ๋ณธ ๋ธ”๋ก์—๋Š” ์ ์–ด๋„ ํ•˜๋‚˜์˜ ํ˜ธ์ถœ ๋ช…๋ น์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํ˜ธ์ถœ ์Šคํƒ์„ ์–ด๋Š ์ •๋„ ํ’€๊ณ  ๋ณต์›ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ, ์‹ค์šฉ์ ์ด๋ ค๋ฉด ์ •์  goto ๋˜๋Š” ํ˜ธ์ถœ ์Šคํƒ ๋ณต์› ์ง€์›์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค(์ด ๋˜ํ•œ ๊ณ ๋ ค๋จ).

CPS ์Šคํƒ€์ผ๋กœ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ WASM์—์„œ call/cc ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@Heimdell , ๊ตฌ๋ถ„๋œ ์—ฐ์† ํ˜•ํƒœ(์ผ๋ช… "์Šคํƒ ์ „ํ™˜")์— ๋Œ€ํ•œ ์ง€์›์ด ๋กœ๋“œ๋งต์— ์žˆ์œผ๋ฉฐ ๊ฑฐ์˜ โ€‹โ€‹๋ชจ๋“  ํฅ๋ฏธ๋กœ์šด ์ œ์–ด ์ถ”์ƒํ™”์— ์ถฉ๋ถ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Wasm ํ˜ธ์ถœ ์Šคํƒ์€ ์ž„๋ฒ ๋”์— ๋Œ€ํ•œ ์žฌ์ง„์ž… ํ˜ธ์ถœ์„ ํฌํ•จํ•˜์—ฌ ๋‹ค๋ฅธ ์–ธ์–ด์™€ ์ž„์˜๋กœ ํ˜ผํ•ฉ๋  ์ˆ˜ ์žˆ๊ณ  ๋”ฐ๋ผ์„œ ๋ณต์‚ฌ ๊ฐ€๋Šฅํ•˜๊ฑฐ๋‚˜ ์ด๋™ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ๊ฐ€์ •ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๋Š” ๋ฌด์ œํ•œ ์—ฐ์†(์ฆ‰, ์ „์ฒด ํ˜ธ์ถœ/cc)์„ ์ง€์›ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ๋ฅผ ์ฝ์œผ๋ฉด์„œ ์ž„์˜์˜ ๋ ˆ์ด๋ธ”๊ณผ goto๊ฐ€ ๊ธฐ๋Šฅ์ด ๋˜๊ธฐ ์ „์— ํฐ ์žฅ์• ๋ฌผ์ด ์žˆ๋‹ค๋Š” ์ธ์ƒ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.

  • ๊ตฌ์กฐํ™”๋˜์ง€ ์•Š์€ ์ œ์–ด ํ๋ฆ„์€ ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
  • "๋น ๋ฅด๊ณ  ๊ฐ„๋‹จํ•œ ๊ฒ€์ฆ, ์‰ฌ์šด, SSA ์–‘์‹์œผ๋กœ์˜ ์›ํŒจ์Šค ๋ณ€ํ™˜" ์ œ๊ฑฐ*
  • ๋น„์„ ํ˜• ์„ฑ๋Šฅ์— JIT ์ปดํŒŒ์ผ๋Ÿฌ ์—ด๊ธฐ
  • ์›๋ž˜ ์–ธ์–ด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์„ ํ–‰ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์›น ํŽ˜์ด์ง€๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ์ง€์—ฐ์„ ๊ฒช์„ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

_* ๋น„๋ก ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„์„ ์ฒ˜๋ฆฌํ•˜๋Š” Braun et al์˜ ์ฆ‰์„ SSA ๊ตฌ์„ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ณผ ๊ฐ™์€ ๋Œ€์•ˆ์ด ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ_

์šฐ๋ฆฌ๊ฐ€ ์—ฌ์ „ํžˆ ๊ฑฐ๊ธฐ์— ๊ฐ‡ํ˜€ ์žˆ๋‹ค๋ฉด _๋ฐ_ ํ…Œ์ผ ํ˜ธ์ถœ์ด ๊ณ„์† ์ง„ํ–‰๋˜๊ณ  ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ธ์–ด ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ์—ฌ์ „ํžˆ goto๋กœ ๋ฒˆ์—ญํ•˜๋„๋ก ์š”์ฒญํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์ง€๋งŒ WebAssembly ์ถœ๋ ฅ ์ „์— ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„๋กœ "๋ ˆ์ด๋ธ” ๋ธ”๋ก"์„ ํ•จ์ˆ˜๋กœ ๋ถ„ํ• ํ•˜๊ณ , goto๋ฅผ ๊ผฌ๋ฆฌ ํ˜ธ์ถœ๋กœ ๋ณ€ํ™˜ํ•˜์‹ญ์‹œ์˜ค.

Scheme ๋””์ž์ด๋„ˆ Guy Steele์˜ 1977๋…„ ๋…ผ๋ฌธ Lambda: The Ultimate GOTO ์— ๋”ฐ๋ฅด๋ฉด ๋ณ€ํ™˜์ด ๊ฐ€๋Šฅํ•ด์•ผ ํ•˜๋ฉฐ ๊ผฌ๋ฆฌ ํ˜ธ์ถœ์˜ ์„ฑ๋Šฅ์€ goto์™€ ๊ฑฐ์˜ ์ผ์น˜ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ƒ๊ฐ?

์šฐ๋ฆฌ๊ฐ€ ์—ฌ์ „ํžˆ ๊ฑฐ๊ธฐ์— ๊ฐ‡ํ˜€ ์žˆ๋‹ค๋ฉด _๋ฐ_ ํ…Œ์ผ ํ˜ธ์ถœ์ด ๊ณ„์† ์ง„ํ–‰๋˜๊ณ  ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ธ์–ด ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ์—ฌ์ „ํžˆ goto๋กœ ๋ฒˆ์—ญํ•˜๋„๋ก ์š”์ฒญํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์ง€๋งŒ WebAssembly ์ถœ๋ ฅ ์ „์— ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„๋กœ "๋ ˆ์ด๋ธ” ๋ธ”๋ก"์„ ํ•จ์ˆ˜๋กœ ๋ถ„ํ• ํ•˜๊ณ , goto๋ฅผ ๊ผฌ๋ฆฌ ํ˜ธ์ถœ๋กœ ๋ณ€ํ™˜ํ•˜์‹ญ์‹œ์˜ค.

์ด๊ฒƒ์€ ๋ณธ์งˆ์ ์œผ๋กœ ๋ชจ๋“  ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ˆ˜ํ–‰ํ•  ์ž‘์—…์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์•„๋Š” ์‚ฌ๋žŒ ์ค‘ ๋ˆ„๊ตฌ๋„ ์œ ํ˜•์ด ์ง€์ •๋œ EBB์˜ ๊ทธ๋ž˜ํ”„์— ๋Œ€ํ•ด JVM์—์„œ ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋Š” ์ข…๋ฅ˜์˜ ๊ด€๋ฆฌ๋˜์ง€ ์•Š๋Š” goto๋ฅผ ์˜นํ˜ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. LLVM, GCC, Cranelift ๋ฐ ๋‚˜๋จธ์ง€๋Š” ๋ชจ๋‘ ๋‚ด๋ถ€ ํ‘œํ˜„์œผ๋กœ (ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ) SSA ํ˜•์‹ CFG๋ฅผ ๊ฐ–๊ณ  Wasm์—์„œ ๋„ค์ดํ‹ฐ๋ธŒ๋กœ์˜ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋™์ผํ•œ ๋‚ด๋ถ€ ํ‘œํ˜„์„ ๊ฐ€์ง€๋ฏ€๋กœ ๊ฐ€๋Šฅํ•œ ํ•œ ๋งŽ์€ ์ •๋ณด๋ฅผ ๋ณด์กดํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ํ•œ ์ ์€ ์ •๋ณด๋ฅผ ์žฌ๊ตฌ์„ฑํ•˜์‹ญ์‹œ์˜ค. ๋กœ์ปฌ์€ ๋” ์ด์ƒ SSA๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์†์‹ค์ด ๋ฐœ์ƒํ•˜๊ณ  Wasm์˜ ์ œ์–ด ํ๋ฆ„์€ ๋” ์ด์ƒ ์ž„์˜์˜ CFG๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์†์‹ค์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. Wasm์„ ํฌํ•จํ•˜๋Š” AFAIK๋Š” ์„ธ๋ถ„ํ™”๋œ ๋ ˆ์ง€์Šคํ„ฐ ํ™œ์„ฑ ์ •๋ณด๊ฐ€ ํฌํ•จ๋œ ๋ฌดํ•œ ๋ ˆ์ง€์Šคํ„ฐ SSA ๋ ˆ์ง€์Šคํ„ฐ ๋จธ์‹ ์ด ์•„๋งˆ codegen์— ๊ฐ€์žฅ ์ ํ•ฉํ•  ๊ฒƒ์ด์ง€๋งŒ ์ฝ”๋“œ ํฌ๊ธฐ๊ฐ€ ๋ถ€ํ’€๋ ค์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž„์˜์˜ CFG์—์„œ ๋ชจ๋ธ๋ง๋œ ์ œ์–ด ํ๋ฆ„์ด ์žˆ๋Š” ์Šคํƒ ๋จธ์‹ ์ด ์•„๋งˆ๋„ ์ตœ๊ณ ์˜ ์ค‘๊ฐ„ ์ง€์ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. . ๋ ˆ์ง€์Šคํ„ฐ ๊ธฐ๊ณ„์˜ ์ฝ”๋“œ ํฌ๊ธฐ์— ๋Œ€ํ•ด ํ‹€๋ฆด ์ˆ˜ ์žˆ์ง€๋งŒ ํšจ์œจ์ ์œผ๋กœ ์ธ์ฝ”๋”ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„์— ๊ด€ํ•œ ๊ฒƒ์€ ํ”„๋ก ํŠธ ์—”๋“œ์—์„œ ํ™˜์›ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ wasm์—์„œ ์—ฌ์ „ํžˆ ํ™˜์›ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. relooper/stackifier ๋ณ€ํ™˜์€ ์ œ์–ด ํ๋ฆ„์„ ํ™˜์› ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค์ง€ ์•Š๊ณ , ๋‹จ์ง€ ํ™˜์› ๋ถˆ๊ฐ€๋Šฅ์„ฑ์„ ๋Ÿฐํƒ€์ž„ ๊ฐ’์— ์ข…์†๋˜๋„๋ก ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฐฑ์—”๋“œ์— ๋” ์ ์€ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋ฏ€๋กœ ๋” ๋‚˜์œ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ CFG์— ๋Œ€ํ•ด ์ข‹์€ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ relooper ๋ฐ stackifier์—์„œ ๋ฐฉ์ถœ๋˜๋Š” ํŒจํ„ด์„ ๊ฐ์ง€ํ•˜๊ณ  ์ด๋ฅผ ๋‹ค์‹œ ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ CFG๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. AFAIK๊ฐ€ ์ถ•์†Œ ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„๋งŒ ์ง€์›ํ•˜๋Š” V8์„ ๊ฐœ๋ฐœํ•˜์ง€ ์•Š๋Š” ํ•œ, ์ถ•์†Œ ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์€ ์ˆœ์ „ํžˆ ์Šน๋ฆฌ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ ๋ชจ๋‘๋ฅผ ํ›จ์”ฌ ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค(ํ”„๋ก ํŠธ์—”๋“œ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ์ €์žฅํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ํ˜•์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐฑ์—”๋“œ๋Š” ํŒจํ„ด์„ ๊ฐ์ง€ํ•ด์•ผ ํ•จ) ์ œ์–ด ํ๋ฆ„์ด ํ™˜์›๋  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ๋” ๋‚˜์€ ์ถœ๋ ฅ์„ ์ƒ์„ฑํ•˜๊ณ  ์ œ์–ด ํ๋ฆ„์ด ํ™˜์› ๊ฐ€๋Šฅํ•œ ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ์™€ ๊ฐ™๊ฑฐ๋‚˜ ๋” ๋‚˜์€ ์ถœ๋ ฅ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ GCC์™€ Go๊ฐ€ WebAssembly ์ƒ์‚ฐ์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

V8์ด WebAssembly ์—์ฝ”์‹œ์Šคํ…œ์˜ ์ค‘์š”ํ•œ ๊ตฌ์„ฑ ์š”์†Œ๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ํ˜„์žฌ ์ œ์–ด ํ๋ฆ„ ์ƒํ™ฉ์—์„œ ์ด์ ์„ ์–ป๋Š” ์—์ฝ”์‹œ์Šคํ…œ์˜ ์œ ์ผํ•œ ๋ถ€๋ถ„์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“  ๋ฐฑ์—”๋“œ๋Š” ์–ด์จŒ๋“  CFG๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค. WebAssembly๊ฐ€ ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€.

v8์€ ์ž…๋ ฅ CFG๋ฅผ ์ˆ˜๋ฝํ•˜๊ธฐ ์œ„ํ•ด relooper๋ฅผ ํ†ตํ•ฉํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๊นŒ? v8์˜ ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์—์„œ ์ƒํƒœ๊ณ„์˜ ํฐ ๋ฉ์–ด๋ฆฌ๊ฐ€ ์ฐจ๋‹จ ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ C++์˜ switch ๋ฌธ์€ was์—์„œ ๋งค์šฐ ๋Š๋ฆฝ๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ํ”„๋กœํŒŒ์ผ๋งํ•  ๋•Œ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํ›จ์”ฌ ๋” ๋น ๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๋Š” ๋‹ค๋ฅธ ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ์•„ํ‚คํ…์ฒ˜์—์„œ๋Š” ๊ฒฐ์ฝ” ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์„ฑ๋Šฅ์ƒ์˜ ์ด์œ ๋กœ ์ •๋ง ๊ฐ€๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@graph , "switch ๋ฌธ์ด ๋Š๋ฆฐ" ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ํ•ญ์ƒ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๋ฅผ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค... (์ด ์Šค๋ ˆ๋“œ๋ฅผ ๋ณด๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด [email protected]์œผ๋กœ ์ง์ ‘ ์ด๋ฉ”์ผ์„ ๋ณด๋‚ด์ฃผ์‹ญ์‹œ์˜ค.)

์ด๊ฒƒ์€ ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์— ์ ์šฉ๋˜๋ฏ€๋กœ ์—ฌ๊ธฐ์— ๊ฒŒ์‹œํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. if ๋ฌธ์œผ๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ ๋” ๋น ๋ฅธ emscripten์œผ๋กœ ์ปดํŒŒ์ผํ•  ๋•Œ ์ด์™€ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ๋ฌธ.

for(y = ....) {
    for(x = ....) {
        switch(type){
        case IS_RGBA:....
         ....
        case IS_BGRA
        ....
        case IS_RGB
        ....
....

์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ ํ”„ ํ…Œ์ด๋ธ”์„ wasm์ด ์ง€์›ํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ๋œ ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ ์‚ดํŽด๋ณด์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ํ™•์ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์›น์—์„œ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ์— ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” wassing๊ณผ ๊ด€๋ จ์ด ์—†๋Š” ๋ช‡ ๊ฐ€์ง€๋ฅผ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ ํŒŒ์ด์–ดํญ์Šค์˜ "ํ”ผ๋“œ๋ฐฑ" ๋ฒ„ํŠผ์„ ํ†ตํ•ด ์ œ์ถœํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ด€์‹ฌ์ด ์žˆ์œผ์‹œ๋ฉด ์•Œ๋ ค์ฃผ์‹œ๋ฉด ๋ฌธ์ œ๋ฅผ ์ด๋ฉ”์ผ๋กœ ๋ณด๋‚ด ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

@graph ์™„์ „ํ•œ ๋ฒค์น˜๋งˆํฌ๋Š” ์—ฌ๊ธฐ์—์„œ ๋งค์šฐ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ C์˜ ์Šค์œ„์น˜๋Š” wasm์—์„œ ๋งค์šฐ ๋น ๋ฅธ ์ ํ”„ ํ…Œ์ด๋ธ”๋กœ ๋ฐ”๋€” ์ˆ˜ ์žˆ์ง€๋งŒ ์•„์ง ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ฝ”๋„ˆ ์ผ€์ด์Šค๊ฐ€ ์žˆ์–ด์„œ LLVM์ด๋‚˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ˆ˜์ •ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŠนํžˆ emscripten์—์„œ๋Š” ์ด์ „ fastcomp ๋ฐฑ์—”๋“œ์™€ ์ƒˆ๋กœ์šด upstream ๋ฐฑ์—”๋“œ ์‚ฌ์ด์—์„œ ์Šค์œ„์น˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋งŽ์ด ๋ณ€๊ฒฝ๋˜๋ฏ€๋กœ ์–ผ๋งˆ์ „ ๋˜๋Š” ์ตœ๊ทผ์— fastcomp๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๊ฒƒ์„ ๋ดค๋‹ค๋ฉด ์—…์ŠคํŠธ๋ฆผ์—์„œ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

@graph , @kripken์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ณต์œ ํ•  ๋‚ด์šฉ์ด ์žˆ์œผ๋ฉด ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๊ฐ€ ์—ฌ๊ธฐ์—์„œ ๋งค์šฐ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

(v8 ๋˜๋Š” jsc์— ๋Œ€ํ•ด ๋ชจ๋ฅด์ง€๋งŒ Firefox๋Š” ํ˜„์žฌ if-then-else ์ฒด์ธ์„ ๊ฐ€๋Šฅํ•œ ์Šค์œ„์น˜๋กœ ์ธ์‹ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ธด if-then-else ์ฒด์ธ๋งŒํผ ์Šค์œ„์น˜๋ฅผ ๊ณต๊ฐœํ•˜๋Š” ๊ฒƒ์€ ์ข‹์€ ์ƒ๊ฐ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์†์ต๋ถ„๊ธฐ์ ์€ ์•„๋งˆ๋„ 2~3๋ฒˆ์˜ ๋น„๊ต๋ฅผ ๋„˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.)

@lars-t-hansen @kripken @graph br_table ๋Š” ์ด ๊ตํ™˜์ด ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ํ˜„์žฌ ๋งค์šฐ ์ตœ์ ํ™”๋˜์ง€ ์•Š์€ ๊ฒƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://twitter.com/battagline/status/1168310096515883008

@aardappel , ์ด์ƒํ•ฉ๋‹ˆ๋‹ค. ์–ด์ œ ์‹คํ–‰ํ•œ ๋ฒค์น˜๋งˆํฌ์—์„œ๋Š” ์ด๊ฒƒ์„ ๋ณด์—ฌ์ฃผ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‚ด ์‹œ์Šคํ…œ์˜ ํŒŒ์ด์–ดํญ์Šค์—์„œ ์†์ต๋ถ„๊ธฐ์ ์€ ๋‚ด๊ฐ€ ๊ธฐ์–ตํ•˜๋Š” ์•ฝ 5๊ฑด์ด์—ˆ๊ณ  ๊ทธ ํ›„ br_table์ด ์Šน์ž์˜€์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  microbenchmark์™€ ์กฐํšŒ ํ‚ค๋ฅผ ๊ท ๋“ฑํ•˜๊ฒŒ ๋ฐฐํฌํ•˜๋ ค๋Š” ์‹œ๋„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. "if" ๋„ค์ŠคํŠธ๊ฐ€ ๊ฐ€์žฅ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์€ ํ‚ค์— ํŽธํ–ฅ๋˜์–ด ์žˆ์–ด ๋‘ ๋ฒˆ ์ด์ƒ์˜ ํ…Œ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉด "if" ๋„ค์ŠคํŠธ๊ฐ€ ์Šน๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์Šค์œ„์น˜ ๊ฐ’์— ๋Œ€ํ•œ ๋ฒ”์œ„ ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ br_table์€ ๋˜ํ•œ ์Šค์œ„์น˜ ๋ฒ”์œ„์— ๋Œ€ํ•ด ์ ์–ด๋„ ํ•˜๋‚˜์˜ ํ•„ํ„ฐ๋ง ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋ฉฐ ์ด๋Š” ์ด์ ๋„ ๋จน์Šต๋‹ˆ๋‹ค.

@lars-t-hansen ์˜ˆ, ์šฐ๋ฆฌ๋Š” ๊ทธ์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ์ด์ƒ๊ฐ’์ด ์žˆ์—ˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋Š ์ชฝ์ด๋“  Chrome์ด Firefox๋ณด๋‹ค ํ•  ์ผ์ด ๋” ๋งŽ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํœด๊ฐ€์ค‘์ด๋ผ ๋‹ต๋ณ€์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. ์ดํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@kripken @lars-t-hansen ๋ช‡ ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ–ˆ๋Š”๋ฐ ์˜ˆ, ์ด์ œ ํŒŒ์ด์–ดํญ์Šค์—์„œ ๋” ๋‚˜์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. if-else๊ฐ€ ์Šค์œ„์น˜๋ฅผ ๋Šฅ๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์—ฌ์ „ํžˆ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค.


๋ฉ”์ธ.cpp

#include <stdio.h>

#include <chrono>
#include <random>

class Chronometer {
public:
    Chronometer() {

    }

    void start() {
        mStart = std::chrono::steady_clock::now();
    }

    double seconds() {
        std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
        return std::chrono::duration_cast<std::chrono::duration<double>>(end - mStart).count();
    }

private:
    std::chrono::steady_clock::time_point mStart;
};

int main() {
    printf("Starting tests!\n");
    Chronometer timer;
    // we want to prevent optimizations based on known size as most applications
    // do not know the size in advance.
    std::random_device rd;  //Will be used to obtain a seed for the random number engine
    std::mt19937 gen(rd()); //Standard mersenne_twister_engine seeded with rd()
    std::uniform_int_distribution<> dis(100000000, 1000000000);
    std::uniform_int_distribution<> opKind(0, 3);
    int maxFrames = dis(gen);
    int switchSelect = 0;
    constexpr int SW1 = 1;
    constexpr int SW2 = 8;
    constexpr int SW3 = 32;
    constexpr int SW4 = 38;

    switch(opKind(gen)) {
    case 0:
        switchSelect = SW1;
        break;
    case 1:
        switchSelect = SW2; break;
    case 2:
        switchSelect = SW3; break;
    case 4:
        switchSelect = SW4; break;
    }
    printf("timing with SW = %d\n", switchSelect);
    timer.start();
    int accumulator = 0;
    for(int i = 0; i < maxFrames; ++i) {
        switch(switchSelect) {
        case SW1:
            accumulator = accumulator*3 + i; break;
        case SW2:
            accumulator = (accumulator < 3)*i; break;
        case SW3:
            accumulator = (accumulator&0xFF)*i + accumulator; break;
        case SW4:
            accumulator = (accumulator*accumulator) - accumulator + i; break;
        }
    }
    printf("switch time = %lf seconds\n", timer.seconds());
    printf("accumulated value: %d\n", accumulator);
    timer.start();
    accumulator = 0;
    for(int i = 0; i < maxFrames; ++i) {
        if(switchSelect == SW1)
            accumulator = accumulator*3 + i;
        else if(switchSelect == SW2)
            accumulator = (accumulator < 3)*i;
        else if(switchSelect == SW3)
            accumulator = (accumulator&0xFF)*i + accumulator;
        else if(switchSelect == SW4)
            accumulator = (accumulator*accumulator) - accumulator + i;
    }
    printf("if-else time = %lf seconds\n", timer.seconds());
    printf("accumulated value: %d\n", accumulator);

    return 0;
}

switchSelect์˜ ๊ฐ’์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. if-else๊ฐ€ ์„ฑ๋Šฅ์„ ๋Šฅ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ถœ๋ ฅ ์˜ˆ:

Starting tests!
timing with SW = 32
switch time = 2.049000 seconds
accumulated value: 0
if-else time = 0.401000 seconds
accumulated value: 0

switchSelect = 32 if-else์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ํ›จ์”ฌ ๋น ๋ฆ…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ฒฝ์šฐ์—๋Š” if-else๊ฐ€ ์กฐ๊ธˆ ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค. switchSelect = 1 & 0์ธ ๊ฒฝ์šฐ switch ๋ฌธ์ด ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค.

Test in Firefox 69.0.3 (64-bit)
compiled using: emcc -O3 -std=c++17 main.cpp -o main.html
emcc version: emcc (Emscripten gcc/clang-like replacement) 1.39.0 (commit e047fe4c1ecfae6ba471ca43f2f630b79516706b)

2019๋…„ 10์›” 20์ผ ํ˜„์žฌ ์•ˆ์ •์ ์ธ ์ตœ์‹  emscripen ์‚ฌ์šฉ. ์ƒˆ๋กœ ์„ค์น˜ ./emcc activate latest .

์œ„์—์„œ ์˜คํƒ€๊ฐ€ ์žˆ์Œ์„ ์•Œ์•„์ฐจ๋ ธ์ง€๋งŒ ๋™์ผํ•œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— if-else๊ฐ€ ๋” ๋น ๋ฅธ SW3 ๊ฒฝ์šฐ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์‹œ 5์˜ ์†์ต๋ถ„๊ธฐ์ ์„ ๋„˜์–ด์„ฐ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ switchSelect=32์˜ ๊ฒฝ์šฐ ์†๋„๊ฐ€ if-else์™€ ๋น„์Šทํ•˜๋‹ค๋Š” ์ ์ด ํฅ๋ฏธ๋กญ์Šต๋‹ˆ๋‹ค. 1003 if-else์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ์•ฝ๊ฐ„ ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์Šค์œ„์น˜๊ฐ€ ์Šน๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Starting tests!
timing with SW = 1003
switch time = 2.253000 seconds
accumulated value: 1903939380
if-else time = 2.197000 seconds
accumulated value: 1903939380


๋ฉ”์ธ.cpp

#include <stdio.h>

#include <chrono>
#include <random>

class Chronometer {
public:
    Chronometer() {

    }

    void start() {
        mStart = std::chrono::steady_clock::now();
    }

    double seconds() {
        std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
        return std::chrono::duration_cast<std::chrono::duration<double>>(end - mStart).count();
    }

private:
    std::chrono::steady_clock::time_point mStart;
};

int main() {
    printf("Starting tests!\n");
    Chronometer timer;
    // we want to prevent optimizations based on known size as most applications
    // do not know the size in advance.
    std::random_device rd;  //Will be used to obtain a seed for the random number engine
    std::mt19937 gen(rd()); //Standard mersenne_twister_engine seeded with rd()
    std::uniform_int_distribution<> dis(100000000, 1000000000);
    std::uniform_int_distribution<> opKind(0, 8);
    int maxFrames = dis(gen);
    int switchSelect = 0;
    constexpr int SW1 = 1;
    constexpr int SW2 = 8;
    constexpr int SW3 = 32;
    constexpr int SW4 = 38;
    constexpr int SW5 = 64;
    constexpr int SW6 = 67;
    constexpr int SW7 = 1003;
    constexpr int SW8 = 256;

    switch(opKind(gen)) {
    case 0:
        switchSelect = SW1;
        break;
    case 1:
        switchSelect = SW2; break;
    case 2:
        switchSelect = SW3; break;
    case 3:
        switchSelect = SW4; break;
    case 4:
        switchSelect = SW5; break;
    case 5:
        switchSelect = SW6; break;
    case 6:
        switchSelect = SW7; break;
    case 7:
        switchSelect = SW8; break;
    }
    printf("timing with SW = %d\n", switchSelect);
    timer.start();
    int accumulator = 0;
    for(int i = 0; i < maxFrames; ++i) {
        switch(switchSelect) {
        case SW1:
            accumulator = accumulator*3 + i; break;
        case SW2:
            accumulator = (accumulator < 3)*i; break;
        case SW3:
            accumulator = (accumulator&0xFF)*i + accumulator; break;
        case SW4:
            accumulator = (accumulator*accumulator) - accumulator + i; break;
        case SW5:
            accumulator = (accumulator << 3) - accumulator + i; break;
        case SW6:
            accumulator = (i - accumulator) & 0xFF; break;
        case SW7:
            accumulator = i*i + accumulator; break;
        }
    }
    printf("switch time = %lf seconds\n", timer.seconds());
    printf("accumulated value: %d\n", accumulator);
    timer.start();
    accumulator = 0;
    for(int i = 0; i < maxFrames; ++i) {
        if(switchSelect == SW1)
            accumulator = accumulator*3 + i;
        else if(switchSelect == SW2)
            accumulator = (accumulator < 3)*i;
        else if(switchSelect == SW3)
            accumulator = (accumulator&0xFF)*i + accumulator;
        else if(switchSelect == SW4)
            accumulator = (accumulator*accumulator) - accumulator + i;
        else if(switchSelect == SW5)
            accumulator = (accumulator << 3) - accumulator + i;
        else if(switchSelect == SW6)
            accumulator = (i - accumulator) & 0xFF;
        else if(switchSelect == SW7)
            accumulator = i*i + accumulator;

    }
    printf("if-else time = %lf seconds\n", timer.seconds());
    printf("accumulated value: %d\n", accumulator);

    return 0;
}


์ด ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์‚ดํŽด๋ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ๋งค์šฐ ํฌ๋ฐ•ํ•œ switch ์ž…๋‹ˆ๋‹ค. LLVM์€ ์–ด์จŒ๋“  if-then ์„ธํŠธ์™€ ๋™๋“ฑํ•œ ๊ฒƒ์œผ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•˜์ง€๋งŒ ๋ถ„๋ช…ํžˆ ์ˆ˜๋™ if-then๋ณด๋‹ค ๋œ ํšจ์œจ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋‘ ๋ฃจํ”„๊ฐ€ ์ฝ”๋“œ์—์„œ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€ ๋ณด๊ธฐ ์œ„ํ•ด wasm2wat๋ฅผ ์‹คํ–‰ํ•ด ๋ณด์…จ์Šต๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ ๋˜ํ•œ ๊ฐ ๋ฐ˜๋ณต์—์„œ ๋™์ผํ•œ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š” ์ด ํ…Œ์ŠคํŠธ์— ํฌ๊ฒŒ ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ์ด ํ…Œ์ŠคํŠธ๋Š” ๋ชจ๋“  ๊ฐ’์„ ์ˆœํ™˜ํ•˜๊ฑฐ๋‚˜ ๊ฐ’์—์„œ ๋ฌด์ž‘์œ„๋กœ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค(์ €๋ ดํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ).

๋” ์ข‹์€ ์ ์€ ์‚ฌ๋žŒ๋“ค์ด ์„ฑ๋Šฅ์„ ์œ„ํ•ด ์Šค์œ„์น˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ง„์งœ ์ด์œ ๋Š” ๋ฒ”์œ„๊ฐ€ ์กฐ๋ฐ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‹ค์ œ๋กœ ์•„๋ž˜์—์„œ br_table ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Œ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. br_table ๊ฐ€ if ๋ณด๋‹ค ๋น ๋ฅธ ๊ฒฝ์šฐ๊ฐ€ ๋ช‡ ๊ฐœ์ธ์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์œ ์šฉํ•œ ์ •๋ณด์ž…๋‹ˆ๋‹ค.

๋นก๋นกํ•œ ๋ฃจํ”„์˜ ์Šค์œ„์น˜๋Š” ์„ฑ๋Šฅ๋ณด๋‹ค ์ฝ”๋“œ๊ฐ€ ๋” ๊น”๋”ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ wass์˜ ๊ฒฝ์šฐ ์„ฑ๋Šฅ ์˜ํ–ฅ์ด ๋„ˆ๋ฌด ์ปค์„œ ๋” ๋ชป์ƒ๊ธด if ๋ฌธ์œผ๋กœ ๋ณ€ํ™˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์Šค์œ„์น˜์—์„œ ๋” ๋งŽ์€ ์„ฑ๋Šฅ์„ ์›ํ•˜๋ฉด ์Šค์œ„์น˜๋ฅผ ๋ฃจํ”„ ์™ธ๋ถ€๋กœ ์ด๋™ํ•˜๊ณ  ๊ฐ ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ๋ฃจํ”„ ์‚ฌ๋ณธ์„ ๊ฐ€์ง€๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ „ํ™˜์€ ํ”ฝ์…€ ํ˜•์‹, ์ƒ‰์ƒ ํ˜•์‹, ์ธ์ฝ”๋”ฉ ๋“ฑ์˜ ์ผ๋ถ€ ํ˜•์‹ ๊ฐ„์— ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งŽ์€ ๊ฒฝ์šฐ ์ƒ์ˆ˜๋Š” ์„ ํ˜•์ด ์•„๋‹Œ ์ •์˜ ๋˜๋Š” ์—ด๊ฑฐํ˜•์„ ํ†ตํ•ด ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค. ์ด์ œ ๋‚ด ๋ฌธ์ œ๊ฐ€ goto ๋””์ž์ธ๊ณผ ๊ด€๋ จ์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‚ด switch ๋ฌธ์— ๋Œ€ํ•ด ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ๋ถˆ์™„์ „ํ•˜๊ฒŒ ์ดํ•ดํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ๋…ธํŠธ๊ฐ€ ์ด ๊ฒฝ์šฐ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด wasm์„ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์ด ๊ธ€์„ ์ฝ๋Š” ๋ธŒ๋ผ์šฐ์ € ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์œ ์šฉํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

goto๊ฐ€ ์ด๋ ‡๊ฒŒ ์—ด๋ค ํ† ๋ก ์„ ํ•  ์ˆ˜ ์žˆ์„ ์ค„์€ ์ƒ์ƒ๋„ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค ๐Ÿ˜ฎ . ๋‚˜๋Š” ๋ชจ๋“  ์–ธ์–ด์˜ ๋ณดํŠธ์— goto๊ฐ€ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค ๐Ÿ˜ . goto๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ์ด์œ ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ wasm์œผ๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ๋ณต์žก์„ฑ์„ ์ค„์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์–ด๋”˜๊ฐ€์— ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ๋ถˆํ‰ํ•  ๊ฒƒ์ด ์—†์Šต๋‹ˆ๋‹ค ๐Ÿ˜ž .

๋” ์ด์ƒ์˜ ์ง„์ „์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์—ด๋ค ํ† ๋ก ์œผ๋กœ ์ธํ•ด ์ผ๋ถ€ ๋ธŒ๋ผ์šฐ์ €๋Š” goto์— ๋Œ€ํ•œ ์ง€์›์„ ๋น„ํ‘œ์ค€ ๋ฐ”์ดํŠธ์ฝ”๋“œ ํ™•์žฅ์œผ๋กœ ์ถ”๊ฐ€ํ•  ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด GCC๊ฐ€ ๋น„ํ‘œ์ค€ ๋ฒ„์ „์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฒŒ์ž„์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „๋ฐ˜์ ์œผ๋กœ ์ข‹์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๋” ๋งŽ์€ ์ปดํŒŒ์ผ๋Ÿฌ ๊ฒฝ์Ÿ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๊ณ ๋ ค๋˜์—ˆ์Šต๋‹ˆ๊นŒ?

์ตœ๊ทผ์— ๋งŽ์€ ์ง„์ „์ด ์—†์—ˆ์ง€๋งŒ funclets ์ œ์•ˆ ์„ ์‚ดํŽด๋ณด๊ณ  ์‹ถ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

@graph ๋‚˜์—๊ฒŒ ๋‹น์‹ ์˜ ์ œ์•ˆ์€ "๋ชจ๋“  ๊ฒƒ์„ ๋ถ€์ˆ˜๊ณ  ๋” ๋‚˜์€ ๊ฒƒ์„ ๋ฐ”๋ผ์ž"์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ ์‹์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ WebAssembly ๊ตฌ์กฐ์—๋Š” ๋งŽ์€ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค(๋ถˆํ–‰ํžˆ๋„ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Œ). wass์˜ ์ฒ ํ•™์— ๋” ๊นŠ์ด ๋น ์ ธ๋ณด์‹ญ์‹œ์˜ค.

"์ž„์˜์˜ ๋ ˆ์ด๋ธ” ๋ฐ ๊ณ ํ† ์Šค"๋ฅผ ํ—ˆ์šฉํ•˜๋ฉด ๊ฒ€์ฆํ•  ์ˆ˜ ์—†๋Š” ๋ฐ”์ดํŠธ์ฝ”๋“œ์˜ (๊ณ ๋Œ€) ์‹œ๋Œ€๋กœ ๋Œ์•„๊ฐ€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์ปดํŒŒ์ผ๋Ÿฌ๋Š” "์˜ฌ๋ฐ”๋ฅธ ์ž‘์—…" ๋Œ€์‹  ์ž‘์—…์„ "๊ฒŒ์œผ๋ฅธ ๋ฐฉ๋ฒ•"์œผ๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ์ƒํƒœ์˜ wasm์—๋Š” ๋ช‡ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ๋ˆ„๋ฝ์ด ์žˆ์Œ์ด ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์€ ( @binji๊ฐ€ ์–ธ๊ธ‰ํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€) ๊ณต๋ฐฑ์„ ๋ฉ”์šฐ๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์ง€๋งŒ "๊ธ€๋กœ๋ฒŒ wasm ๊ตฌ์กฐ"๋ฅผ ๋‹ค์‹œ ์ž‘์—…ํ•  ํ•„์š” ๋Š” ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ์ œ ์†Œ๋ฐ•ํ•œ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค.

@vshymanskyy ์ž„์˜์˜ ๋ ˆ์ด๋ธ” ๋ฐ goto์™€ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” funclet ์ œ์•ˆ์€ ์„ ํ˜• ์‹œ๊ฐ„์—์„œ ์™„์ „ํžˆ ๊ฒ€์ฆ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ ์šฐ๋ฆฌ์˜ ์„ ํ˜• ์‹œ๊ฐ„ Wasm ์ปดํŒŒ์ผ๋Ÿฌ, ์šฐ๋ฆฌ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ funclets ๊ฐ™์€ ํ‘œํ˜„, ๋‚œ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€์— ๋ชจ๋“  Wasm ์ œ์–ด ํ๋ฆ„์„ ์ปดํŒŒ์ผ ์–ธ๊ธ‰ํ•ด์•ผ ์ด ๋ธ”๋ก์˜ ๊ฒŒ์‹œ๋ฌผ์— ๊ตฌํ˜„๋˜๋ฉฐ์ด ๋‚ด๋ถ€ ํ‘œํ˜„ Wasm ์ œ์–ด ํ๋ฆ„์˜ ๋ณ€ํ™˜์„ ์—ฌ๊ธฐ . ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ด funclet๊ณผ ๊ฐ™์€ ํ‘œํ˜„์—์„œ ๋ชจ๋“  ์œ ํ˜• ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋ฏ€๋กœ ์„ ํ˜• ์‹œ๊ฐ„์— ์œ ํ˜• ์•ˆ์ „์„ฑ์„ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ๊ฐ„๋‹จํ•˜๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„์„ ์„ ํ˜• ์‹œ๊ฐ„์œผ๋กœ ๊ฒ€์ฆํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์ด๋Ÿฌํ•œ ์˜คํ•ด๋Š” ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„์ด ์ปดํŒŒ์ผ๋˜๋Š” ๋Œ€์‹  ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” JVM์—์„œ ๋น„๋กฏ๋œ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” JVM์ด ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„์— ๋Œ€ํ•œ ์œ ํ˜• ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ํ‘œํ˜„ํ•  ๋ฐฉ๋ฒ•์ด ์—†์–ด ์Šคํƒ ๋จธ์‹ ์—์„œ ๋ ˆ์ง€์Šคํ„ฐ ๋จธ์‹ ์œผ๋กœ์˜ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. "์ž„์˜ gotos"(์ฆ‰, ๋ฐ”์ดํŠธ/๋ช…๋ น์–ด X๋กœ ์ ํ”„)๋Š” ์ „ํ˜€ ํ™•์ธํ•  ์ˆ˜ ์—†์ง€๋งŒ ํ•จ์ˆ˜๋ฅผ ์œ ํ˜•์ด ์ง€์ •๋œ ๋ธ”๋ก์œผ๋กœ ๋ถ„๋ฆฌํ•œ ๋‹ค์Œ ์ž„์˜์˜ ์ˆœ์„œ๋กœ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ๋ชจ๋“ˆ์„ ์œ ํ˜•์ด ์ง€์ •๋œ ํ•จ์ˆ˜๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๊ฒ€์ฆํ•˜๊ธฐ ์–ด๋ ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค. , ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ž„์˜์˜ ์ˆœ์„œ๋กœ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GCC ๋ฐ LLVM๊ณผ ๊ฐ™์€ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ๋‚ด๋ณด๋‚ด๋Š” ์œ ์šฉํ•œ ํŒจํ„ด์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด jump-to-byte-X-style untyped goto๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์—ฌ๊ธฐ์˜ ๊ณผ์ •์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. A๋ฉด์€ ํŠน์ • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ด๊ฒƒ์ด ํ•„์š”ํ•œ ์ด์œ ๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. B์ธก์€ ๊ทธ๋“ค์ด ์ž˜๋ชปํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๋งํ•˜์ง€๋งŒ ํ•ด๋‹น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•œ ์ง€์›์€ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. A๋ฉด์€ B์˜ ์‹ค์šฉ์ ์ธ ์ฃผ์žฅ ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ํƒ€๋‹นํ•˜์ง€ ์•Š์€ ์ด์œ ๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. B ์ธก์€ A ์ธก์ด ์ž˜๋ชปํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฒ˜๋ฆฌํ•˜๊ธฐ๋ฅผ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ์ด๋“œ A๋Š” ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์ด๋“œ B๋Š” ๊ทธ๊ฒƒ์„ ๊ฒŒ์œผ๋ฅด๊ฑฐ๋‚˜ ์•ผ๋งŒ์ ์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ์ž˜๋ชป๋œ ๋ชฉํ‘œ๋ผ๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ๋” ๊นŠ์€ ์ฒ ํ•™์  ์˜๋ฏธ๋Š” A๋ฉด์—์„œ ์†์‹ค๋ฉ๋‹ˆ๋‹ค. ์‹ค์šฉ์ ์ธ ์˜๋ฏธ๋Š” B๋ฉด์—์„œ ์†์‹ค๋ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ทธ๋“ค์€ ์ผ์ข…์˜ ๋” ๋†’์€ ๋„๋•์  ๊ธฐ๋ฐ˜์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ์ฃผ์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. A์ธก์€ ์ด๊ฒƒ์„ ๋น„๋„๋•์ ์ธ ๊ธฐ๊ณ„๋ก ์  ์ž‘์—…์œผ๋กœ ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ถ๊ทน์ ์œผ๋กœ ์ธก๋ฉด B๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋” ์ข‹๊ฑฐ๋‚˜ ๋‚˜์˜๊ฒŒ ์‚ฌ์–‘์„ ์ œ์–ดํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ƒ๋Œ€์ ์ธ ์ˆœ๋„์— ๋”ฐ๋ผ ์—„์ฒญ๋‚œ ์–‘์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

์†”์งํžˆ ๋งํ•ด์„œ, ๋ช‡ ๋…„ ์ „ ์ €๋Š” TinyCC ํฌํŠธ๋ฅผ WASM์œผ๋กœ ๋งŒ๋“ค๋ ค๊ณ  ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ESP8266์„ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ESP8266์—์„œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ~4MB์˜ ์ €์žฅ ๊ณต๊ฐ„๋งŒ ์žˆ์œผ๋ฏ€๋กœ ์žฌ๋ฃจํผ ๋ฐ AST๋กœ์˜ ์ „ํ™˜ ๋ฐ ๊ธฐํƒ€ ๋งŽ์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํฌํ•จํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. (์ฐธ๊ณ : relooper๊ฐ€ relooper์™€ ๊ฐ™์€ ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ •๋ง ๋”์ฐํ•˜๊ณ  ์•„๋ฌด๋„ In C์—์„œ ๊ทธ ๋นจํŒ์„ ๋‹ค์‹œ ์ž‘์„ฑํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค!?) ์ด ์‹œ์ ์—์„œ ๊ฐ€๋Šฅํ•˜๋”๋ผ๋„ TinyCC ๋Œ€์ƒ์„ ์ž‘์„ฑํ• ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚˜์—๊ฒŒ ๋” ์ด์ƒ ํฅ๋ฏธ๋กญ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— WASM์—.

๊ทธ๋ž˜๋„ ์ด ์Šค๋ ˆ๋“œ. ์ด ์‹ค์€ ๋‚˜์—๊ฒŒ ๋งŽ์€ ์‹ค์กด์  ๊ธฐ์จ์„ ๊ฐ€์ ธ๋‹ค์ฃผ์—ˆ๋‹ค. ์ธ๋ฅ˜์˜ ๋ถ„์—ด์„ ์ง€์ผœ๋ณด๋Š” ๊ฒƒ์€ ๋ฏผ์ฃผ์ฃผ์˜์ž๋‚˜ ๊ณตํ™”์ฃผ์˜์ž, ์ข…๊ต๋ณด๋‹ค ๋” ๊นŠ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋  ์ˆ˜ ์žˆ์„๊นŒ ํ•˜๋Š” ์ƒ๊ฐ์ด ๋“ญ๋‹ˆ๋‹ค. A๊ฐ€ B์˜ ์„ธ๊ณ„์—์„œ ์‚ด ์ˆ˜ ์žˆ๊ฒŒ ๋˜๊ฑฐ๋‚˜ B๊ฐ€ ์ ˆ์ฐจ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ๊ทธ ์ž๋ฆฌ๋ฅผ ์ฐจ์ง€ํ•œ๋‹ค๋Š” A์˜ ์ฃผ์žฅ์„ ์ž…์ฆํ•œ๋‹ค๋ฉด... ์ €๋Š” ์šฐ๋ฆฌ๊ฐ€ ์„ธ๊ณ„ ํ‰ํ™”๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

V8 ๋‹ด๋‹น์ž๊ฐ€ ์ด ์Šค๋ ˆ๋“œ์—์„œ ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„์— ๋Œ€ํ•œ ๋ฐ˜๋Œ€๊ฐ€ V8์˜ ํ˜„์žฌ ๊ตฌํ˜„์— ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด๊ฒƒ์ด ๊ฐ€์žฅ ๋‚˜๋ฅผ ๊ดด๋กญํžˆ๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋Š” ๋ฌป๋Š”๋‹ค. ๋‚˜์—๊ฒŒ ์ด๊ฒƒ์€ ์ด ๊ธฐ๋Šฅ์˜ ์žฅ๋‹จ์ ์— ๋Œ€ํ•œ ์‚ฌ์–‘ ์ˆ˜์ค€์— ๋Œ€ํ•œ ํ† ๋ก ์ด์–ด์•ผ ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํŠน์ • ๊ตฌํ˜„์ด ํ˜„์žฌ ์–ด๋–ป๊ฒŒ ์„ค๊ณ„๋˜์—ˆ๋Š”์ง€์— ์˜ํ•ด ์ „ํ˜€ ์˜ํ–ฅ์„ ๋ฐ›์•„์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ V8์˜ ๊ตฌํ˜„์ด ์ด์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ณ  ์žˆ๋‹ค๊ณ  ๋ฏฟ๊ฒŒ ๋งŒ๋“œ๋Š” ์ง„์ˆ ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ํ‹€๋ ธ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณต๊ฐœ ์ง„์ˆ ์ด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธ€์Ž„์š”, ๋ถˆํ–‰ํ•œ ๋งŒํผ, ํ˜„์žฌ๊นŒ์ง€ ์กด์žฌํ•˜๋Š” ํ˜„์žฌ ๊ตฌํ˜„์€ ๋„ˆ๋ฌด ์ค‘์š”ํ•ด์„œ ๋ฏธ๋ž˜(๊ณผ๊ฑฐ๋ณด๋‹ค ๋” ๊ธธ์—ˆ์„ ๊ฒƒ)๋Š” ๊ทธ๋ ‡๊ฒŒ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” #1202์—์„œ ์ผ๊ด€์„ฑ์ด ๋ช‡ ๊ฐ€์ง€ ๊ตฌํ˜„๋ณด๋‹ค ๋” ์ค‘์š”ํ•˜๋‹ค๊ณ  ์„ค๋ช…ํ•˜๋ ค๊ณ ํ–ˆ์ง€๋งŒ ๋ง์ƒ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ํ”„๋กœ์ ํŠธ์˜ ์ผ๋ถ€ ๊ฐœ๋ฐœ ๊ฒฐ์ •์ด ๋ณดํŽธ์ ์ธ ์ง„์‹ค์„ ๊ตฌ์„ฑํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๊ธฐ๋ณธ์ ์œผ๋กœ ์˜ฌ๋ฐ”๋ฅธ ๊ฒƒ์œผ๋กœ ๊ฐ€์ •ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์„ค๋ช…ํ•˜๋Š” ํ–‰์šด์„ ๋น•๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ๋Š” W3C ํƒ„๊ด‘์— ์žˆ๋Š” ํ•˜๋‚˜์˜ ์นด๋‚˜๋ฆฌ์•„์ž…๋‹ˆ๋‹ค. ์ €๋Š” ๋งŽ์€ W3C ๊ฐœ์ธ์„ ์กด๊ฒฝํ•˜์ง€๋งŒ W3C๊ฐ€ ์•„๋‹Œ Ecma International์— JavaScript๋ฅผ ์œ„์ž„ํ•˜๊ธฐ๋กœ ํ•œ ๊ฒฐ์ •์ด ํŽธ๊ฒฌ ์—†์ด ์ด๋ฃจ์–ด์ง„ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

@cnlohr ์ฒ˜๋Ÿผ, ๋‚˜๋Š” TCC wasm ํฌํŠธ์— ๋Œ€ํ•œ ํฌ๋ง์„ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ๊ณ , ๊ทธ๋Ÿด๋งŒํ•œ ์ด์œ ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

"Wasm์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ์œ„ํ•œ ์ด์‹ ๊ฐ€๋Šฅํ•œ ์ปดํŒŒ์ผ ๋Œ€์ƒ์œผ๋กœ ์„ค๊ณ„๋˜์–ด ํด๋ผ์ด์–ธํŠธ ๋ฐ ์„œ๋ฒ„ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์œ„ํ•ด ์›น์— ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค." - webassembly.org

๋ฌผ๋ก , ๋ˆ„๊ตฌ๋‚˜ goto ๊ฐ€ [INSERT JARGON]์ธ ์ด์œ ๋ฅผ ์žฅ๋‹ดํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์˜๊ฒฌ๋ณด๋‹ค ํ‘œ์ค€์„ ์„ ํ˜ธํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์šฐ๋ฆฌ ๋ชจ๋‘๋Š” POSIX C๊ฐ€ ์ข‹์€ ๊ธฐ๋ณธ ํƒ€๊ฒŸ์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์˜ค๋Š˜๋‚ ์˜ lang์ด C์—์„œ ๋งŒ๋“ค์–ด์ง€๊ฑฐ๋‚˜ C์— ๋Œ€ํ•ด ๋ฒค์น˜๋งˆํ‚น๋˜๊ณ  WASM์˜ ํ™ˆํŽ˜์ด์ง€ ํ—ค๋“œ๋ผ์ธ์ด ์ž์ฒด์ ์œผ๋กœ lang์— ๋Œ€ํ•œ ์ด์‹ ๊ฐ€๋Šฅํ•œ ์ปดํŒŒ์ผ ํƒ€๊ฒŸ์„ ์„ ์ „ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ผ๋ถ€ ๊ธฐ๋Šฅ์€ ์Šค๋ ˆ๋“œ ๋ฐ simd์™€ ๊ฐ™์ด ๋กœ๋“œ๋งต๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ goto ์™€ ๊ฐ™์€ ๊ทผ๋ณธ์ ์ธ ๊ฒƒ์„ ์™„์ „ํžˆ ๋ฌด์‹œํ•˜๊ณ  ๋กœ๋“œ๋งต์˜ ํ’ˆ์œ„์กฐ์ฐจ ๋ถ€์—ฌํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ WASM์˜ ๋ช…์‹œ๋œ ๋ชฉ์ ๊ณผ <marquee> ๋ฅผ ์Šน์ธํ•œ ํ‘œ์ค€ํ™” ๊ธฐ๊ตฌ์˜ ์ž…์žฅ๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฐฝ๋ฐฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

SEI CERT C Coding Standard Rec. "๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ํ•ด์ œํ•  ๋•Œ ์˜ค๋ฅ˜์— ํ•จ์ˆ˜๋ฅผ ๋‚จ๊ธธ ๋•Œ goto ์ฒด์ธ ์‚ฌ์šฉ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค" ;

๋งŽ์€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์—ฌ๋Ÿฌ ๋ฆฌ์†Œ์Šค๋ฅผ ํ• ๋‹นํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ• ๋‹น๋œ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋ฅผ ํ•ด์ œํ•˜์ง€ ์•Š๊ณ  ์ด ํ•จ์ˆ˜์˜ ์ค‘๊ฐ„ ์–ด๋”˜๊ฐ€์—์„œ ์‹คํŒจํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ๋ฆฌ์†Œ์Šค ์ค‘ ํ•˜๋‚˜(๋˜๋Š” ์ „์ฒด)๋ฅผ ํ•ด์ œํ•˜๋Š” ๊ฒƒ์„ ์žŠ๋Š” ๊ฒƒ์€ ์ผ๋ฐ˜์ ์ธ ์˜ค๋ฅ˜์ด๋ฏ€๋กœ goto ์ฒด์ธ์€ ํ•ด์ œ๋œ ๋ฆฌ์†Œ์Šค์˜ ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ์ข…๋ฃŒ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜๊ณ  ๊น”๋”ํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ถŒ์žฅ ์‚ฌํ•ญ์€ goto ์‚ฌ์šฉํ•˜๋Š” ์„ ํ˜ธํ•˜๋Š” POSIX C ์†”๋ฃจ์…˜์˜ ์˜ˆ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋ก ์ž๋“ค์€ goto ๊ฐ€ ์—ฌ์ „ํžˆ ํ•ด๋กœ์šด ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ ๋œ๋‹ค๋Š” ์ ์„ ์ง€์ ํ• 

๊ฒฐ๋ก ์ ์œผ๋กœ "CSS ์ง€์—ญ" ๋˜๋Š” goto ๋ฅผ ์œ ํ•ดํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•˜๋Š” ๊ฒƒ์€ ๊ทธ๋Ÿฌํ•œ ๊ธฐ๋Šฅ์ด ์‚ฌ์šฉ๋˜๋Š” ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ œ์•ˆ๋œ ์†”๋ฃจ์…˜๊ณผ ํ•จ๊ป˜ ๊ณ ๋ ค๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น "์œ ํ•ดํ•œ" ๊ธฐ๋Šฅ์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ๋Œ€์•ˆ ์—†์ด ํ•ฉ๋ฆฌ์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค๋ฉด ์ด๋Š” ์†”๋ฃจ์…˜์ด ์•„๋‹ˆ๋ฉฐ ์‹ค์ œ๋กœ ํ•ด๋‹น ์–ธ์–ด ์‚ฌ์šฉ์ž์—๊ฒŒ ํ•ด๋กœ์šด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•จ์ˆ˜๋Š” C์—์„œ๋„ ๋น„์šฉ์ด 0์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€ gotos ๋ฐ ๋ ˆ์ด๋ธ”์— ๋Œ€ํ•œ ๋Œ€์ฒดํ’ˆ์„ ์ œ๊ณตํ•œ๋‹ค๋ฉด canihaz ๋ถ€ํƒํ•ฉ๋‹ˆ๋‹ค! ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋‚˜์—๊ฒŒ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ๋งํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์„ฑ๋Šฅ๊ณผ ๊ด€๋ จํ•˜์—ฌ goto ๋Š” ์–ธ์–ด์˜ ์—ฌ๋ช…๊ธฐ๋ถ€ํ„ฐ ์กด์žฌํ–ˆ๋˜ ์„ฑ๋Šฅ์ด ๋›ฐ์–ด๋‚˜๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šด ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์—”์ง€๋‹ˆ์–ด์—๊ฒŒ ์ฃผ์žฅํ•˜๊ธฐ ์–ด๋ ค์šด ์•ฝ๊ฐ„์˜ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

goto ๋ฅผ ์ง€์›ํ•  ๊ณ„ํš์ด ์—†๋‹ค๋ฉด WASM์€ ์žฅ๋‚œ๊ฐ ์ปดํŒŒ์ผ ๋Œ€์ƒ์ด๊ณ  ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. W3C๊ฐ€ ์›น์„ ๋ณด๋Š” ๋ฐฉ์‹์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. WASM์ด 32๋น„ํŠธ ์ฃผ์†Œ ๊ณต๊ฐ„์„ ๋„˜์–ด ๋” ๋†’์ด ์˜ฌ๋ผ๊ฐ€ ์ปดํŒŒ์ผ ๊ฒฝ์Ÿ์— ๋›ฐ์–ด๋“ค๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์—”์ง€๋‹ˆ์–ด๋ง ๋‹ด๋ก ์ด "๋ถˆ๊ฐ€๋Šฅ..."์—์„œ ๋ฒ—์–ด๋‚˜ WASM์ด ๊ต‰์žฅํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Labels as Values ์™€ ๊ฐ™์€ GCC C ํ™•์žฅ์„ ๋น ๋ฅด๊ฒŒ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ TCC๋Š” ํž™์Šคํ„ฐ ๋žœ๋”ฉ ํŽ˜์ด์ง€์™€ ๋ฐ˜์ง์ด๋Š” ๋กœ๊ณ ๊ฐ€ ์—†๋Š” ์ด ์‹œ์ ์—์„œ ํ›จ์”ฌ ๋” ์ธ์ƒ์ ์ด๊ณ  ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

@d4tocchini :

SEI CERT C Coding Standard Rec. "๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ํ•ด์ œํ•  ๋•Œ ์˜ค๋ฅ˜์— ํ•จ์ˆ˜๋ฅผ ๋‚จ๊ธธ ๋•Œ goto ์ฒด์ธ ์‚ฌ์šฉ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค" ;

๋งŽ์€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์—ฌ๋Ÿฌ ๋ฆฌ์†Œ์Šค๋ฅผ ํ• ๋‹นํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ• ๋‹น๋œ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋ฅผ ํ•ด์ œํ•˜์ง€ ์•Š๊ณ  ์ด ํ•จ์ˆ˜์˜ ์ค‘๊ฐ„ ์–ด๋”˜๊ฐ€์—์„œ ์‹คํŒจํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ๋ฆฌ์†Œ์Šค ์ค‘ ํ•˜๋‚˜(๋˜๋Š” ์ „์ฒด)๋ฅผ ํ•ด์ œํ•˜๋Š” ๊ฒƒ์„ ์žŠ๋Š” ๊ฒƒ์€ ์ผ๋ฐ˜์ ์ธ ์˜ค๋ฅ˜์ด๋ฏ€๋กœ goto ์ฒด์ธ์€ ํ•ด์ œ๋œ ๋ฆฌ์†Œ์Šค์˜ ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ์ข…๋ฃŒ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜๊ณ  ๊น”๋”ํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ถŒ์žฅ ์‚ฌํ•ญ์€ goto ์‚ฌ์šฉํ•˜๋Š” ์„ ํ˜ธํ•˜๋Š” POSIX C ์†”๋ฃจ์…˜์˜ ์˜ˆ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋ก ์ž๋“ค์€ goto ๊ฐ€ ์—ฌ์ „ํžˆ ํ•ด๋กœ์šด ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ ๋œ๋‹ค๋Š” ์ ์„ ์ง€์ ํ• 

ํ•ด๋‹น ๊ถŒ์žฅ ์‚ฌํ•ญ์— ์ œ๊ณต๋œ ์˜ˆ์ œ๋Š” Wasm์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ ˆ์ด๋ธ”์ด ์ง€์ •๋œ ์ค‘๋‹จ์œผ๋กœ ์ง์ ‘ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž„์˜ goto์˜ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (C๋Š” ๋ ˆ์ด๋ธ”์ด ๋ถ™์€ break and continue๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํ•„์š”ํ•œ ๊ฒƒ๋ณด๋‹ค ๋” ์ž์ฃผ goto๋กœ ํด๋ฐฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.)

@rossberg , ํ•ด๋‹น ์˜ˆ์—์„œ ๋ ˆ์ด๋ธ”์ด ์ง€์ •๋œ ์ค‘๋‹จ์— ๋Œ€ํ•œ ์ข‹์€ ์ ์ด์ง€๋งŒ C๊ฐ€ "ํด๋ฐฑ"ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์งˆ์  ๊ฐ€์ •์— ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. goto๋Š” ๋ ˆ์ด๋ธ”์ด ์ง€์ •๋œ ์ค‘๋‹จ๋ณด๋‹ค ๋” ํ’๋ถ€ํ•œ ๊ตฌ์„ฑ์ž…๋‹ˆ๋‹ค. C๊ฐ€ ์ด์‹ ๊ฐ€๋Šฅํ•œ ์ปดํŒŒ์ผ ๋Œ€์ƒ์— ํฌํ•จ๋˜์–ด์•ผ ํ•˜๊ณ  C๊ฐ€ ๋ ˆ์ด๋ธ”์ด ์ง€์ •๋œ ์ค‘๋‹จ์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ด๋Š” ์˜คํžˆ๋ ค ์Œ์†Œ๊ฑฐ ์ง€์ ์ž…๋‹ˆ๋‹ค. Java๋Š” break/continues๋ผ๋Š” ๋ ˆ์ด๋ธ”์„ ์ง€์ •ํ–ˆ์ง€๋งŒ Python ์€ ์ œ์•ˆ๋œ ๊ธฐ๋Šฅ์„ ๊ฑฐ๋ถ€ํ–ˆ์œผ๋ฉฐ Sun JVM๊ณผ ๊ธฐ๋ณธ CPython์ด ๋ชจ๋‘ C๋กœ ์ž‘์„ฑ๋˜์—ˆ์Œ์„ ๊ณ ๋ คํ•  ๋•Œ ์ง€์›๋˜๋Š” ์–ธ์–ด๋กœ C๊ฐ€ ์šฐ์„  ์ˆœ์œ„ ๋ชฉ๋ก์—์„œ ๋” ๋†’์•„์•ผ ํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

goto ๊ฐ€ ๊ณ ๋ ค ๋Œ€์ƒ์—์„œ ์‰ฝ๊ฒŒ ์ œ์™ธ ๋œ๋‹ค๋ฉด emscripten์˜ ์†Œ์Šค ๋‚ด ์—์„œ

C๋กœ ์“ธ ์ˆ˜ ์—†๋Š” ์–ธ์–ด๊ฐ€ ์žˆ๋‚˜์š”? ์–ธ์–ด๋กœ์„œ์˜ C๋Š” WASM์˜ ๊ธฐ๋Šฅ์„ ์•Œ๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋Š˜๋‚ ์˜ WASM์œผ๋กœ๋Š” POSIX C๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์ ์ ˆํ•œ ๋กœ๋“œ๋งต์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋…ผ์Ÿ์˜ ์ฃผ์ œ์— ๊ด€ํ•œ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ๋…ผ์Ÿ์˜ ์—ฌ๊ธฐ์ €๊ธฐ์— ๋„์‚ฌ๋ฆฌ๊ณ  ์žˆ๋Š” ๋ฌด์ž‘์œ„์ ์ธ ์‹ค์ˆ˜๋ฅผ ์ˆจ๊ธฐ์ง€ ์•Š๊ธฐ ์œ„ํ•ด:

Python์—๋Š” ๋ ˆ์ด๋ธ”์ด ์ง€์ •๋œ ํœด์‹ ์‹œ๊ฐ„์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ž์„ธํžˆ ์•Œ๋ ค์ฃผ์‹ค ์ˆ˜ ์žˆ๋‚˜์š”? (์ผ๋ช…: Python์—๋Š” ๋ ˆ์ด๋ธ”์ด ์ง€์ •๋œ ์ค‘๋‹จ์ด ์—†์Šต๋‹ˆ๋‹ค.)

goto๊ฐ€ ๊ณ ๋ ค ๋Œ€์ƒ์—์„œ ์‰ฝ๊ฒŒ ์ œ์™ธ๋œ๋‹ค๋ฉด emscripten์˜ ์†Œ์Šค ๋‚ด์—์„œ ์ˆ˜๋ฐฑ ๊ฐ€์ง€์˜ goto ์‚ฌ์šฉ๋„ ์žฌ๊ณ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

1) ๊ทธ ์ค‘ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๊ฒƒ์ด emscripten์— ์ง์ ‘ ์กด์žฌํ•˜์ง€ ์•Š๊ณ  musl libc์— ์กด์žฌํ•˜๋Š”์ง€ ์ฃผ๋ชฉํ•˜์‹ญ์‹œ์˜ค. (๋‘ ๋ฒˆ์งธ๋กœ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์€ tests/third_party์ž…๋‹ˆ๋‹ค)
2) ์†Œ์Šค ๋ ˆ๋ฒจ ๊ตฌ์„ฑ์€ ๋ฐ”์ดํŠธ์ฝ”๋“œ ๋ช…๋ น์–ด์™€ ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
3) Emscripten์€ wasm ํ‘œ์ค€๊ณผ ๊ฐ™์€ ์ถ”์ƒํ™” ์ˆ˜์ค€์ด ์•„๋‹ˆ๋ฏ€๋กœ ์ด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์žฌ๊ณ ํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํŠนํžˆ, ์˜ค๋Š˜๋‚  libc์—์„œ gotos๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๊ฒฐ๊ณผ cfg๋ฅผ ์ž˜ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด relooper/cfgstackify๋ฅผ ์‹ ๋ขฐํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๊ฒฐ๊ณผ cfg๋ฅผ ๋” ๋งŽ์ด ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์—…์ŠคํŠธ๋ฆผ musl์—์„œ ์—„์ฒญ๋‚˜๊ฒŒ ๋‹ค์–‘ํ•œ ์ฝ”๋“œ๋กœ ๋งˆ๋ฌด๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์†Œํ•˜์ง€ ์•Š์€ ์–‘์˜ ์ž‘์—…์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Emscripten ๊ฐœ๋ฐœ์ž(๋‚ด๊ฐ€ ๋งˆ์ง€๋ง‰์œผ๋กœ ํ™•์ธํ•จ)๋Š” goto์™€ ๊ฐ™์€ ๊ตฌ์กฐ๊ฐ€ ์ •๋ง ์ข‹์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ช…๋ฐฑํ•œ ์ด์œ  ๋•Œ๋ฌธ์— ์ˆ˜์šฉ ๊ฐ€๋Šฅํ•œ ํƒ€ํ˜‘์— ๋„๋‹ฌํ•˜๋Š” ๋ฐ ๋ช‡ ๋…„์ด ๊ฑธ๋ฆฌ๋”๋ผ๋„ ๊ณ ๋ ค ๋Œ€์ƒ์—์„œ ์ œ์™ธํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

<marquee> ๋ฅผ ์Šน์ธํ•œ ํ‘œ์ค€ํ™” ๊ธฐ๊ตฌ์˜ ์ž…์žฅ์€ ์ฐฝ๋ฐฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ํŠนํžˆ asinine ์ง„์ˆ ์ž…๋‹ˆ๋‹ค.

1) ๋” ๊ด‘๋ฒ”์œ„ํ•œ ์ธํ„ฐ๋„ท์€ ๊ทธ๋Ÿฌํ•œ ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๊ธฐ๊นŒ์ง€ 10๋…„ ์ด์ƒ ๋‚จ์•˜์Šต๋‹ˆ๋‹ค.
2) We-the-wasm-CG๋Š” ํ•ด๋‹น ํƒœ๊ทธ์™€ ์™„์ „ํžˆ(๊ฑฐ์˜?) ๋ณ„๊ฐœ์˜ ์‚ฌ๋žŒ๋“ค ๊ทธ๋ฃน์ด๋ฉฐ, ๋ช…๋ฐฑํ•œ ๊ณผ๊ฑฐ ์‹ค์ˆ˜๋กœ ์ธํ•ด ๊ฐœ๋ณ„์ ์œผ๋กœ๋„ ์งœ์ฆ์ด ๋‚  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํž™์Šคํ„ฐ ๋žœ๋”ฉ ํŽ˜์ด์ง€์™€ ๋ฐ˜์ง์ด๋Š” ๋กœ๊ณ ๋„ ๋‚ญ๋น„ํ•˜์ง€ ์•Š๊ณ ์š”.

์ด๊ฒƒ์€ ํ†ค ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ  "๋‚˜๋Š” ์ขŒ์ ˆํ•ฉ๋‹ˆ๋‹ค"๋กœ ๋‹ค์‹œ ๋งํ–ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ์ด๋Ÿฌํ•œ ๋Œ€ํ™”๋Š” ๊ทธ ์ž์ฒด๋กœ ์ถฉ๋ถ„ํžˆ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ ํ™˜๊ฒฝ์ด ์ง€์›์„ ์œ„ํ•ด ์ถ”๊ฐ€ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์ณ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ๊นŠ์ด ์‹ ๋ขฐํ•˜๊ณ  ์ดํ•ดํ•˜๋Š” ๊ธฐ๋Šฅ ์ง‘ํ•ฉ์„ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์— ๋Œ€ํ•ด ๊นŠ์ด ์šฐ๋ คํ•˜๋Š” ์ƒˆ๋กœ์šด ์ˆ˜์ค€์ด ์žˆ์Šต๋‹ˆ๋‹ค. (ํ•˜๋‚˜์˜ ํŠน์ • ์ปดํŒŒ์ผ๋Ÿฌ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— ์–ฝ๋งค์ด๋Š” ๊ฒƒ์„ ์‹ซ์–ดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋Š” ์—ฌ์ „ํžˆ ํ™•๊ณ ํ•œ please-add-goto ์บ ํ”„์— ์žˆ์ง€๋งŒ)

์ œ ์ƒ๊ฐ์—๋Š” ์ด ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ƒ์‚ฐ์ ์ด์ง€ ๋ชปํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ๋‚˜์•„๊ฐ”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ์“ฐ๋ ˆ๋“œ๋Š” 4๋…„ ๋„˜๊ฒŒ ์‹คํ–‰๋˜์–ด ์™”์œผ๋ฉฐ ์ž„์˜์˜ goto ์— ๋Œ€ํ•œ ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ์ฃผ์žฅ์ด ์—ฌ๊ธฐ์— ์‚ฌ์šฉ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด๋Ÿฌํ•œ ์ฃผ์žฅ ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ํŠน๋ณ„ํžˆ ์ƒˆ๋กœ์šด ๊ฒƒ์€ ์•„๋‹ˆ๋ผ๋Š” ์ ์— ์œ ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ;)

์ž„์˜์˜ ์ ํ”„ ๋ ˆ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ์„ ํƒํ•œ ๊ด€๋ฆฌ๋˜๋Š” ๋Ÿฐํƒ€์ž„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ž„์˜ ์ ํ”„๊ฐ€ ํ—ˆ์šฉ๋˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์‹œ์Šคํ…œ์ด ์žˆ์œผ๋ฉฐ ์ž˜ ์ˆ˜ํ–‰๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ, ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์‹œ์Šคํ…œ์˜ ์ž‘์„ฑ์ž๋Š” ๋””์ž์ธ ์„ ํƒ์„ ํ•˜๊ณ  ๊ทธ ์„ ํƒ์ด ์„ฑ๊ณต์ ์ธ์ง€ ์•„๋‹Œ์ง€๋Š” ์˜ค์ง ์‹œ๊ฐ„๋งŒ์ด ์‹ค์ œ๋กœ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

์ž„์˜์˜ ์ ํ”„๋ฅผ ๊ธˆ์ง€ํ•˜๋Š” Wasm ๋””์ž์ธ ์„ ํƒ์€ ์ฒ ํ•™์˜ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค. ์ˆœ์ˆ˜ํ•œ ๊ฐ„์ ‘ ์ ํ”„๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ funclet๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ์—†์ด goto ์ง€์›ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ž„์˜์˜ ์ ํ”„๋ฅผ ๊ธˆ์ง€ํ•˜๋Š” Wasm ๋””์ž์ธ ์„ ํƒ์€ ์ฒ ํ•™์˜ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค. ์ˆœ์ˆ˜ํ•œ ๊ฐ„์ ‘ ์ ํ”„๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ funclet๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ์—†์ด goto๋ฅผ ์ง€์›ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@penzn funclets ์ œ์•ˆ ์ด ์™œ ๋ฉˆ์ท„์Šต๋‹ˆ๊นŒ? 2018๋…„ 10์›”๋ถ€ํ„ฐ ์กด์žฌํ•˜๋ฉฐ ์•„์ง 0๋‹จ๊ณ„์— ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ํ‰๋ฒ”ํ•œ ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค๋ฉด ํฌํฌํ•˜๊ณ  ๋๋ƒˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” ๊ด‘๋ฒ”์œ„ํ•œ ๋…์  ํ‘œ์ค€์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๊ด€์‹ฌ์„ ๊ฐ–๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ™œ๋ฐœํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ ๋ฐ˜์‘์ด ๋ฐฐ์–‘๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@J0eCool

  1. ๊ทธ ์ค‘ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๊ฒƒ์ด emscripten์— ์ง์ ‘ ์กด์žฌํ•˜์ง€ ์•Š๊ณ  musl libc์— ์กด์žฌํ•˜๋Š”์ง€ ์ฃผ๋ชฉํ•˜์‹ญ์‹œ์˜ค. (๋‘ ๋ฒˆ์งธ๋กœ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์€ tests/third_party์ž…๋‹ˆ๋‹ค)

์˜ˆ, ์ผ๋ฐ˜์ ์œผ๋กœ C์—์„œ ์–ผ๋งˆ๋‚˜ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š”์ง€์— ๋Œ€ํ•œ ๊ณ ๊ฐœ๋ฅผ ๋„๋•์˜€์Šต๋‹ˆ๋‹ค.

  1. ์†Œ์Šค ์ˆ˜์ค€ ๊ตฌ์„ฑ์€ ๋ฐ”์ดํŠธ ์ฝ”๋“œ ๋ช…๋ น์–ด์™€ ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก , ์šฐ๋ฆฌ๊ฐ€ ๋…ผ์˜ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์€ ์†Œ์Šค ์ˆ˜์ค€ ๊ตฌ์„ฑ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๋‚ด๋ถ€ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์ขŒ์ ˆ์˜ ์ผ๋ถ€์ด๋ฉฐ, ๋ธ”๋ž™๋ฐ•์Šค๋Š” ๊ทธ ์šฐ๋ ค๋ฅผ ๋ˆ„์„คํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.

  1. Emscripten์€ wasm ํ‘œ์ค€๊ณผ ๊ฐ™์€ ์ถ”์ƒํ™” ์ˆ˜์ค€์ด ์•„๋‹ˆ๋ฏ€๋กœ ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์žฌ๊ณ ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

์š”์ ์€ WebAssembly ๋„๊ตฌ ์ฒด์ธ ๋‚ด์—์„œ๋„ ๋Œ€๋ถ€๋ถ„์˜ ์ƒ๋‹นํ•œ C ํ”„๋กœ์ ํŠธ์—์„œ goto ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž์ฒด ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํžˆ ํ‘œํ˜„๋ ฅ์ด ์—†๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์–ธ์–ด์— ๋Œ€ํ•œ ์ด์‹ ๊ฐ€๋Šฅํ•œ ์ปดํŒŒ์ผ๋Ÿฌ ๋Œ€์ƒ์€ ์šฐ๋ฆฌ ๊ธฐ์—…์˜ ํŠน์„ฑ๊ณผ ์ •ํ™•ํžˆ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํŠนํžˆ, ์˜ค๋Š˜๋‚  libc์—์„œ gotos๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๊ฒฐ๊ณผ cfg๋ฅผ ์ž˜ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด relooper/cfgstackify๋ฅผ ์‹ ๋ขฐํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๊ฒฐ๊ณผ cfg๋ฅผ ๋” ๋งŽ์ด ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์›ํ˜•์ž…๋‹ˆ๋‹ค. ์œ„์˜ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๊ทธ๋Ÿฌํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์˜ ๋ฌด์˜ค์„ฑ์— ๋Œ€ํ•ด ๋‹ต์ด ์—†๋Š” ์‹ฌ๊ฐํ•œ ์งˆ๋ฌธ์„ ์ œ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค.

์—…์ŠคํŠธ๋ฆผ musl์—์„œ ์—„์ฒญ๋‚˜๊ฒŒ ๋‹ค์–‘ํ•œ ์ฝ”๋“œ๋กœ ๋งˆ๋ฌด๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์†Œํ•˜์ง€ ์•Š์€ ์–‘์˜ ์ž‘์—…์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์ด ๋งํ–ˆ๋“ฏ์ด gotos๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์‚ฌ์†Œํ•œ ์ผ์ด

Emscripten ๊ฐœ๋ฐœ์ž(๋‚ด๊ฐ€ ๋งˆ์ง€๋ง‰์œผ๋กœ ํ™•์ธํ•จ)๋Š” goto์™€ ๊ฐ™์€ ๊ตฌ์กฐ๊ฐ€ ์ •๋ง ์ข‹์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ช…๋ฐฑํ•œ ์ด์œ  ๋•Œ๋ฌธ์— ์ˆ˜์šฉ ๊ฐ€๋Šฅํ•œ ํƒ€ํ˜‘์— ๋„๋‹ฌํ•˜๋Š” ๋ฐ ๋ช‡ ๋…„์ด ๊ฑธ๋ฆฌ๋”๋ผ๋„ ๊ณ ๋ ค ๋Œ€์ƒ์—์„œ ์ œ์™ธํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•œ ์ค„๊ธฐ ํฌ๋ง! ๋ช‡ ๋…„์ด ์ง€๋‚ฌ๋”๋ผ๋„ goto/label ์ง€์›์ด ๋กœ๋“œ๋งต ํ•ญ๋ชฉ + ๊ณต์„ ์›€์ง์ด๊ฒŒ ํ•˜๋Š” ๊ณต์‹ ์ดˆ์ฒญ์œผ๋กœ ์ง„์ง€ํ•˜๊ฒŒ ๋ฐ›์•„๋“ค์—ฌ์ง„๋‹ค๋ฉด ๋งŒ์กฑํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ํŠนํžˆ asinine ์ง„์ˆ ์ž…๋‹ˆ๋‹ค.

๋„ค๊ฐ€ ์˜ณ์•„. ๊ณผ์žฅ๋œ ํ‘œํ˜„์„ ์šฉ์„œํ•˜์‹ญ์‹œ์˜ค. ์ €๋Š” ์•ฝ๊ฐ„ ์‹ค๋ง์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” was๋ฅผ ์ข‹์•„ํ•˜๊ณ  ์ž์ฃผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ํฌํŠธ TCC์™€ ๊ฐ™์ด ์ฃผ๋ชฉํ• ๋งŒํ•œ ๊ฒƒ์„ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๊ถ๊ทน์ ์œผ๋กœ ๋‚ด ์•ž์— ๊ณ ํ†ต์˜ ๊ธธ์ด ๋ณด์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๋Œ“๊ธ€๊ณผ ๊ธฐ์‚ฌ๋ฅผ ์ฝ์€ ํ›„์—๋„ ๋ฐ˜๋Œ€๊ฐ€ ๊ธฐ์ˆ ์ ์ธ์ง€, ์ฒ ํ•™์ ์ธ์ง€, ์ •์น˜์ ์ธ ๊ฒƒ์ธ์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. @neelance๊ฐ€ ํ‘œํ˜„ํ–ˆ๋“ฏ์ด,

โ€œV8 ๋‹ด๋‹น์ž๊ฐ€ ์ด ์Šค๋ ˆ๋“œ์—์„œ ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„์— ๋Œ€ํ•œ ๋ฐ˜๋Œ€๊ฐ€ V8์˜ ํ˜„์žฌ ๊ตฌํ˜„์— ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด๊ฒƒ์ด ๊ฐ€์žฅ ๋‚˜๋ฅผ ๊ดด๋กญํžˆ๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋Š” ๋ฌป๋Š”๋‹ค. [...]

์‚ฌ์šฉ ์ค‘์ด์‹œ๋ผ๋ฉด Go 1.11์— ๋Œ€ํ•œ @neelance์˜ ํ”ผ๋“œ๋ฐฑ์„ ๋งˆ์Œ์— ์ƒˆ๊ธฐ์‹ญ์‹œ์˜ค. ๊ทธ๊ฒƒ์€ ๋…ผ์Ÿํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก , ์šฐ๋ฆฌ๋Š” ๋ชจ๋‘ goto์˜ ์‚ฌ์†Œํ•œ ๋”์ŠคํŒ…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  goto ๋ช…๋ น์œผ๋กœ๋งŒ ๊ณ ์น  ์ˆ˜ ์žˆ๋Š” ์‹ฌ๊ฐํ•œ ์„ฑ๋Šฅ ์ ์ค‘์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.

๋‹ค์‹œ ํ•œ ๋ฒˆ ์ œ ์ขŒ์ ˆ๊ฐ์„ ์šฉ์„œํ•ด ์ฃผ์‹ญ์‹œ์˜ค. ํ•˜์ง€๋งŒ ์ด ๋ฌธ์ œ๊ฐ€ ์ ์ ˆํ•œ ์ฃผ์†Œ ์—†์ด ์ข…๋ฃŒ๋œ๋‹ค๋ฉด ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์ปค๋ฎค๋‹ˆํ‹ฐ ์‘๋‹ต์„ ํ™”๋‚˜๊ฒŒ ํ•  ๋ฟ ์•„๋‹ˆ๋ผ ์šฐ๋ฆฌ์˜ ๊ฐ€์žฅ ํฐ ํ‘œ์ค€ ๋…ธ๋ ฅ ์ค‘ ํ•˜๋‚˜์— ์ ํ•ฉํ•˜์ง€ ์•Š์€ ์ž˜๋ชป๋œ ์ข…๋ฅ˜์˜ ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋“ค. ๋‚ด๊ฐ€ ์ด ํŒ€์˜ ๋ชจ๋“  ์ด๋“ค์˜ ์—ด๋ ฌํ•œ ํŒฌ์ด์ž ์ง€์ง€์ž๋ผ๋Š” ๊ฒƒ์€ ๋งํ•  ํ•„์š”๋„ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๋‹ค์Œ์€ goto/funclets ๋ˆ„๋ฝ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ์‹ค์ œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. https://github.com/golang/go/issues/42979

์ด ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฝ์šฐ Go ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํ˜„์žฌ 18,000๊ฐœ์˜ ์ค‘์ฒฉ๋œ block ์žˆ๋Š” wasm ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. wasm ๋ฐ”์ด๋„ˆ๋ฆฌ ์ž์ฒด์˜ ํฌ๊ธฐ๋Š” 2.7MB์ด์ง€๋งŒ wasm2wat ํ†ตํ•ด ์‹คํ–‰ํ•˜๋ฉด 4.7GB .wat ํŒŒ์ผ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๐Ÿคฏ

Go ์ปดํŒŒ์ผ๋Ÿฌ์— ์•ฝ๊ฐ„์˜ ๊ฒฝํ—˜์  ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜์—ฌ ํ•˜๋‚˜์˜ ๊ฑฐ๋Œ€ํ•œ ์ ํ”„ ํ…Œ์ด๋ธ” ๋Œ€์‹  ์ผ์ข…์˜ ์ด์ง„ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“  ๋‹ค์Œ ์ ํ”„ ๋Œ€์ƒ ๋ณ€์ˆ˜๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ์ •๋ง๋กœ wasm๊ณผ ํ•จ๊ป˜ ์žˆ์–ด์•ผ ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๊นŒ?

๋‹จ์ผ ์ปดํŒŒ์ผ๋Ÿฌ(Emscripten[1])๋งŒ WebAssembly๋ฅผ ํ˜„์‹ค์ ์œผ๋กœ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์‚ฌ๋žŒ๋“ค์ด ์™„๋ฒฝํ•˜๊ฒŒ ๊ดœ์ฐฎ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด ์ด์ƒํ•˜๋‹ค๋Š” ์ ์„ ๋ง๋ถ™์ด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
libopus ์ƒํ™ฉ(์ €์ž‘๊ถŒ์ด ์žˆ๋Š” ์ฝ”๋“œ์— ๊ทœ๋ฒ”์ ์œผ๋กœ ์˜์กดํ•˜๋Š” ํ‘œ์ค€)์ด ์ƒ๊ฐ๋‚ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ WebAssembly ๊ฐœ๋ฐœ์ž๊ฐ€ ์ด๊ฒƒ์— ๋Œ€ํ•ด ๊ทธ๋ ‡๊ฒŒ ๊ฒฉ๋ ฌํ•˜๊ฒŒ ๋ฐ˜๋Œ€ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๊ฒƒ์ด ์ด์ƒํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ ์ชฝ์˜ ๊ฑฐ์˜ ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์ด ์ด๊ฒƒ์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ๋งํ•˜๊ณ  ์žˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ . ๊ธฐ์–ตํ•˜์‹ญ์‹œ์˜ค: WebAssembly๋Š” ์„ ์–ธ๋ฌธ์ด ์•„๋‹ˆ๋ผ ํ‘œ์ค€์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์‹ค, ๋Œ€๋ถ€๋ถ„์˜ ์ตœ์‹  ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋ช…์‹œ์  ๋ฃจํ”„[2]์˜ ๊ฐœ๋…์ด ์—†๋Š” ์ผ๋ถ€ ํ˜•ํƒœ์˜ SSA + ๊ธฐ๋ณธ ๋ธ”๋ก์„ ๋‚ด๋ถ€์ ์œผ๋กœ(๋˜๋Š” ๋™์ผํ•œ ์†์„ฑ์„ ๊ฐ€์ง„ ๊ฑฐ์˜ ๋™๋“ฑํ•œ ๊ฒƒ) ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. JIT์กฐ์ฐจ๋„ ๋น„์Šทํ•œ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค.
"๊ทธ๋ƒฅ goto ์‚ฌ์šฉ"์ด๋ผ๋Š” ํƒˆ์ถœ๊ตฌ ์—†์ด ์žฌ๋ฃจํ•‘์ด ๋ฐœ์ƒํ•˜๊ธฐ ์œ„ํ•œ ์ ˆ๋Œ€์ ์ธ ์š”๊ตฌ ์‚ฌํ•ญ์€ ๋‚ด๊ฐ€ ์•„๋Š” ํ•œ[3] ์–ธ์–ด ๋Œ€ ์–ธ์–ด ๋ฒˆ์—ญ๊ฐ€ ์™ธ์—๋Š” ์ „๋ก€๊ฐ€ ์—†๋Š” ์ผ์ž…๋‹ˆ๋‹ค. goto๊ฐ€ ์—†๋Š” ์–ธ์–ด๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ WebAssembly ์ด์™ธ์˜ ๋ชจ๋“  ์ข…๋ฅ˜์˜ IR ๋˜๋Š” ๋ฐ”์ดํŠธ ์ฝ”๋“œ์— ๋Œ€ํ•ด ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ด์•ผ๊ธฐ๋ฅผ ๋“ค์–ด๋ณธ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค.

์•„๋งˆ๋„ WebAssembly์˜ ์ด๋ฆ„์„ WebEmscripten(WebScripten?)์œผ๋กœ ๋ณ€๊ฒฝํ•  ๋•Œ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@d4tocchini๊ฐ€ ๋งํ–ˆ๋“ฏ์ด WebAssembly์˜ (ํ‘œ์ค€ํ™” ์ƒํ™ฉ์œผ๋กœ ์ธํ•ด ํ•„์š”ํ•œ) ๋…์  ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ์—ˆ๋‹ค๋ฉด ์ง€๊ธˆ์ฏค์ด๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง€์›ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ด๋ฏธ ์•Œ๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ํ•ฉ๋ฆฌ์ ์œผ๋กœ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ถ„๊ธฐ๋˜์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์•„๋‹ˆ์˜ค, "๊ทธ๋ƒฅ emscripten ์‚ฌ์šฉ"์€ ํ‘œ์ค€์„ ๋‹จ์ผ ์ปดํŒŒ์ผ๋Ÿฌ ๊ณต๊ธ‰์—…์ฒด์— ์˜์กดํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์— ์œ ํšจํ•œ ๋ฐ˜๋ก ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ์™œ ๋‚˜์œ์ง€ ๋งํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

ํŽธ์ง‘: ํ•œ ๊ฐ€์ง€๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ์žŠ์—ˆ์Šต๋‹ˆ๋‹ค.
๋ฌธ์ œ๊ฐ€ ๊ธฐ์ˆ ์ ์ธ์ง€, ์ฒ ํ•™์ ์ธ์ง€, ์ •์น˜์ ์ธ ๊ฒƒ์ธ์ง€ ์•„์ง ๋ช…ํ™•ํžˆ ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ›„์ž๋ฅผ ์˜์‹ฌํ•˜์ง€๋งŒ ๊ธฐ๊บผ์ด ํ‹€๋ฆฐ ๊ฒƒ์œผ๋กœ ํŒ๋ช…๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค(๊ธฐ์ˆ ์ , ์ฒ ํ•™์  ๋ฌธ์ œ๋Š” ์ •์น˜์ ์ธ ๋ฌธ์ œ๋ณด๋‹ค ํ›จ์”ฌ ์‰ฝ๊ฒŒ ๊ณ ์น  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค).

goto/funclets ๋ˆ„๋ฝ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ์‹ค์ œ ๋ฌธ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. golang/go#42979

์ด ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฝ์šฐ Go ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํ˜„์žฌ 18,000๊ฐœ์˜ ์ค‘์ฒฉ๋œ block ์žˆ๋Š” wasm ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. wasm ๋ฐ”์ด๋„ˆ๋ฆฌ ์ž์ฒด์˜ ํฌ๊ธฐ๋Š” 2.7MB์ด์ง€๋งŒ wasm2wat ํ†ตํ•ด ์‹คํ–‰ํ•˜๋ฉด 4.7GB .wat ํŒŒ์ผ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๐Ÿคฏ

Go ์ปดํŒŒ์ผ๋Ÿฌ์— ์•ฝ๊ฐ„์˜ ๊ฒฝํ—˜์  ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜์—ฌ ํ•˜๋‚˜์˜ ๊ฑฐ๋Œ€ํ•œ ์ ํ”„ ํ…Œ์ด๋ธ” ๋Œ€์‹  ์ผ์ข…์˜ ์ด์ง„ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“  ๋‹ค์Œ ์ ํ”„ ๋Œ€์ƒ ๋ณ€์ˆ˜๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ์ •๋ง๋กœ wasm๊ณผ ํ•จ๊ป˜ ์žˆ์–ด์•ผ ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๊นŒ?

์ด ์˜ˆ๋Š” ์ •๋ง ํฅ๋ฏธ๋กญ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌํ•œ ๊ฐ„๋‹จํ•œ ์ง์„  ํ”„๋กœ๊ทธ๋žจ์ด ์–ด๋–ป๊ฒŒ ์ด ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๊นŒ? ๋ฐฐ์—ด ์š”์†Œ์˜ ์ˆ˜์™€ ๋ธ”๋ก์˜ ์ˆ˜ ์‚ฌ์ด์˜ ๊ด€๊ณ„๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ํŠนํžˆ, ์ด๊ฒƒ์„ ๊ฐ ๋ฐฐ์—ด ์š”์†Œ ์•ก์„ธ์Šค์— _multiple_ ๋ธ”๋ก์ด ์ถฉ์‹คํ•˜๊ฒŒ ์ปดํŒŒ์ผ๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ๋กœ ํ•ด์„ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๊ทธ๋ฆฌ๊ณ  ์•„๋‹ˆ์š”, "๊ทธ๋ƒฅ emscripten์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค"๋Š” ์œ ํšจํ•œ ๋ฐ˜๋ก ์ด ์•„๋‹™๋‹ˆ๋‹ค.

์ด ๋งฅ๋ฝ์—์„œ ์‹ค์ œ ๋ฐ˜๋ก ์€ Wasm์„ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋ ค๋Š” ๋‹ค๋ฅธ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž์ฒด relooper์™€ ๊ฐ™์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•  ์ˆ˜/๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ, ๋‚˜๋Š” Wasm์ด ๊ฒฐ๊ตญ goto ๋Œ€ํ•œ ์ž์—ฐ์Šค๋Ÿฌ์šด ๋ชฉํ‘œ์ธ multi-body loop (Funclet์— ๊ฐ€๊น๋‹ค) ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@conrad-watt ๊ฐ ํ• ๋‹น์ด CFG์˜ ์—ฌ๋Ÿฌ ๊ธฐ๋ณธ ๋ธ”๋ก์„ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์š”์ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ค‘ ํ•˜๋‚˜๋Š” ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ๊ธธ์ด๋ฅผ ์•Œ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์Šฌ๋ผ์ด์Šค์— ๊ธธ์ด ๊ฒ€์‚ฌ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ธฐ๋ณธ ๋ธ”๋ก์„ ๋น„๊ต์  ์ €๋ ดํ•œ ๊ตฌ์„ฑ์œผ๋กœ ๊ฐ„์ฃผํ•˜์ง€๋งŒ wasm์„ ์‚ฌ์šฉํ•˜๋ฉด ํŠนํžˆ ์ด ํŠน์ • ๊ฒฝ์šฐ์— ๋‹ค์†Œ ๋น„์šฉ์ด ๋งŽ์ด ๋“ญ๋‹ˆ๋‹ค.

์ฝ”๋“œ๊ฐ€ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์œผ๋กœ ๋ถ„ํ• ๋œ ์ˆ˜์ •๋œ ์˜ˆ์ œ์˜ @neelance ์—์„œ (๋Ÿฐํƒ€์ž„/์ปดํŒŒ์ผ) ๋ฉ”๋ชจ๋ฆฌ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ํ›จ์”ฌ ๋‚ฎ์€ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋” ์ ์€ ์ˆ˜์˜ ๋ธ”๋ก์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๋ณ„๋„์˜ ๊ธฐ๋Šฅ์œผ๋กœ ์ธํ•ด ์—”์ง„ GC๊ฐ€ ๋” ์„ธ๋ถ„ํ™”๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๊นŒ?

@conrad-watt ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ Go ์ฝ”๋“œ๋„ ์•„๋‹ˆ๊ณ  WebAssembly ํ˜ธ์ŠคํŠธ์ž…๋‹ˆ๋‹ค. Chrome 86์œผ๋กœ wasm ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๋ฉด CPU๊ฐ€ 2๋ถ„ ๋™์•ˆ 100%๊ฐ€ ๋˜๊ณ  ํƒญ์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ์ตœ๊ณ ์ ์— ๋„๋‹ฌํ•ฉ๋‹ˆ๋‹ค. 11.3GB. ์ด๊ฒƒ์€ wasm ๋ฐ”์ด๋„ˆ๋ฆฌ / Go ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰ ๋˜๊ธฐ ์ „ ์ž…๋‹ˆ๋‹ค. ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋Š” ๊ฒƒ์€ wass ๋ฐ”์ด๋„ˆ๋ฆฌ์˜ ๋ชจ์–‘์ž…๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ์ด๋ฏธ ๋‚˜์˜ ์ดํ•ด์˜€๋‹ค. ๋งŽ์€ ์ˆ˜์˜ ๋ธ”๋ก/์œ ํ˜• ์ฃผ์„์œผ๋กœ ์ธํ•ด ํŠนํžˆ ์ปดํŒŒ์ผ/์ธ์Šคํ„ด์Šคํ™” ์ค‘์— ๋ฉ”๋ชจ๋ฆฌ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ด์ „ ์งˆ๋ฌธ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด - ์ฝ”๋“œ์˜ ๋ถ„ํ•  ๋ฒ„์ „์ด ๋” ์ ์€ ์ˆ˜์˜ ๋ธ”๋ก์œผ๋กœ Wasm์œผ๋กœ ์ปดํŒŒ์ผ๋˜๋ฉด(์ผ๋ถ€ ๋ฆฌ๋ฃจํผ ํŠน์„ฑ์œผ๋กœ ์ธํ•ด) ๋ฉ”๋ชจ๋ฆฌ ์˜ค๋ฒ„ํ—ค๋“œ ๊ฐ์†Œ์— ๋Œ€ํ•œ ํ•œ ๊ฐ€์ง€ ์„ค๋ช…์ด ๋  ๊ฒƒ์ด๋ฉฐ ๋” ์ผ๋ฐ˜์ ์ธ ์ถ”๊ฐ€๋ฅผ ์œ„ํ•œ ์ข‹์€ ๋™๊ธฐ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. Wasm์œผ๋กœ์˜ ํ๋ฆ„์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

๋˜๋Š” ๋ถ„ํ•  ์ฝ”๋“œ๊ฐ€ (๋Œ€๋žต) ๋™์ผํ•œ ์ด ๋ธ”๋ก ์ˆ˜๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฐ ๊ธฐ๋Šฅ์ด ๋ณ„๋„๋กœ JIT ์ปดํŒŒ์ผ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ ๊ธฐ๋Šฅ์„ ์ปดํŒŒ์ผํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ/IR์€ Wasm ์—”์ง„์— ์˜ํ•ด ๋” ์—ด์„ฑ์ ์œผ๋กœ GC ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. . ํฐ asm.js ํ•จ์ˆ˜๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„/์ปดํŒŒ์ผํ•  ๋•Œ ๋น„์Šทํ•œ ๋ฌธ์ œ๊ฐ€ V8๋…„ ์ „์— ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ Wasm์— ๋ณด๋‹ค ์ผ๋ฐ˜์ ์ธ ์ œ์–ด ํ๋ฆ„์„ ๋„์ž…ํ•ด๋„ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋จผ์ € Go ์ปดํŒŒ์ผ๋Ÿฌ๋Š” relooper ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ทธ๊ฒƒ์€ ๋ณธ์งˆ์ ์œผ๋กœ ๊ณ ๋ฃจํ‹ด ์ „ํ™˜์˜ ๊ฐœ๋…๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ธฐ๋ณธ ๋ธ”๋ก์€ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ์•ฝ๊ฐ„์˜ ํด์Šค๋ฃจ๊ฐ€ ์žˆ๋Š” ์ ํ”„ ํ…Œ์ด๋ธ”์„ ํ†ตํ•ด ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.

์ค‘์ฒฉ๋œ block ์˜ ๊นŠ์ด์™€ ๊ด€๋ จํ•˜์—ฌ Chrome์˜ wasm ๋Ÿฐํƒ€์ž„์— ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์ธ ๋ณต์žก์„ฑ ์ฆ๊ฐ€๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ถ„ํ•  ๋ฒ„์ „์€ ๋ธ”๋ก ์ˆ˜๋Š” ๊ฐ™์ง€๋งŒ ์ตœ๋Œ€ ๊นŠ์ด๋Š” ๋” ์ž‘์Šต๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ Wasm์— ๋ณด๋‹ค ์ผ๋ฐ˜์ ์ธ ์ œ์–ด ํ๋ฆ„์„ ๋„์ž…ํ•ด๋„ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด ๋ณต์žก์„ฑ ๋ฌธ์ œ๊ฐ€ ์•„๋งˆ๋„ Chrome์˜ ๋์—์„œ ํ•ด๊ฒฐ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ €๋Š” ํ•ญ์ƒ "์™œ ์ด ๋ฌธ์ œ๊ฐ€ ์ฒ˜์Œ์— ์กด์žฌํ–ˆ์„๊นŒ?"๋ผ๋Š” ์งˆ๋ฌธ์„ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋ณด๋‹ค ์ผ๋ฐ˜์ ์ธ ์ œ์–ด ํ๋ฆ„์ด ์žˆ์—ˆ๋‹ค๋ฉด ์ด ๋ฌธ์ œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์•˜์„ ๊ฒƒ์ด๋ผ๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ชจ๋“  ๊ธฐ๋ณธ ๋ธ”๋ก์ด ์ ํ”„ ํ…Œ์ด๋ธ”๋กœ ํ‘œํ˜„๋˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ ์ƒ๋‹นํ•œ ์ผ๋ฐ˜ ์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด๋Š” ์ตœ์ ํ™”๋กœ ์‚ฌ๋ผ์งˆ ๊ฒƒ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ค‘์ฒฉ ๋ธ”๋ก์˜ ๊นŠ์ด์™€ ๊ด€๋ จํ•˜์—ฌ Chrome์˜ wasm ๋Ÿฐํƒ€์ž„์— ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ๋ณต์žก์„ฑ์ด ์ฆ๊ฐ€ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ถ„ํ•  ๋ฒ„์ „์€ ๋ธ”๋ก ์ˆ˜๋Š” ๊ฐ™์ง€๋งŒ ์ตœ๋Œ€ ๊นŠ์ด๋Š” ๋” ์ž‘์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ N ๋ฐฐ์—ด ์•ก์„ธ์Šค๊ฐ€ ์žˆ๋Š” ์ง์„  ํ•จ์ˆ˜์—์„œ ์ตœ์ข… ๋ฐฐ์—ด ์•ก์„ธ์Šค๊ฐ€ N ๋ธ”๋ก ๊นŠ์ด ์ค‘์ฒฉ(์ผ๋ถ€ ์ƒ์ˆ˜ ์š”์†Œ)๋œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์ฝ”๋“œ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ์ธ์ˆ˜๋ถ„ํ•ดํ•˜์—ฌ ์ด๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ 3000๊ฐœ์˜ ์ค‘์ฒฉ ๋ฃจํ”„๋ฅผ ๋ถ„์„ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ(๋งค์šฐ ๋Œ€๋žต์ ์ธ ์œ ์ถ”) ์˜ˆ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์˜๋ฏธ๋ก ์  ์ด์œ ๋กœ ํ”ผํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ์ด๋Š” ๋ณด๋‹ค ์ผ๋ฐ˜์ ์ธ ์ œ์–ด ํ๋ฆ„์— ๋Œ€ํ•œ ์ธ์ˆ˜์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

์ค‘์ฒฉ ์ฐจ์ด๊ฐ€ ๊ทธ๋ณด๋‹ค ๋œ ๊ทน๋ช…ํ•˜๋‹ค๋ฉด V8์€ ๋‹จ์ผ Wasm ํ•จ์ˆ˜๋ฅผ ์ปดํŒŒ์ผํ•˜๋Š” ๋™์•ˆ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์˜ GC๋ฅผ ๊ฑฐ์˜ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ฒ˜์Œ๋ถ€ํ„ฐ ์–ธ์–ด์—์„œ ์•ฝ๊ฐ„์˜ funclets ์ œ์•ˆ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋”๋ผ๋„ , ํฅ๋ฏธ๋กœ์šด GC ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๊ณ ๋„ ๋™์ผํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๊ณ„์† ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ๋ชจ๋“  ๊ธฐ๋ณธ ๋ธ”๋ก์ด ์ ํ”„ ํ…Œ์ด๋ธ”๋กœ ํ‘œํ˜„๋˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ ์ƒ๋‹นํ•œ ์ผ๋ฐ˜ ์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด๋Š” ์ตœ์ ํ™”๋กœ ์‚ฌ๋ผ์งˆ ๊ฒƒ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ๋” ์ž์—ฐ์Šค๋Ÿฌ์šด ๋Œ€์ƒ์„ ๊ฐ–๋Š” ๊ฒƒ์ด (์ˆœ์ „ํžˆ ๊ธฐ์ˆ ์ ์ธ ๊ด€์ ์—์„œ) ๋ถ„๋ช…ํžˆ ๋ฐ”๋žŒ์งํ•˜๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ N ๋ฐฐ์—ด ์•ก์„ธ์Šค๊ฐ€ ์žˆ๋Š” ์ง์„  ํ•จ์ˆ˜์—์„œ ์ตœ์ข… ๋ฐฐ์—ด ์•ก์„ธ์Šค๊ฐ€ N ๋ธ”๋ก ๊นŠ์ด ์ค‘์ฒฉ(์ผ๋ถ€ ์ƒ์ˆ˜ ์š”์†Œ)๋œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์ฝ”๋“œ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ์ธ์ˆ˜๋ถ„ํ•ดํ•˜์—ฌ ์ด๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ 3000๊ฐœ์˜ ์ค‘์ฒฉ ๋ฃจํ”„๋ฅผ ๋ถ„์„ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ(๋งค์šฐ ๋Œ€๋žต์ ์ธ ์œ ์ถ”) ์˜ˆ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์˜๋ฏธ๋ก ์  ์ด์œ ๋กœ ํ”ผํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ์ด๋Š” ๋ณด๋‹ค ์ผ๋ฐ˜์ ์ธ ์ œ์–ด ํ๋ฆ„์— ๋Œ€ํ•œ ์ธ์ˆ˜์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ: ์ฒซ ๋ฒˆ์งธ ํ• ๋‹น์€ ๋งˆ์ง€๋ง‰์ด ์•„๋‹Œ ๊นŠ์ด ์ค‘์ฒฉ๋ฉ๋‹ˆ๋‹ค. ์ค‘์ฒฉ๋œ block ์™€ ์ƒ๋‹จ์˜ ๋‹จ์ผ br_table ๋Š” ์ „ํ†ต์ ์ธ switch ๋ฌธ์ด wasm์œผ๋กœ ํ‘œํ˜„๋˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ์–ธ๊ธ‰ํ•œ ์ ํ”„ ํ…Œ์ด๋ธ”์ž…๋‹ˆ๋‹ค. 3000๊ฐœ์˜ ์ค‘์ฒฉ ๋ฃจํ”„๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋‚ดํฌ ์ฐจ์ด๊ฐ€ ๊ทธ๊ฒƒ๋ณด๋‹ค ๋œ ๊ทน๋ช…ํ•˜๋‹ค๋ฉด, ๋‚ด ์ง๊ฐ์€ V8์ด ๋‹จ์ผ Wasm ํ•จ์ˆ˜๋ฅผ ์ปดํŒŒ์ผํ•˜๋Š” ๋™์•ˆ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์˜ GC๋ฅผ ๊ฑฐ์˜ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. , ํฅ๋ฏธ๋กœ์šด GC ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๊ณ ๋„ ๋™์ผํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๊ณ„์† ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ, ๊ธฐ๋ณธ ๋ธ”๋ก์˜ ์ˆ˜์™€ ๊ด€๋ จํ•˜์—ฌ ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ๋ณต์žกํ•œ ๊ตฌํ˜„์ด ์žˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋งŽ์€ ์–‘์˜ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ•˜๋ฃจ ์ข…์ผ ํ•˜๋Š” ์ผ์€ ๊ธฐ๋ณธ ๋ธ”๋ก์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Go ์ปดํŒŒ์ผ๋Ÿฌ ์ž์ฒด๋Š” ์—ฌ๋Ÿฌ ์ตœ์ ํ™” ๋‹จ๊ณ„์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋˜๋”๋ผ๋„ ์ปดํŒŒ์ผํ•˜๋Š” ๋™์•ˆ ์ด ์ˆ˜์˜ ๊ธฐ๋ณธ ๋ธ”๋ก์„ ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, ๊ธฐ๋ณธ ๋ธ”๋ก์˜ ์ˆ˜์™€ ๊ด€๋ จํ•˜์—ฌ ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ๋ณต์žกํ•œ ๊ตฌํ˜„์ด ์žˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋งŽ์€ ์–‘์˜ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ•˜๋ฃจ ์ข…์ผ ํ•˜๋Š” ์ผ์€ ๊ธฐ๋ณธ ๋ธ”๋ก์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Go ์ปดํŒŒ์ผ๋Ÿฌ ์ž์ฒด๋Š” ์—ฌ๋Ÿฌ ์ตœ์ ํ™” ๋‹จ๊ณ„์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋˜๋”๋ผ๋„ ์ปดํŒŒ์ผํ•˜๋Š” ๋™์•ˆ ์ด ์ˆ˜์˜ ๊ธฐ๋ณธ ๋ธ”๋ก์„ ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๋ฌผ๋ก , ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ ์„ฑ๋Šฅ ๋ฌธ์ œ๋Š” ์ด๋Ÿฌํ•œ ๊ธฐ๋ณธ ๋ธ”๋ก ๊ฐ„์˜ ์ œ์–ด ํ๋ฆ„์ด ์›๋ž˜ ์†Œ์Šค ์–ธ์–ด๋กœ ํ‘œํ˜„๋˜๋Š” ๋ฐฉ์‹๊ณผ ์ง๊ตํ•ฉ๋‹ˆ๋‹ค(์ฆ‰, Wasm์—์„œ ๋ณด๋‹ค ์ผ๋ฐ˜์ ์ธ ์ œ์–ด ํ๋ฆ„์— ๋Œ€ํ•œ ๋™๊ธฐ๊ฐ€ ์•„๋‹˜). ์—ฌ๊ธฐ์„œ V8์ด ํŠนํžˆ ๋‚˜์œ์ง€ ํ™•์ธํ•˜๋ ค๋ฉด FireFox/SpiderMonkey ๋˜๋Š” Lucet/Cranelift๊ฐ€ ๋™์ผํ•œ ์ปดํŒŒ์ผ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ช‡ ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ๋” ํ–ˆ์Šต๋‹ˆ๋‹ค. Firefox์™€ Safari๋Š” ์ „ํ˜€ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํฅ๋ฏธ๋กญ๊ฒŒ๋„ Chrome์€ ์ง‘์ค‘ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์™„๋ฃŒ๋˜๊ธฐ ์ „์— ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜๋„ ์žˆ์œผ๋ฏ€๋กœ wasm ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ๊ผญ ํ•„์š”ํ•˜์ง€ ์•Š์€ ์ผ๋ถ€ ์ž‘์—…์— ๋ณต์žก์„ฑ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก , ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ ์„ฑ๋Šฅ ๋ฌธ์ œ๋Š” ๊ธฐ๋ณธ ๋ธ”๋ก ๊ฐ„์˜ ์ œ์–ด ํ๋ฆ„์ด ์›๋ž˜ ์†Œ์Šค ์–ธ์–ด๋กœ ํ‘œํ˜„๋˜๋Š” ๋ฐฉ์‹๊ณผ ์ง๊ตํ•ฉ๋‹ˆ๋‹ค.

๋„ˆ์˜ ์˜๋„๋ฅผ ์•Œ ๊ฒ ์–ด.

๋‚˜๋Š” ์—ฌ์ „ํžˆ ์ ํ”„ ๋ช…๋ น์–ด๊ฐ€ ์•„๋‹Œ ์ ํ”„ ๋ณ€์ˆ˜์™€ ๊ฑฐ๋Œ€ํ•œ ์ ํ”„ ํ…Œ์ด๋ธ”/์ค‘์ฒฉ ๋ธ”๋ก์„ ํ†ตํ•ด ๊ธฐ๋ณธ ๋ธ”๋ก์„ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๊ธฐ๋ณธ ๋ธ”๋ก์˜ ๋‹จ์ˆœํ•œ ๊ฐœ๋…์„ ์ƒ๋‹นํžˆ ๋ณต์žกํ•œ ๋ฐฉ์‹์œผ๋กœ ํ‘œํ˜„ํ•œ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ์™€ ์—ฌ๊ธฐ์—์„œ ๋ณธ ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ณต์žก์„ฑ ๋ฌธ์ œ์˜ ์œ„ํ—˜์œผ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹จ์ˆœํ•œ ์‹œ์Šคํ…œ์ด ๋ณต์žกํ•œ ์‹œ์Šคํ…œ๋ณด๋‹ค ๋” ํ›Œ๋ฅญํ•˜๊ณ  ๊ฐ•๋ ฅํ•˜๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋” ๋‹จ์ˆœํ•œ ์‹œ์Šคํ…œ์ด ๋‚˜์œ ์„ ํƒ์ด๋ผ๋Š” ๊ฒƒ์„ ํ™•์‹ ์‹œํ‚ค๋Š” ์ฃผ์žฅ์„ ์•„์ง ๋ณด์ง€ ๋ชปํ–ˆ๋‹ค. ๋‚˜๋Š” V8์ด ์ž„์˜์˜ ์ œ์–ด ํ๋ฆ„์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์–ด๋ ค์›€์„ ๊ฒช์„ ๊ฒƒ์ด๋ผ๊ณ  ๋“ค์—ˆ๊ณ  ์ด ์ง„์ˆ ์ด ํ‹€๋ ธ์Œ์„ ์•Œ๋ ค์ฃผ๋Š” ๊ณต๊ฐœ ์งˆ๋ฌธ(https://github.com/WebAssembly/design/issues/796#issuecomment-623431527)์ด ์—†์Šต๋‹ˆ๋‹ค. ์•„์ง ๋‹ต๋ณ€์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@neelance

Chrome์€ ์ง‘์ค‘ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์™„๋ฃŒ๋˜๊ธฐ ์ „์— ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฒ ์ด์Šค๋ผ์ธ ์ปดํŒŒ์ผ๋Ÿฌ Liftoff๊ฐ€ ๊ดœ์ฐฎ์€ ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ๊ณ  ๋ฌธ์ œ๋Š” ์ตœ์ ํ™” ์ปดํŒŒ์ผ๋Ÿฌ TurboFan์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋ฅผ ์ œ์ถœํ•˜๊ฑฐ๋‚˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๋ฉด ์›ํ•˜๋Š” ๊ฒฝ์šฐ ํ•˜๋‚˜๋ฅผ ์ œ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋” ์ผ๋ฐ˜์ ์œผ๋กœ: was stack ์Šค์œ„์นญ ๊ณ„ํš์ด Go์˜ ๊ณ ๋ฃจํ‹ด ๊ตฌํ˜„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ? ์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๊ณ ์˜ ๋งํฌ์ด์ง€๋งŒ ๊ฒฉ์ฃผ ๋ชจ์ž„๊ณผ ์ž‘์—…์— ๋™๊ธฐ๋ฅผ ๋ถ€์—ฌํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ฐ•๋ ฅํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋กœ ์ธํ•ด ํ˜„์žฌ ๋งค์šฐ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. Go๊ฐ€ ํฐ ์Šค์œ„์น˜ ํŒจํ„ด์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด wasm ์ฝ”๋ฃจํ‹ด์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ž„์˜์˜ goto๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Go ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋ณธ์งˆ์ ์œผ๋กœ ๊ณ ๋ฃจํ‹ด ์ „ํ™˜ ๊ฐœ๋…๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌ๋ฃจํผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ž์ฒด์ ์œผ๋กœ ์ ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์ด ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ๊ตฌ์กฐํ™”๋œ ์ œ์–ด ํ๋ฆ„ + Asyncify ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ข‹์€ ๊ฒฐ๊ณผ๋ฅผ

๊ด€์‹ฌ์ด ์žˆ์œผ์‹œ๋ฉด Go์—์„œ ์‹คํ—˜ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ถ„๋ช…ํžˆ wasm์˜ ๋‚ด์žฅ ์Šคํƒ ์Šค์œ„์นญ ์ง€์›๋งŒํผ ์ข‹์ง€๋Š” ์•Š์ง€๋งŒ ์ด๋ฏธ ํฐ ์Šค์œ„์น˜ ํŒจํ„ด๋ณด๋‹ค ๋‚˜์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜์ค‘์— ๋‚ด์žฅ ์Šคํƒ ์Šค์œ„์นญ ์ง€์›์œผ๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ, ์ด ์‹คํ—˜์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์Šคํƒ ์ „ํ™˜์— ๋Œ€ํ•ด ์ „ํ˜€ ๊ฑฑ์ •ํ•˜์ง€ ์•Š๊ณ  Go๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๊ตฌ์กฐํ™”๋œ ์ฝ”๋“œ๋ฅผ ๋‚ด๋ณด๋‚ด๋„๋ก ํ•˜๊ณ  ์ ์ ˆํ•œ ์ง€์ ์—์„œ ํŠน๋ณ„ํ•œ maybe_switch_goroutine ํ•จ์ˆ˜์— ๋Œ€ํ•œ ํ˜ธ์ถœ์„ ๋‚ด๋ณด๋‚ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Asyncify ๋ณ€ํ™˜์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‚˜๋จธ์ง€ ๋ชจ๋“  ๊ฒƒ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์ €๋Š” qemu์™€ ๊ฐ™์€ ๋™์  ์žฌ์ปดํŒŒ์ผ ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ์œ„ํ•œ gotos์— ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ปดํŒŒ์ผ๋Ÿฌ์™€ ๋‹ฌ๋ฆฌ qemu๋Š” ํ”„๋กœ๊ทธ๋žจ ์ œ์–ด ํ๋ฆ„ ๊ตฌ์กฐ์— ๋Œ€ํ•œ ์ง€์‹์ด ์—†์œผ๋ฏ€๋กœ goto๊ฐ€ ์œ ์ผํ•œ ํ•ฉ๋ฆฌ์ ์ธ ๋Œ€์ƒ์ž…๋‹ˆ๋‹ค. Tailcall์€ ๊ฐ ๋ธ”๋ก์„ ํ•จ์ˆ˜๋กœ ์ปดํŒŒ์ผํ•˜๊ณ  ๊ฐ goto๋ฅผ tailcall๋กœ ์ปดํŒŒ์ผํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@kripken ๋งค์šฐ ์œ ์šฉํ•œ ๊ฒŒ์‹œ๋ฌผ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๋ฒ ์ด์Šค๋ผ์ธ ์ปดํŒŒ์ผ๋Ÿฌ Liftoff๊ฐ€ ๊ดœ์ฐฎ์€ ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ๊ณ  ๋ฌธ์ œ๋Š” ์ตœ์ ํ™” ์ปดํŒŒ์ผ๋Ÿฌ TurboFan์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋ฅผ ์ œ์ถœํ•˜๊ฑฐ๋‚˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๋ฉด ์›ํ•˜๋Š” ๊ฒฝ์šฐ ํ•˜๋‚˜๋ฅผ ์ œ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์˜ wasm ๋ฐ”์ด๋„ˆ๋ฆฌ ๋‹น์‹ ์ด ์‹คํ–‰ํ•  ์ˆ˜ wasm_exec.html์€ .

wasm ์Šคํƒ ์ „ํ™˜ ๊ณ„ํš์ด Go์˜ ๊ณ ๋ฃจํ‹ด ๊ตฌํ˜„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

๋„ค, ์–ธ๋œป ๋ณด๊ธฐ์— ๋„์›€์ด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ๊ตฌ์กฐํ™”๋œ ์ œ์–ด ํ๋ฆ„ + Asyncify๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ข‹์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ๋„ ์œ ๋งํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. Go์—์„œ relooper๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜์ง€๋งŒ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ์ž‘์€ ๋‹จ์ ์€ wasm ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ”์ด๋„ˆ๋ฆฌ์— ์ข…์†์„ฑ์„ ์ถ”๊ฐ€ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋งˆ ๊ณง ์ œ์•ˆ์„œ๋ฅผ ์ž‘์„ฑํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

LLVM์˜ stackifier ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋” ์‰ฝ๊ณ  ๋” ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ: https://medium.com/leaningtech/solve-the-structured-control-flow-problem-once-and-for-all-5123117b1ee2

Go ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ์ œ์•ˆ์„œ๋ฅผ ์ œ์ถœํ–ˆ์Šต๋‹ˆ๋‹ค: https://github.com/golang/go/issues/43033

@neelance , @kripken ์˜ ์ œ์•ˆ์ด golang + wasm์— ์•ฝ๊ฐ„ ๋„์›€์ด ๋˜๋Š” ๊ฒƒ์„ ๋ณด๋‹ˆ ๋ฐ˜๊ฐ‘์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๊ฐ€ ์Šคํƒ ์ „ํ™˜์ด ์•„๋‹Œ goto/labels ์ค‘ ํ•˜๋‚˜๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  Asyncify๊ฐ€ ์Šคํƒ ์ „ํ™˜์ด ๋ฆด๋ฆฌ์Šค๋  ๋•Œ๊นŒ์ง€ Asyncify๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด deps/ํŠน์ˆ˜ ์ผ€์ด์Šค ๋นŒ๋“œ๋ฅผ ๋„์ž…ํ•œ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ์ด ๋ฌธ์ œ๋ฅผ ์†”๋ฃจ์…˜์œผ๋กœ ํŠน์„ฑํ™”ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด ์ตœ์  ์™„ํ™” ๋ฏธ๋งŒ์œผ๋กœ ํŠน์„ฑํ™”ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? goto ์ง€์นจ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ์˜ˆ์ƒ ์ด์ ๊ณผ ๋น„๊ตํ•˜๋ฉด ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

์—ฐ๊ฒฐ ๋ชฉ๋ก์— ๋Œ€ํ•œ Linus Torvalds์˜ "Good Taste" ์ฃผ์žฅ์ด ์œ ์ผํ•œ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ์˜ ๋ถ„๊ธฐ ๋ฌธ์„ ์ œ๊ฑฐํ•˜๋Š” ์šฐ์•„ํ•จ์— ๊ทผ๊ฑฐํ•œ๋‹ค๋ฉด ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ์˜ ์ฒด์กฐ๋ฅผ ์Šน๋ฆฌ๋กœ ๋ณด๊ฑฐ๋‚˜ ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ๋‚˜์•„๊ฐ€๋Š” ๋‹จ๊ณ„๋ผ๊ณ  ๋ณด๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ C์—์„œ ๋น„๋™๊ธฐ์‹ API์— goto๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ goto ๋ช…๋ น์ด ๋ชจ๋“  ์ข…๋ฅ˜์˜ ๋ƒ„์ƒˆ๋ฅผ ์œ ๋ฐœํ•˜๊ธฐ ์ „์— ์Šคํƒ ์ „ํ™˜์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ž˜๋ชป ์ฝ๊ณ  ์žˆ๋‹ค๋ฉด ์ •์ •ํ•ด ์ฃผ์‹ญ์‹œ์˜ค. ๊ทธ๋Ÿฌ๋‚˜ ์ œ๊ธฐ๋œ ๋ช‡ ๊ฐ€์ง€ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋ฏธ๋ฏธํ•œ ํŠน์ˆ˜์„ฑ์— ์ดˆ์ ์„ ๋งž์ถ˜ ์ž„์‹œ๋ฐฉํŽธ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ์‘๋‹ต์„ ์ œ์™ธํ•˜๊ณ  ์—ฌ๊ธฐ ์œ ์ง€ ๊ด€๋ฆฌ์ž๋Š” ๋‹น๋ฉดํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋ช…ํ™•์„ฑ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์•˜์œผ๋ฉฐ ์–ด๋ ค์šด ์งˆ๋ฌธ์— ๋‹ต๋ณ€ํ•˜์ง€๋„ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ •๋‹นํ•œ ์กด๊ฒฝ๊ณผ ํ•จ๊ป˜, ์ด ๋Š๋ฆฐ ๊ณจํ™”๋Š” ๊ตณ์€์‚ด์ด ๊ธฐ์—… ์ •์น˜์˜ ํŠน์ง•์ด ์•„๋‹™๋‹ˆ๊นŒ? ์ด ๊ฒฝ์šฐ๋ผ๋ฉด ๊ทธ ์ƒํ™ฉ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค... ANSI C๋งŒ ํ˜ธํ™˜ ๋ฆฌํŠธ๋จธ์Šค ํ…Œ์ŠคํŠธ์˜€๋‹ค๋ฉด Wasm์˜ ๋ธŒ๋žœ๋“œ๊ฐ€ ์ง€์›์„ ์ž๋ž‘ํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ๋ชจ๋“  ์–ธ์–ด/์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค!

@neelance @darkuranium @d4tocchini ๋ชจ๋“  Wasm ๊ธฐ๊ณ ์ž๋“ค์ด goto์˜ ๋ถ€์กฑ์ด ์˜ณ์€ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ๊ทธ๊ฒƒ์„ Wasm์˜ #1 ๋””์ž์ธ ์‹ค์ˆ˜๋กœ ํ‰๊ฐ€ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์— ์ ˆ๋Œ€์ ์œผ๋กœ ์ฐฌ์„ฑํ•ฉ๋‹ˆ๋‹ค(ํŽ€ํด๋ฆฟ์œผ๋กœ ๋˜๋Š” ์ง์ ‘์ ์œผ๋กœ).

๊ทธ๋Ÿฌ๋‚˜ ์ด ์Šค๋ ˆ๋“œ์— ๋Œ€ํ•ด ํ† ๋ก ํ•œ๋‹ค๊ณ  ํ•ด์„œ goto๊ฐ€ ๋ฐœ์ƒํ•˜์ง€๋„ ์•Š๊ณ , Wasm์— ๊ด€๋ จ๋œ ๋ชจ๋“  ์‚ฌ๋žŒ์ด ๋งˆ์ˆ ์ฒ˜๋Ÿผ ํ™•์‹ ์„ ๊ฐ–๊ณ  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€๋„ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ทจํ•ด์•ผ ํ•  ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. Wasm CG์— ๊ฐ€์ž…ํ•˜์„ธ์š”.
  2. ๋ˆ„๊ตฐ๊ฐ€ goto ์ œ์•ˆ์˜ ์ฑ”ํ”ผ์–ธ์ด ๋˜๊ธฐ ์œ„ํ•ด ์‹œ๊ฐ„์„ ํˆฌ์žํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ @sunfishcode์— ์˜ํ•ด ์ž˜ ์ƒ๊ฐํ•˜๊ณ ์žˆ๋‹ค์œผ๋กœ ๋‚˜๋Š”, ๊ธฐ์กด funclets ์ œ์•ˆ์—์„œ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค๋กœ๋Š” ์›์‹œ๋ณด๋‹ค ์„ฑ๊ณตํ•  ํ™•๋ฅ ์ด ๋” ๋†’๋‹ค ์žˆ๋„๋ก ๋ธ”๋ก ๊ตฌ์กฐ์— ์˜์กดํ•˜๋Š” ํ˜„์žฌ์˜ ์—”์ง„ ๋ฐ ๋„๊ตฌ์— "์ ์–ด๋„ ๋ฐฉํ•ด"๊ฐ€ ์ด๋™.
  3. 4๊ฐ€์ง€ ์ œ์•ˆ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์น˜๋„๋ก ๋„์™€์ฃผ์„ธ์š”. ์—ฌ๊ธฐ์—๋Š” ๋‹จ๊ณ„๋ฅผ ํ†ต๊ณผํ•  ๋•Œ ๊ณผ๋ฐ˜์ˆ˜ ํ‘œ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋„๋ก ์ถฉ๋ถ„ํ•œ ์‚ฌ๋žŒ๋“ค์„ ๊ธฐ์˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•˜๋Š” ๋ชจ๋“  ๋ฐ˜๋Œ€ ์˜๊ฒฌ์— ๋Œ€ํ•ด ์ข‹์€ ๋””์ž์ธ์„ ๋งŒ๋“ค๊ณ  ํ† ๋ก ์„ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

@d4tocchini ์†”์งํžˆ ๋งํ•ด์„œ, ์ €๋Š” ํ˜„์žฌ ์ œ์•ˆ๋œ ์†”๋ฃจ์…˜์„ "๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์—์„œ ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•" ์ฆ‰ "ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•"์œผ๋กœ ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์—ฌ์ „ํžˆ jump/goto ๋ช…๋ น์–ด(๋˜๋Š” funclets)๋ฅผ ๋” ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์ƒ๊ฐํ•˜๊ณ  ๋”ฐ๋ผ์„œ ๋” ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. (์—ฌ์ „ํžˆ ๋Œ€์•ˆ์„ ์ œ์•ˆํ•ด ์ค€ @kripken ์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.)

@aardappel ๋‚ด๊ฐ€ ์•„๋Š” ํ•œ, @sunfishcode ๋Š” funclet ์ œ์•ˆ์„ ํ‘ธ์‹œํ•˜๋ ค๊ณ  ํ–ˆ์ง€๋งŒ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค. ์™œ ๋‚˜์™€ ๋‹ค๋ฅผ๊นŒ์š”?

@neelance ์ €๋Š” @sunfishcode ๊ฐ€ ์ œ์•ˆ์„ ์ดˆ๊ธฐ ์ƒ์„ฑ ์ด์ƒ์œผ๋กœ ๋ฐ€์–ด๋ถ™์ผ ์‹œ๊ฐ„์ด ๋งŽ์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— "์‹คํŒจ"๊ฐ€ ์•„๋‹ˆ๋ผ "์ค‘๋‹จ" ์ƒํƒœ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ œ๊ฐ€ ๋งํ•˜๋ ค๊ณ  ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ, ์ œ์•ˆ์ด ํŒŒ์ดํ”„๋ผ์ธ์„ ํ†ตํ•ด ๋๊นŒ์ง€ ์ „๋‹ฌ๋˜๋ ค๋ฉด ์ฑ”ํ”ผ์–ธ์ด ์ง€์†์ ์ธ ์ž‘์—…์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@neelance

ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ํ˜„์ง€์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://bugs.chromium.org/p/v8/issues/detail?id=11237์„ ์ œ์ถœํ–ˆ์Šต๋‹ˆ๋‹ค.

Go์—์„œ ๋ฆฌ๋ฃจํผ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. [..] ํ•œ ๊ฐ€์ง€ ์ž‘์€ ๋‹จ์ ์€ wasm ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ”์ด๋„ˆ๋ฆฌ์— ์ข…์†์„ฑ์„ ์ถ”๊ฐ€ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Btw, ๋„์›€์ด ๋œ๋‹ค๋ฉด ์ด์ง„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋นŒ๋“œ๋ฅผ ๋‹จ์ผ C ํŒŒ์ผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ†ตํ•ฉ์ด ๋” ์‰ฌ์šธ๊นŒ์š”?

๋˜ํ•œ Binaryen์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฑฐ๊ธฐ์— ์žˆ๋Š” Relooper ๊ตฌํ˜„

@taralx

LLVM์˜ stackifier ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋” ์‰ฝ๊ณ  ๋” ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋งํฌ๋Š” ์—…์ŠคํŠธ๋ฆผ LLVM์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ Cheerp ์ปดํŒŒ์ผ๋Ÿฌ(LLVM์˜ ํฌํฌ)์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Stackifier๋Š” LLVM๊ณผ ์ด๋ฆ„์ด ๋น„์Šทํ•˜์ง€๋งŒ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

๋˜ํ•œ Cheerp ๊ฒŒ์‹œ๋ฌผ์€ 2011๋…„์˜ ์›๋ž˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ์ตœ์‹  relooper ๊ตฌํ˜„ (์•ž์„œ ์–ธ๊ธ‰ํ•œ ๋Œ€๋กœ)์—๋Š” ์ˆ˜๋…„ ๋™์•ˆ ์–ธ๊ธ‰ํ•œ ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. Cheerp์™€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ํ•˜๋Š” ๊ฒƒ๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•œ ์ผ๋ฐ˜์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์— ๋Œ€ํ•œ ๋” ๊ฐ„๋‹จํ•˜๊ฑฐ๋‚˜ ๋” ๋‚˜์€ ๋Œ€์•ˆ์„ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ…Œ๋งˆ์˜ ๋ณ€ํ˜•์ž…๋‹ˆ๋‹ค.

@kripken ๋ฌธ์ œ๋ฅผ

Btw, ๋„์›€์ด ๋œ๋‹ค๋ฉด ์ด์ง„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋นŒ๋“œ๋ฅผ ๋‹จ์ผ C ํŒŒ์ผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ†ตํ•ฉ์ด ๋” ์‰ฌ์šธ๊นŒ์š”?

ํ•  ๊ฒƒ ๊ฐ™์ง€ ์•Š์€. Go ์ปดํŒŒ์ผ๋Ÿฌ ์ž์ฒด๋Š” ์–ผ๋งˆ ์ „์— ์ˆœ์ˆ˜ Go๋กœ ๋ณ€ํ™˜๋˜์—ˆ์œผ๋ฉฐ ๋‹ค๋ฅธ C ์ข…์†์„ฑ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ์˜ˆ์™ธ๊ฐ€ ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค.

funclet ์ œ์•ˆ์˜ ํ˜„์žฌ ์ƒํƒœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์Šค ์˜ ๋‹ค์Œ ๋‹จ๊ณ„๋Š” 1๋‹จ๊ณ„์— ์ง„์ž…ํ•˜๊ธฐ ์œ„ํ•ด CG ํˆฌํ‘œ๋ฅผ ์š”์ฒญํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜ ์ž์‹ ์€ ํ˜„์žฌ WebAssembly์˜ ๋‹ค๋ฅธ ์˜์—ญ์— ์ง‘์ค‘ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ funclet์„ ์•ž์œผ๋กœ ํ‘ธ์‹œํ•  ๋Œ€์—ญํญ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ funclet์˜ ์ฑ”ํ”ผ์–ธ ์—ญํ• ์„ ์ธ์ˆ˜ํ•˜๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด ๊ธฐ๊บผ์ด ๋„˜๊ฒจ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ•  ๊ฒƒ ๊ฐ™์ง€ ์•Š์€. Go ์ปดํŒŒ์ผ๋Ÿฌ ์ž์ฒด๋Š” ์–ผ๋งˆ ์ „์— ์ˆœ์ˆ˜ Go๋กœ ๋ณ€ํ™˜๋˜์—ˆ์œผ๋ฉฐ ๋‹ค๋ฅธ C ์ข…์†์„ฑ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ์˜ˆ์™ธ๊ฐ€ ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค.

๊ฒŒ๋‹ค๊ฐ€ ์ด๊ฒƒ์€ WebAssembly ๋Ÿฐํƒ€์ž„์—์„œ ์‹ฌ๊ฐํ•œ ์„ฑ๋Šฅ ์ ˆ๋ฒฝ์„ ์ผ์œผํ‚ค๋Š” relooper์˜ ๊ด‘๋ฒ”์œ„ํ•œ ์‚ฌ์šฉ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

@๋ถ€๋ฆฌํžˆ

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด wasm์— gotos๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๊ฒฝ์šฐ์ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๋ˆ„๊ตฐ๊ฐ€๋Š” ์‹ฌ๊ฐํ•œ ์„ฑ๋Šฅ ์ ˆ๋ฒฝ์„ ๋ณด์—ฌ์ฃผ๋Š” ์‹ค์ œ ์ฝ”๋“œ์—์„œ ๋งค๋ ฅ์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๋Ÿฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ๋ณธ ์ ์ด ์—†๋‹ค. "Not So Fast: Analyzing Performance of WebAssembly vs. Native Code"(2019) ์™€ ๊ฐ™์€ wasm perf ์ ์ž๋ฅผ ๋ถ„์„ํ•˜๋Š” ์ž‘์—…์€ ์ค‘์š”ํ•œ ์š”์†Œ์ธ ์ œ์–ด ํ๋ฆ„๋„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๋” ๋งŽ์€ ์–‘์˜ ๋ถ„๊ธฐ ๋ช…๋ น์„ ๊ธฐ๋กํ•˜์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ตฌ์กฐํ™”๋œ ์ œ์–ด ํ๋ฆ„์œผ๋กœ ์ธํ•ด - ์˜คํžˆ๋ ค ์•ˆ์ „ ์ ๊ฒ€ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค).

@kripken ๊ทธ๋Ÿฌํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ œ์•ˆ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์„ฑ๋Šฅ ๋ถ€์กฑ์ด ๊ตฌ์กฐํ™”๋œ ์ œ์–ด ํ๋ฆ„์œผ๋กœ ์ธํ•œ ๊ฒƒ์ž„์„ ์–ด๋–ป๊ฒŒ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์—ฌ๊ธฐ์— ๋ถˆ๋งŒ์˜ ์ผ๋ถ€์ธ ์ปดํŒŒ์ผ ๋‹จ๊ณ„์˜ ์„ฑ๋Šฅ์„ ๋ถ„์„ํ•˜๋Š” ์ž‘์—…์ด ๋งŽ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์•„์ง switch case ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์— ๋‹ค์†Œ ๋†€๋ž์ง€๋งŒ funclet์€ ๊ทธ๊ฒƒ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

@neelance

๊ตฌ์ฒด์ ์ธ ์›์ธ์„ ํŒŒ์•…ํ•˜๊ธฐ๊ฐ€ ์‰ฝ์ง€ ์•Š์ฃ . ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฒฝ๊ณ„ ๊ฒ€์‚ฌ์˜ ๊ฒฝ์šฐ VM์—์„œ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ณ  ์ธก์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์Šฌํ”„๊ฒŒ๋„ goto์— ๋Œ€ํ•ด ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค.

ํ•œ ๊ฐ€์ง€ ์˜ต์…˜์€ ๋ฐฉ์ถœ๋œ ๊ธฐ๊ณ„์–ด ์ฝ”๋“œ๋ฅผ ์†์œผ๋กœ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์ธ๋ฐ, ์ด๋Š” ๋งํฌ๋œ ๋ฌธ์„œ์—์„œ ์ˆ˜ํ–‰ํ•œ ์ž‘์—…์ž…๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์˜ต์…˜์€ ์ œ์–ด ํ๋ฆ„์„ ์ตœ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋ฏฟ๋Š” ๊ฒƒ์œผ๋กœ wasm์„ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๊ตฌ์กฐํ™”๋ฅผ "์‹คํ–‰ ์ทจ์†Œ"ํ•ฉ๋‹ˆ๋‹ค. LLVM์€ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋ฏ€๋กœ LLVM(WAVM ๋˜๋Š” wasmer์™€ ๊ฐ™์€)์„ ์‚ฌ์šฉํ•˜๋Š” VM์—์„œ ๋˜๋Š” WasmBoxC๋ฅผ ํ†ตํ•ด wasm์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ํฅ๋ฏธ๋กœ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. LLVM์—์„œ CFG ์ตœ์ ํ™”๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ณ  ์ด๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์ค‘์š”ํ•œ์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@taralx

ํฅ๋ฏธ๋กญ๋„ค์š”. ์ปดํŒŒ์ผ ์‹œ๊ฐ„์ด๋‚˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์— ๋Œ€ํ•ด ๋†“์นœ ๋ถ€๋ถ„์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๊ตฌ์กฐํ™”๋œ ์ œ์–ด ํ๋ฆ„์€ ์‹ค์ œ๋กœ ๊ฑฐ๊ธฐ์—์„œ ๋” ์ข‹์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ผ๋ฐ˜ CFG์—์„œ์™€ ๋น„๊ตํ•  ๋•Œ SSA ํ˜•์‹์œผ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์‚ฌ์‹ค ์ฒ˜์Œ๋ถ€ํ„ฐ ๊ตฌ์กฐํ™”๋œ ์ œ์–ด ํ๋ฆ„์„ ์‚ฌ์šฉํ–ˆ๋˜ ์ด์œ  ์ค‘ ํ•˜๋‚˜์˜€์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์›น์—์„œ ๋กœ๋“œ ์‹œ๊ฐ„์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ์‹ ์ค‘ํ•˜๊ฒŒ ์ธก์ •๋ฉ๋‹ˆ๋‹ค.

(๋˜๋Š” ๊ฐœ๋ฐœ์ž์˜ ์ปดํ“จํ„ฐ์—์„œ ์ปดํŒŒ์ผ๋Ÿฌ ์„ฑ๋Šฅ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? wasm์ด ํด๋ผ์ด์–ธํŠธ์—์„œ ๋” ๋งŽ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋” ์ ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๊ธฐ์šธ์–ด์ง€๋Š” ๊ฒƒ์ด ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค.)

๋‚˜๋Š” ์ž„๋ฒ ๋”์—์„œ ์ปดํŒŒ์ผ ์„ฑ๋Šฅ์„ ์˜๋ฏธํ–ˆ์ง€๋งŒ ๊ทธ๊ฒƒ์ด ๋ฐ˜๋“œ์‹œ ์ˆœ์ˆ˜ํ•œ ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ์•„๋‹Œ ๋ฒ„๊ทธ ๋กœ ์ทจ๊ธ‰๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@taralx

์˜ˆ, ๋ฒ„๊ทธ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•œ VM์˜ ํ•œ ๊ณ„์ธต์—์„œ๋งŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ๊ทผ๋ณธ์ ์ธ ์ด์œ ๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๊ตฌ์กฐํ™”๋œ ์ œ์–ด ํ๋ฆ„์€ ๋” ๋งŽ์€ ๋ฆฌ์†Œ์Šค๋ฅผ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋” ์ ์€ ๋ฆฌ์†Œ์Šค๋ฅผ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, was์— goto๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์ด๋Ÿฌํ•œ ์„ฑ๋Šฅ ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋” ๋†’์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@kripken

๊ตฌ์กฐํ™”๋œ ์ œ์–ด ํ๋ฆ„์€ ์‹ค์ œ๋กœ ๊ฑฐ๊ธฐ์—์„œ ๋” ์ข‹์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ผ๋ฐ˜ CFG์—์„œ์™€ ๋น„๊ตํ•  ๋•Œ SSA ํ˜•์‹์œผ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์‚ฌ์‹ค ์ฒ˜์Œ๋ถ€ํ„ฐ ๊ตฌ์กฐํ™”๋œ ์ œ์–ด ํ๋ฆ„์„ ์‚ฌ์šฉํ–ˆ๋˜ ์ด์œ  ์ค‘ ํ•˜๋‚˜์˜€์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์›น์—์„œ ๋กœ๋“œ ์‹œ๊ฐ„์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ์‹ ์ค‘ํ•˜๊ฒŒ ์ธก์ •๋ฉ๋‹ˆ๋‹ค.

๋งŒ์ผ์„ ๋Œ€๋น„ํ•˜์—ฌ ๋งค์šฐ ๊ตฌ์ฒด์ ์ธ ์งˆ๋ฌธ: "๊ตฌ์กฐํ™”๋œ ์ œ์–ด ํ๋ฆ„"์—์„œ SSA ํ˜•์‹์œผ๋กœ "๋งค์šฐ ๊ฐ„๋‹จ"ํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•˜๋Š” Wasm ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๊ฐ„๋‹จํžˆ ์‚ดํŽด๋ณด๋ฉด Wasm์˜ ์ œ์–ด ํ๋ฆ„์€ (์™„์ „ํžˆ/๊ถ๊ทน์ ์œผ๋กœ) ๊ตฌ์กฐํ™”๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ˜•์‹์ ์œผ๋กœ ๊ตฌ์กฐํ™”๋œ ์ œ์–ด๋Š” break s, continue s, return s(๋Œ€๋žต call/cc์™€ ๊ฐ™์€ ๋งˆ๋ฒ•์ด ์—†๋Š” Scheme์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชจ๋ธ)๊ฐ€ ์—†๋Š” ์ œ์–ด์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์ด ์กด์žฌํ•  ๋•Œ, ๊ทธ๋Ÿฌํ•œ ์ œ์–ด ํ๋ฆ„์€ ๋Œ€๋žต "๋ฐ˜๊ตฌ์กฐ์ "์ด๋ผ๊ณ  ๋ถ€๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์™„์ „ํžˆ ๊ตฌ์กฐํ™”๋œ ์ œ์–ด ํ๋ฆ„์„ ์œ„ํ•œ ์ž˜ ์•Œ๋ ค์ง„ SSA ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.45.4503 . ๋ฐ˜๊ตฌ์กฐํ™”๋œ ์ œ์–ด ํ๋ฆ„์— ๋Œ€ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ์กฐํ™”๋œ ๋ช…๋ น๋ฌธ์˜ ๊ฒฝ์šฐ ๊ตฌ๋ฌธ ๋ถ„์„ ์ค‘ ๋‹จ์ผ ํŒจ์Šค์—์„œ SSA ํ˜•์‹๊ณผ ๋„๋ฏธ๋„ค์ดํ„ฐ ํŠธ๋ฆฌ๋ฅผ ๋ชจ๋‘ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ์ž„์˜์˜ ์ง€์ ์—์„œ ์ œ์–ด ๊ตฌ์กฐ๋ฅผ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ๋Š” ํŠน์ • ํด๋ž˜์Šค์˜ ๋น„์ •ํ˜• ๋ช…๋ น๋ฌธ(LOOP/EXIT ๋ฐ RETURN)์œผ๋กœ ๋ฉ”์„œ๋“œ๋ฅผ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋Ÿฌํ•œ ์ข…๋ฃŒ๋Š” ์ผ์ข…์˜ (๊ทœ์œจ๋œ) goto์ด๋ฏ€๋กœ ๊ตฌ์กฐํ™”๋œ ๋ช…๋ น๋ฌธ๋ณด๋‹ค ์ฒ˜๋ฆฌํ•˜๊ธฐ๊ฐ€ ํ›จ์”ฌ ๋” ์–ด๋ ต๋‹ค๋Š” ๊ฒƒ์€ ๋†€๋ผ์šด ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค.

OTOH, ์ž˜ ์•Œ๋ ค์ง„ ๋˜ ๋‹ค๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ธ https://pp.info.uni-karlsruhe.de/uploads/publikationen/braun13cc.pdf ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‹จ์ผ ํŒจ์Šค์ด๊ธฐ๋„ ํ•˜์ง€๋งŒ ๊ตฌ์กฐํ™”๋˜์ง€ ์•Š์€ ์ œ์–ด์—๋งŒ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ๋ฆ„, ๊ทธ๋Ÿฌ๋‚˜ ํ™˜์›ํ•  ์ˆ˜ ์—†๋Š” ์ œ์–ด ํ๋ฆ„์ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋„(์ตœ์ ์˜ ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•˜์ง€๋Š” ์•Š์ง€๋งŒ).

๋”ฐ๋ผ์„œ ๋ฌธ์ œ๋Š” ์ผ๋ถ€ ํ”„๋กœ์ ํŠธ๊ฐ€ ์‹ค์ œ๋กœ Brandis/Mรถssenbรถck ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ™•์žฅํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ๊ฒช์—ˆ๊ณ  Braun et al๊ณผ ๋น„๊ตํ•˜์—ฌ ํ•ด๋‹น ๊ฒฝ๋กœ์—์„œ ์‹ค์งˆ์ ์ธ ์ด์ ์„ ์–ป์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜(์ฐธ๊ณ ๋กœ ๋‚ด ์ง๊ด€์  ์ง๊ฐ์€ Braun algo๊ฐ€ ์ •ํ™•ํžˆ ๊ทธ๋Ÿฐ "์ƒํ•œ" ํ™•์žฅ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ˜•์‹์  ์ฆ๊ฑฐ์— ๋Œ€ํ•ด ๋งํ•˜์ง€ ์•Š๊ณ  ์ง๊ด€์ ์œผ๋กœ ์ฆ๋ช…ํ•˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ๋ฉ์ฒญํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๊ฒŒ ๋‹ค์ž…๋‹ˆ๋‹ค. - ์ง๊ด€์  ์ง๊ฐ ).

๊ทธ๋ฆฌ๊ณ  ์งˆ๋ฌธ์˜ ์ผ๋ฐ˜์ ์ธ ์ฃผ์ œ๋Š” Wasm์ด ์ž„์˜์ ์ธ goto ์ง€์›์„ ๊ฑฐ๋ถ€ํ•œ ๊ถ๊ทน์ ์ธ ์ด์œ ๋ฅผ ํ™•๋ฆฝํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค("์œ ์ง€"๋ผ๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค). ์ด ์Šค๋ ˆ๋“œ๋ฅผ ๋ช‡ ๋…„ ๋™์•ˆ ๊ด€์ฐฐํ•˜๋ฉด์„œ ๋‚ด๊ฐ€ ๊ตฌ์ถ•ํ•œ ๋ฉ˜ํƒˆ ๋ชจ๋ธ์€ ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ CFG์— ์ง๋ฉดํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ ๊ฒฉ์ฐจ๋Š” ์ถ•์†Œ ๊ฐ€๋Šฅํ•œ CFG์™€ ํ•  ์ˆ˜ ์—†๋Š” CFG ์‚ฌ์ด์— ์žˆ์œผ๋ฉฐ ๋งŽ์€ ์ตœ์ ํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ถ•์†Œ ๊ฐ€๋Šฅํ•œ CFG์— ๋Œ€ํ•ด ํ›จ์”ฌ ๋” ์‰ฝ๊ณ  ์ด๊ฒƒ์ด ๋งŽ์€ ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์ฝ”๋”ฉํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Wasm์˜ (๋ฐ˜)๊ตฌ์กฐํ™”๋œ ์ œ์–ด ํ๋ฆ„์€ ๋ณด์žฅํ•˜๋Š” ์ €๋ ดํ•œ ๋ฐฉ๋ฒ•์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ํ™˜์›์„ฑ.

๊ตฌ์กฐํ™”๋œ CFG(๊ทธ๋ฆฌ๊ณ  Wasm CFG๋Š” ์‹ค์ œ๋กœ ํ˜•์‹์ ์ธ ์˜๋ฏธ์—์„œ ๊ตฌ์กฐํ™”๋˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค)์— ๋Œ€ํ•œ SSA ์ƒ์‚ฐ์˜ ํŠน๋ณ„ํ•œ ์šฉ์ด์„ฑ์— ๋Œ€ํ•ด ์–ธ๊ธ‰ํ•˜๋ฉด โ€‹โ€‹์œ„์˜ ๋ช…ํ™•ํ•œ ๊ทธ๋ฆผ์ด ํ๋ ค์ง‘๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ SSA ๊ตฌ์„ฑ์ด Wasm CFG ํ˜•์‹์œผ๋กœ ์‹ค์งˆ์ ์œผ๋กœ ๋„์›€์ด ๋œ๋‹ค๋Š” ๊ตฌ์ฒด์ ์ธ ์–ธ๊ธ‰์ด ์žˆ๋Š”์ง€ ๋ฌป๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌ ํ•ด์š”.

@kripken ์ €๋Š” ์ง€๊ธˆ ์•ฝ๊ฐ„ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ณ  ๋ฐฐ์šฐ๊ณ  ์‹ถ์–ดํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ƒํ™ฉ์„๋ณด๊ณ  ์žˆ์œผ๋ฉฐ ํ˜„์žฌ ๋‹ค์Œ์„๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.


ํ”„๋กœ๊ทธ๋žจ ์†Œ์Šค์—๋Š” ํŠน์ • ์ œ์–ด ํ๋ฆ„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด CFG๋Š” ์ถ•์†Œ ๊ฐ€๋Šฅํ•˜๊ฑฐ๋‚˜ ์ถ•์†Œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(์˜ˆ: goto๊ฐ€ ์†Œ์Šค ์–ธ์–ด์—์„œ ์‚ฌ์šฉ๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€). ์ด ์‚ฌ์‹ค์„ ๋ฐ”๊ฟ€ ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค. ์ด CFG๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด Go ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๊ธฐ๊ณ„์–ด๋กœ ๋ณ€ํ™˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

CFG๊ฐ€ ์ด๋ฏธ ์ถ•์†Œ ๊ฐ€๋Šฅํ•˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ์ž˜๋˜๊ณ  wasm VM์ด ๋น ๋ฅด๊ฒŒ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ฒˆ์—ญ ํŒจ์Šค๋Š” ์ด๊ฒƒ์ด ๊ฐ„๋‹จํ•œ ๊ฒฝ์šฐ์ž„์„ ๊ฐ์ง€ํ•˜๊ณ  ๋น ๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ CFG๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ด ๊ฒฝ์šฐ๋ฅผ ๋Šฆ์ถ”์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

CFG๋ฅผ ์ถ•์†Œํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ๋‘ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด ์ ํ”„ ํ…Œ์ด๋ธ”์„ ๋„์ž…ํ•˜์—ฌ ์ถ•์†Œ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด ๋‹จ๊ณ„์—์„œ ์ •๋ณด๊ฐ€ ์†์‹ค๋ฉ๋‹ˆ๋‹ค. ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•œ ์ปดํŒŒ์ผ๋Ÿฌ์— ํŠน์ •ํ•œ ๋ถ„์„ ์—†์ด ์›๋ž˜ CFG๋ฅผ ๋ณต์›ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ •๋ณด ์†์‹ค๋กœ ์ธํ•ด ์ƒ์„ฑ๋œ ๋ชจ๋“  ๊ธฐ๊ณ„์–ด ์ฝ”๋“œ๋Š” ์ดˆ๊ธฐ CFG์—์„œ ์ƒ์„ฑ๋œ ์ฝ”๋“œ๋ณด๋‹ค ๋‹ค์†Œ ๋Š๋ฆฝ๋‹ˆ๋‹ค. ๋‹จ์ผ ํŒจ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์ด ๊ธฐ๊ณ„์–ด ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ์ •๋ณด ์†์‹ค์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. [1]

  • ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ CFG๋ฅผ ๋ฐฉ์ถœํ•˜๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. VM์€ ์ด๋ฅผ ์ถ•์†Œ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋กœ๋“œ ์‹œ๊ฐ„์ด ๋Š๋ ค์ง€์ง€๋งŒ CFG๊ฐ€ ์‹ค์ œ๋กœ ๊ฐ์†Œํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ์—๋Š” ๋กœ๋“œ ์‹œ๊ฐ„ ์„ฑ๋Šฅ ๋˜๋Š” ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ์— ๋Œ€ํ•œ ์ตœ์ ํ™” ์ค‘์—์„œ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

[1] ์กฐ์ž‘์„ ๋˜๋Œ๋ฆด ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—ฌ์ „ํžˆ ์žˆ๋‹ค๋ฉด ์ •๋ณด ์†์‹ค์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ๋” ์ž˜ ์„ค๋ช…ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.


๋‚ด ์ƒ๊ฐ์˜ ๊ฒฐํ•จ์€ ์–ด๋””์— ์žˆ์Šต๋‹ˆ๊นŒ?

@ํŒ”์ฝ˜

"๊ตฌ์กฐํ™”๋œ ์ œ์–ด ํ๋ฆ„"์—์„œ SSA ํ˜•์‹์œผ๋กœ "๋งค์šฐ ๊ฐ„๋‹จ"ํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•˜๋Š” Wasm ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

VM ์ •๋ณด: ์ง์ ‘์ ์œผ๋กœ๋Š” ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ IIRC๋Š” @titzer ์™€ @lukewagner ๊ฐ€ ๊ทธ๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ํŽธ๋ฆฌํ•˜๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๊ทธ๋“ค ์ค‘ ํ•˜๋‚˜๊ฐ€ ์ •๊ตํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ™˜์› ๊ฐ€๋Šฅ์„ฑ์ด ์ „์ฒด ๋ฌธ์ œ์ธ์ง€ ์•„๋‹Œ์ง€๋Š” ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋“ค์ด ๋‹น์‹ ์ด ์–ธ๊ธ‰ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ–ˆ๋Š”์ง€ ์—ฌ๋ถ€๋Š” ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

VM ์ด์™ธ์˜ ์ •๋ณด: Binaryen ์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” wasm์˜ ๊ตฌ์กฐํ™”๋œ ์ œ์–ด ํ๋ฆ„์˜ ์ด์ ์„ ํ™•์‹คํžˆ ๋ˆ„๋ฆด ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ถ•์†Œ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด wasm์—์„œ ์ฃผ์„์ด ๋‹ฌ๋ฆฐ ๋ฃจํ”„ ํ—ค๋”๊ฐ€ ์–ด๋””์— ์žˆ๋Š”์ง€ ํ•ญ์ƒ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์–‘ํ•œ ์ตœ์ ํ™”๊ฐ€ ๋” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. (OTOH ๋‹ค๋ฅธ ์ตœ์ ํ™”๋Š” ์ˆ˜ํ–‰ํ•˜๊ธฐ๊ฐ€ ๋” ์–ด๋ ค์šฐ๋ฉฐ ์šฐ๋ฆฌ๋Š” ์ผ๋ฐ˜ CFG IR๋„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค...)

@neelance

CFG๊ฐ€ ์ด๋ฏธ ์ถ•์†Œ ๊ฐ€๋Šฅํ•˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ์ž˜๋˜๊ณ  wasm VM์ด ๋น ๋ฅด๊ฒŒ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ฒˆ์—ญ ํŒจ์Šค๋Š” ์ด๊ฒƒ์ด ๊ฐ„๋‹จํ•œ ๊ฒฝ์šฐ์ž„์„ ๊ฐ์ง€ํ•˜๊ณ  ๋น ๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ CFG๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ด ๊ฒฝ์šฐ๋ฅผ ๋Šฆ์ถ”์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์–ด์ฉŒ๋ฉด ๋‚ด๊ฐ€ ๋‹น์‹ ์„ ์™„์ „ํžˆ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๊ณ  ์žˆ์„์ง€๋„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ wasm VM์ด ์ฝ”๋“œ๋ฅผ ๋น ๋ฅด๊ฒŒ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋Š” ์ถ•์†Œ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ธ์ฝ”๋”ฉ ๋ฐฉ์‹์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ํŠนํžˆ ์ผ๋ฐ˜์ ์ธ CFG ํ˜•์‹์„ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ VM์€ ์ถ•์†Œ ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Wasm์€ ๊ทธ ์ž‘์—…์„ ํ”ผํ•˜๋„๋ก ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ธ์ฝ”๋”ฉ์€ ๋ฐ˜๋“œ์‹œ ์ถ•์†Œ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค(์ฆ‰, wasm์„ ์ฝ๊ณ  ์‚ฌ์†Œํ•œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ ์ถ”๊ฐ€ ์ž‘์—… ์—†์ด ์ถ•์†Œ ๊ฐ€๋Šฅํ•จ์„ ์ฆ๋ช…ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค).

๊ฒŒ๋‹ค๊ฐ€, wasm์˜ ์ธ์ฝ”๋”ฉ์€ ๊ทธ๊ฒƒ์„ ๊ฒ€์ฆํ•  ํ•„์š” ์—†์ด ์ถ•์†Œ์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ๊ฒƒ๋งŒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ฃจํ”„ ํ—ค๋”, if ๋ฐ ๊ธฐํƒ€ ์œ ์šฉํ•œ ๊ฒƒ๋“ค์— ์ฃผ์„์„ ๋‹ต๋‹ˆ๋‹ค(์ด ์ฃผ์„์˜ ์•ž๋ถ€๋ถ„์—์„œ ๋ณ„๋„๋กœ ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ). ํ”„๋กœ๋•์…˜ VM์ด ์ด๋ฅผ ํ†ตํ•ด ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š”์ง€๋Š” ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค. (์•„๋งˆ๋„ ํŠนํžˆ ๋ฒ ์ด์Šค๋ผ์ธ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ?)

์ „๋ฐ˜์ ์œผ๋กœ ๋‚˜๋Š” ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ CFG๋ฅผ ํ—ˆ์šฉํ•˜๋ฉด ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ CFG๊ฐ€ ๋ณ„๋„์˜ ๋ฐฉ์‹์œผ๋กœ ์ธ์ฝ”๋”ฉ๋˜์ง€ ์•Š๋Š” ํ•œ ๋น ๋ฅธ ๊ฒฝ์šฐ๋ฅผ ๋Šฆ์ถœ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: funclet์ด ์ œ์•ˆ๋จ).

@kripken

์„ค๋ช…ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์ œ๊ฐ€ ๋งŒ๋“ค๋ ค๊ณ  ํ•˜๋Š” ์ฐจ๋ณ„ํ™”์ž…๋‹ˆ๋‹ค. ์ถ•์†Œ ๊ฐ€๋Šฅํ•œ CFG์˜ ๊ฒฝ์šฐ ๊ตฌ์กฐํ™”๋œ ํ‘œ๊ธฐ๋ฒ•/์ธ์ฝ”๋”ฉ์˜ ์ด์ ์„ ๋ด…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ CFG์˜ ํ‘œ๊ธฐ๋ฅผ ํ—ˆ์šฉํ•˜๊ณ  ํ™˜์› ๊ฐ€๋Šฅํ•œ ์†Œ์Šค CFG์˜ ๊ฒฝ์šฐ ๊ธฐ์กด ์žฅ์ ์„ ์œ ์ง€ํ•˜๋Š” ์ผ๋ถ€ ๊ตฌ์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ต์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ๋ฅผ ๋“ค์–ด, ์ด ์ƒˆ๋กœ์šด ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด CFG๊ฐ€ ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค. ์ถ•์†Œ ๊ฐ€๋Šฅ).

๊ฒฐ๋ก ์ ์œผ๋กœ ๋‚˜๋Š” ์ˆœ์ „ํžˆ ํ™˜์› ๊ฐ€๋Šฅํ•œ ํ‘œ๊ธฐ๋ฒ•์ด ๋” ๋น ๋ฅด๋‹ค๊ณ  ์ฃผ์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์ถ•์†Œ ๊ฐ€๋Šฅํ•œ ์†Œ์Šค CFG ์˜ ๊ฒฝ์šฐ ๋˜‘๊ฐ™์ด ๋น ๋ฆ…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์†Œ์Šค CFG ์˜ ๊ฒฝ์šฐ ๊ธฐ๊ปํ•ด์•ผ ํฌ๊ฒŒ ๋Š๋ฆฌ์ง€ ์•Š๋‹ค๊ณ  ์ฃผ์žฅํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ช‡ ๊ฐ€์ง€ ์‹ค์ œ ์‚ฌ๋ก€๋Š” ์ด๋ฏธ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ทธ๋Ÿด ๊ฐ€๋Šฅ์„ฑ์ด ์—†์Œ์„ ๋ณด์—ฌ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

์š”์ปจ๋Œ€, ์„ฑ๋Šฅ ๊ณ ๋ ค ์‚ฌํ•ญ์ด ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„์„ ๋ฐฉ์ง€ํ•˜๋Š” ์ฃผ์žฅ์ด ๋  ์ˆ˜ ์žˆ๊ณ  ๋‹ค์Œ ๋‹จ๊ณ„๊ฐ€ ์„ฑ๋Šฅ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•ด์•ผ ํ•˜๋Š” ์ด์œ ์— ๋Œ€ํ•ด ์˜๋ฌธ์„ ์ œ๊ธฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@neelance

์˜ˆ, ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ funclet๊ณผ ๊ฐ™์€ ์ƒˆ๋กœ์šด ๊ตฌ์กฐ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ์กด ์‚ฌ๋ก€๊ฐ€ ๋Š๋ ค์ง€์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ was์— ๋ณต์žก์„ฑ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ๋กœ์šด ๊ตฌ์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ์—๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ VM์—์„œ ๋” ํฐ ํ‘œ๋ฉด์ ์„ ์˜๋ฏธํ•˜๋ฏ€๋กœ ๋” ๋งŽ์€ ๋ฒ„๊ทธ์™€ ๋ณด์•ˆ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Wasm์€ VM์˜ ๋ณต์žก์„ฑ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ๊ฐ€๋Šฅํ•œ ํ•œ ๊ฐœ๋ฐœ์ž ์ธก์— ๋งŽ์€ ๋ณต์žก์„ฑ์„ ๊ฐ€ํ•˜๋Š” ์ชฝ์œผ๋กœ ๊ธฐ์šธ์—ˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ถ€ wasm ์ œ์•ˆ์€ GC(JS๋กœ ์ฃผ๊ธฐ ์ˆ˜์ง‘์„ ํ—ˆ์šฉํ•จ)์™€ ๊ฐ™์ด ์†๋„์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ funclet๊ณผ ๊ฐ™์ด ์†๋„์— ๊ด€ํ•œ ์ œ์•ˆ์˜ ๊ฒฝ์šฐ ์†๋„๊ฐ€ ๋ณต์žก์„ฑ์„ ์ •๋‹นํ™”ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค„ ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์†๋„์— ๊ด€ํ•œ SIMD์— ๋Œ€ํ•ด ํ† ๋ก ํ–ˆ๊ณ  ์‹ค์ œ ์ฝ”๋“œ์—์„œ ๋งค์šฐ ํฐ ์†๋„ ํ–ฅ์ƒ(2๋ฐฐ ์ด์ƒ)์„ ์•ˆ์ •์ ์œผ๋กœ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

(์ผ๋ฐ˜ CFG๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ์†๋„ ์™ธ์— ๋‹ค๋ฅธ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ wasm์„ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฌ์›Œ์ง„๋‹ค๋Š” ์ ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ wasm VM์— ๋ณต์žก์„ฑ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ณ ๋„ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ LLVM ๋ฐ Binaryen์—์„œ ์ž„์˜์˜ CFG์— ๋Œ€ํ•œ ์ง€์›์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. , ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ CFG๋ฅผ ๋‚ด๋ณด๋‚ด๊ณ  ๊ตฌ์กฐํ™”๋œ ์ œ์–ด ํ๋ฆ„์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š๋‹ค๋ฉด ์ €๋ฅผ ํฌํ•จํ•œ ๋„๊ตฌ ์‚ฌ๋žŒ๋“ค์ด ๋” ๋งŽ์€ ์ผ์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.)

Funclet์€ ์ค‘์š”ํ•œ ์ œ์–ด ํ๋ฆ„์ด ์žˆ๋Š” ์–ธ์–ด๊ฐ€ WebAssembly๋กœ ์ปดํŒŒ์ผ๋˜๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ๋งŒํผ ์†๋„์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. C ๋ฐ Go๊ฐ€ ๊ฐ€์žฅ ๋ถ„๋ช…ํ•˜์ง€๋งŒ ๋น„๋™๊ธฐ/๋Œ€๊ธฐ๊ฐ€ ์žˆ๋Š” ๋ชจ๋“  ์–ธ์–ด์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ณ„์ธต์  ์ œ์–ด ํ๋ฆ„์„ ์„ ํƒํ•˜๋ฉด V8 ์ด์™ธ์˜ ๋ชจ๋“  Wasm ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ณ„์ธต์  ์ œ์–ด ํ๋ฆ„์„ CFG๋กœ ๋ถ„ํ•ดํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ์‹ค์ œ๋กœ VM์—์„œ _๋” ๋งŽ์€_ ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. CFG์˜ EBB๋Š” Wasm ๋“ฑ์˜ ์—ฌ๋Ÿฌ ์ œ์–ด ํ๋ฆ„ ๊ตฌ์„ฑ์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ปดํŒŒ์ผํ•  ๋‹จ์ผ ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์–‘ํ•œ ์šฉ๋„๋กœ ์—ฌ๋Ÿฌ ์ข…๋ฅ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ์ ์€ ์ˆ˜์˜ ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋งค์šฐ ๋‹จ์ˆœํ•œ ์ŠคํŠธ๋ฆฌ๋ฐ ์ปดํŒŒ์ผ๋Ÿฌ์ธ Lightbeam๋„ CFG์— ์ œ์–ด ํ๋ฆ„์„ ๋ถ„ํ•ดํ•˜๋Š” ์ถ”๊ฐ€ ๋ฒˆ์—ญ ๋‹จ๊ณ„๋ฅผ ์ถ”๊ฐ€ํ•œ ํ›„ ์ž˜๋ชป๋œ ์ปดํŒŒ์ผ ๋ฒ„๊ทธ๊ฐ€ ํฌ๊ฒŒ ๊ฐ์†Œํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ด ํ”„๋กœ์„ธ์Šค์˜ ๋‹ค๋ฅธ ์ธก๋ฉด์—์„œ ๋‘ ๋ฐฐ๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค. Relooper๋Š” funclet์„ ๋‚ด๋ณด๋‚ด๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ์ €๋Š” LLVM์šฉ Wasm ๋ฐฑ์—”๋“œ ๋ฐ ๊ตฌํ˜„๋  funclet์ธ ๋‹ค๋ฅธ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์ž‘์—…ํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋กœ๋ถ€ํ„ฐ ๋ชจ๋“  ๊ฒƒ์„ ๋ฐฉ์ถœํ•  ๊ฒƒ์ด๋ผ๊ณ  ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. codegen์˜ ์‹ ๋ขฐ์„ฑ๊ณผ ๋‹จ์ˆœ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด funclet๋งŒ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. Wasm์„ ์ƒ์„ฑํ•˜๋Š” ๋ชจ๋“  ์ปดํŒŒ์ผ๋Ÿฌ๋Š” EBB๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ Wasm์„ ์‚ฌ์šฉํ•˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋ชจ๋‘ EBB๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ funclet ๊ตฌํ˜„์„ ๊ฑฐ๋ถ€ํ•˜๊ฑฐ๋‚˜ CFG๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ๊ฑฐ๋ถ€ํ•˜๋Š” ๊ฒƒ์€ V8 ํŒ€ ์ด์™ธ์˜ ๊ด€๋ จ๋œ ๋ชจ๋“  ๋‹น์‚ฌ์ž์—๊ฒŒ ํ•ด๋ฅผ ์ž…ํžˆ๋Š” ์†์‹ค ๋‹จ๊ณ„๋ฅผ ์ค‘๊ฐ„์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. .

"์œ ํ•ดํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜๋Š” ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„"์€ ๋‹จ์ˆœํžˆ ์š”์ ์ผ ๋ฟ์ด๋ฉฐ, funclet์˜ ์ œ์–ด ํ๋ฆ„์„ ์ถ•์†Œํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ œํ•œ์„ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฏธ๋ž˜์— ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„์„ ํ—ˆ์šฉํ•˜๋ ค๋ฉด ์ถ•์†Œ ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„์„ ๊ฐ€์ง„ ๊ธฐ์กด์˜ ๋ชจ๋“  Wasm ๋ชจ๋“ˆ์ด ์ˆ˜์ •๋˜์ง€ ์•Š๊ณ  ์ž‘๋™ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„์„ ์ถ”๊ฐ€๋กœ ์ง€์›ํ•˜๋Š” ์—”์ง„์—์„œ. ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ธฐ์—์„œ ์ถ•์†Œ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒฝ์šฐ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

@๋ถ€๋ฆฌํžˆ

funclet์˜ ์ œ์–ด ํ๋ฆ„์„ ์ถ•์†Œํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ œํ•œ์„ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์‚ฌ์†Œํ•œ ์ผ์€ ์•„๋‹™๋‹ˆ๋‹ค. VM์—์„œ ์ด๋ฅผ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ผ ์„ ํ˜• ํŒจ์Šค์—์„œ๋Š” ์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ˜„์žฌ ๋Œ€๋ถ€๋ถ„์˜ VM์— ์žˆ๋Š” ๊ธฐ์ค€ ์ปดํŒŒ์ผ๋Ÿฌ์— ๋ฌธ์ œ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. (์‚ฌ์‹ค, ๋ฃจํ”„ ๋ฐฑ ์—์ง€๋ฅผ ์ฐพ๋Š” ๊ฒƒ - ์ด๊ฒƒ์€ ๋” ๊ฐ„๋‹จํ•œ ๋ฌธ์ œ์ด๊ณ  ๋‹ค๋ฅธ ์ด์œ ๋กœ๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค - ๋‹จ์ผ ์ •๋ฐฉํ–ฅ ํŒจ์Šค์—์„œ ์ˆ˜ํ–‰๋  ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ?)

V8 ์ด์™ธ์˜ ๋ชจ๋“  Wasm ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์–ด์จŒ๋“  ๊ณ„์ธต์  ์ œ์–ด ํ๋ฆ„์„ CFG๋กœ ๋ถ„ํ•ดํ•ฉ๋‹ˆ๋‹ค.

TurboFan์ด ์‚ฌ์šฉํ•˜๋Š” "๋…ธ๋“œ์˜ ๋ฐ”๋‹ค" ์ ‘๊ทผ ๋ฐฉ์‹์„ ๋ง์”€ํ•˜์‹œ๋Š” ๊ฑด๊ฐ€์š”? ๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ „๋ฌธ๊ฐ€๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ๋‹ต๋ณ€์€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋งก๊ธฐ๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋” ์ผ๋ฐ˜์ ์œผ๋กœ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์œ„์˜ ์ธ์ˆ˜๋ฅผ ๊ตฌ์ž…ํ•˜์ง€ ์•Š๋”๋ผ๋„ ์•ž์—์„œ ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๊ธฐ์ค€ ์ปดํŒŒ์ผ๋Ÿฌ์— ๋Œ€ํ•ด์„œ๋Š” ํ›จ์”ฌ ๋” ์ง์ ‘์ ์ธ ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค.

Funclet์€ ์†๋„์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ค‘์š”ํ•˜์ง€ ์•Š์€ ์ œ์–ด ํ๋ฆ„์ด ์žˆ๋Š” ์–ธ์–ด๋ฅผ WebAssembly๋กœ ์ปดํŒŒ์ผํ•˜๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. [..] Relooper๋Š” funclet์„ ๋‚ด๋ณด๋‚ด๋Š” ๊ฒƒ๋ณด๋‹ค ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

๋„๊ตฌ ์ธก๋ฉด์—์„œ 100% ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ๊ตฌ์กฐํ™”๋œ ์ฝ”๋“œ๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” ๊ฒƒ์ด ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค! ๊ทธ๋Ÿฌ๋‚˜ ์š”์ ์€ VM ์ธก์—์„œ ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  wasm์ด ์„ ํƒํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ์—ฌ๊ธฐ์—๋Š” ๊ท€ํ•˜๊ฐ€ ์–ธ๊ธ‰ํ•œ ๋‹จ์ ์„ ํฌํ•จํ•˜์—ฌ ์ ˆ์ถฉ์ ์ด ์žˆ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

2015๋…„์— was๊ฐ€ ์ด๊ฒƒ์„ ์ž˜๋ชป ์ดํ•ดํ–ˆ๋‚˜์š”? ์žˆ์„ ์ˆ˜์žˆ๋‹ค. ๋””๋ฒ„๊น… ๊ฐ€๋Šฅ์„ฑ ๋ฐ ์Šคํƒ ๋จธ์‹ ์œผ๋กœ์˜ ๋Šฆ์€ ์ „ํ™˜๊ณผ ๊ฐ™์€ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋Œ์ด์ผœ๋ณด๋ฉด ๊ณ ์น  ์ˆ˜ ์—†๊ณ  ์ƒˆ๋กœ์šด ๊ฒƒ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ, ํŠนํžˆ ๊ฒน์น˜๋Š” ๊ฒƒ์—๋Š” ๋†’์€ ๊ธฐ์ค€์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ชจ๋“  ๊ฒƒ์„ ๊ฐ์•ˆํ•  ๋•Œ ๊ฑด์„ค์ ์ธ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์ด๋ฉด์„œ ๋„๊ตฌ ์ธก๋ฉด์—์„œ ๊ธฐ์กด ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋„๊ตฌ ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ํ›จ์”ฌ ๋‚ฎ์€ ๋ง‰๋Œ€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘ ๊ฐ€์ง€ ๊ฐ€๋Šฅํ•œ ์ œ์•ˆ:

  • Go ์ปดํŒŒ์ผ๋Ÿฌ์— ๋„์›€์ด ๋œ๋‹ค๋ฉด Binaryen CFG ์ฝ”๋“œ๋ฅผ Go๋กœ ์ด์‹ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - @neelance ?
  • ์šฐ๋ฆฌ๋Š” ์ˆœ์ „ํžˆ ๋„๊ตฌ ์ธก๋ฉด์—์„œ funclet ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์šฐ๋ฆฌ๋Š” ์˜ค๋Š˜ ์ด๋ฅผ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ ๋ฐ”์ด๋„ˆ๋ฆฌ ํ˜•์‹์„ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. (wasm ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์—์„œ ๋„๊ตฌ ์ธก์—์„œ wasm ๋ฐ”์ด๋„ˆ๋ฆฌ ํ˜•์‹์„ ์ถ”๊ฐ€ํ•˜๋Š” ์„ ๋ก€๊ฐ€ ์ด๋ฏธ ์žˆ์Šต๋‹ˆ๋‹ค.)

์šฐ๋ฆฌ๋Š” ์ˆœ์ „ํžˆ ๋„๊ตฌ ์ธก๋ฉด์—์„œ funclet ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์šฐ๋ฆฌ๋Š” ์˜ค๋Š˜ ์ด๋ฅผ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ ๋ฐ”์ด๋„ˆ๋ฆฌ ํ˜•์‹์„ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. (wasm ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์—์„œ ๋„๊ตฌ ์ธก์—์„œ wasm ๋ฐ”์ด๋„ˆ๋ฆฌ ํ˜•์‹์„ ์ถ”๊ฐ€ํ•˜๋Š” ์„ ๋ก€๊ฐ€ ์ด๋ฏธ ์žˆ์Šต๋‹ˆ๋‹ค.)

์ด์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ์ž‘์—…์ด ์žˆ๋Š” ๊ฒฝ์šฐ (AFAIU) ์ด๊ฒƒ์„ Wasm์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฐ€์žฅ ์ž‘์€ ๊ด€์šฉ์  ๋ฐฉ๋ฒ•( @rossberg๊ฐ€ ์–ธ๊ธ‰ํ•œ ๋Œ€๋กœ )์€ ๋ธ”๋ก ๋ช…๋ น์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค์ค‘ ๋ฃจํ”„ (t in ) _n_ t out (_instr_* end ) _n_

์ด๋Š” n๊ฐœ์˜ ๋ ˆ์ด๋ธ”์ด ์ง€์ •๋œ ๋ณธ๋ฌธ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค(n๊ฐœ์˜ ์ž…๋ ฅ ์œ ํ˜• ์ฃผ์„์ด ์•ž์œผ๋กœ ์„ ์–ธ๋จ). ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ช…๋ น์˜ br ๊ณ„์—ด์€ ์ผ๋ฐ˜ํ™”๋˜์–ด ๋‹ค์ค‘ ๋ฃจํ”„์— ์˜ํ•ด ์ •์˜๋œ ๋ชจ๋“  ๋ ˆ์ด๋ธ”์ด ๊ฐ ๋ณธ๋ฌธ ๋‚ด์—์„œ ์ˆœ์„œ๋Œ€๋กœ ๋ฒ”์œ„ ๋‚ด์— ์žˆ์Šต๋‹ˆ๋‹ค(์ฆ‰, ๋ชจ๋“  ๋ณธ๋ฌธ์ด ๋‹ค๋ฅธ ๋ณธ๋ฌธ ๋‚ด์—์„œ ๋ถ„๊ธฐ๋  ์ˆ˜ ์žˆ์Œ). ๋ฉ€ํ‹ฐ๋ฃจํ”„ ๋ณธ๋ฌธ์ด ๋ถ„๊ธฐ๋˜๋ฉด ์‹คํ–‰์€ ๋ณธ๋ฌธ์˜ _start_๋กœ ์ ํ”„ํ•ฉ๋‹ˆ๋‹ค(์ผ๋ฐ˜ Wasm ๋ฃจํ”„์ฒ˜๋Ÿผ). ์‹คํ–‰์ด ๋‹ค๋ฅธ ๋ณธ๋ฌธ์œผ๋กœ ๋ถ„๊ธฐํ•˜์ง€ ์•Š๊ณ  ๋ณธ๋ฌธ ๋์— ๋„๋‹ฌํ•˜๋ฉด ์ „์ฒด ๊ตฌ๋ฌธ์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค(ํด์Šค๋ฃจ ์—†์Œ).

๊ฐ ๋ฐ”๋””์˜ ์œ ํ˜• ์ฃผ์„์„ ํšจ์œจ์ ์œผ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ์•ฝ๊ฐ„์˜ ๋ฐ”์ดํฌ์‰๋”ฉ์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค(์œ„์˜ ๊ณต์‹์—์„œ n๊ฐœ์˜ ๋ฐ”๋””๋Š” n๊ฐœ์˜ ๋‹ค๋ฅธ ์ž…๋ ฅ ์œ ํ˜•์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ ๋ชจ๋‘ ๋™์ผํ•œ ์ถœ๋ ฅ ์œ ํ˜•์„ ๊ฐ€์ ธ์•ผ ํ•˜๋ฏ€๋กœ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ถˆํ•„์š”ํ•œ ๋Š๋‚Œ์˜ LUB ๊ณ„์‚ฐ์„ ์š”๊ตฌํ•˜์ง€ ์•Š๋Š” ์ผ๋ฐ˜ ๋‹ค์ค‘ ๊ฐ’ _blocktype_ ์ธ๋ฑ์Šค) ๋ฐ ์‹คํ–‰ํ•  ์ดˆ๊ธฐ ๋ณธ๋ฌธ์„ ์„ ํƒํ•˜๋Š” ๋ฐฉ๋ฒ•(ํ•ญ์ƒ ์ฒซ ๋ฒˆ์งธ ๋˜๋Š” ์ •์  ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?).

์ด๊ฒƒ์€ funclet๊ณผ ๊ฐ™์€ ์ˆ˜์ค€์˜ ํ‘œํ˜„๋ ฅ์„ ๊ฐ–์ง€๋งŒ ์ œ์–ด ๋ช…๋ น์˜ ์ƒˆ๋กœ์šด ๊ณต๊ฐ„์„ ๋„์ž…ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค funclet์ด ๋” ๋ฐ˜๋ณต๋˜์—ˆ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€ํ–ˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘: ํด ์Šค๋ฃจ(fall-through) ๋™์ž‘์„ ๊ฐ–๋„๋ก ์ด๊ฒƒ์„ ์กฐ์ •ํ•˜๋ฉด ํ˜•์‹ ์˜๋ฏธ๊ฐ€ ์•ฝ๊ฐ„ ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ

์—”์ง„์„ ๋” ๊ฐ„๋‹จํ•˜๊ณ  ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ž‘์—…์„ ๋„๊ตฌ๋กœ ์˜คํ”„๋กœ๋”ฉํ•˜๋Š” Wasm ์„ค๊ณ„ ์›์น™์€ ๋งค์šฐ ์ค‘์š”ํ•˜๋ฉฐ ๊ณ„์†ํ•ด์„œ ๋งค์šฐ ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฆ‰, ์‚ฌ์†Œํ•˜์ง€ ์•Š์€ ๋ชจ๋“  ๊ฒƒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ‘๋ฐฑ์ด ์•„๋‹Œ ์ ˆ์ถฉ์•ˆ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์ƒ์‚ฐ์ž์˜ ๊ณ ํ†ต์ด ์—”์ง„์˜ ๊ณ ํ†ต๊ณผ ๋น„๋ก€ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ Wasm์— ๊ฐ€์ ธ์˜ค๊ณ  ์‹ถ์€ ๋Œ€๋ถ€๋ถ„์˜ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ์ž„์˜์˜ CFG ๊ตฌ์กฐ(SSA)๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ goto(CPU)์— ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๋Š” ๋Œ€์ƒ์„ ๋Œ€์ƒ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋งŽ์€ ์ด๋“์„ ์–ป์ง€ ๋ชปํ•œ ์ฑ„ ์„ธ์ƒ์„ ๋›ฐ์–ด๋„˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

funclet(๋˜๋Š” multiloop)๊ณผ ๊ฐ™์€ ๊ฒƒ์€ ๋ชจ๋“ˆ์‹์ด๊ธฐ ๋•Œ๋ฌธ์— ์ข‹์Šต๋‹ˆ๋‹ค. ์ƒ์‚ฐ์ž๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉด ์ด์ „๊ณผ ๊ฐ™์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์—”์ง„์ด ์ž„์˜์˜ CFG๋ฅผ ์‹ค์ œ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ์ž ์‹œ ๋™์•ˆ์€ ๋งˆ์น˜ loop + br_table ์ข…๋ฅ˜์˜ ๊ตฌ์„ฑ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ฐฉ์ถœํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋งŒ ๋Œ€๊ฐ€๋ฅผ ์ง€๋ถˆํ•ฉ๋‹ˆ๋‹ค. . ๊ทธ๋Ÿฐ ๋‹ค์Œ "์‹œ์žฅ์ด ๊ฒฐ์ •"ํ•˜๊ณ  ์—”์ง„์— ๋” ๋‚˜์€ ์ฝ”๋“œ๋ฅผ ๋‚ด๋ณด๋‚ด์•ผ ํ•œ๋‹ค๋Š” ์••๋ ฅ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. funclet์— ์˜์กดํ•˜๋Š” Wasm ์ฝ”๋“œ๊ฐ€ ๋งŽ์ด ์žˆ์„ ๊ฒฝ์šฐ ์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์ด ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์—”์ง„์ด ์ข‹์€ ์ฝ”๋“œ๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” ๊ฒƒ์€ ํฐ ์žฌ์•™์ด ๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ๋ญ”๊ฐ€๊ฐ€ ๋งํ•ด์ค๋‹ˆ๋‹ค.

ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์‚ฌ์†Œํ•œ ์ผ์€ ์•„๋‹™๋‹ˆ๋‹ค. VM์—์„œ ์ด๋ฅผ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ผ ์„ ํ˜• ํŒจ์Šค์—์„œ๋Š” ์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ˜„์žฌ ๋Œ€๋ถ€๋ถ„์˜ VM์— ์žˆ๋Š” ๊ธฐ์ค€ ์ปดํŒŒ์ผ๋Ÿฌ์— ๋ฌธ์ œ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์–ด์ฉŒ๋ฉด ๋‚ด๊ฐ€ ๊ธฐ์ค€ ์ปดํŒŒ์ผ๋Ÿฌ์— ๋Œ€ํ•œ ๊ธฐ๋Œ€์น˜๋ฅผ ์˜คํ•ดํ•˜๊ณ  ์žˆ์„์ง€๋„ ๋ชจ๋ฅด์ง€๋งŒ ๊ทธ๋“ค์ด ์™œ ์‹ ๊ฒฝ์„ ์“ฐ๊ฒ ์Šต๋‹ˆ๊นŒ? goto๊ฐ€ ๋ณด์ด๋ฉด ์ ํ”„ ๋ช…๋ น์„ ์‚ฝ์ž…ํ•˜์‹ญ์‹œ์˜ค.

๋„๊ตฌ ์ธก๋ฉด์—์„œ 100% ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ๊ตฌ์กฐํ™”๋œ ์ฝ”๋“œ๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” ๊ฒƒ์ด ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค! ๊ทธ๋Ÿฌ๋‚˜ ์š”์ ์€ VM ์ธก์—์„œ ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  wasm์ด ์„ ํƒํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ์—ฌ๊ธฐ์—๋Š” ๊ท€ํ•˜๊ฐ€ ์–ธ๊ธ‰ํ•œ ๋‹จ์ ์„ ํฌํ•จํ•˜์—ฌ ์ ˆ์ถฉ์ ์ด ์žˆ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

์•„๋‹ˆ์š”, ์›๋ž˜ ์˜๊ฒฌ์—์„œ ์—ฌ๋Ÿฌ ๋ฒˆ ๋งํ–ˆ๋“ฏ์ด VM ์ธก์—์„œ ์ž‘์—…์„ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ค์ง€ _์•Š์Šต๋‹ˆ๋‹ค_. ๋‚˜๋Š” 1๋…„ ๋„˜๊ฒŒ ๋ฒ ์ด์Šค๋ผ์ธ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์ผํ–ˆ๊ณ  Wasm์˜ ์ œ์–ด ํ๋ฆ„์„ CFG๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ค‘๊ฐ„ ๋‹จ๊ณ„๋ฅผ ์ถ”๊ฐ€ํ•œ ํ›„ ๋‚ด ์‚ถ์ด ๋” ์‰ฌ์›Œ์ง€๊ณ  ๋ฐฉ์ถœ๋œ ์ฝ”๋“œ๊ฐ€ ๋” ๋นจ๋ผ์กŒ์Šต๋‹ˆ๋‹ค.

ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์‚ฌ์†Œํ•œ ์ผ์€ ์•„๋‹™๋‹ˆ๋‹ค. VM์—์„œ ์ด๋ฅผ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ผ ์„ ํ˜• ํŒจ์Šค์—์„œ๋Š” ์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ˜„์žฌ ๋Œ€๋ถ€๋ถ„์˜ VM์— ์žˆ๋Š” ๊ธฐ์ค€ ์ปดํŒŒ์ผ๋Ÿฌ์— ๋ฌธ์ œ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. (์‚ฌ์‹ค, ๋ฃจํ”„ ๋ฐฑ ์—์ง€๋ฅผ ์ฐพ๋Š” ๊ฒƒ - ์ด๊ฒƒ์€ ๋” ๊ฐ„๋‹จํ•œ ๋ฌธ์ œ์ด๊ณ  ๋‹ค๋ฅธ ์ด์œ ๋กœ๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค - ๋‹จ์ผ ์ •๋ฐฉํ–ฅ ํŒจ์Šค์—์„œ ์ˆ˜ํ–‰๋  ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ?)

์ž, ์—ฌ๊ธฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•œ ์ œ ์ง€์‹์€ ์ŠคํŠธ๋ฆฌ๋ฐ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„์„ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๊ฑฐ๋‚˜ ๊ฐ์ง€ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์ ˆ๋Œ€์ ์ธ ํ™•์‹ ์„ ๊ฐ€์งˆ ๋งŒํผ ๊ฐ•๋ ฅํ•˜์ง€ ์•Š์ง€๋งŒ, ๊ทธ๋Ÿด ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฒ€์ฆ์€ ์ปดํŒŒ์ผ๊ณผ ํ•จ๊ป˜ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ŠคํŠธ๋ฆฌ๋ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ(๊ท€ํ•˜์™€ ๋ณธ์ธ ๋ชจ๋‘ ์•Œ์ง€ ๋ชปํ•˜๋Š”) ๊ธฐ๋Šฅ์ด ์™„์ „ํžˆ ์ˆ˜์‹ ๋˜๋ฉด ๋น„ ์ŠคํŠธ๋ฆฌ๋ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์–ด๋–ค ์ด์œ ๋กœ) ์ถ•์†Œํ•  ์ˆ˜ ์—†๋Š” ์ œ์–ด ํ๋ฆ„์ด ๋ฌดํ•œ ๋ฃจํ”„์™€ ๊ฐ™์ด ์ •๋ง ๋‚˜์œ ๊ฒƒ์œผ๋กœ ์ด์–ด์ง€๋Š” ๊ฒฝ์šฐ, ๋‹จ์ˆœํžˆ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์„ ์ดˆ๊ณผํ•˜๊ฑฐ๋‚˜ ์ปดํŒŒ์ผ ์Šค๋ ˆ๋“œ๋ฅผ ์ทจ์†Œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ์‚ฌ์‹ค์ผ ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์„ ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์–ด์ฉŒ๋ฉด ๋‚ด๊ฐ€ ๊ธฐ์ค€ ์ปดํŒŒ์ผ๋Ÿฌ์— ๋Œ€ํ•œ ๊ธฐ๋Œ€์น˜๋ฅผ ์˜คํ•ดํ•˜๊ณ  ์žˆ์„์ง€๋„ ๋ชจ๋ฅด์ง€๋งŒ ๊ทธ๋“ค์ด ์™œ ์‹ ๊ฒฝ์„ ์“ฐ๊ฒ ์Šต๋‹ˆ๊นŒ? goto๊ฐ€ ๋ณด์ด๋ฉด ์ ํ”„ ๋ช…๋ น์„ ์‚ฝ์ž…ํ•˜์‹ญ์‹œ์˜ค.

Wasm์˜ ๋ฌดํ•œ ๋ ˆ์ง€์Šคํ„ฐ ๊ธฐ๊ณ„(์•„๋‹ˆ์š”, ์Šคํƒ ๊ธฐ๊ณ„๊ฐ€ ์•„๋‹˜)๋ฅผ ๋ฌผ๋ฆฌ์  ํ•˜๋“œ์›จ์–ด์˜ ์œ ํ•œ ๋ ˆ์ง€์Šคํ„ฐ์— ๋งคํ•‘ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡๊ฒŒ ๊ฐ„๋‹จ

๋‚ด๊ฐ€ ์ž‘์—…ํ•œ ์ŠคํŠธ๋ฆฌ๋ฐ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ž„์˜์˜ - ์‹ฌ์ง€์–ด ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ - CFG๋ฅผ ์ž˜ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠน๋ณ„ํžˆ ํŠน๋ณ„ํ•œ ์ผ์„ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์ฒ˜์Œ์œผ๋กœ ์ ํ”„ํ•ด์•ผ ํ•  ๋•Œ ๊ฐ ๋ธ”๋ก์— "ํ˜ธ์ถœ ๊ทœ์น™"(๊ธฐ๋ณธ์ ์œผ๋กœ ํ•ด๋‹น ๋ธ”๋ก์˜ ๋ฒ”์œ„ ๋‚ด ๊ฐ’์ด ์žˆ์–ด์•ผ ํ•˜๋Š” ์œ„์น˜)์„ ํ• ๋‹นํ•˜๊ณ  ์กฐ๊ฑด๋ถ€๋กœ ๋‘ ๋ธ”๋ก์œผ๋กœ ๋ถ„๊ธฐํ•ด์•ผ ํ•˜๋Š” ์ง€์ ์— ๋„๋‹ฌํ•œ ๊ฒฝ์šฐ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” "ํ˜ธ์ถœ ๊ทœ์น™"์ด ์žˆ๋Š” ๋” ๋งŽ์€ ๋Œ€์ƒ์—์„œ "์–ด๋Œ‘ํ„ฐ" ๋ธ”๋ก์„ ๋Œ€๊ธฐ์—ด๋กœ ํ‘ธ์‹œํ•˜๊ณ  ๋‹ค์Œ ๊ฐ€๋Šฅํ•œ ์ง€์ ์—์„œ ๋ฐฉ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ถ•์†Œ ๋ฐ ์ถ•์†Œ ์ œ์–ด ํ๋ฆ„ ๋ชจ๋‘์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ ๊ฑฐ์˜ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•ž์„œ ๋งํ–ˆ๋“ฏ์ด "์œ ํ•ดํ•œ ์ œ์–ด ํ๋ฆ„์œผ๋กœ ๊ฐ„์ฃผ๋˜๋Š” ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„"์€ ๊ธฐ์ˆ ์ ์ธ ์ฃผ์žฅ์ด ์•„๋‹ˆ๋ผ ํ™”๋‘์ž…๋‹ˆ๋‹ค. ์ œ์–ด ํ๋ฆ„์„ CFG๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด ์ŠคํŠธ๋ฆฌ๋ฐ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ํ›จ์”ฌ ๋” ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์—ฌ๋Ÿฌ ๋ฒˆ ๋งํ–ˆ๋“ฏ์ด ๊ด‘๋ฒ”์œ„ํ•œ ๊ฐœ์ธ ๊ฒฝํ—˜์„ ํ†ตํ•ด ์ด๋ฅผ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ํ™˜์›ํ•  ์ˆ˜ ์—†๋Š” ์ œ์–ด ํ๋ฆ„์ด ๊ตฌํ˜„์„ ์ž‘์„ฑํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“œ๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ(๊ทธ ์ค‘ ์•„๋ฌด ๊ฒƒ๋„ ์ƒ๊ฐํ•  ์ˆ˜ ์—†์Œ)๋Š” ์Šคํ„ฐ๋ธŒ ์ฒ˜๋ฆฌ๋˜์–ด ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ๋ฆ„์€ ์ถ•์†Œํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ(๋”ฐ๋ผ์„œ ์ถ•์†Œํ•  ์ˆ˜ ์—†๋Š” ์ œ์–ด ํ๋ฆ„์„ ์‹ค์ˆ˜๋กœ ์ˆ˜๋ฝํ•˜์ง€ ์•Š์Œ) ๊ธฐ์ค€ ์ปดํŒŒ์ผ๋Ÿฌ ์ž์ฒด์™€ ๋ณ„๋„๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒ๋Œ€์ ์œผ๋กœ ๊ฐ„๋‹จํ•œ ์ŠคํŠธ๋ฆฌ๋ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์กด์žฌํ•œ๋‹ค๊ณ  ๋ฏฟ์„๋งŒํ•œ ์ด์œ ๊ฐ€ ์žˆ๋Š” ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ทธ ์ฃผ์ œ์— ๋Œ€ํ•œ ๊ถŒ์œ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ๋ง์„ ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. CFG์˜ ํ™˜์› ๊ฐ€๋Šฅ์„ฑ์„ ๊ฐ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด์ง€๋งŒ ์ด๊ฒƒ์ด ์‚ฌ์‹ค์ด๋ผ๊ณ  ์ง์ ‘ ๋งํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

@oridb

์–ด์ฉŒ๋ฉด ๋‚ด๊ฐ€ ๊ธฐ์ค€ ์ปดํŒŒ์ผ๋Ÿฌ์— ๋Œ€ํ•œ ๊ธฐ๋Œ€์น˜๋ฅผ ์˜คํ•ดํ•˜๊ณ  ์žˆ์„์ง€๋„ ๋ชจ๋ฅด์ง€๋งŒ ๊ทธ๋“ค์ด ์™œ ์‹ ๊ฒฝ์„ ์“ฐ๊ฒ ์Šต๋‹ˆ๊นŒ? goto๊ฐ€ ๋ณด์ด๋ฉด ์ ํ”„ ๋ช…๋ น์„ ์‚ฝ์ž…ํ•˜์‹ญ์‹œ์˜ค.

๊ธฐ์ค€ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์—ฌ์ „ํžˆ ๋ฃจํ”„ ๋ฐฑ์—์ง€์— ์ถ”๊ฐ€ ๊ฒ€์‚ฌ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋ฏ€๋กœ(์›น์—์„œ ๋งค๋‹ฌ๋ฆฐ ํŽ˜์ด์ง€๊ฐ€ ๊ฒฐ๊ตญ ๋Š๋ฆฐ ์Šคํฌ๋ฆฝํŠธ ๋Œ€ํ™”๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค), ๊ทธ๋Ÿฐ ๊ฒƒ์„ ์‹๋ณ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ทธ๋“ค์€ ํ•ฉ๋ฆฌ์ ์œผ๋กœ ํšจ์œจ์ ์ธ ๋ ˆ์ง€์Šคํ„ฐ ํ• ๋‹น์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค(๊ธฐ์ค€ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ข…์ข… ์ตœ์ ํ™” ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์•ฝ 1/2 ์†๋„๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋‹จ์ผ ํŒจ์Šค๋ฅผ ๊ฐ์•ˆํ•  ๋•Œ ๋งค์šฐ ์ธ์ƒ์ ์ž…๋‹ˆ๋‹ค!). ์กฐ์ธ๊ณผ ๋ถ„ํ• ์„ ํฌํ•จํ•œ ์ œ์–ด ํ๋ฆ„์˜ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๋ฉด ํ›จ์”ฌ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.

@gwvo

์ฆ‰, ์‚ฌ์†Œํ•˜์ง€ ์•Š์€ ๋ชจ๋“  ๊ฒƒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ‘๋ฐฑ์ด ์•„๋‹Œ ์ ˆ์ถฉ์•ˆ์ž…๋‹ˆ๋‹ค. [..] ์šฐ๋ฆฌ๋Š” ๋งŽ์€ ์ด๋“์„ ์–ป์ง€ ๋ชปํ•œ ์ฑ„ ์„ธ์ƒ์„ ๋›ฐ์–ด๋„˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์ด ์ ˆ์ถฉ์ ์ด๋ผ๋Š” ๋ฐ ์ „์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•„๋งˆ๋„ wasm๋„ ๊ทธ ๋‹น์‹œ์—๋Š” ํ‹€๋ ธ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋„๊ตฌ ์ธก๋ฉด์—์„œ ์ด๋Ÿฌํ•œ ๊ณ ๋ฆฌ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ์‹ค์šฉ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ "์‹œ์žฅ์ด ๊ฒฐ์ •"ํ•˜๊ณ  ์—”์ง„์— ๋” ๋‚˜์€ ์ฝ”๋“œ๋ฅผ ๋‚ด๋ณด๋‚ด์•ผ ํ•œ๋‹ค๋Š” ์••๋ ฅ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์‹ค์ œ๋กœ ์šฐ๋ฆฌ๊ฐ€ ์ง€๊ธˆ๊นŒ์ง€ ํ”ผํ–ˆ๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ฐ€์ƒ ๋จธ์‹ ์—์„œ wasm์„ ๊ฐ€๋Šฅํ•œ ํ•œ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ค๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ณต์žกํ•œ ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชฉํ‘œ๋Š” VM์ด โ€‹โ€‹๋” ์ž˜ํ•˜๋„๋ก ์••๋ ฅ์„ ๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋„๊ตฌ ์ธก๋ฉด์—์„œ ์—ด์‹ฌํžˆ ์ผํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@๋ถ€๋ฆฌํžˆ

๋‚˜๋Š” 1๋…„ ๋„˜๊ฒŒ ๋ฒ ์ด์Šค๋ผ์ธ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์ผํ–ˆ๊ณ  Wasm์˜ ์ œ์–ด ํ๋ฆ„์„ CFG๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ค‘๊ฐ„ ๋‹จ๊ณ„๋ฅผ ์ถ”๊ฐ€ํ•œ ํ›„ ๋‚ด ์‚ถ์ด ๋” ์‰ฌ์›Œ์ง€๊ณ  ๋ฐฉ์ถœ๋œ ์ฝ”๋“œ๊ฐ€ ๋” ๋นจ๋ผ์กŒ์Šต๋‹ˆ๋‹ค.

๋งค์šฐ ํฅ๋ฏธ๋กœ์šด! ์–ด๋–ค VM์ด์—ˆ์Šต๋‹ˆ๊นŒ?

๋˜ํ•œ ์‹ฑ๊ธ€ ํŒจ์Šค/์ŠคํŠธ๋ฆฌ๋ฐ์ธ์ง€ ์•„๋‹Œ์ง€(๋งŒ์•ฝ ๊ทธ๋ ‡๋‹ค๋ฉด ๋ฃจํ”„ ๋ฐฑ์—์ง€ ๊ณ„์ธก์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ–ˆ์Šต๋‹ˆ๊นŒ?), ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ป๊ฒŒ ๋ ˆ์ง€์Šคํ„ฐ ํ• ๋‹น์„ ์ˆ˜ํ–‰ํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

์›์น™์ ์œผ๋กœ ๋ฃจํ”„ ๋ฐฑ์—์ง€์™€ ๋ ˆ์ง€์Šคํ„ฐ ํ• ๋‹น์€ ๋ชจ๋‘ ์„ ํ˜• ๋ช…๋ น ์ˆœ์„œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ธฐ๋ณธ ๋ธ”๋ก์€ ์—„๊ฒฉํ•˜๊ฒŒ ์š”๊ตฌํ•˜์ง€ ์•Š๊ณ ๋„ ํ•ฉ๋ฆฌ์ ์ธ topsort์™€ ๊ฐ™์€ ์ˆœ์„œ๋กœ ๋ฐฐ์น˜๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ ๋ฉ๋‹ˆ๋‹ค.

For ๋ฃจํ”„ backedges: backedge๋ฅผ ๋ช…๋ น์–ด ์ŠคํŠธ๋ฆผ์—์„œ ์ด์ „์œผ๋กœ ์ ํ”„ํ•˜๋Š” ๋ช…๋ น์–ด๋กœ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ตœ์•…์˜ ๊ฒฝ์šฐ ๋ธ”๋ก์ด ๊ฑฐ๊พธ๋กœ ๋ฐฐ์น˜๋˜๋ฉด ์—„๊ฒฉํ•˜๊ฒŒ ํ•„์š”ํ•œ ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์€ ๋ฐฑ์—์ง€ ๊ฒ€์‚ฌ๋ฅผ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋ ˆ์ง€์Šคํ„ฐ ํ• ๋‹น์˜ ๊ฒฝ์šฐ: ์ด๊ฒƒ์€ ํ‘œ์ค€ ์„ ํ˜• ์Šค์บ” ๋ ˆ์ง€์Šคํ„ฐ ํ• ๋‹น ์ž…๋‹ˆ๋‹ค. ๋ ˆ์ง€์Šคํ„ฐ ํ• ๋‹น์„ ์œ„ํ•œ ๋ณ€์ˆ˜์˜ ์ˆ˜๋ช…์€ ๊ทธ ์‚ฌ์ด์— ์„ ํ˜•์œผ๋กœ ์žˆ๋Š” ๋ชจ๋“  ๋ธ”๋ก์„ ํฌํ•จํ•˜์—ฌ ๋ณ€์ˆ˜์˜ ์ฒซ ๋ฒˆ์งธ ์–ธ๊ธ‰๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰ โ€‹โ€‹์–ธ๊ธ‰๊นŒ์ง€์ž…๋‹ˆ๋‹ค. ์ตœ์•…์˜ ๊ฒฝ์šฐ ๋ธ”๋ก์ด ์„ž์ด๋ฉด ํ•„์š”ํ•œ ๊ฒƒ๋ณด๋‹ค ๋” ๊ธด ์ˆ˜๋ช…์„ ๊ฐ–๊ฒŒ ๋˜์–ด ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์Šคํƒ์— ๋ฌผ๊ฑด์„ ์Ÿ์•„ ๋ถ“๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์œ ์ผํ•œ ์ถ”๊ฐ€ ๋น„์šฉ์€ ๋‹จ์ผ ์„ ํ˜• ์Šค์บ”์œผ๋กœ ๋ชจ๋“  ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ ๋ณ€์ˆ˜์˜ ์ฒซ ๋ฒˆ์งธ ๋ฐ ๋งˆ์ง€๋ง‰ ์–ธ๊ธ‰์„ ์ถ”์ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. (wasm์˜ ๊ฒฝ์šฐ "๋ณ€์ˆ˜"๊ฐ€ ๋กœ์ปฌ ๋˜๋Š” ์Šคํƒ ์Šฌ๋กฏ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.)

@kripken

Go ์ปดํŒŒ์ผ๋Ÿฌ์— ๋„์›€์ด ๋œ๋‹ค๋ฉด Binaryen CFG ์ฝ”๋“œ๋ฅผ Go๋กœ ์ด์‹ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - @neelance ?

Asyncify๋ฅผ ํ†ตํ•ฉํ•˜๋ ค๋ฉด? ์ œ์•ˆ ์— ๋ง์”€ํ•ด ์ฃผ์‹ญ์‹œ์˜ค.

@comex

์ข‹์€ ์ !

์œ ์ผํ•œ ์ถ”๊ฐ€ ๋น„์šฉ์€ ๊ฐ ๋ณ€์ˆ˜์˜ ์ฒ˜์Œ ์–ธ๊ธ‰๊ณผ ๋งˆ์ง€๋ง‰ ์–ธ๊ธ‰์„ ์ถ”์ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋„ค, ์ƒ๋‹นํ•œ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์„ ํ˜• ์Šค์บ” ๋ ˆ์ง€์Šคํ„ฐ ํ• ๋‹น์€ ์‹ค์ œ๋กœ ๋น ๋ฅธ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฐฉ์‹์œผ๋กœ ์ปดํŒŒ์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ wasm ๊ธฐ์ค€ ์ปดํŒŒ์ผ๋Ÿฌ ๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚ซ์Šต๋‹ˆ๋‹ค(ํ•˜์ง€๋งŒ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ๋Š๋ฆผ). ์ฆ‰, ๊ฐ ๋ณ€์ˆ˜์˜ ๋งˆ์ง€๋ง‰ ์–ธ๊ธ‰์„ ์ฐพ๋Š” ์ดˆ๊ธฐ ๋‹จ๊ณ„๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‹จ์ผ ํŒจ์Šค๋กœ ์ปดํŒŒ์ผํ•˜๊ณ  ๋‚˜์ค‘์— wasm ํ•จ์ˆ˜์—์„œ ์ฝ”๋“œ๋ฅผ ๋ณด์ง€ ์•Š๊ณ  ์ฝ”๋“œ๋ฅผ ๋‚ด๋ณด๋‚ด๊ณ  ๊ตฌ์กฐ์˜ ๋„์›€์„ ๋ฐ›์•„ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ทธ๋“ค์ด๊ฐ€๋Š”๋Œ€๋กœ ์„ ํƒ ( "๋ฐ”๋ณด"ํ•ด๋‹น ๊ฒŒ์‹œ๋ฌผ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋‹จ์–ด์ž…๋‹ˆ๋‹ค).

๋ ˆ์ง€์Šคํ„ฐ ํ• ๋‹น์— ๋Œ€ํ•œ V8์˜ ์ŠคํŠธ๋ฆฌ๋ฐ ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋ธ”๋ก์ด ์ฒ˜๋ฆฌํ•˜๋Š” ์œ ์ผํ•œ ์ˆ˜๋ช…์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ธ”๋ก์ด ์ƒํ˜ธ ์žฌ๊ท€์ ์œผ๋กœ ํ—ˆ์šฉ๋˜๋Š” ๊ฒฝ์šฐ(https://github.com/WebAssembly/design/issues/796#issuecomment-742690194์—์„œ์™€ ๊ฐ™์ด) ์ž˜ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ผ ๋ธ”๋ก(์Šคํƒ) ๋‚ด์—์„œ ๋ฐ”์ธ๋”ฉ๋˜๊ฑฐ๋‚˜ ๊ธฐ๋Šฅ ์ „์ฒด(๋กœ์ปฌ)๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค.

IIUC( @titzer ์˜ ์˜๊ฒฌ ์ฐธ์กฐ) V8์˜ ์ฃผ์š” ๋ฌธ์ œ๋Š” Turbofan์ด ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” CFG์˜ ์ข…๋ฅ˜์— ์žˆ์Šต๋‹ˆ๋‹ค.

@kripken

๋ณต์žกํ•œ ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋„๋ก VM์—์„œ wasm์„ ๊ฐ€๋Šฅํ•œ ํ•œ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ค๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ "๋ณต์žกํ•œ ์ตœ์ ํ™”"๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. goto๋Š” ๋งŽ์€ ์‹œ์Šคํ…œ์—์„œ ๋ฏฟ์„ ์ˆ˜ ์—†์„ ์ •๋„๋กœ ๊ธฐ๋ณธ์ ์ด๊ณ  ์ž์—ฐ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ ๋น„์šฉ ์—†์ด ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ๋งŽ์€ ์—”์ง„์ด ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ์ด์œ ๋กœ๋“  ๊ตฌ์กฐํ™”๋œ CFG ๋ชจ๋ธ์„ ์œ ์ง€ํ•˜๋ ค๋Š” ์—”์ง„์ด ์žˆ๋‹ค๋ฉด ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ €๋Š” LLVM(ํ˜„์žฌ ์šฐ๋ฆฌ์˜ 1์œ„ Wasm ์ƒ์‚ฐ์ž)์ด ์ฃผ์š” ์—”์ง„์—์„œ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ํ™•์‹ ์ด ์žˆ์„ ๋•Œ๊นŒ์ง€ funclet ์‚ฌ์šฉ์œผ๋กœ ์ „ํ™˜ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

@kripken Wasmtime ์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค. ์˜ˆ, ์ŠคํŠธ๋ฆฌ๋ฐ์ด๊ณ  O(N) ๋ณต์žก์„ฑ์„ ์˜๋„ํ–ˆ์ง€๋งŒ ์™„์ „ํžˆ ์‹คํ˜„๋˜๊ธฐ ์ „์— ์ƒˆ ํšŒ์‚ฌ๋กœ ์˜ฎ๊ฒผ์œผ๋ฏ€๋กœ "O(N)-ish"์ž…๋‹ˆ๋‹ค. https://github.com/bytecodealliance/wasmtime/tree/main/crates/lightbeam

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค @Vurich , ํฅ๋ฏธ๋กญ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์‹œ์ž‘๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ฒ˜๋ฆฌ๋Ÿ‰์— ๋Œ€ํ•ด์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ์„ฑ๋Šฅ ์ˆ˜์น˜๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์ ‘๊ทผ ๋ฐฉ์‹์€ V8 ๋ฐ SpiderMonkey ์—”์ง€๋‹ˆ์–ด๊ฐ€ ์ทจํ•œ ์ ‘๊ทผ ๋ฐฉ์‹๋ณด๋‹ค ์ปดํŒŒ์ผ ์†๋„๊ฐ€ ๋” ๋Š๋ฆฌ๋ฉด์„œ ๋” ๋น ๋ฅธ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๊ณต๊ฐ„์—์„œ๋Š” ๋‹ค๋ฅธ ์ ˆ์ถฉ์•ˆ์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์˜ ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋‹น์‹ ์ด ๋งํ–ˆ๋“ฏ์ด wasm์˜ ๊ตฌ์กฐํ™”๋œ ์ œ์–ด ํ๋ฆ„์˜ ์ด์ ์„ ์–ป์ง€ ๋ชปํ•˜๋Š” ๋ฐ˜๋ฉด ๊ทธ๋“ค์˜ ์ ‘๊ทผ ๋ฐฉ์‹์€ ๊ทธ๋Ÿด๋“ฏํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

์•„๋‹ˆ์š”, ์ŠคํŠธ๋ฆฌ๋ฐ ์ปดํŒŒ์ผ๋Ÿฌ์ด๊ณ  ๋‘ ์—”์ง„ ์ค‘ ํ•˜๋‚˜๋ณด๋‹ค ๋” ๋น ๋ฅด๊ฒŒ ์ฝ”๋“œ๋ฅผ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค(๋น„๋ก ๋‚ด๊ฐ€ ํ”„๋กœ์ ํŠธ๋ฅผ ๋– ๋‚ฌ์„ ๋•Œ ์ˆ˜์ •๋˜์ง€ ์•Š์€ ํ‡ดํ™” ์‚ฌ๋ก€๊ฐ€ ์žˆ๊ธด ํ•˜์ง€๋งŒ). ๋น ๋ฅธ ์ฝ”๋“œ๋ฅผ ๋‚ด๋ณด๋‚ด๊ธฐ ์œ„ํ•ด ์ตœ์„ ์„ ๋‹คํ–ˆ์ง€๋งŒ ์ฃผ๋กœ ์ถœ๋ ฅ์˜ ํšจ์œจ์„ฑ์ด ๋ถ€์ฐจ์ ์ธ ๊ด€์‹ฌ์‚ฌ์ธ ์ฝ”๋“œ๋ฅผ ๋น ๋ฅด๊ฒŒ ๋‚ด๋ณด๋‚ด๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์•„๋Š” ํ•œ ์‹œ์ž‘ ๋น„์šฉ์€ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š๊ณ  ์‹œ์ž‘๋˜๊ณ  ์ปดํŒŒ์ผ์ด ๋ช…๋ น์–ด๋ณ„๋กœ ์ˆ˜ํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— 0(๋ฐฑ์—”๋“œ ๊ฐ„์— ๊ณต์œ ๋˜๋Š” Wasmtime์˜ ๊ณ ์œ  ๋น„์šฉ ์ด์ƒ)์ž…๋‹ˆ๋‹ค. V8 ๋˜๋Š” SpiderMonkey์™€ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋Š” ์ˆซ์ž๋Š” ์—†์ง€๋งŒ Cranelift(wasmtime์˜ ๊ธฐ๋ณธ ์—”์ง„)์™€ ๋น„๊ตํ•  ์ˆซ์ž๋Š” ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์‹œ์ ์—์„œ ๋ช‡ ๊ฐœ์›”์ด ์ง€๋‚ฌ์ง€๋งŒ Cranelift๋ณด๋‹ค ๋” ๋น ๋ฅด๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Cranelift๋ณด๋‹ค ๋” ๋น ๋ฅธ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋‹น์‹œ์—๋Š” SpiderMonkey๋ณด๋‹ค ๋” ๋น ๋ฅธ ์ฝ”๋“œ๋„ ๋‚ด๋ณด๋ƒˆ์ง€๋งŒ, ๋‚ด ๋ง์„ ๋ฏฟ์–ด์•ผ ํ•˜๋ฏ€๋กœ ๋‚ด ๋ง์„ ๋ฏฟ์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ•ด์„œ ๋‹น์‹ ์„ ๋น„๋‚œํ•˜์ง€๋Š” ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ตœ์‹  ์ˆ˜์น˜๋Š” ์—†์ง€๋งŒ ํ˜„์žฌ ์ƒํƒœ๋Š” Cranelift์™€ SpiderMonkey๊ฐ€ Lightbeam๊ณผ ๋น„๊ตํ•  ๋•Œ ์ด๋Ÿฌํ•œ ๋งˆ์ดํฌ๋กœ๋ฒค์น˜๋งˆํฌ์—์„œ ๋‚ฎ์€ ์„ฑ๋Šฅ์˜ ์ถœ๋ ฅ์˜ ์ฃผ์š” ์›์ธ์ด์—ˆ๋˜ ์†Œ์ˆ˜์˜ ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•œ ์ƒํƒœ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ปดํŒŒ์ผ ์†๋„ ์ฐจ์ด๋Š” ๋‚ด๊ฐ€ ํ”„๋กœ์ ํŠธ์— ์žˆ๋Š” ๋‚ด๋‚ด ๋ณ€ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ฐ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์—ฌ์ „ํžˆ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋™์ผํ•˜๊ฒŒ ์„ค๊ณ„๋˜์–ด ์žˆ๊ณ  ์„œ๋กœ ๋‹ค๋ฅธ ์ˆ˜์ค€์˜ ์„ฑ๋Šฅ์„ ์ด๋Œ์–ด๋‚ด๋Š” ๊ฒƒ์€ ๊ฐ๊ฐ์˜ ์•„ํ‚คํ…์ฒ˜์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์˜ ์ถ”์ธก์— ๊ฐ์‚ฌํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ์„ค๋ช…ํ•œ ๋ฐฉ๋ฒ•์ด ๋” ๋Š๋ฆด ๊ฒƒ์ด๋ผ๋Š” ๋‹น์‹ ์˜ ๊ฐ€์ •์ด ์–ด๋””์—์„œ ์˜ค๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ๋ฒค์น˜๋งˆํฌ์ž…๋‹ˆ๋‹ค. ::compile ๋ฒค์น˜๋งˆํฌ๋Š” ์ปดํŒŒ์ผ ์†๋„์— ๋Œ€ํ•œ ๊ฒƒ์ด๊ณ  ::run ๋ฒค์น˜๋งˆํฌ๋Š” ๊ธฐ๊ณ„ ์ฝ”๋“œ ์ถœ๋ ฅ์˜ ์‹คํ–‰ ์†๋„์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. https://gist.github.com/Vurich/8696e67180aa3c93b4548fb1f298c29e

๋ฐฉ๋ฒ•๋ก ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ณต์ œํ•˜๊ณ  ๋ฒค์น˜๋งˆํฌ๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ์ง์ ‘ ํ™•์ธํ•  ์ˆ˜ ์žˆ์ง€๋งŒ PR์€ ์ตœ์‹  ๋ฒ„์ „์˜ wasmtime๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋งˆ์ง€๋ง‰์œผ๋กœ ์—…๋ฐ์ดํŠธํ•œ ์‹œ์ ์˜ ์„ฑ๋Šฅ ๋น„๊ต๋งŒ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ํ™๋ณด https://github.com/bytecodealliance/wasmtime/pull/1660

์ฆ‰, ๋‚ด ์ฃผ์žฅ์€ CFG๊ฐ€ ์ŠคํŠธ๋ฆฌ๋ฐ ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์„ฑ๋Šฅ์— ๋Œ€ํ•œ ์œ ์šฉํ•œ ๋‚ด๋ถ€ ํ‘œํ˜„์ด๋ผ๋Š” _์•„๋‹™๋‹ˆ๋‹ค_. ๋‚ด ์ฃผ์žฅ์€ CFG๊ฐ€ ๋ชจ๋“  ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์„ฑ๋Šฅ์— ๋ถ€์ •์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์œผ๋ฉฐ GCC ๋ฐ Go ํŒ€์ด WebAssembly๋ฅผ ์ƒ์‚ฐํ•˜์ง€ ๋ชปํ•˜๋„๋ก ์™„์ „ํžˆ ์ž ๊ทธ๋Š” ๊ฒƒ์„ ์ •๋‹นํ™”ํ•  ์ˆ˜์ค€์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์Šค๋ ˆ๋“œ์—์„œ funclets ๋˜๋Š” wasm์— ๋Œ€ํ•œ ์œ ์‚ฌํ•œ ํ™•์žฅ์— ๋Œ€ํ•ด ๋…ผ์Ÿํ•˜๋Š” ์‚ฌ๋žŒ์€ ๊ฑฐ์˜ ์•„๋ฌด๋„ ์ด ์ œ์•ˆ์— ์˜ํ•ด ๋ถ€์ •์ ์ธ ์˜ํ–ฅ์„ ๋ฐ›์„ ๊ฒƒ์ด๋ผ๊ณ  ์ฃผ์žฅํ•˜๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ์‹ค์ œ๋กœ ์ž‘์—…ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด ์ฃผ์ œ์— ๋Œ€ํ•ด ๋…ผํ‰ํ•˜๊ธฐ ์œ„ํ•ด ์ง์ ‘ ๊ฒฝํ—˜์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์–ด๋Š ์ •๋„ ๊ฐ€์น˜ ์žˆ๋Š” ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์ž์ „๊ฑฐ ๋ณด๊ด€์†Œ์˜ ์ƒ‰์ƒ์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ์˜๊ฒฌ์„ ๊ฐ–๋Š” ๊ฒƒ๊ณผ ์ž์ „๊ฑฐ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ ์‚ฌ์ด์—๋Š” ์„ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ํœด ์ถ”์ธก์— ๊ทผ๊ฑฐํ•œ ์ฃผ์žฅ.

@๋ถ€๋ฆฌํžˆ

์•„๋‹ˆ์š”, ์ŠคํŠธ๋ฆฌ๋ฐ ์ปดํŒŒ์ผ๋Ÿฌ์ด๊ณ  ๋‘ ์—”์ง„ ์ค‘ ํ•˜๋‚˜๋ณด๋‹ค ๋” ๋น ๋ฅด๊ฒŒ ์ฝ”๋“œ๋ฅผ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค(๋น„๋ก ๋‚ด๊ฐ€ ํ”„๋กœ์ ํŠธ๋ฅผ ๋– ๋‚ฌ๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜์ •๋˜์ง€ ์•Š์€ ํ‡ดํ™” ์‚ฌ๋ก€๊ฐ€ ์žˆ๊ธด ํ•˜์ง€๋งŒ).

์ด์ „์— ์ถฉ๋ถ„ํžˆ ๋ช…ํ™•ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๊ฐ™์€ ๊ฒƒ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ํ•ด๋‹น ์—”์ง„์˜ ๊ธฐ๋ณธ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์˜๋ฏธํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  V8๊ณผ SpiderMonkey๊ฐ€ ์ด ์šฉ์–ด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์˜๋ฏธ์—์„œ ๊ธฐ์ค€ ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์š”์ ์ธ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ V8 ๋ฐ SpiderMonkey ๊ธฐ์ค€ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์„ ๋Šฅ๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํšŒ์˜์ ์ธ ์ด์œ ๋Š” ์ด์ „์— ์ œ๊ณต ํ•œ ๋งํฌ ์—์„œ์™€ ๊ฐ™์ด ๋‘ ๊ธฐ์ค€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ๋Œ€ํ•ด ์—„์ฒญ๋‚˜๊ฒŒ ์กฐ์ •๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ ๋‚ด๋ถ€ IR์„ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  wasm์—์„œ ๊ธฐ๊ณ„ ์ฝ”๋“œ๋กœ ๋ฐ”๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋‚ด๋ถ€ IR(CFG์˜ ๊ฒฝ์šฐ)์„ ๋‚ด๋ณด๋‚ธ๋‹ค๊ณ  ๋ง์”€ํ•˜์…จ์Šต๋‹ˆ๋‹ค. - ๊ทธ ๋•Œ๋ฌธ์—(๋” ๋งŽ์€ ๋ถ„๊ธฐ, ๋ฉ”๋ชจ๋ฆฌ ๋Œ€์—ญํญ ๋“ฑ์œผ๋กœ ์ธํ•ด) ์ปดํŒŒ์ผ ์‹œ๊ฐ„์ด ๋Š๋ ค์งˆ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ๊ธฐ์ค€ ์ปดํŒŒ์ผ๋Ÿฌ์— ๋Œ€ํ•ด ๋ฒค์น˜๋งˆํ‚นํ•˜์‹ญ์‹œ์˜ค! ๋‚ด ์ถ”์ธก์ด ํ‹€๋ ธ์Œ์„ ๋ณด์—ฌ์ฃผ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. V8 ๋ฐ SpiderMonkey ์—”์ง€๋‹ˆ์–ด๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๊ทธ๋“ค์ด ์ฑ„ํƒ์„ ๊ณ ๋ คํ•ด์•ผ ํ•  ๋” ๋‚˜์€ ๋””์ž์ธ์„ ๋ฐœ๊ฒฌํ–ˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

V8์— ๋Œ€ํ•ด ํ…Œ์ŠคํŠธํ•˜๋ ค๋ฉด d8 --liftoff --no-wasm-tier-up ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ณ  SpiderMonkey์˜ ๊ฒฝ์šฐ sm --wasm-compiler=baseline ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(Cranelift์™€ ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•œ ์ง€์นจ์— ๊ฐ์‚ฌํ•˜์ง€๋งŒ Cranelift๋Š” ๊ธฐ์ค€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์„ ์ด์™€ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์€ ์ด ์ปจํ…์ŠคํŠธ์—์„œ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋งค์šฐ ํฅ๋ฏธ๋กญ์ง€๋งŒ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.)

๋‚ด ์ง๊ด€์€ ๋ฒ ์ด์Šค๋ผ์ธ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์–ด์จŒ๋“  ์˜๋ฏธ ์žˆ๋Š” ๋ธ”๋ก ๊ฐ„ ์ตœ์ ํ™”๋ฅผ ์‹œ๋„ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— funclet/ multiloop ๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ์ปดํŒŒ์ผ ์ „๋žต์„ ํฌ๊ฒŒ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. @kripken ์ด ์ฐธ์กฐ ํ•˜๋Š” "์กฐ์ธ ๋ฐ ๋ถ„ํ• ์„ ํฌํ•จํ•œ ์ œ์–ด ํ๋ฆ„์˜ ๊ตฌ์กฐ"์— ์˜์กดํ•˜๋Š” ๊ฒƒ์€ ์ƒํ˜ธ ์žฌ๊ท€ ๋ธ”๋ก ์ปฌ๋ ‰์…˜์— ๋Œ€ํ•œ ๋ชจ๋“  ์ž…๋ ฅ ์œ ํ˜•์ด ์ „๋ฐฉ์œผ๋กœ ์„ ์–ธ๋˜๋„๋ก ์š”๊ตฌํ•จ์œผ๋กœ์จ ์ถฉ์กฑ๋ฉ๋‹ˆ๋‹ค(์–ด์จŒ๋“  ์ŠคํŠธ๋ฆฌ๋ฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์œ„ํ•œ ์ž์—ฐ์Šค๋Ÿฌ์šด ์„ ํƒ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค) . Lightbeam/Wasmtime์ด ์—”์ง„ ๊ธฐ์ค€ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๋Šฅ๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋Š” ์ด๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ์ ์€ ์—”์ง„ ๊ธฐ์ค€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ง€๊ธˆ์ฒ˜๋Ÿผ ๋น ๋ฅด๊ฒŒ ์œ ์ง€๋  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค.

FWIW, ์ €๋Š” ์ด ๊ธฐ๋Šฅ์ด ํ–ฅํ›„ CG ํšŒ์˜์—์„œ ๋…ผ์˜๋˜๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์—”์ง„ ๋‹ด๋‹น์ž๊ฐ€ ๊ตฌํ˜„ํ•  ์ค€๋น„๊ฐ€ ๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด ์Šค์Šค๋กœ ๋ฐ˜๋Œ€ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” @Vurich์˜ ์˜๊ฒฌ์— ๋Œ€์ฒด๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์šฐ๋ฆฌ๋Š” ๊ทธ๋Ÿฌํ•œ ๋ฐ˜๋Œ€๋ฅผ ์ง„์ง€ํ•˜๊ฒŒ ๋ฐ›์•„๋“ค์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค(์ด ๊ธฐ๋Šฅ์„ ์ถ”๊ตฌํ•  ๋•Œ JavaScript Proper Tail Calls saga ์˜ WebAssembly ๋ฒ„์ „์„ ํ”ผํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ด์ „์— ์ง์ ‘ ํšŒ์˜์—์„œ ์˜๊ฒฌ์„ ๋‚˜๋ˆด์Šต๋‹ˆ๋‹ค). ๋‚˜๋Š” (ํ˜„์žฌ ๋งค์šฐ ๋Šฆ์€) ๋…ผ๋ฌธ ์ œ์ถœ์„ ๋งˆ์น˜๋ฉด ์ƒˆํ•ด์— ๊ทธ๋Ÿฌํ•œ CG ํ† ๋ก ์„ ๋จผ์ € ์‹œ์ž‘ํ•˜๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.

@kripken

๋„ค, ์ƒ๋‹นํ•œ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์„ ํ˜• ์Šค์บ” ๋ ˆ์ง€์Šคํ„ฐ ํ• ๋‹น์€ ์‹ค์ œ๋กœ ๋น ๋ฅธ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฐฉ์‹์œผ๋กœ ์ปดํŒŒ์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ wasm ๊ธฐ์ค€ ์ปดํŒŒ์ผ๋Ÿฌ ๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚ซ์Šต๋‹ˆ๋‹ค(ํ•˜์ง€๋งŒ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ๋Š๋ฆผ). ์ฆ‰, ๊ฐ ๋ณ€์ˆ˜์˜ ๋งˆ์ง€๋ง‰ ์–ธ๊ธ‰์„ ์ฐพ๋Š” ์ดˆ๊ธฐ ๋‹จ๊ณ„๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‹จ์ผ ํŒจ์Šค๋กœ ์ปดํŒŒ์ผํ•˜๊ณ  ๋‚˜์ค‘์— wasm ํ•จ์ˆ˜์—์„œ ์ฝ”๋“œ๋ฅผ ๋ณด์ง€ ์•Š๊ณ  ์ฝ”๋“œ๋ฅผ ๋‚ด๋ณด๋‚ด๊ณ  ๊ตฌ์กฐ์˜ ๋„์›€์„ ๋ฐ›์•„ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ทธ๋“ค์ด๊ฐ€๋Š”๋Œ€๋กœ ์„ ํƒ ( "๋ฐ”๋ณด"ํ•ด๋‹น ๊ฒŒ์‹œ๋ฌผ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋‹จ์–ด์ž…๋‹ˆ๋‹ค).

์™€, ์ •๋ง ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด์—... ๊ทธ ํŠน์ • ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ตฌ์กฐํ™”๋œ ์ œ์–ด ํ๋ฆ„์˜ ๊นŠ์€ ์†์„ฑ์— ์˜์กดํ•˜์ง€ ์•Š์„ ์ •๋„๋กœ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์กฐํ™”๋œ ์ œ์–ด ํ๋ฆ„์˜ ์–•์€ ์†์„ฑ์—๋„ ๊ฑฐ์˜ ์˜์กดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด SpiderMonkey์˜ wasm ๊ธฐ์ค€ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ณ ์ • ABI๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ wasm ์Šคํƒ์—์„œ ๊ธฐ๋ณธ ์Šคํƒ ๋ฐ ๋ ˆ์ง€์Šคํ„ฐ๋กœ ๋งคํ•‘ํ•˜๋Š” ๋Œ€์‹  "์ œ์–ด ํ๋ฆ„ ์กฐ์ธ"(์ฆ‰, ์—ฌ๋Ÿฌ ์„ ํ–‰ ์ž‘์—…์ด ์žˆ๋Š” ๊ธฐ๋ณธ ๋ธ”๋ก)์„ ํ†ตํ•ด ๋ ˆ์ง€์Šคํ„ฐ ํ• ๋‹น์ž ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. . ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ œ์–ด ํ๋ฆ„ ์กฐ์ธ์ด ์•„๋‹ˆ๋”๋ผ๋„ ๋ธ”๋ก์„ ์ž…๋ ฅํ•  ๋•Œ ๊ณ ์ • ABI๋„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค!

๊ณ ์ • ABI๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค(x86์—์„œ).

  • ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ˆ˜๊ฐ€ 0์ด ์•„๋‹Œ ๊ฒฝ์šฐ (๋ธ”๋ก์— ๋“ค์–ด๊ฐˆ ๋•Œ) ๋˜๋Š” ๋ฐ˜ํ™˜ํ•  ๋•Œ(๋ธ”๋ก์„ ๋‚˜๊ฐˆ ๋•Œ), wasm ์Šคํƒ์˜ ๋งจ ์œ„๋Š” rax ์— ๋“ค์–ด๊ฐ€๊ณ  ๋‚˜๋จธ์ง€ wasm ์Šคํƒ์€ x86์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ์Šคํƒ.
  • ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ „์ฒด wasm ์Šคํƒ์ด x86 ์Šคํƒ์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์™œ ์ค‘์š”ํ•ฉ๋‹ˆ๊นŒ?

์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํ›จ์”ฌ ์ ์€ ์ •๋ณด๋กœ ๊ฑฐ์˜ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์‚ฌ๊ณ  ์‹คํ—˜์œผ๋กœ ๊ธฐ๋ณธ ์–ด์…ˆ๋ธ”๋ฆฌ์™€ ์œ ์‚ฌํ•œ ๊ตฌ์กฐํ™”๋œ ์ œ์–ด ํ๋ฆ„ ์ง€์นจ์ด ์—†๊ณ  ์ ํ”„ ์ง€์นจ๋งŒ ์žˆ๋Š” ๋Œ€์ฒด ์šฐ์ฃผ ๋ฒ„์ „์˜ WebAssembly๋ฅผ ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค. ์–ด๋–ค ๋ช…๋ น์ด ์ ํ”„์˜ ๋Œ€์ƒ์ธ์ง€ ์•Œ๋ ค์ฃผ๋Š” ํ•œ ๊ฐ€์ง€ ์ถ”๊ฐ€ ์ •๋ณด๋กœ ๋ณด๊ฐ•๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ช…๋ น์„ ์„ ํ˜•์œผ๋กœ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ ํ”„ ๋ฐ ์ ํ”„ ๋Œ€์ƒ ์ „์— ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ๊ณ ์ • ABI๋กœ ํ”Œ๋Ÿฌ์‹œํ•ฉ๋‹ˆ๋‹ค.

ํ•œ ๊ฐ€์ง€ ์ฐจ์ด์ ์€ ๊ณ ์ • ABI๊ฐ€ ๋‘ ๊ฐœ๊ฐ€ ์•„๋‹ˆ๋ผ ํ•œ ๊ฐœ์—ฌ์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์Šคํƒ ์ƒ๋‹จ ๊ฐ’์ด ์˜๋ฏธ์ƒ ์ ํ”„์˜ '๊ฒฐ๊ณผ'์ธ ๊ฒƒ๊ณผ ์™ธ๋ถ€ ๋ธ”๋ก์—์„œ ์Šคํƒ์— ๋‚จ์•„ ์žˆ๋Š” ๊ฒƒ์„ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฌด์กฐ๊ฑด rax ์ตœ์ƒ์œ„ ์Šคํƒ์„ ๋„ฃ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ์„ฑ๋Šฅ์— ๋Œ€ํ•œ ์ธก์ • ๊ฐ€๋Šฅํ•œ ๋น„์šฉ์ด ๋  ๊ฒƒ์ธ์ง€ ์˜์‹ฌ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๋ฌด์—‡์ด๋“  ๊ฐœ์„ ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(๊ฒ€์ฆ๋„ ๋‹ค๋ฅด์ง€๋งŒ ์—ฌ์ „ํžˆ ๋‹จ์ผ ํŒจ์Šค์ž…๋‹ˆ๋‹ค.)

์ข‹์•„์š”, ์‚ฌ์ „ ์ฃผ์˜์‚ฌํ•ญ:

  1. ์ด๊ฒƒ์€ ๋Œ€์ฒด ์šฐ์ฃผ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ธฐ์กด WebAssembly์— ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜๋Š” ํ™•์žฅ์„ ๋งŒ๋“œ๋Š” ๋ฐ ์–ด๋ ค์›€์„ ๊ฒช๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  2. SpiderMonkey์˜ ๊ธฐ์ค€ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋‹จ์ง€ ํ•˜๋‚˜์˜ ๊ตฌํ˜„์ผ ๋ฟ์ด๋ฉฐ ๋ ˆ์ง€์Šคํ„ฐ ํ• ๋‹น๊ณผ ๊ด€๋ จํ•˜์—ฌ ์ฐจ์„ ์ฑ…์ผ ๊ฐ€๋Šฅ์„ฑ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์กฐ๊ธˆ๋งŒ ๋” ๋˜‘๋˜‘ํ–ˆ๋‹ค๋ฉด ๋Ÿฐํƒ€์ž„ ์ด์ ์ด ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ๋น„์šฉ๋ณด๋‹ค ํด ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  3. ๊ธฐ์ค€ ์ปดํŒŒ์ผ๋Ÿฌ์— ์ถ”๊ฐ€ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋”๋ผ๋„ ์ตœ์ ํ™” ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋น ๋ฅธ SSA ๊ตฌ์„ฑ์„ ์œ„ํ•ด ์ถ”๊ฐ€ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ์—ผ๋‘์— ๋‘๊ณ  ์œ„์˜ ์‚ฌ๊ณ  ์‹คํ—˜์€ ๊ธฐ์ค€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ตฌ์กฐํ™”๋œ ์ œ์–ด ํ๋ฆ„์„ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๋‚˜์˜ ๋ฏฟ์Œ์„ ๊ฐ•ํ™”ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋‚ฎ์€ ์ˆ˜์ค€์˜ ๊ตฌ์„ฑ์„ ์ถ”๊ฐ€ํ–ˆ๋Š”์ง€์— ๊ด€๊ณ„์—†์ด, ์–ด๋–ค ๋ช…๋ น์–ด๊ฐ€ ์ ํ”„ ๋Œ€์ƒ์ธ์ง€์™€ ๊ฐ™์€ ๊ธฐ๋ณธ ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š” ํ•œ, ๋ฒ ์ด์Šค๋ผ์ธ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์‚ฌ์†Œํ•œ ๋ณ€๊ฒฝ๋งŒ์œผ๋กœ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ์ ์–ด๋„ ์ด๊ฒƒ์€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@ conrad -watt

์•„์ฃผ ์ข‹์€ ์ ๋“ค์ž…๋‹ˆ๋‹ค! ๋ฒ ์ด์Šค๋ผ์ธ ์ปดํŒŒ์ผ๋Ÿฌ์— ๋Œ€ํ•œ ๋‚˜์˜ ์ง๊ด€์€ ์ž˜๋ชป๋œ ๊ฒƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  @comex - ์˜ˆ, ๋‹น์‹ ์ด ๋งํ–ˆ๋“ฏ์ด ์ด ๋…ผ์˜๋Š” SSA๊ฐ€ ๊ตฌ์กฐ์˜ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ตœ์ ํ™” ์ปดํŒŒ์ผ๋Ÿฌ์™€ ๋ณ„๊ฐœ์ž…๋‹ˆ๋‹ค. ์ด์ „ ๋งํฌ ์ค‘ ํ•˜๋‚˜์—์„œ ์•ฝ๊ฐ„ ์ธ์šฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ค๊ณ„์ƒ WebAssembly ์ฝ”๋“œ๋ฅผ TurboFan์˜ IR(SSA ๊ตฌ์„ฑ ํฌํ•จ)๋กœ ๊ฐ„๋‹จํ•œ ๋‹จ์ผ ํŒจ์Šค๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ๋ถ€๋ถ„์ ์œผ๋กœ WebAssembly์˜ ๊ตฌ์กฐํ™”๋œ ์ œ์–ด ํ๋ฆ„์œผ๋กœ ์ธํ•ด ๋งค์šฐ ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.

@conrad-watt ์ €๋Š” ์šฐ๋ฆฌ๊ฐ€ VM ์‚ฌ๋žŒ๋“ค๋กœ๋ถ€ํ„ฐ ์ง์ ‘์ ์ธ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›๊ณ  ์—ด๋ฆฐ ๋งˆ์Œ์„ ์œ ์ง€ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ๋งํ•ด์„œ, ์—ฌ๊ธฐ์„œ ๋‚ด ๋ชฉํ‘œ๋Š” ์•„๋ฌด๊ฒƒ๋„ ๋ง‰๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์˜๊ฒฌ์ด wasm์˜ ๊ตฌ์กฐํ™”๋œ ์ œ์–ด ํ๋ฆ„์ด ๋ช…๋ฐฑํ•œ ์‹ค์ˆ˜์ด๊ฑฐ๋‚˜ funclets/multiloop์œผ๋กœ ๋ถ„๋ช…ํžˆ ์ˆ˜์ •๋˜์–ด์•ผ ํ•˜๋Š” ์˜ค๋ฅ˜๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ ๊ฐ™์•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์— ๊ธธ๊ฒŒ ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ๋‹จ์ง€ ์—ฌ๊ธฐ์— ์ƒ๊ฐ์˜ ์—ญ์‚ฌ๋ฅผ ์ œ์‹œํ•˜๊ณ  ์‹ถ์—ˆ๊ณ  ๊ฐ•๋ ฅํ•œ ์ด์œ ๊ฐ€ ์žˆ๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๋ชจ๋ธ์˜ ๊ฒฝ์šฐ ๊ฐœ์„ ์ด ์‰ฝ์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด ๋Œ€ํ™”๋ฅผ ์ฝ๋Š” ๊ฒƒ์„ ์ •๋ง๋กœ ์ฆ๊ฒผ๋‹ค. ๋‚˜๋Š” (์–‘๋ฐฉํ–ฅ์—์„œ ์˜ค๋Š”) ์ด๋Ÿฌํ•œ ์งˆ๋ฌธ์„ ๋งŽ์ด ๊ถ๊ธˆํ•ดํ–ˆ๊ณ  ์ด๋Ÿฌํ•œ ์ƒ๊ฐ ์ค‘ ๋งŽ์€ ๋ถ€๋ถ„์„ (๋‹ค์‹œ ์–‘๋ฐฉํ–ฅ์—์„œ) ๊ณต์œ ํ–ˆ์œผ๋ฉฐ ํ† ๋ก ์€ ๋งŽ์€ ์œ ์šฉํ•œ ํ†ต์ฐฐ๋ ฅ๊ณผ ๊ฒฝํ—˜์„ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„์ง ํ™•๊ณ ํ•œ ์˜๊ฒฌ์ด ์žˆ๋Š”์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ, ๊ฐ ๋ฐฉํ–ฅ์— ๊ธฐ์—ฌํ•˜๊ณ  ์‹ถ๋‹ค๋Š” ์ƒ๊ฐ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

"for" ์ธก๋ฉด์—์„œ, ์–ด๋–ค ๋ธ”๋ก์— backedge๊ฐ€ ์žˆ๋Š”์ง€ ๋ฏธ๋ฆฌ ์•„๋Š” ๊ฒƒ์ด ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ŠคํŠธ๋ฆฌ๋ฐ ์ปดํŒŒ์ผ๋Ÿฌ WebAssembly ์œ ํ˜•์˜ ์‹œ์Šคํ…œ (์˜ˆ : ๋กœ์ปฌ์—์„œ ์ธ๋ฑ์Šค ์ž๋ช…ํ•˜์ง€ ์•Š์€ ํŠน์„ฑ์„ ์ถ”์  ํ•  ์ˆ˜ i ๋กœ์ปฌ์—์„œ ์ƒ๊ธฐ ์–ด๋ ˆ์ด์˜ ๊ฒฝ๊ณ„ ๋‚ด์— arr ). ์•ž์œผ๋กœ ์ ํ”„ํ•  ๋•Œ ํ•ด๋‹น ์ง€์ ์—์„œ ์–ด๋–ค ์†์„ฑ์ด ์œ ์ง€๋˜๋Š”์ง€ ๋Œ€์ƒ์— ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ ˆ์ด๋ธ”์— ๋„๋‹ฌํ•  ๋•Œ ๋ชจ๋“  ์ธ-์—์ง€์—์„œ ์œ ์ง€๋˜๋Š” ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ๋ธ”๋ก์„ ์ปดํŒŒ์ผํ•˜์—ฌ ๋ฐฐ์—ด ๊ฒฝ๊ณ„ ๊ฒ€์‚ฌ๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ ˆ์ด๋ธ”์— ์ž ์žฌ์ ์œผ๋กœ ์•Œ๋ ค์ง€์ง€ ์•Š์€ backedge๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ๋ธ”๋ก์€ ์ด ์ง€์‹์œผ๋กœ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋น„ ์ŠคํŠธ๋ฆฌ๋ฐ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋” ์ค‘์š”ํ•œ ๋ฃจํ”„ ๋ถˆ๋ณ€ ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ŠคํŠธ๋ฆฌ๋ฐ ์ปดํŒŒ์ผ๋Ÿฌ์˜ ๊ฒฝ์šฐ ์•ž์œผ๋กœ ์ผ์–ด๋‚  ์ผ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๊ฒƒ์ด ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ( ๋ถ€์ˆ˜์  ์ƒ๊ฐ:

"๋ฐ˜๋Œ€" ์ธก๋ฉด์—์„œ ์ง€๊ธˆ๊นŒ์ง€ ๋…ผ์˜๋Š” ๊ตญ์ง€์  ํ†ต์ œ์—๋งŒ ์ดˆ์ ์„ ๋งž์ถ”์—ˆ์Šต๋‹ˆ๋‹ค. C์—์„œ๋Š” ๊ดœ์ฐฎ์ง€๋งŒ C++ ๋˜๋Š” ์œ ์‚ฌํ•œ ์˜ˆ์™ธ๊ฐ€ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ๋‹ค๋ฅธ ์–ธ์–ด์˜ ๊ฒฝ์šฐ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๋‹ค๋ฅธ ํ˜•ํƒœ์˜ ๋น„-๋กœ์ปฌ ์ปจํŠธ๋กค์ด ์žˆ๋Š” ์–ธ์–ด๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๋™์  ๋ฒ”์œ„๊ฐ€ ์žˆ๋Š” ๊ฒƒ๋“ค์€ ๋ณธ์งˆ์ ์œผ๋กœ ๊ตฌ์กฐํ™”๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค(๋˜๋Š” ์ ์–ด๋„ ์ƒํ˜ธ ์žฌ๊ท€์  ๋™์  ๋ฒ”์œ„์˜ ์˜ˆ๋Š” ๋ชจ๋ฆ…๋‹ˆ๋‹ค). ์ด๋Ÿฌํ•œ ๊ณ ๋ ค ์‚ฌํ•ญ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ์„ค์ •์—์„œ ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ ค๋ฉด ์—ผ๋‘์— ๋‘๊ณ  ๋ฌด์–ธ๊ฐ€๋ฅผ ์„ค๊ณ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ์ˆ™๊ณ ํ•ด ์™”๋˜ ๊ฒƒ์ด๋ฉฐ, ์ง„ํ–‰ ์ค‘์ธ ๋‚ด ์ƒ๊ฐ(@conrad-watt์˜ ๋‹ค์ค‘ ๋ฃจํ”„์˜ ํ™•์žฅ์ฒ˜๋Ÿผ ๋ณด์ž„)์„ ๊ด€์‹ฌ ์žˆ๋Š” ์‚ฌ๋žŒ๊ณผ ๊ณต์œ ํ•˜๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค(์—ฌ๊ธฐ์„œ๋Š” ์ฃผ์ œ๊ฐ€ ์•„๋‹Œ ๊ฒƒ ๊ฐ™์ง€๋งŒ). ๋‚˜๋Š” ์ ์–ด๋„ ์—ผ๋‘์— ๋‘์–ด์•ผ ํ•  ๋กœ์ปฌ ์ œ์–ด ํ๋ฆ„ ์ด์ƒ์˜ ๊ฒƒ์ด ์žˆ๋‹ค๋Š” ์ ์„ ๋ฏธ๋ฆฌ ์•Œ๋ ค๋“œ๋ฆฌ๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

(๋‚˜๋Š” @kripken ์ด ๊ณ ๋ ค ์‚ฌํ•ญ์„ ๋Œ€ํ‘œํ•˜๋Š” ํ›Œ๋ฅญํ•œ ์ผ์„ ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ VM ์‚ฌ๋žŒ๋“ค์˜

๋‚ด๊ฐ€ Lightbeam์ด ๋‚ด๋ถ€ IR์„ ์ƒ์„ฑํ•œ๋‹ค๊ณ  ๋งํ•  ๋•Œ, ๊ทธ๊ฒƒ์€ ์ •๋ง ์˜คํ•ด์˜ ์†Œ์ง€๊ฐ€ ์žˆ๊ณ  ๋ถ„๋ช…ํžˆ ํ–ˆ์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ž ์‹œ ๋™์•ˆ ํ”„๋กœ์ ํŠธ์— ์ฐธ์—ฌํ•˜๊ณ  ์žˆ์—ˆ๊ณ  ๋•Œ๋•Œ๋กœ ํ„ฐ๋„ ๋น„์ „์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ Lightbeam์€ ๋ช…๋ น์–ด๋ณ„๋กœ ์ž…๋ ฅ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ(์‹ค์ œ๋กœ ์ตœ๋Œ€ 1๊ฐœ์˜ ๋ช…๋ น์–ด ๋ฏธ๋ฆฌ๋ณด๊ธฐ๊ฐ€ ์žˆ์ง€๋งŒ ํŠน๋ณ„ํžˆ ์ค‘์š”ํ•˜์ง€ ์•Š์Œ) ๊ฐ ๋ช…๋ น์–ด์— ๋Œ€ํ•ด ์ผ์ •ํ•œ ๊ณต๊ฐ„์—์„œ ์ง€์—ฐ๋˜๊ณ  ์ผ์ •ํ•œ ๊ณต๊ฐ„์—์„œ ์—ฌ๋Ÿฌ ๋‚ด๋ถ€ IR ๋ช…๋ น์–ด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. Wasm ๋ช…๋ น์–ด๋‹น ์ตœ๋Œ€ ๋ช…๋ น์–ด ์ˆ˜๋Š” ์ผ์ •ํ•˜๊ณ  ์ž‘์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 6๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ „์ฒด ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ IR ๋ช…๋ น์–ด ๋ฒ„ํผ๋ฅผ ๋งŒ๋“ค๊ณ  ์ž‘์—…ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ•ด๋‹น IR ๋ช…๋ น์„ ํ•˜๋‚˜์”ฉ ์ฝ์Šต๋‹ˆ๋‹ค. ๊ฐ Wasm ๋ช…๋ น์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ณด๋‹ค ์ผ๋ฐ˜์ ์ธ ๋„์šฐ๋ฏธ ํ•จ์ˆ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ์–ด ํ๋ฆ„ ๋“ฑ์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ๋ชจ๋ธ์ด ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ƒฅ IR์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ์•„๋งˆ๋„ V8์ด๋‚˜ SpiderMonkey์˜ ๊ธฐ์ค€ ์ปดํŒŒ์ผ๋Ÿฌ๋งŒํผ ๋น ๋ฅด๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Š” ์™„์ „ํžˆ ์ตœ์ ํ™”๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ด์š” ๊ตฌ์กฐ์ ์œผ๋กœ ๋ถ€์กฑํ•˜๊ธฐ ๋•Œ๋ฌธ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋‚ด ์š”์ ์€ LLVM ๋˜๋Š” Cranelift๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์‹ค์ œ๋กœ ๋ฉ”๋ชจ๋ฆฌ์— IR ๋ฒ„ํผ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋Œ€์‹  Wasm์˜ ๊ณ„์ธต์  ์ œ์–ด ํ๋ฆ„์„ ๋งˆ์น˜ CFG์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋‚ด๋ถ€์ ์œผ๋กœ ๋ชจ๋ธ๋งํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์˜ต์…˜์€ ์ œ์–ด ํ๋ฆ„์„ ์ตœ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋ฏฟ๋Š” ๊ฒƒ์œผ๋กœ wasm์„ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๊ตฌ์กฐํ™”๋ฅผ "์‹คํ–‰ ์ทจ์†Œ"ํ•ฉ๋‹ˆ๋‹ค. LLVM์€ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋ฏ€๋กœ LLVM(WAVM ๋˜๋Š” wasmer์™€ ๊ฐ™์€)์„ ์‚ฌ์šฉํ•˜๋Š” VM์—์„œ ๋˜๋Š” WasmBoxC๋ฅผ ํ†ตํ•ด wasm์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ํฅ๋ฏธ๋กœ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@kripken ๋ถˆํ–‰ํžˆ๋„ LLVM์€ ์•„์ง ๊ตฌ์กฐํ™”๋ฅผ ์ทจ์†Œํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ ํ”„ ์Šค๋ ˆ๋”ฉ ์ตœ์ ํ™” ๋‹จ๊ณ„์—์„œ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜์ง€๋งŒ ์•„์ง ์ด ํŒจํ„ด์„ ์ธ์‹ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ relooper ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด CFG๋ฅผ ๋ฃจํ”„+์Šค์œ„์น˜๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฐฉํ•˜๋Š” ์ผ๋ถ€ C++ ์ฝ”๋“œ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์˜ˆ์ž…๋‹ˆ๋‹ค. GCC๋Š” "deloop"์„ ๊ด€๋ฆฌํ•˜์ง€๋งŒ clang์€ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. https://godbolt.org/z/GGM9rP

@AndrewScheidecker ํฅ๋ฏธ

@comex

SpiderMonkey์˜ ๊ธฐ์ค€ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋‹จ์ง€ ํ•˜๋‚˜์˜ ๊ตฌํ˜„์ผ ๋ฟ์ด๋ฉฐ ๋ ˆ์ง€์Šคํ„ฐ ํ• ๋‹น๊ณผ ๊ด€๋ จํ•˜์—ฌ ์ฐจ์„ ์ฑ…์ผ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์กฐ๊ธˆ๋งŒ ๋” ๋˜‘๋˜‘ํ–ˆ๋‹ค๋ฉด ๋Ÿฐํƒ€์ž„ ์ด์ ์ด ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ๋น„์šฉ๋ณด๋‹ค ํด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ ˆ์ง€์Šคํ„ฐ ํ• ๋‹น์— ๋Œ€ํ•ด ๋ถ„๋ช…ํžˆ ๋” ๋˜‘๋˜‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ์–ด ํ๋ฆ„ ํฌํฌ, ์กฐ์ธ ๋ฐ ํ˜ธ์ถœ ์ „์—์„œ ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ์œ ์ถœ๋˜๊ณ  ๋ ˆ์ง€์Šคํ„ฐ ์ƒํƒœ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ์œ ์ง€ํ•˜๊ณ  ๋ ˆ์ง€์Šคํ„ฐ์— ๊ฐ’์„ ๋” ์˜ค๋ž˜ ์œ ์ง€ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค/์ฃฝ์„ ๋•Œ๊นŒ์ง€. ๋ธ”๋ก์˜ ๊ฐ’ ๊ฒฐ๊ณผ์— ๋Œ€ํ•ด rax๋ณด๋‹ค ๋” ๋‚˜์€ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ๊ณ ์ • ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ๋ณด์œ ํ•˜๊ธฐ ์œ„ํ•ด ๋‘ ๊ฐœ์˜ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์ •์ ์œผ๋กœ ์ „์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ํ•œ ๋ง๋ญ‰์น˜ ๋ถ„์„์— ๋”ฐ๋ฅด๋ฉด ์†Œ์ˆ˜์˜ ์ •์ˆ˜์™€ FP ๋ ˆ์ง€์Šคํ„ฐ๊ฐ€ ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ๋Šฅ์— ์ถฉ๋ถ„ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ํ˜๋ฆฌ๋Š” ๊ฒƒ์ด ๋” ํ˜„๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ๋ ˆ์ง€์Šคํ„ฐ๊ฐ€ ๋ถ€์กฑํ•  ๋•Œ ๋ชจ๋“  ๊ฒƒ์„ ๊ณตํ™ฉ ์ƒํƒœ๋กœ ๋น ๋œจ๋ฆฝ๋‹ˆ๋‹ค.

์ด๊ฒƒ์˜ ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ๋น„์šฉ์€ ์ฃผ๋กœ ๊ฐ ์ œ์–ด ํ๋ฆ„ ์—์ง€์™€ ๊ด€๋ จํ•˜์—ฌ ์ผ์ •ํ•˜์ง€ ์•Š์€ ์–‘์˜ ์ •๋ณด(๋ ˆ์ง€์Šคํ„ฐ ์ƒํƒœ)๋ฅผ ๊ฐ–๊ฒŒ ๋˜๋ฉฐ ์ด๋Š” ๊ธฐ๋ณธ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋™์  ์ €์žฅ์†Œ ํ• ๋‹น์˜ ๋” ๋„๋ฆฌ ํผ์ง„ ์‚ฌ์šฉ์œผ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ€๋ฆฌ ํ”ผํ–ˆ๋‹ค. ๋ฌผ๋ก  ๊ฐ ์กฐ์ธ(๋ฐ ๊ธฐํƒ€ ์œ„์น˜)์—์„œ ๊ฐ€๋ณ€ ํฌ๊ธฐ ์ •๋ณด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ๋“œ๋Š” ๋น„์šฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์Šคํ•„ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋ ˆ์ง€์Šคํ„ฐ ์ƒํƒœ๋ฅผ ํ†ต๊ณผํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ผ์ •ํ•˜์ง€ ์•Š์€ ๋น„์šฉ์ด ์ด๋ฏธ ์กด์žฌํ•˜๊ณ  ๋Œ€์ฒด๋กœ ๋ผ์ด๋ธŒ ๊ฐ’์ด ๊ฑฐ์˜ ์—†์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๊ฒƒ์ด ๊ดœ์ฐฎ์„ ์ˆ˜๋„ ์žˆ๊ณ  ์•„๋‹ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  regalloc์„ ์‚ฌ์šฉํ•˜์—ฌ ๋” ๋˜‘๋˜‘ํ•ด์ง€๋Š” ๊ฒƒ์€ ๋น ๋ฅธ ์บ์‹œ์™€ ooo ์‹คํ–‰์œผ๋กœ ์ตœ์‹  ์นฉ์—์„œ ์„ฑ๊ณผ๋ฅผ ๋‚ผ ์ˆ˜๋„ ์žˆ๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค...

๋” ๋ฏธ๋ฌ˜ํ•œ ๋น„์šฉ์€ ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์œ ์ง€ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ์„ฑ์ž…๋‹ˆ๋‹ค... ์ด๋ฏธ ์ƒ๋‹นํžˆ ๋ณต์žกํ•˜๊ณ  ์› ํŒจ์Šค์ด๋ฉฐ IR ๊ทธ๋ž˜ํ”„๋ฅผ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ ๋™์  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ „ํ˜€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ณ„์ธตํ™” ๋ฐ ์ถ”์ƒํ™”์— ์ €ํ•ญํ•ฉ๋‹ˆ๋‹ค.

@RossTate

Re funclet / gotos, ๋‚˜๋Š” ์š”์ „์— funclet ์‚ฌ์–‘์„ ํ›‘์–ด๋ณด์•˜๊ณ  ์–ธ๋œป ๋ณด๊ธฐ์— 1 ํŒจ์Šค ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋‹จ์ˆœํ•œ regalloc ์ฒด๊ณ„๊ฐ€ ์•„๋‹Œ ์‹ค์ œ๋กœ ๋ฌธ์ œ๊ฐ€ ์—†์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋” ๋‚˜์€ ์ฒด๊ณ„๋ฅผ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ๊ดœ์ฐฎ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐํ•ฉ ์ง€์ ์— ๋„๋‹ฌํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ๊ฐ€์žฅ์ž๋ฆฌ๋Š” ๋ ˆ์ง€์Šคํ„ฐ ํ• ๋‹น์ด ๋ฌด์—‡์ธ์ง€ ๊ฒฐ์ •ํ•˜๊ณ  ๋‹ค๋ฅธ ๊ฐ€์žฅ์ž๋ฆฌ๋Š” ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@conrad-watt CG ํšŒ์˜์—์„œ ๋ฐฉ๊ธˆ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ๋‹ค์ค‘ ๋ฃจํ”„๊ฐ€ ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ๋ณด๋Š” ๋ฐ ๋งค์šฐ ๊ด€์‹ฌ์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@aardappel ์˜ˆ, ์ธ์ƒ์ด ๋นจ๋ฆฌ ์ฐพ์•„์™”์ง€๋งŒ ๋‹ค์Œ ํšŒ์˜์—์„œ๋Š” ์ด๊ฒƒ์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. @rossberg๊ฐ€ ์›๋ž˜

์œ ์ตํ•  ์ˆ˜ ์žˆ๋Š” ์ฐธ์กฐ ์ค‘ ํ•˜๋‚˜๋Š” ์ผ์ข…์˜ ๊ตฌ์‹์ด์ง€๋งŒ DJ ๊ทธ๋ž˜ํ”„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ฃจํ”„๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ต์ˆ™ํ•œ ๋ฃจํ”„ ๊ฐœ๋…์„ ์ผ๋ฐ˜ํ™”

์šฐ๋ฆฌ๋Š” CG์—์„œ ์ด์— ๋Œ€ํ•ด ๋ช‡ ์ฐจ๋ก€ ํ† ๋ก  ์„ธ์…˜์„ ๊ฐ€์กŒ์œผ๋ฉฐ ์š”์•ฝ ๋ฐ ํ›„์† ๋ฌธ์„œ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ธธ์ด ๋•Œ๋ฌธ์— ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋ณ„๋„์˜ ์š”์ ์œผ๋กœ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

https://gist.github.com/conrad-watt/6a620cb8b7d8f0191296e3eb24dffdef

์ฆ‰์‹œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋‘ ๊ฐ€์ง€ ์งˆ๋ฌธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค(์ž์„ธํ•œ ๋‚ด์šฉ์€ ํ›„์† ์„น์…˜ ์ฐธ์กฐ).

  • ํ˜„์žฌ ์–ด๋ ค์›€์„ ๊ฒช๊ณ  ์žˆ๊ณ  ์„ฑ๋Šฅ ๋ฉด์—์„œ multiloop ๋„์›€์ด ๋˜๋Š” "์•ผ์ƒ" ํ”„๋กœ๊ทธ๋žจ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๋Š” LLVM ๋ณ€ํ™˜์ด ์†Œ์Šค ํ”„๋กœ๊ทธ๋žจ์— ์กด์žฌํ•˜์ง€ ์•Š๋”๋ผ๋„ ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„์„ ๋„์ž…ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • multiloop ๊ฐ€ "์›น" Wasm์— ๋Œ€ํ•œ ๋งํฌ/๋ฒˆ์—ญ ๋ฐฐํฌ ๊ณ„์ธต๊ณผ ํ•จ๊ป˜ ์ƒ์‚ฐ์ž ์ธก์—์„œ ๋จผ์ € ๊ตฌํ˜„๋˜๋Š” ์„ธ์ƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚ด๊ฐ€ ํ›„์† ๋ฌธ์„œ์—์„œ ๋…ผ์˜ํ•˜๋Š” ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋ฌธ์ œ์˜ ๊ฒฐ๊ณผ์— ๋Œ€ํ•ด ๋” ์ž์œ ๋กœ์šด ํ† ๋ก ์ด ์žˆ์„ ๊ฒƒ์ด๋ฉฐ, ๋ฌผ๋ก  ์šฐ๋ฆฌ๊ฐ€ ๊ตฌ์ฒด์ ์ธ ๋‚ด์šฉ์œผ๋กœ ๋‚˜์•„๊ฐ€๋ฉด ์˜๋ฏธ๋ก ์  ์„ธ๋ถ€ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ํ‘œ์ค€ ์ž์ „๊ฑฐ ๊ณต์œ ๊ฐ€ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋…ผ์˜๋Š” ๋‹ค์†Œ ๋ถ„๊ธฐ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๊ทธ ์ค‘ ์ผ๋ถ€๋ฅผ funclet ์ €์žฅ์†Œ์˜ ๋ฌธ์ œ๋กœ

์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ง„์ „์„ ๋ณด๊ฒŒ ๋˜์–ด ๋งค์šฐ ๊ธฐ์ฉ๋‹ˆ๋‹ค. ๊ด€๋ จ๋œ ๋ชจ๋“  ๋ถ„๋“ค๊ป˜ ํฐ "๊ณ ๋ง™์Šต๋‹ˆ๋‹ค!"

ํ˜„์žฌ ์–ด๋ ค์›€์„ ๊ฒช๊ณ  ์žˆ๊ณ  ๋ฉ€ํ‹ฐ๋ฃจํ”„์—์„œ ์„ฑ๋Šฅ๋ฉด์—์„œ ์ด์ ์ด ์žˆ๋Š” "์•ผ์ƒ" ํ”„๋กœ๊ทธ๋žจ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๋Š” LLVM ๋ณ€ํ™˜์ด ์†Œ์Šค ํ”„๋กœ๊ทธ๋žจ์— ์กด์žฌํ•˜์ง€ ์•Š๋”๋ผ๋„ ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„์„ ๋„์ž…ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ˆœํ™˜ ์ถ”๋ก ์— ๋Œ€ํ•ด ์•ฝ๊ฐ„ ์ฃผ์˜ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์„ฑ๋Šฅ์ด ์ข‹์ง€ ์•Š์€ ํ”„๋กœ๊ทธ๋žจ์€ ๋ฐ”๋กœ ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ "์•ผ์ƒ์—์„œ" ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์ ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๋ฐ”๋‘‘ ํ”„๋กœ๊ทธ๋žจ์ด ๋งŽ์€ ์ด์ ์„ ์–ป์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Go ์ปดํŒŒ์ผ๋Ÿฌ๋Š” Go์˜ ๊ณ ๋ฃจํ‹ด์„ ์ง€์›ํ•˜๋Š” ํšจ์œจ์ ์ธ ์ฝ”๋“œ๋ฅผ ๋‚ด๋ณด๋‚ด๋ ค๋ฉด WebAssembly ์ฝ”๋ฃจํ‹ด ๋˜๋Š” multiloop ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋ฏธ๋ฆฌ ์ปดํŒŒ์ผ๋œ ์ •๊ทœ์‹ ๋งค์ฒ˜๋Š” ๋‹ค๋ฅธ ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผ๋œ ์ƒํƒœ ์‹œ์Šคํ…œ๊ณผ ํ•จ๊ป˜ ์ œ์–ด ํ๋ฆ„์„ ์ถ•์†Œํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋‚ณ์Šต๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค ์œ ํ˜•์— ๋Œ€ํ•œ "์œตํ•ฉ" ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ œ์–ด ํ๋ฆ„์„ ๊ฐ์†Œ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋งํ•˜๊ธฐ๋Š” ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

  • ์ด ํ† ๋ก ์„ funclets(๋˜๋Š” ์ƒˆ) ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ ๋ฌธ์ œ๋กœ ์˜ฎ๊ฒจ์•ผ ํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.
  • LLVM(๋ฐ Go ๋ฐ ๊ธฐํƒ€)์ด ์‹ค์ œ๋กœ ๊ฐ€์žฅ ์ตœ์ ์˜ ์ œ์–ด ํ๋ฆ„(ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•  ์ˆ˜ ์žˆ์Œ)์„ ๋ฐฉ์ถœํ•˜์ง€ ์•Š๊ณ ๋Š” ์ด๋ฅผ ํ†ตํ•ด ์ด์ต์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ฐพ๋Š” ๊ฒƒ์ด ์ •๋Ÿ‰ํ™”ํ•˜๊ธฐ ์–ด๋ ต๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. FixIrreducibleControlFlow ๋ฐ ์นœ๊ตฌ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๋น„ํšจ์œจ์„ฑ์€ ๋Œ€๊ทœ๋ชจ ๋ฐ”์ด๋„ˆ๋ฆฌ์—์„œ "1000 ์ปท์œผ๋กœ ์‚ฌ๋ง" ๋ฌธ์ œ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‚˜๋Š” ์ด ๋…ผ์˜์—์„œ ๋‚˜์˜ค๋Š” ์ ˆ๋Œ€์ ์ธ ์ตœ์†Œ ์ง„ํ–‰์œผ๋กœ ๋„๊ตฌ ์ „์šฉ ๊ตฌํ˜„์„ ํ™˜์˜ํ•˜์ง€๋งŒ, ์ƒ์‚ฐ์ž๋Š” ์ด์ œ ํŽธ๋ฆฌํ•จ์„ ์œ„ํ•ด ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ์–ด๋ ค์šด ์„ ํƒ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ ์ตœ์ ์ด ์•„๋‹ ๊ฒƒ์ž…๋‹ˆ๋‹ค(๊ทธ๋Ÿฌ๋‚˜ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†๋Š” ์„ฑ๋Šฅ ํšŒ๊ท€/ ์ ˆ๋ฒฝ), ๋˜๋Š” ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ์ถœ๋ ฅ์„ ํ‘œ์ค€ wasm์œผ๋กœ ๋žญ๊ธ€๋งํ•˜๊ธฐ ์œ„ํ•ด ์—ด์‹ฌํžˆ ๋…ธ๋ ฅํ•˜์‹ญ์‹œ์˜ค.
  • "gotos"๊ฐ€ ๊ธฐ๊ปํ•ด์•ผ ๋„๊ตฌ ์ „์šฉ ๊ธฐ๋Šฅ์ด๋ผ๊ณ  ๊ฒฐ์ •๋˜๋ฉด ๋ฉ€ํ‹ฐ๋ฃจํ”„๋ณด๋‹ค ํ›จ์”ฌ ๋” ๊ฐ„๋‹จํ•œ ๊ธฐ๋Šฅ์œผ๋กœ ๋ฒ—์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค. ์ ˆ๋Œ€์ ์œผ๋กœ ์ตœ์†Œํ•œ goto <function_byte_offset> ๋Š” WABT ๋˜๋Š” Binaryen์ด ํ•ฉ๋ฒ•์ ์ธ Wasm์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ผ๋ฐ˜ Wasm ํ•จ์ˆ˜ ๋ณธ์ฒด์— ์‚ฝ์ž…ํ•ด์•ผ ํ•˜๋Š” ์œ ์ผํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์œ ํ˜• ์„œ๋ช…๊ณผ ๊ฐ™์€ ๊ฒƒ์€ ์—”์ง„์ด ๋‹ค์ค‘ ๋ฃจํ”„๋ฅผ ๋น ๋ฅด๊ฒŒ ํ™•์ธํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉํ•˜์ง€๋งŒ, ํŽธ๋ฆฌํ•œ ๋„๊ตฌ์ธ ๊ฒฝ์šฐ ๋ฐฉ์ถœํ•˜๋Š” ๊ฒƒ์ด ์ตœ๋Œ€ํ•œ ํŽธ๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

LLVM(๋ฐ Go ๋ฐ ๊ธฐํƒ€)์ด ์‹ค์ œ๋กœ ๊ฐ€์žฅ ์ตœ์ ์˜ ์ œ์–ด ํ๋ฆ„(ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•  ์ˆ˜ ์žˆ์Œ)์„ ๋ฐฉ์ถœํ•˜์ง€ ์•Š๊ณ ๋Š” ์ด๋ฅผ ํ†ตํ•ด ์ด์ต์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ฐพ๋Š” ๊ฒƒ์ด ์ •๋Ÿ‰ํ™”ํ•˜๊ธฐ ์–ด๋ ต๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

์ˆ˜์ •๋œ ๋„๊ตฌ ์ฒด์ธ + VM์—์„œ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์ด ์ตœ์ ์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ˜„์žฌ wasm ๋นŒ๋“œ๋ฅผ ์ตœ์ ์˜ ์ œ์–ด ํ๋ฆ„์„ ๊ฐ€์ง„ ๊ธฐ๋ณธ ๋นŒ๋“œ์™€ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Not So Fast ์™€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์€ ์ด๋ฅผ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹(์„ฑ๋Šฅ ์นด์šดํ„ฐ, ์ง์ ‘ ์กฐ์‚ฌ)์œผ๋กœ ์‚ดํŽด๋ณด์•˜์ง€๋งŒ ํ™˜์›ํ•  ์ˆ˜ ์—†๋Š” ์ œ์–ด ํ๋ฆ„์ด ์ค‘์š”ํ•œ ์š”์†Œ๋ผ๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

๋” ๊ตฌ์ฒด์ ์œผ๋กœ ๋งํ•˜๋ฉด C/C++์—์„œ ์ค‘์š”ํ•œ ์š”์†Œ๋กœ ์ธ์‹๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„์˜ ์„ฑ๋Šฅ๋ณด๋‹ค C/C++์™€ ๋” ๊ด€๋ จ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์†”์งํžˆ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.) @neelance ๊ฐ€ Go์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๊ฐ€ ์•„๋‹ ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์„ ๋งŒํ•œ ์ด์œ ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‚ด ์ƒ๊ฐ์— ์ด ๋ฌธ์ œ์—๋Š” ์—ฌ๋Ÿฌ ์ธก๋ฉด์ด ์žˆ์œผ๋ฉฐ ์—ฌ๋Ÿฌ ๋ฐฉํ–ฅ์„ ํ†ตํ•ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ฒซ์งธ, WebAssembly์˜ ์ƒ์„ฑ ๊ฐ€๋Šฅ์„ฑ์— ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ ๋Œ€๋ถ€๋ถ„์€ ํšจ์œจ์ ์ธ ์œ ํ˜• ๊ฒ€์‚ฌ ๋ฐ ์ŠคํŠธ๋ฆฌ๋ฐ ์ปดํŒŒ์ผ์„ ํฌํ•จํ•˜๋Š” ์ปดํŒฉํŠธ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๊ฐ–๋Š” WebAssembly์˜ ์ œ์•ฝ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑํ•˜๊ธฐ ๋” ์‰ฝ์ง€๋งŒ "์ง„์ •ํ•œ" WebAssembly๋กœ์˜ ๋ฒˆ์—ญ์ด ๋ณด์žฅ๋˜๋Š” ํ‘œ์ค€ํ™”๋œ "์‚ฌ์ „"-WebAssembly๋ฅผ ๊ฐœ๋ฐœํ•จ์œผ๋กœ์จ ์ด ๋ฌธ์ œ๋ฅผ ์ ์–ด๋„ ๋ถ€๋ถ„์ ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌํ•œ ๋ฒˆ์—ญ์„ ์ œ๊ณตํ•˜๋Š” ์ ์–ด๋„ ์ผ๋ถ€ ๋„๊ตฌ์™€ ํ•จ๊ป˜.

๋‘˜์งธ, "์ง„์ •ํ•œ" WebAssembly์— ์ง์ ‘ ํ†ตํ•ฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š” "pre"-WebAssembly์˜ ๊ธฐ๋Šฅ์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. "์ง„์ •ํ•œ" WebAssembly ๋ชจ๋“ˆ๋กœ ๋ณ€ํ˜• ๋˜๊ธฐ ์ „์— ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋Š” "์‚ฌ์ „"-WebAssembly ๋ชจ๋“ˆ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ •๋ณด์— ์ž…๊ฐํ•œ ๋ฐฉ์‹์œผ๋กœ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ช‡ ๋…„ ์ „์— ๋™์  ์–ธ์–ด(https://github.com/ciao-lang/ciao)์— ๋Œ€ํ•œ ํŠน์ • ๋ฐ”์ดํŠธ ์ฝ”๋“œ ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ์›น ์–ด์…ˆ๋ธ”๋ฆฌ๋กœ ์ปดํŒŒ์ผํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ์„ฑ๋Šฅ์ด ์ตœ์ ์ด ์•„๋‹ˆ์—ˆ์Šต๋‹ˆ๋‹ค(๋•Œ๋กœ๋Š” ๊ธฐ๋ณธ ๋ฒ„์ „๋ณด๋‹ค 10๋ฐฐ ๋Š๋ฆผ). ์ฃผ ์‹คํ–‰ ๋ฃจํ”„์—๋Š” ํฐ ๋ฐ”์ดํŠธ์ฝ”๋“œ ๋””์ŠคํŒจ์น˜ ์Šค์œ„์น˜๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ ์—”์ง„์€ ์‹ค์ œ ํ•˜๋“œ์›จ์–ด์—์„œ ์‹คํ–‰๋˜๋„๋ก ์ˆ˜์‹ญ ๋…„ ๋™์•ˆ ๋ฏธ์„ธ ์กฐ์ •๋˜์—ˆ์œผ๋ฉฐ ๋ ˆ์ด๋ธ”๊ณผ goto๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ํ™˜์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ๋ฆ„์„ ์ง€์›ํ•จ์œผ๋กœ์จ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š”์ง€ ์•„๋‹ˆ๋ฉด ๋ฌธ์ œ๊ฐ€ ๋‹ค๋ฅธ ๋ฌธ์ œ์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ์กฐ์‚ฌ๋ฅผ ํ•  ์‹œ๊ฐ„์ด ์—†์—ˆ์ง€๋งŒ ์ƒํ™ฉ์ด ๊ฐœ์„ ๋œ ๊ฒƒ์œผ๋กœ ์•Œ๋ ค์ง€๋ฉด ๋‹ค์‹œ ์‹œ๋„ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋‹ค๋ฅธ ์–ธ์–ด VM์„ wasm์œผ๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ์ด ์ฃผ์š” ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ์ ์„ ์ดํ•ดํ•˜์ง€๋งŒ, ํŠนํžˆ ์–ด๋””์„œ๋‚˜ ํšจ์œจ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ๋ฒ”์šฉ ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ์•ฝ์†๋œ ์ด์  ์ค‘ ํ•˜๋‚˜์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ๊ฒฐ๊ตญ ์‹คํ˜„ ๊ฐ€๋Šฅํ•œ์ง€ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. wasm. (์ด ํŠน์ • ์ฃผ์ œ๊ฐ€ ๋‹ค๋ฅธ ๋ฌธ์ œ์—์„œ ๋…ผ์˜๋œ ๊ฒฝ์šฐ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.)

@jfmc ๋‚ด ์ดํ•ด๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ํ˜„์‹ค์ ์ด๊ณ (์ฆ‰, ๋ณ‘๋ฆฌํ•™์ ์ด ๋˜๊ธฐ ์œ„ํ•ด ๊ณ ์•ˆ๋œ ๊ฒƒ์ด ์•„๋‹˜) ์„ฑ๋Šฅ์— ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด ์™„๋ฒฝํ•˜๊ฒŒ ์œ ํšจํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. WebAssembly๋Š” ์ข‹์€ ๋ฒ”์šฉ ํƒ€๊ฒŸ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์™œ ๊ทธ๋ ‡๊ฒŒ ์‹ฌ๊ฐํ•œ ๋‘”ํ™”๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์ œ์–ด ํ๋ฆ„์— ๋Œ€ํ•œ ์ œํ•œ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ ์ด ๋…ผ์˜์—์„œ ์•„๋Š” ๊ฒƒ์ด ๋งค์šฐ ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ฌธ์ œ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ ์ผ๋ฐ˜์ ์œผ๋กœ WebAssembly๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•„๋Š” ๊ฒƒ์ด ์—ฌ์ „ํžˆ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

๊ด€๋ จ ๋ฌธ์ œ

nikhedonia picture nikhedonia  ยท  7์ฝ”๋ฉ˜ํŠธ

beriberikix picture beriberikix  ยท  7์ฝ”๋ฉ˜ํŠธ

JimmyVV picture JimmyVV  ยท  4์ฝ”๋ฉ˜ํŠธ

artem-v-shamsutdinov picture artem-v-shamsutdinov  ยท  6์ฝ”๋ฉ˜ํŠธ

void4 picture void4  ยท  5์ฝ”๋ฉ˜ํŠธ