์คํ ํ๊ธฐ์ ์ด์ ์ ๋ง์ถฐ WebAssembly์ ์์ธ ์ฒ๋ฆฌ ๋ฉ์ปค๋์ฆ์ ํ์ํฉ๋๋ค. ๊ตฌํ, ์ฑ๋ฅ ์ํฅ ๋ฐ ํฅํ ๋ฐฉํฅ์ ๋ํด ์์๋ณด์ธ์.
WebAssembly ์์ธ ์ฒ๋ฆฌ: ์คํ ํ๊ธฐ(Stack Unwinding) ์ฌ์ธต ๋ถ์
WebAssembly(Wasm)๋ ๊ณ ์ฑ๋ฅ์ ์ด์ ๊ฐ๋ฅํ ์ปดํ์ผ ๋์์ ์ ๊ณตํ์ฌ ์น์ ํ๋ช ์ ์ผ์ผ์ผฐ์ต๋๋ค. ์ฒ์์๋ ์์น ๊ณ์ฐ์ ์ค์ ์ ๋์์ง๋ง, Wasm์ ์ ์ ๋ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉ๋๊ณ ์์ผ๋ฉฐ ๊ฐ๋ ฅํ ์ค๋ฅ ์ฒ๋ฆฌ ๋ฉ์ปค๋์ฆ์ด ํ์ํด์ก์ต๋๋ค. ๋ฐ๋ก ์ด ์ง์ ์์ ์์ธ ์ฒ๋ฆฌ๊ฐ ๋ฑ์ฅํฉ๋๋ค. ์ด ๊ธ์์๋ WebAssembly์ ์์ธ ์ฒ๋ฆฌ๋ฅผ ๊น์ด ํ๊ณ ๋ค๋ฉฐ, ํนํ ์ค์ํ ํ๋ก์ธ์ค์ธ ์คํ ํ๊ธฐ์ ์ด์ ์ ๋ง์ถฅ๋๋ค. ๊ตฌํ ์ธ๋ถ ์ฌํญ, ์ฑ๋ฅ ๊ณ ๋ ค ์ฌํญ, ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ด Wasm ๊ฐ๋ฐ์ ๋ฏธ์น๋ ์ ๋ฐ์ ์ธ ์ํฅ์ ๋ํด ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์์ธ ์ฒ๋ฆฌ๋ ๋ฌด์์ธ๊ฐ?
์์ธ ์ฒ๋ฆฌ๋ ํ๋ก๊ทธ๋จ ์คํ ์ค์ ๋ฐ์ํ๋ ์ค๋ฅ๋ ์์ธ์ ์ธ ์กฐ๊ฑด์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๊ณ ์๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด ๊ตฌ์กฐ์ ๋๋ค. ํ๋ก๊ทธ๋จ์ด ์ถฉ๋ํ๊ฑฐ๋ ์ ์๋์ง ์์ ๋์์ ๋ณด์ด๋ ๋์ , ์์ธ๋ฅผ "๋์ง๊ณ (throw)" ์ง์ ๋ ํธ๋ค๋ฌ์ ์ํด "์กํ๋๋ก(catch)" ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ํ๋ก๊ทธ๋จ์ ์ค๋ฅ๋ก๋ถํฐ ์ ์์ ์ผ๋ก ๋ณต๊ตฌํ๊ฑฐ๋, ์ง๋จ ์ ๋ณด๋ฅผ ๊ธฐ๋กํ๊ฑฐ๋, ์คํ์ ๊ณ์ํ๊ฑฐ๋ ์ ์์ ์ผ๋ก ์ข ๋ฃํ๊ธฐ ์ ์ ์ ๋ฆฌ ์์ ์ ์ํํ ์ ์์ต๋๋ค.
ํ์ผ์ ์ ๊ทผํ๋ ค๋ ์ํฉ์ ์๊ฐํด๋ณด์ญ์์ค. ํ์ผ์ด ์กด์ฌํ์ง ์๊ฑฐ๋ ์ฝ์ ์ ์๋ ํ์ํ ๊ถํ์ด ์์ ์ ์์ต๋๋ค. ์์ธ ์ฒ๋ฆฌ๊ฐ ์๋ค๋ฉด ํ๋ก๊ทธ๋จ์ด ์ถฉ๋ํ ์ ์์ต๋๋ค. ์์ธ ์ฒ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ผ ์ ๊ทผ ์ฝ๋๋ฅผ try ๋ธ๋ก์ผ๋ก ๊ฐ์ธ๊ณ catch ๋ธ๋ก์ ์ ๊ณตํ์ฌ ์ ์ฌ์ ์ธ ์์ธ(์: FileNotFoundException, SecurityException)๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ฌ์ฉ์์๊ฒ ์ ์ฉํ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ํ์ํ๊ฑฐ๋ ์ค๋ฅ๋ก๋ถํฐ ๋ณต๊ตฌ๋ฅผ ์๋ํ ์ ์์ต๋๋ค.
WebAssembly์์ ์์ธ ์ฒ๋ฆฌ๊ฐ ํ์ํ ์ด์
WebAssembly๊ฐ ์์ ๋ชจ๋์ ์ํ ์๋๋ฐ์ค ์คํ ํ๊ฒฝ์์ ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ํ๋ซํผ์ผ๋ก ๋ฐ์ ํจ์ ๋ฐ๋ผ, ์ ์ ํ ์์ธ ์ฒ๋ฆฌ์ ํ์์ฑ์ด ์ ์ ๋ ์ค์ํด์ง๊ณ ์์ต๋๋ค. ์์ธ๊ฐ ์์ผ๋ฉด ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ๋ฒ๊ฑฐ๋กญ๊ณ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฝ์ต๋๋ค. ๊ฐ๋ฐ์๋ค์ ์ค๋ฅ ์ฝ๋๋ฅผ ๋ฐํํ๊ฑฐ๋ ๋ค๋ฅธ ์์์ ์ธ ๋ฉ์ปค๋์ฆ์ ์์กดํด์ผ ํ๋๋ฐ, ์ด๋ ์ฝ๋๋ฅผ ์ฝ๊ณ , ์ ์ง๋ณด์ํ๊ณ , ๋๋ฒ๊น ํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
C++์ ๊ฐ์ ์ธ์ด๋ก ์์ฑ๋์ด WebAssembly๋ก ์ปดํ์ผ๋ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๊ฐํด๋ณด์ญ์์ค. C++ ์ฝ๋๋ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ํด ์์ธ์ ํฌ๊ฒ ์์กดํ ์ ์์ต๋๋ค. WebAssembly์ ์ ์ ํ ์์ธ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ด ์๋ค๋ฉด, ์ปดํ์ผ๋ ์ฝ๋๋ ์ ๋๋ก ์๋ํ์ง ์๊ฑฐ๋ ์์ธ ์ฒ๋ฆฌ ๋ฉ์ปค๋์ฆ์ ๋์ฒดํ๊ธฐ ์ํด ์๋นํ ์์ ์ด ํ์ํ ๊ฒ์ ๋๋ค. ์ด๋ ๊ธฐ์กด ์ฝ๋๋ฒ ์ด์ค๋ฅผ WebAssembly ์ํ๊ณ๋ก ์ด์ํ๋ ํ๋ก์ ํธ์ ํนํ ๊ด๋ จ์ด ์์ต๋๋ค.
WebAssembly์ ์์ธ ์ฒ๋ฆฌ ์ ์
WebAssembly ์ปค๋ฎค๋ํฐ๋ ํ์คํ๋ ์์ธ ์ฒ๋ฆฌ ์ ์(์ข ์ข WasmEH๋ผ๊ณ ํจ)์ ๋ํด ์์ ํด ์์ต๋๋ค. ์ด ์ ์์ WebAssembly์์ ์์ธ๋ฅผ ์ฒ๋ฆฌํ๋ ์ด์ ๊ฐ๋ฅํ๊ณ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค. ์ด ์ ์์ ์์ธ๋ฅผ ๋์ง๊ณ ์ก๊ธฐ ์ํ ์๋ก์ด ๋ช ๋ น์ด์ ์ด ๊ธ์ ์ด์ ์ธ ์คํ ํ๊ธฐ ๋ฉ์ปค๋์ฆ์ ์ ์ํฉ๋๋ค.
WebAssembly ์์ธ ์ฒ๋ฆฌ ์ ์์ ์ฃผ์ ๊ตฌ์ฑ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
try/catch๋ธ๋ก: ๋ค๋ฅธ ์ธ์ด์ ์์ธ ์ฒ๋ฆฌ์ ์ ์ฌํ๊ฒ, WebAssembly๋ ์์ธ๋ฅผ ๋์ง ์ ์๋ ์ฝ๋๋ฅผ ๊ฐ์ธ๊ณ ํด๋น ์์ธ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํtry๋ฐcatch๋ธ๋ก์ ์ ๊ณตํฉ๋๋ค.- ์์ธ ๊ฐ์ฒด: WebAssembly ์์ธ๋ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ์ ์๋ ๊ฐ์ฒด๋ก ํํ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ์์ธ ํธ๋ค๋ฌ๋ ๋ฐ์ํ ์ค๋ฅ์ ๋ํ ์ ๋ณด์ ์ ๊ทผํ ์ ์์ต๋๋ค.
throw๋ช ๋ น์ด: ์ด ๋ช ๋ น์ด๋ ์์ธ๋ฅผ ๋ฐ์์ํค๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.rethrow๋ช ๋ น์ด: ์์ธ ํธ๋ค๋ฌ๊ฐ ์์ธ๋ฅผ ๋ ๋์ ์์ค์ผ๋ก ์ ํํ ์ ์๋๋ก ํฉ๋๋ค.- ์คํ ํ๊ธฐ: ์์ธ๊ฐ ๋ฐ์ํ ํ ํธ์ถ ์คํ์ ์ ๋ฆฌํ๋ ๊ณผ์ ์ผ๋ก, ์ ์ ํ ๋ฆฌ์์ค ๊ด๋ฆฌ์ ํ๋ก๊ทธ๋จ ์์ ์ฑ์ ๋ณด์ฅํ๋ ๋ฐ ํ์์ ์ ๋๋ค.
์คํ ํ๊ธฐ: ์์ธ ์ฒ๋ฆฌ์ ํต์ฌ
์คํ ํ๊ธฐ๋ ์์ธ ์ฒ๋ฆฌ ๊ณผ์ ์ ์ค์ํ ๋ถ๋ถ์ ๋๋ค. ์์ธ๊ฐ ๋ฐ์ํ๋ฉด WebAssembly ๋ฐํ์์ ์ ์ ํ ์์ธ ํธ๋ค๋ฌ๋ฅผ ์ฐพ๊ธฐ ์ํด ํธ์ถ ์คํ์ "ํ์ด์ผ(unwind)" ํฉ๋๋ค. ์ด ๊ณผ์ ์ ๋ค์ ๋จ๊ณ๋ฅผ ํฌํจํฉ๋๋ค:
- ์์ธ ๋ฐ์:
throw๋ช ๋ น์ด๊ฐ ์คํ๋์ด ์์ธ๊ฐ ๋ฐ์ํ์์ ์๋ฆฝ๋๋ค. - ํธ๋ค๋ฌ ๊ฒ์: ๋ฐํ์์ ์์ธ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋
catch๋ธ๋ก์ ์ฐพ๊ธฐ ์ํด ํธ์ถ ์คํ์ ๊ฒ์ํฉ๋๋ค. ์ด ๊ฒ์์ ํ์ฌ ํจ์์์ ํธ์ถ ์คํ์ ๋ฃจํธ ๋ฐฉํฅ์ผ๋ก ์งํ๋ฉ๋๋ค. - ์คํ ํ๊ธฐ: ๋ฐํ์์ด ํธ์ถ ์คํ์ ๋ฐ๋ผ ์ด๋ํ๋ฉด์ ๊ฐ ํจ์์ ์คํ ํ๋ ์์ "ํ์ด์ผ" ํฉ๋๋ค. ์ด๋ ๋ค์์ ํฌํจํฉ๋๋ค:
- ์ด์ ์คํ ํฌ์ธํฐ๋ฅผ ๋ณต์ํฉ๋๋ค.
- ํ๋ฆฌ๋ ํจ์์ ๊ด๋ จ๋ ๋ชจ๋
finally๋ธ๋ก(๋๋ ๋ช ์์ ์ธfinally๋ธ๋ก์ด ์๋ ์ธ์ด์ ๋๋ฑํ ์ ๋ฆฌ ์ฝ๋)์ ์คํํฉ๋๋ค. ์ด๋ ๋ฆฌ์์ค๊ฐ ์ ์ ํ๊ฒ ํด์ ๋๊ณ ํ๋ก๊ทธ๋จ์ด ์ผ๊ด๋ ์ํ๋ฅผ ์ ์งํ๋๋ก ๋ณด์ฅํฉ๋๋ค. - ํธ์ถ ์คํ์์ ์คํ ํ๋ ์์ ์ ๊ฑฐํฉ๋๋ค.
- ํธ๋ค๋ฌ ๋ฐ๊ฒฌ: ์ ํฉํ ์์ธ ํธ๋ค๋ฌ๊ฐ ๋ฐ๊ฒฌ๋๋ฉด ๋ฐํ์์ ์ ์ด๋ฅผ ํด๋น ํธ๋ค๋ฌ๋ก ์ด์ ํฉ๋๋ค. ํธ๋ค๋ฌ๋ ์์ธ์ ๋ํ ์ ๋ณด์ ์ ๊ทผํ์ฌ ์ ์ ํ ์กฐ์น๋ฅผ ์ทจํ ์ ์์ต๋๋ค.
- ํธ๋ค๋ฌ ๋ฏธ๋ฐ๊ฒฌ: ํธ์ถ ์คํ์์ ์ ํฉํ ์์ธ ํธ๋ค๋ฌ๋ฅผ ์ฐพ์ง ๋ชปํ๋ฉด ์์ธ๋ ์กํ์ง ์์ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค. ์ด ๊ฒฝ์ฐ WebAssembly ๋ฐํ์์ ์ผ๋ฐ์ ์ผ๋ก ํ๋ก๊ทธ๋จ์ ์ข ๋ฃํฉ๋๋ค(์๋ฒ ๋๊ฐ ์ด ๋์์ ์ฌ์ฉ์ ์ ์ํ ์๋ ์์ต๋๋ค).
์์: ๋ค์๊ณผ ๊ฐ์ ๋จ์ํ๋ ํธ์ถ ์คํ์ ๊ณ ๋ คํด๋ณด์ญ์์ค:
ํจ์ A๊ฐ ํจ์ B๋ฅผ ํธ์ถ ํจ์ B๊ฐ ํจ์ C๋ฅผ ํธ์ถ ํจ์ C์์ ์์ธ ๋ฐ์
ํจ์ C์์ ์์ธ๊ฐ ๋ฐ์ํ๊ณ ํจ์ B์ ์์ธ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ try/catch ๋ธ๋ก์ด ์๋ ๊ฒฝ์ฐ, ์คํ ํ๊ธฐ ํ๋ก์ธ์ค๋ ๋ค์๊ณผ ๊ฐ์ด ์งํ๋ฉ๋๋ค:
- ํจ์ C์ ์คํ ํ๋ ์์ ํ๋๋ค.
- ์ ์ด๋ฅผ ํจ์ B์
catch๋ธ๋ก์ผ๋ก ์ด์ ํฉ๋๋ค.
๋ง์ฝ ํจ์ B์ catch ๋ธ๋ก์ด ์๋ค๋ฉด, ํ๊ธฐ ํ๋ก์ธ์ค๋ ํจ์ A๊น์ง ๊ณ์๋ฉ๋๋ค.
WebAssembly์์์ ์คํ ํ๊ธฐ ๊ตฌํ
WebAssembly์์ ์คํ ํ๊ธฐ ๊ตฌํ์ ์ฌ๋ฌ ์ฃผ์ ๊ตฌ์ฑ ์์๋ฅผ ํฌํจํฉ๋๋ค:
- ํธ์ถ ์คํ ํํ: WebAssembly ๋ฐํ์์ ์คํ ํ๋ ์์ ํจ์จ์ ์ผ๋ก ์ํํ ์ ์๋๋ก ํธ์ถ ์คํ์ ํํ์ ์ ์งํด์ผ ํฉ๋๋ค. ์ด๋ ์ผ๋ฐ์ ์ผ๋ก ์คํ ์ค์ธ ํจ์, ์ง์ญ ๋ณ์ ๋ฐ ๋ฐํ ์ฃผ์์ ๋ํ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค.
- ํ๋ ์ ํฌ์ธํฐ: ํ๋ ์ ํฌ์ธํฐ(๋๋ ์ ์ฌํ ๋ฉ์ปค๋์ฆ)๋ ํธ์ถ ์คํ์์ ๊ฐ ํจ์์ ์คํ ํ๋ ์์ ์ฐพ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ฐํ์์ ํจ์์ ์ง์ญ ๋ณ์ ๋ฐ ๊ธฐํ ๊ด๋ จ ์ ๋ณด์ ์ฝ๊ฒ ์ ๊ทผํ ์ ์์ต๋๋ค.
- ์์ธ ์ฒ๋ฆฌ ํ ์ด๋ธ: ์ด ํ ์ด๋ธ๋ค์ ๊ฐ ํจ์์ ๊ด๋ จ๋ ์์ธ ํธ๋ค๋ฌ์ ๋ํ ์ ๋ณด๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐํ์์ ์ด ํ ์ด๋ธ์ ์ฌ์ฉํ์ฌ ํน์ ํจ์๊ฐ ์ฃผ์ด์ง ์์ธ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ ํธ๋ค๋ฌ๋ฅผ ๊ฐ์ง๊ณ ์๋์ง ์ ์ํ๊ฒ ๊ฒฐ์ ํฉ๋๋ค.
- ์ ๋ฆฌ ์ฝ๋: ๋ฐํ์์ ์คํ์ ํ๋ฉด์ ์ ๋ฆฌ ์ฝ๋(์:
finally๋ธ๋ก)๋ฅผ ์คํํด์ผ ํฉ๋๋ค. ์ด๋ ๋ฆฌ์์ค๊ฐ ์ ์ ํ๊ฒ ํด์ ๋๊ณ ํ๋ก๊ทธ๋จ์ด ์ผ๊ด๋ ์ํ๋ฅผ ์ ์งํ๋๋ก ๋ณด์ฅํฉ๋๋ค.
WebAssembly์์ ์คํ ํ๊ธฐ๋ฅผ ๊ตฌํํ๋ ๋ฐ๋ ์ฌ๋ฌ ๊ฐ์ง ์ ๊ทผ ๋ฐฉ์์ด ์ฌ์ฉ๋ ์ ์์ผ๋ฉฐ, ๊ฐ๊ฐ ์ฑ๋ฅ๊ณผ ๋ณต์ก์ฑ ์ธก๋ฉด์์ ์ฅ๋จ์ ์ด ์์ต๋๋ค. ๋ช ๊ฐ์ง ์ผ๋ฐ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ ๋ก ๋น์ฉ ์์ธ ์ฒ๋ฆฌ (ZCEH): ์ด ์ ๊ทผ ๋ฐฉ์์ ์์ธ๊ฐ ๋ฐ์ํ์ง ์์ ๋ ์์ธ ์ฒ๋ฆฌ์ ์ค๋ฒํค๋๋ฅผ ์ต์ํํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค. ZCEH๋ ์ผ๋ฐ์ ์ผ๋ก ์ ์ ๋ถ์์ ์ฌ์ฉํ์ฌ ์ด๋ค ํจ์๊ฐ ์์ธ๋ฅผ ๋์ง ์ ์๋์ง ํ์ ํ ๋ค์ ํด๋น ํจ์์ ๋ํ ํน์ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐฉ์์ ํฌํจํฉ๋๋ค. ์์ธ๋ฅผ ๋์ง์ง ์๋ ๊ฒ์ผ๋ก ์๋ ค์ง ํจ์๋ ์์ธ ์ฒ๋ฆฌ ์ค๋ฒํค๋ ์์ด ์คํ๋ ์ ์์ต๋๋ค. LLVM์ ์ข ์ข ์ด ๋ฐฉ์์ ๋ณํ์ ์ฌ์ฉํฉ๋๋ค.
- ํ ์ด๋ธ ๊ธฐ๋ฐ ํ๊ธฐ: ์ด ์ ๊ทผ ๋ฐฉ์์ ํ ์ด๋ธ์ ์ฌ์ฉํ์ฌ ์คํ ํ๋ ์๊ณผ ์์ธ ํธ๋ค๋ฌ์ ๋ํ ์ ๋ณด๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐํ์์ ์์ธ๊ฐ ๋ฐ์ํ์ ๋ ์ด ํ ์ด๋ธ์ ์ฌ์ฉํ์ฌ ์ ์ํ๊ฒ ์คํ์ ํ ์ ์์ต๋๋ค.
- DWARF ๊ธฐ๋ฐ ํ๊ธฐ: DWARF(Debugging With Attributed Record Formats)๋ ์คํ ํ๋ ์์ ๋ํ ์ ๋ณด๋ฅผ ํฌํจํ๋ ํ์ค ๋๋ฒ๊น ํ์์ ๋๋ค. ๋ฐํ์์ ์์ธ๊ฐ ๋ฐ์ํ์ ๋ DWARF ์ ๋ณด๋ฅผ ์ฌ์ฉํ์ฌ ์คํ์ ํ ์ ์์ต๋๋ค.
WebAssembly์์ ์คํ ํ๊ธฐ์ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์ WebAssembly ๋ฐํ์๊ณผ WebAssembly ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐ ์ฌ์ฉ๋ ์ปดํ์ผ๋ฌ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
์คํ ํ๊ธฐ์ ์ฑ๋ฅ ์ํฅ
์คํ ํ๊ธฐ๋ WebAssembly ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ์๋นํ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. ์คํ์ ํธ๋ ์ค๋ฒํค๋๋ ์๋นํ ์ ์์ผ๋ฉฐ, ํนํ ํธ์ถ ์คํ์ด ๊น๊ฑฐ๋ ํ์ด์ผ ํ ํจ์๊ฐ ๋ง์ ๊ฒฝ์ฐ ๋์ฑ ๊ทธ๋ ์ต๋๋ค. ๋ฐ๋ผ์ WebAssembly ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค๊ณํ ๋ ์์ธ ์ฒ๋ฆฌ์ ์ฑ๋ฅ ์ํฅ์ ์ ์คํ๊ฒ ๊ณ ๋ คํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
์ฌ๋ฌ ์์ธ์ด ์คํ ํ๊ธฐ์ ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค:
- ํธ์ถ ์คํ์ ๊น์ด: ํธ์ถ ์คํ์ด ๊น์์๋ก ํ์ด์ผ ํ ํจ์๊ฐ ๋ง์์ ธ ์ค๋ฒํค๋๊ฐ ์ฆ๊ฐํฉ๋๋ค.
- ์์ธ ๋ฐ์ ๋น๋: ์์ธ๊ฐ ์์ฃผ ๋ฐ์ํ๋ฉด ์คํ ํ๊ธฐ์ ์ค๋ฒํค๋๊ฐ ์ปค์ง ์ ์์ต๋๋ค.
- ์ ๋ฆฌ ์ฝ๋์ ๋ณต์ก์ฑ: ์ ๋ฆฌ ์ฝ๋(์:
finally๋ธ๋ก)๊ฐ ๋ณต์กํ๋ฉด ์ ๋ฆฌ ์ฝ๋๋ฅผ ์คํํ๋ ์ค๋ฒํค๋๊ฐ ์๋นํ ์ ์์ต๋๋ค. - ์คํ ํ๊ธฐ ๊ตฌํ ๋ฐฉ์: ์คํ ํ๊ธฐ์ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ ๋ฐฉ์์ ์ฑ๋ฅ์ ํฐ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. ์ ๋ก ๋น์ฉ ์์ธ ์ฒ๋ฆฌ ๊ธฐ์ ์ ์์ธ๊ฐ ๋ฐ์ํ์ง ์์ ๋ ์ค๋ฒํค๋๋ฅผ ์ต์ํํ ์ ์์ง๋ง, ์์ธ๊ฐ ๋ฐ์ํ ๋๋ ๋ ๋์ ์ค๋ฒํค๋๋ฅผ ์ ๋ฐํ ์ ์์ต๋๋ค.
์คํ ํ๊ธฐ์ ์ฑ๋ฅ ์ํฅ์ ์ต์ํํ๋ ค๋ฉด ๋ค์ ์ ๋ต์ ๊ณ ๋ คํ์ญ์์ค:
- ์์ธ ์ฌ์ฉ ์ต์ํ: ์์ธ๋ ์ ๋ง๋ก ์์ธ์ ์ธ ์ํฉ์๋ง ์ฌ์ฉํ์ญ์์ค. ์ผ๋ฐ์ ์ธ ์ ์ด ํ๋ฆ์ ์์ธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ํผํ์ญ์์ค. Rust์ ๊ฐ์ ์ธ์ด๋ ๋ช
์์ ์ธ ์ค๋ฅ ์ฒ๋ฆฌ(์:
Resultํ์ )๋ฅผ ์ ํธํ์ฌ ์์ธ๋ฅผ ์์ ํ ํผํฉ๋๋ค. - ํธ์ถ ์คํ์ ์๊ฒ ์ ์ง: ๊ฐ๋ฅํ๋ฉด ๊น์ ํธ์ถ ์คํ์ ํผํ์ญ์์ค. ํธ์ถ ์คํ์ ๊น์ด๋ฅผ ์ค์ด๊ธฐ ์ํด ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค.
- ์ ๋ฆฌ ์ฝ๋ ์ต์ ํ: ์ ๋ฆฌ ์ฝ๋๊ฐ ๊ฐ๋ฅํ ํ ํจ์จ์ ์ธ์ง ํ์ธํ์ญ์์ค.
finally๋ธ๋ก์์ ๋ถํ์ํ ์์ ์ ์ํํ์ง ๋ง์ญ์์ค. - ํจ์จ์ ์ธ ์คํ ํ๊ธฐ ๊ตฌํ์ ๊ฐ์ถ WebAssembly ๋ฐํ์ ์ฌ์ฉ: ์ ๋ก ๋น์ฉ ์์ธ ์ฒ๋ฆฌ์ ๊ฐ์ด ํจ์จ์ ์ธ ์คํ ํ๊ธฐ ๊ตฌํ์ ์ฌ์ฉํ๋ WebAssembly ๋ฐํ์์ ์ ํํ์ญ์์ค.
์์: ๋ง์ ์์ ๊ณ์ฐ์ ์ํํ๋ WebAssembly ์ ํ๋ฆฌ์ผ์ด์ ์ ์๊ฐํด๋ณด์ญ์์ค. ๋ง์ฝ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๊ณ์ฐ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์์ธ๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, ์คํ ํ๊ธฐ์ ์ค๋ฒํค๋๊ฐ ์ปค์ง ์ ์์ต๋๋ค. ์ด๋ฅผ ์ํํ๊ธฐ ์ํด ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ธ ๋์ ์ค๋ฅ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋๋ก ์์ ํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์คํ ํ๊ธฐ์ ์ค๋ฒํค๋๋ ์ ๊ฑฐ๋์ง๋ง, ๊ฐ ๊ณ์ฐ ํ์ ๋ช ์์ ์ผ๋ก ์ค๋ฅ๋ฅผ ํ์ธํด์ผ ํฉ๋๋ค.
์์ ์ฝ๋ ์กฐ๊ฐ (๊ฐ๋ ์ - WASM ์ด์ ๋ธ๋ฆฌ)
๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ ํ์ ๋๋ฌธ์ ์ฌ๊ธฐ์์ ์ง์ ์คํ ๊ฐ๋ฅํ WASM ์ฝ๋๋ฅผ ์ ๊ณตํ ์๋ ์์ง๋ง, ์์ธ ์ฒ๋ฆฌ๊ฐ WASM ์ด์ ๋ธ๋ฆฌ(WAT - WebAssembly ํ ์คํธ ํ์)์์ ๊ฐ๋ ์ ์ผ๋ก ์ด๋ป๊ฒ ๋ณด์ผ ์ ์๋์ง ๋ณด์ฌ๋๋ฆฌ๊ฒ ์ต๋๋ค:
;; ์์ธ ์ ํ ์ ์
(type $exn_type (exception (result i32)))
;; ์์ธ๋ฅผ ๋์ง ์ ์๋ ํจ์
(func $might_fail (result i32)
(try $try_block
i32.const 10
i32.const 0
i32.div_s ;; 0์ผ๋ก ๋๋๋ฉด ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค
;; ์์ธ๊ฐ ์์ผ๋ฉด ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ
(return)
(catch $exn_type
;; ์์ธ ์ฒ๋ฆฌ: -1 ๋ฐํ
i32.const -1
(return))
)
)
;; ์คํจํ ๊ฐ๋ฅ์ฑ์ด ์๋ ํจ์๋ฅผ ํธ์ถํ๋ ํจ์
(func $caller (result i32)
(call $might_fail)
)
;; caller ํจ์๋ฅผ ๋ด๋ณด๋ด๊ธฐ
(export "caller" (func $caller))
;; ์์ธ ์ ์
(global $my_exception (mut i32) (i32.const 0))
;; ์์ธ ๋์ง๊ธฐ (์์ฌ ์ฝ๋, ์ค์ ๋ช
๋ น์ด๋ ๋ค๋ฅผ ์ ์์)
;; throw $my_exception
์ค๋ช :
(type $exn_type (exception (result i32))): ์์ธ ์ ํ์ ์ ์ํฉ๋๋ค.(try ... catch ...): try-catch ๋ธ๋ก์ ์ ์ํฉ๋๋ค.$might_fail๋ด๋ถ์i32.div_s๋ 0์ผ๋ก ๋๋๊ธฐ ์ค๋ฅ(๋ฐ ์์ธ)๋ฅผ ์ ๋ฐํ ์ ์์ต๋๋ค.catch๋ธ๋ก์$exn_type์ ํ์ ์์ธ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
์ฐธ๊ณ : ์ด๊ฒ์ ๋จ์ํ๋ ๊ฐ๋ ์ ์์ ์ ๋๋ค. ์ค์ WebAssembly ์์ธ ์ฒ๋ฆฌ ๋ช ๋ น์ด์ ๊ตฌ๋ฌธ์ WebAssembly ์ฌ์์ ํน์ ๋ฒ์ ๊ณผ ์ฌ์ฉ๋๋ ๋๊ตฌ์ ๋ฐ๋ผ ์ฝ๊ฐ ๋ค๋ฅผ ์ ์์ต๋๋ค. ๊ฐ์ฅ ์ต์ ์ ๋ณด๋ ๊ณต์ WebAssembly ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
์์ธ๊ฐ ์๋ WebAssembly ๋๋ฒ๊น
์์ธ๋ฅผ ์ฌ์ฉํ๋ WebAssembly ์ฝ๋๋ฅผ ๋๋ฒ๊น ํ๋ ๊ฒ์ ์ด๋ ค์ธ ์ ์์ผ๋ฉฐ, ํนํ WebAssembly ๋ฐํ์๊ณผ ์์ธ ์ฒ๋ฆฌ ๋ฉ์ปค๋์ฆ์ ์ต์ํ์ง ์์ ๊ฒฝ์ฐ ๋์ฑ ๊ทธ๋ ์ต๋๋ค. ๊ทธ๋ฌ๋ ์์ธ๊ฐ ์๋ WebAssembly ์ฝ๋๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๋๋ฒ๊น ํ๋ ๋ฐ ๋์์ด ๋๋ ์ฌ๋ฌ ๋๊ตฌ์ ๊ธฐ์ ์ด ์์ต๋๋ค:
- ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ: ์ต์ ์น ๋ธ๋ผ์ฐ์ ๋ WebAssembly ์ฝ๋๋ฅผ ๋๋ฒ๊น ํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ๊ฐ๋ ฅํ ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ๋๊ตฌ๋ ์ผ๋ฐ์ ์ผ๋ก ์ค๋จ์ ์ค์ , ์ฝ๋ ๋จ๊ณ๋ณ ์คํ, ๋ณ์ ๊ฒ์ฌ, ํธ์ถ ์คํ ๋ณด๊ธฐ๋ฅผ ํ์ฉํฉ๋๋ค. ์์ธ๊ฐ ๋ฐ์ํ๋ฉด ๊ฐ๋ฐ์ ๋๊ตฌ๋ ์์ธ ์ ํ ๋ฐ ์์ธ ๋ฐ์ ์์น์ ๊ฐ์ ์์ธ์ ๋ํ ์ ๋ณด๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
- WebAssembly ๋๋ฒ๊ฑฐ: WebAssembly Binary Toolkit(WABT) ๋ฐ Binaryen ํดํท๊ณผ ๊ฐ์ ์ฌ๋ฌ ์ ์ฉ WebAssembly ๋๋ฒ๊ฑฐ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๋๋ฒ๊ฑฐ๋ WebAssembly ๋ชจ๋์ ๋ด๋ถ ์ํ ๊ฒ์ฌ ๋ฐ ํน์ ๋ช ๋ น์ด์ ์ค๋จ์ ์ค์ ๊ณผ ๊ฐ์ ๋ ๊ณ ๊ธ ๋๋ฒ๊น ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
- ๋ก๊น : ๋ก๊น ์ ์์ธ๊ฐ ์๋ WebAssembly ์ฝ๋๋ฅผ ๋๋ฒ๊น ํ๋ ๋ฐ ์ ์ฉํ ๋๊ตฌ๊ฐ ๋ ์ ์์ต๋๋ค. ์ฝ๋์ ๋ก๊น ๋ฌธ์ ์ถ๊ฐํ์ฌ ์คํ ํ๋ฆ์ ์ถ์ ํ๊ณ ๋ฐ์ํ๋ ์์ธ์ ๋ํ ์ ๋ณด๋ฅผ ๊ธฐ๋กํ ์ ์์ต๋๋ค. ์ด๋ ์์ธ์ ๊ทผ๋ณธ ์์ธ์ ์๋ณํ๊ณ ์์ธ๊ฐ ์ด๋ป๊ฒ ์ฒ๋ฆฌ๋๋์ง ์ดํดํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
- ์์ค ๋งต: ์์ค ๋งต์ ์ฌ์ฉํ๋ฉด WebAssembly ์ฝ๋๋ฅผ ์๋ณธ ์์ค ์ฝ๋๋ก ๋ค์ ๋งคํํ ์ ์์ต๋๋ค. ์ด๋ ํนํ ์ฝ๋๊ฐ ๊ณ ์์ค ์ธ์ด์์ ์ปดํ์ผ๋ ๊ฒฝ์ฐ WebAssembly ์ฝ๋๋ฅผ ํจ์ฌ ์ฝ๊ฒ ๋๋ฒ๊น ํ ์ ์๊ฒ ํด์ค๋๋ค. ์์ธ๊ฐ ๋ฐ์ํ๋ฉด ์์ค ๋งต์ ์๋ณธ ์์ค ํ์ผ์์ ํด๋น ์ฝ๋ ์ค์ ์๋ณํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
WebAssembly ์์ธ ์ฒ๋ฆฌ์ ํฅํ ๋ฐฉํฅ
WebAssembly ์์ธ ์ฒ๋ฆฌ ์ ์์ ์์ง ๋ฐ์ ์ค์ด๋ฉฐ, ์ถ๊ฐ์ ์ธ ๊ฐ์ ์ด ๋ชจ์๋๊ณ ์๋ ์ฌ๋ฌ ์์ญ์ด ์์ต๋๋ค:
- ์์ธ ์ ํ ํ์คํ: ํ์ฌ WebAssembly๋ ์ฌ์ฉ์ ์ ์ ์์ธ ์ ํ์ ์ ์ํ ์ ์๋๋ก ํ์ฉํฉ๋๋ค. ๊ณตํต ์์ธ ์ ํ ์งํฉ์ ํ์คํํ๋ฉด ๋ค๋ฅธ WebAssembly ๋ชจ๋ ๊ฐ์ ์ํธ ์ด์ฉ์ฑ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
- ๊ฐ๋น์ง ์ปฌ๋ ์ ๊ณผ์ ํตํฉ: WebAssembly๊ฐ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์ง์ํ๊ฒ ๋จ์ ๋ฐ๋ผ ์์ธ ์ฒ๋ฆฌ๋ฅผ ๊ฐ๋น์ง ์ปฌ๋ ํฐ์ ํตํฉํ๋ ๊ฒ์ด ์ค์ํด์ง ๊ฒ์ ๋๋ค. ์ด๋ ์์ธ๊ฐ ๋ฐ์ํ์ ๋ ๋ฆฌ์์ค๊ฐ ์ ์ ํ๊ฒ ํด์ ๋๋๋ก ๋ณด์ฅํ ๊ฒ์ ๋๋ค.
- ๊ฐ์ ๋ ๋๊ตฌ: WebAssembly ๋๋ฒ๊น ๋๊ตฌ์ ์ง์์ ์ธ ๊ฐ์ ์ ์์ธ๊ฐ ์๋ WebAssembly ์ฝ๋๋ฅผ ๋ ์ฝ๊ฒ ๋๋ฒ๊น ํ๋ ๋ฐ ์ค์ํ ๊ฒ์ ๋๋ค.
- ์ฑ๋ฅ ์ต์ ํ: WebAssembly์์ ์คํ ํ๊ธฐ ๋ฐ ์์ธ ์ฒ๋ฆฌ์ ์ฑ๋ฅ์ ์ต์ ํํ๊ธฐ ์ํด ์ถ๊ฐ์ ์ธ ์ฐ๊ตฌ ๋ฐ ๊ฐ๋ฐ์ด ํ์ํฉ๋๋ค.
๊ฒฐ๋ก
WebAssembly ์์ธ ์ฒ๋ฆฌ๋ ๋ณต์กํ๊ณ ๊ฒฌ๊ณ ํ WebAssembly ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ์ค์ํ ๊ธฐ๋ฅ์ ๋๋ค. ์คํ ํ๊ธฐ๋ฅผ ์ดํดํ๋ ๊ฒ์ WebAssembly์์ ์์ธ๊ฐ ์ด๋ป๊ฒ ์ฒ๋ฆฌ๋๋์ง ์ดํดํ๊ณ ์์ธ๋ฅผ ์ฌ์ฉํ๋ WebAssembly ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ์ต์ ํํ๋ ๋ฐ ํ์์ ์ ๋๋ค. WebAssembly ์ํ๊ณ๊ฐ ๊ณ์ ๋ฐ์ ํจ์ ๋ฐ๋ผ ์์ธ ์ฒ๋ฆฌ ๋ฉ์ปค๋์ฆ์ด ๋์ฑ ๊ฐ์ ๋์ด WebAssembly๊ฐ ๊ด๋ฒ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ๋์ฑ ๋งค๋ ฅ์ ์ธ ํ๋ซํผ์ด ๋ ๊ฒ์ผ๋ก ๊ธฐ๋ํ ์ ์์ต๋๋ค.
์์ธ ์ฒ๋ฆฌ์ ์ฑ๋ฅ ์ํฅ์ ์ ์คํ๊ฒ ๊ณ ๋ คํ๊ณ ์ ์ ํ ๋๋ฒ๊น ๋๊ตฌ์ ๊ธฐ์ ์ ์ฌ์ฉํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ WebAssembly ์์ธ ์ฒ๋ฆฌ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ์ฌ ์ ๋ขฐํ ์ ์๊ณ ์ ์ง๋ณด์ ๊ฐ๋ฅํ WebAssembly ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.