๋๋ ์น ์ด์
๋ธ๋ฆฌ ์์
์ ์ฐธ์ฌํ์ง ์์๋ค๋ ์ ์ ์ง์ ํ๊ณ ์ถ์ต๋๋ค.
ํฌ๊ฑฐ๋ ๋๋ฆฌ ์ฌ์ฉ๋๋ ์ปดํ์ผ๋ฌ๋ฅผ ์ ์ง ๊ด๋ฆฌํ์ง ์์ต๋๋ค(๋ด ์์ ์
์ฅ๋๊ฐ ๊ฐ์ ์ธ์ด, 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;
}
}
๋ชป์๊ฒผ์ด? ์. ์๊ด์ด ์๋? ์น์ด์
๋ธ๋ฆฌ๊ฐ ๋ณธ๊ฒฉํ๋๋ฉด
์ค๋๋์ง ์์ต๋๋ค.
๊ธ์์, ๋ง์ฝ ์ ๊ฐ ์น ์ด์
๋ธ๋ฆฌ๋ฅผ ๋ชฉํ๋ก ์ผ๊ฒ ๋๋ค๋ฉด, ์ ๋ ์ฝ๋๋ฅผ ์์ฑํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
ํด๋ฆฌํ์์ ์ธ๊ธํ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๊ณ ์ต์ ์ ๋คํด
์ปดํ์ผ๋ฌ๊ฐ
์ด ํจํด์ ์ก์๋ผ.
๊ทธ๋ฌ๋ ์ฝ๋ ์์ฑ์ ์๋ฉด์ด ํ์ํ์ง ์๋ค๋ฉด ์ข์ ๊ฒ์
๋๋ค.
์ง์ ๋ ํ์์ ํด๊ฒฐํ์ญ์์ค.
@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
ํฉ๋ฆฌ์ ์ธ ๊ฒ์ ๊ตฌ์กฐํ๋ ์ ์ด ํ๋ฆ์ด ์์ค ์ฝ๋ ๋คํ๋ฅผ ์ฝ๋ ๋ฐ ๋์์ด ๋๋ฉฐ ํด๋ฆฌํ ๊ตฌํ์ ๋์์ด ๋๋ค๊ณ ๋ฏฟ์ด์ง๋๋ค.
์น ์ด์ ๋ธ๋ฆฌ์์ ์ปดํ์ผํ๋ ์ฌ๋๋ค์ ์๋ง๋ ์ถ์๋ ์ ์ด ํ๋ฆ์ ์ฒ๋ฆฌํ๊ณ ๋ถ๋ฆฌํ๋ ๋ฐ ์ ์ํ ๊ฒ์ ๋๋ค.
๊ทธ๋์:
loop
๋ธ๋ก์ด ์์ฐ์ค๋ฌ์ด ๋ฃจํ์์ ๊ณ์ ๋ณด์ฅํด์ผ ํฉ๋๋ค.block
:end
๋ค์์ ์ค๋ BB๋ ๋ธ๋ก์ ์์ํ๋ BB๊ฐ ์ง๋ฐฐํ์ง๋ง end
์ด์ ์ BB์ ์ํด ์ง๋ฐฐ๋์ง ์์ต๋๋ค( br
์์์ด ์์ผ๋ฉด ๊ฑด๋๋ฐ๊ธฐ ๋๋ฌธ์
๋๋ค. ).loop
:end
์ดํ์ BB๋ end
์ด์ ์ BB์ ์ํด ์ง๋ฐฐ๋ฉ๋๋ค( end
๋ฅผ ์คํํ๋ ๊ฒ ์ธ์๋ end
์ดํ์ ๋ช
๋ น์ ๋๋ฌํ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค).if
:end
๋ค์ BB๋ ๋ชจ๋ if
์์ BB๊ฐ ์ง๋ฐฐํฉ๋๋ค.br
, return
, unreachable
:br
, return
๋๋ unreachable
๋ฐ๋ก ๋ค์ BB๋ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค.)br_if
, br_table
:br_if
/ br_table
์์ BB๊ฐ ๋ค์ BB๋ฅผ ์ง๋ฐฐํฉ๋๋ค.goto
๋ช
๋ น์ด๊ฐ ๋๋ฏธ๋ค์ดํฐ ํธ๋ฆฌ ์ธก๋ฉด์์ ์ด๋ป๊ฒ ์๋ํด์ผ ํ๋์ง ์๊ฐํด ๋ณด์ญ์์ค. A๊ฐ B๋ฅผ ์ง๋ฐฐํ๊ณ C๋ฅผ ์ง๋ฐฐํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.if
๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ์ฌ๋ฌ ๊ฐ์ธ ๊ฒฝ์ฐ br_table
์ฌ์ฉ).์ด๋ฅผ ๋ฐํ์ผ๋ก ๋ค์์ ์คํธ๋ก์ฐ๋งจ ์ ์์ ๋๋ค.
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๊ฐ ๊ธฐ๋ฅ์ด ๋๊ธฐ ์ ์ ํฐ ์ฅ์ ๋ฌผ์ด ์๋ค๋ ์ธ์์ ๋ฐ์์ต๋๋ค.
_* ๋น๋ก ํ์ ๋ถ๊ฐ๋ฅํ ์ ์ด ํ๋ฆ์ ์ฒ๋ฆฌํ๋ 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์๋ ๋ ์ด๋ธ์ด ์ง์ ๋ ์ค๋จ์ด ์์ต๋๋ค.)
@pfalcon , ์, ๋ด ์๋ชป์ ๋๋ค. 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
- ๊ทธ ์ค ์ผ๋ง๋ ๋ง์ ๊ฒ์ด emscripten์ ์ง์ ์กด์ฌํ์ง ์๊ณ musl libc์ ์กด์ฌํ๋์ง ์ฃผ๋ชฉํ์ญ์์ค. (๋ ๋ฒ์งธ๋ก ๋ง์ด ์ฌ์ฉ๋๋ ๊ฒ์ tests/third_party์ ๋๋ค)
์, ์ผ๋ฐ์ ์ผ๋ก C์์ ์ผ๋ง๋ ๋ง์ด ์ฌ์ฉ๋๋์ง์ ๋ํ ๊ณ ๊ฐ๋ฅผ ๋๋์์ต๋๋ค.
- ์์ค ์์ค ๊ตฌ์ฑ์ ๋ฐ์ดํธ ์ฝ๋ ๋ช ๋ น์ด์ ๋์ผํ์ง ์์ต๋๋ค.
๋ฌผ๋ก , ์ฐ๋ฆฌ๊ฐ ๋ ผ์ํ๊ณ ์๋ ๊ฒ์ ์์ค ์์ค ๊ตฌ์ฑ์ ์ํฅ์ ๋ฏธ์น๋ ๋ด๋ถ ๋ฌธ์ ์ ๋๋ค. ๊ทธ๊ฒ์ด ์ข์ ์ ์ผ๋ถ์ด๋ฉฐ, ๋ธ๋๋ฐ์ค๋ ๊ทธ ์ฐ๋ ค๋ฅผ ๋์คํด์๋ ์๋ฉ๋๋ค.
- 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์ ๊ด๋ จ๋ ๋ชจ๋ ์ฌ๋์ด ๋ง์ ์ฒ๋ผ ํ์ ์ ๊ฐ๊ณ ์์ ์ ์ํํ์ง๋ ์์ ๊ฒ์ ๋๋ค. ์ทจํด์ผ ํ ๋จ๊ณ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
@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๊ฐ ์ด๊ฒ์ ์๋ชป ์ดํดํ๋์? ์์ ์์๋ค. ๋๋ฒ๊น ๊ฐ๋ฅ์ฑ ๋ฐ ์คํ ๋จธ์ ์ผ๋ก์ ๋ฆ์ ์ ํ๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋์ด์ผ๋ณด๋ฉด ๊ณ ์น ์ ์๊ณ ์๋ก์ด ๊ฒ์ ์ถ๊ฐํ๋ ๊ฒ, ํนํ ๊ฒน์น๋ ๊ฒ์๋ ๋์ ๊ธฐ์ค์ด ์์ต๋๋ค.
์ด ๋ชจ๋ ๊ฒ์ ๊ฐ์ํ ๋ ๊ฑด์ค์ ์ธ ๋ ธ๋ ฅ์ ๊ธฐ์ธ์ด๋ฉด์ ๋๊ตฌ ์ธก๋ฉด์์ ๊ธฐ์กด ๋ฌธ์ ๋ฅผ ์์ ํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๊ตฌ ๋ณ๊ฒฝ์ ๋ํ ํจ์ฌ ๋ฎ์ ๋ง๋๊ฐ ์์ต๋๋ค. ๋ ๊ฐ์ง ๊ฐ๋ฅํ ์ ์:
์ฐ๋ฆฌ๋ ์์ ํ ๋๊ตฌ ์ธก๋ฉด์์ 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์ ๊ฒฝ์ฐ "๋ณ์"๊ฐ ๋ก์ปฌ ๋๋ ์คํ ์ฌ๋กฏ์ด๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค.)
@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์์).
rax
์ ๋ค์ด๊ฐ๊ณ ๋๋จธ์ง wasm ์คํ์ x86์ ํด๋นํฉ๋๋ค. ์คํ.์ด๊ฒ์ด ์ ์ค์ํฉ๋๊น?
์ด ์๊ณ ๋ฆฌ์ฆ์ ํจ์ฌ ์ ์ ์ ๋ณด๋ก ๊ฑฐ์ ๋์ผํ ๋ฐฉ์์ผ๋ก ์๋ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ฌ๊ณ ์คํ์ผ๋ก ๊ธฐ๋ณธ ์ด์ ๋ธ๋ฆฌ์ ์ ์ฌํ ๊ตฌ์กฐํ๋ ์ ์ด ํ๋ฆ ์ง์นจ์ด ์๊ณ ์ ํ ์ง์นจ๋ง ์๋ ๋์ฒด ์ฐ์ฃผ ๋ฒ์ ์ WebAssembly๋ฅผ ์์ํด ๋ณด์ญ์์ค. ์ด๋ค ๋ช ๋ น์ด ์ ํ์ ๋์์ธ์ง ์๋ ค์ฃผ๋ ํ ๊ฐ์ง ์ถ๊ฐ ์ ๋ณด๋ก ๋ณด๊ฐ๋์ด์ผ ํฉ๋๋ค.
๊ทธ๋ฌ๋ฉด ์๊ณ ๋ฆฌ์ฆ์ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ ๋๋ค. ๋ช ๋ น์ ์ ํ์ผ๋ก ์งํํฉ๋๋ค. ์ ํ ๋ฐ ์ ํ ๋์ ์ ์ ๋ ์ง์คํฐ๋ฅผ ๊ณ ์ ABI๋ก ํ๋ฌ์ํฉ๋๋ค.
ํ ๊ฐ์ง ์ฐจ์ด์ ์ ๊ณ ์ ABI๊ฐ ๋ ๊ฐ๊ฐ ์๋๋ผ ํ ๊ฐ์ฌ์ผ ํ๋ค๋ ๊ฒ์
๋๋ค. ์คํ ์๋จ ๊ฐ์ด ์๋ฏธ์ ์ ํ์ '๊ฒฐ๊ณผ'์ธ ๊ฒ๊ณผ ์ธ๋ถ ๋ธ๋ก์์ ์คํ์ ๋จ์ ์๋ ๊ฒ์ ๊ตฌ๋ณํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ฌด์กฐ๊ฑด rax
์ต์์ ์คํ์ ๋ฃ์ด์ผ ํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ด๊ฒ์ด ์ฑ๋ฅ์ ๋ํ ์ธก์ ๊ฐ๋ฅํ ๋น์ฉ์ด ๋ ๊ฒ์ธ์ง ์์ฌ์ค๋ฝ์ต๋๋ค. ๋ฌด์์ด๋ ๊ฐ์ ์ด ๋ ์ ์์ต๋๋ค.
(๊ฒ์ฆ๋ ๋ค๋ฅด์ง๋ง ์ฌ์ ํ ๋จ์ผ ํจ์ค์ ๋๋ค.)
์ข์์, ์ฌ์ ์ฃผ์์ฌํญ:
์ด๋ฅผ ์ผ๋์ ๋๊ณ ์์ ์ฌ๊ณ ์คํ์ ๊ธฐ์ค ์ปดํ์ผ๋ฌ๊ฐ ๊ตฌ์กฐํ๋ ์ ์ด ํ๋ฆ์ ํ์๋ก ํ์ง ์๋๋ค๋ ๋์ ๋ฏฟ์์ ๊ฐํํฉ๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ผ๋ง๋ ๋ฎ์ ์์ค์ ๊ตฌ์ฑ์ ์ถ๊ฐํ๋์ง์ ๊ด๊ณ์์ด, ์ด๋ค ๋ช ๋ น์ด๊ฐ ์ ํ ๋์์ธ์ง์ ๊ฐ์ ๊ธฐ๋ณธ ์ ๋ณด๊ฐ ํฌํจ๋์ด ์๋ ํ, ๋ฒ ์ด์ค๋ผ์ธ ์ปดํ์ผ๋ฌ๋ ์ฌ์ํ ๋ณ๊ฒฝ๋ง์ผ๋ก ์ด๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ๋๋ ์ ์ด๋ ์ด๊ฒ์ ํ ์ ์์ต๋๋ค.
@ 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
๊ฐ ํ์ํฉ๋๋ค.
๋ฏธ๋ฆฌ ์ปดํ์ผ๋ ์ ๊ท์ ๋งค์ฒ๋ ๋ค๋ฅธ ๋ฏธ๋ฆฌ ์ปดํ์ผ๋ ์ํ ์์คํ ๊ณผ ํจ๊ป ์ ์ด ํ๋ฆ์ ์ถ์ํ ์ ์๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณ์ต๋๋ค. ์ธํฐํ์ด์ค ์ ํ์ ๋ํ "์ตํฉ" ์๊ณ ๋ฆฌ์ฆ์ด ์ ์ด ํ๋ฆ์ ๊ฐ์์ํฌ ์ ์๋์ง ์ฌ๋ถ๋ฅผ ๋งํ๊ธฐ๋ ์ด๋ ต์ต๋๋ค.
FixIrreducibleControlFlow
๋ฐ ์น๊ตฌ๋ก ์ธํด ๋ฐ์ํ๋ ๋นํจ์จ์ฑ์ ๋๊ท๋ชจ ๋ฐ์ด๋๋ฆฌ์์ "1000 ์ปท์ผ๋ก ์ฌ๋ง" ๋ฌธ์ ์ผ ์ ์์ต๋๋ค.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๋ฅผ ๊ฐ์ ํ๋ ๋ฐฉ๋ฒ์ ์๋ ๊ฒ์ด ์ฌ์ ํ ์ ์ฉํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๊ณง ์ถ์๋ Go 1.11 ๋ฆด๋ฆฌ์ค์๋ WebAssembly์ ๋ํ ์คํ์ ์ง์์ด ํฌํจ๋ฉ๋๋ค. ์ฌ๊ธฐ์๋ ๊ณ ๋ฃจํด, ์ฑ๋ ๋ฑ์ ํฌํจํ Go์ ๋ชจ๋ ๊ธฐ๋ฅ์ ๋ํ ์์ ํ ์ง์์ด ํฌํจ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ์์ฑ๋ WebAssembly์ ์ฑ๋ฅ์ ํ์ฌ ๊ทธ๋ค์ง ์ข์ง ์์ต๋๋ค.
์ด๊ฒ์ ์ฃผ๋ก ๋๋ฝ๋ goto ๋ช ๋ น ๋๋ฌธ์ ๋๋ค. goto ๋ช ๋ น์ด๊ฐ ์์ผ๋ฉด ๋ชจ๋ ํจ์์์ ์ต์์ ๋ฃจํ์ ์ ํ ํ ์ด๋ธ์ ์ฌ์ฉํด์ผ ํ์ต๋๋ค. relooper ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ ๊ฒ์ ์ฐ๋ฆฌ์๊ฒ ์ ํ ์ฌํญ์ด ์๋๋๋ค. ๊ณ ๋ฃจํด ๊ฐ์ ์ ํํ ๋ ํจ์์ ๋ค๋ฅธ ์ง์ ์์ ์คํ์ ์ฌ๊ฐํ ์ ์์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. relooper๋ ์ด๊ฒ์ ๋์ธ ์ ์์ผ๋ฉฐ goto ๋ช ๋ น๋ง ํ ์ ์์ต๋๋ค.
WebAssembly๊ฐ Go์ ๊ฐ์ ์ธ์ด๋ฅผ ์ง์ํ ์ ์๋ ์ง๊ฒฝ์ ์ด๋ฅด๊ฒ ๋ ๊ฒ์ ๊ต์ฅํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ง์ ํ ์น ์ด์ ๋ธ๋ฆฌ๊ฐ ๋๋ ค๋ฉด WebAssembly๊ฐ ๋ค๋ฅธ ์ด์ ๋ธ๋ฆฌ ์ธ์ด์ ๋๋ฑํ๊ฒ ๊ฐ๋ ฅํด์ผ ํฉ๋๋ค. Go์๋ ๋ค๋ฅธ ์ฌ๋ฌ ํ๋ซํผ์ ๋ํด ๋งค์ฐ ํจ์จ์ ์ธ ์ด์ ๋ธ๋ฆฌ๋ฅผ ์์ฑํ ์ ์๋ ๊ณ ๊ธ ์ปดํ์ผ๋ฌ๊ฐ ์์ต๋๋ค. ์ด๊ฒ์ด ์น์ ์ํ ํจ์จ์ ์ธ ์ด์ ๋ธ๋ฆฌ๋ฅผ ๋ด๋ณด๋ด๋ ๋ฐ ์ด ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ด ์ฃผ๋ก WebAssembly์ ์ ํ์ด๊ณ Go ์ปดํ์ผ๋ฌ์ ์ ํ์ด ์๋๋ผ๊ณ ์ฃผ์ฅํ๋ ์ด์ ์ ๋๋ค.