WebAssembly ๊ฐ๋น์ง ์ปฌ๋ ์ (GC) ์ ์ ๋ด์ ๊ฐ์ฒด ๊ทธ๋ํ ๋ถ์ ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ฐธ์กฐ ์ถ์ ์ ๋ํ ์ฌ์ธต ๋ถ์์ผ๋ก, ๊ด๋ จ ๊ธฐ์ , ๊ณผ์ , ํฅํ ๋ฐฉํฅ์ ๋ค๋ฃน๋๋ค.
WebAssembly GC ๊ฐ์ฒด ๊ทธ๋ํ ๋ถ์: ๋ฉ๋ชจ๋ฆฌ ์ฐธ์กฐ ์ถ์
WebAssembly(Wasm)๋ ๋ค์ํ ํ๋ซํผ์์ ๊ณ ์ฑ๋ฅ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ธฐ ์ํ ๊ฐ๋ ฅํ๊ณ ๋ค์ฌ๋ค๋ฅํ ๊ธฐ์ ๋ก ๋ถ์ํ์ต๋๋ค. WebAssembly์ ๊ฐ๋น์ง ์ปฌ๋ ์ (GC)์ด ๋์ ๋ ๊ฒ์ Wasm์ Java, C#, Kotlin๊ณผ ๊ฐ์ด ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ํฌ๊ฒ ์์กดํ๋ ์ธ์ด๋ค์๊ฒ ํจ์ฌ ๋ ๋งค๋ ฅ์ ์ธ ํ๊ฒ์ผ๋ก ๋ง๋๋ ์ค์ํ ๋จ๊ณ์ ๋๋ค. ์ด ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์์๋ WebAssembly GC์ ๋งฅ๋ฝ์์ ๊ฐ์ฒด ๊ทธ๋ํ ๋ถ์ ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ฐธ์กฐ ์ถ์ ์ ๋ณต์กํ ์ธ๋ถ ์ฌํญ์ ๊น์ด ํ๊ณ ๋ญ๋๋ค.
WebAssembly GC ์ดํดํ๊ธฐ
๊ฐ์ฒด ๊ทธ๋ํ ๋ถ์์ ๋ํด ์์๋ณด๊ธฐ ์ ์ WebAssembly GC์ ๊ธฐ๋ณธ ์ฌํญ์ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ JavaScript๋ก ๊ตฌํ๋ ์ธ๋ถ ๊ฐ๋น์ง ์ปฌ๋ ํฐ์ ์์กดํ๋ ๊ธฐ์กด์ WebAssembly์ ๋ฌ๋ฆฌ, Wasm GC ์ ์์ ๋ค์ดํฐ๋ธ ๊ฐ๋น์ง ์ปฌ๋ ์ ๊ธฐ๋ฅ์ Wasm ๋ฐํ์์ ์ง์ ๋์ ํฉ๋๋ค. ์ด๋ ์ฌ๋ฌ ๊ฐ์ง ์ด์ ์ ์ ๊ณตํฉ๋๋ค:
- ์ฑ๋ฅ ํฅ์: ๋ค์ดํฐ๋ธ GC๋ ๋ฐํ์๊ณผ์ ๊ธด๋ฐํ ํตํฉ๊ณผ ์ ์์ค ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ํ๋ฆฌ๋ฏธํฐ๋ธ์ ๋ํ ๋ ๋์ ์ ๊ทผ์ฑ ๋๋ถ์ ์ข ์ข JavaScript ๊ธฐ๋ฐ GC๋ณด๋ค ๋ฐ์ด๋ ์ฑ๋ฅ์ ๋ฐํํ ์ ์์ต๋๋ค.
- ๊ฐ๋ฐ ๋จ์ํ: GC์ ์์กดํ๋ ์ธ์ด๋ ๋ณต์กํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด๋ ์ธ๋ถ ์ข ์์ฑ ์์ด Wasm์ผ๋ก ์ง์ ์ปดํ์ผํ ์ ์์ต๋๋ค.
- ์ฝ๋ ํฌ๊ธฐ ๊ฐ์: ๋ค์ดํฐ๋ธ GC๋ Wasm ๋ชจ๋ ๋ด์ ๋ณ๋์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํฌํจํ ํ์์ฑ์ ์์ ์ ์ฒด ์ฝ๋ ํฌ๊ธฐ๋ฅผ ์ค์ผ ์ ์์ต๋๋ค.
๊ฐ์ฒด ๊ทธ๋ํ ๋ถ์: GC์ ๊ธฐ์ด
๊ฐ๋น์ง ์ปฌ๋ ์ ์ ํต์ฌ์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋ณํ๊ณ ํ์ํ๋ ๊ฒ์ ๋๋ค. ์ด๋ฅผ ๋ฌ์ฑํ๊ธฐ ์ํด ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ ๋ฉ๋ชจ๋ฆฌ ๋ด ๊ฐ์ฒด ๊ฐ์ ๊ด๊ณ, ์ฆ ๊ฐ์ฒด ๊ทธ๋ํ๋ผ๊ณ ์๋ ค์ง ๊ฒ์ ์ดํดํด์ผ ํฉ๋๋ค. ๊ฐ์ฒด ๊ทธ๋ํ ๋ถ์์ ์ด ๊ทธ๋ํ๋ฅผ ์ํํ์ฌ ์ด๋ค ๊ฐ์ฒด๊ฐ ๋๋ฌ ๊ฐ๋ฅํ์ง(์ฆ, ์์ง ์ฌ์ฉ ์ค์ธ์ง)์ ๋๋ฌ ๋ถ๊ฐ๋ฅํ์ง(์ฆ, ๊ฐ๋น์ง์ธ์ง)๋ฅผ ๊ฒฐ์ ํ๋ ์์ ์ ํฌํจํฉ๋๋ค.
WebAssembly GC์ ๋งฅ๋ฝ์์ ๊ฐ์ฒด ๊ทธ๋ํ ๋ถ์์ ๋ ํนํ ๋์ ๊ณผ์ ์ ๊ธฐํ๋ฅผ ์ ์ํฉ๋๋ค. Wasm GC ์ ์์ ํน์ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ๊ณผ ๊ฐ์ฒด ๋ ์ด์์์ ์ ์ํ๋ฉฐ, ์ด๋ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ๊ฐ์ฒด ๊ทธ๋ํ๋ฅผ ํจ์จ์ ์ผ๋ก ์ํํ๋ ๋ฐฉ์์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
๊ฐ์ฒด ๊ทธ๋ํ ๋ถ์์ ํต์ฌ ๊ฐ๋
- ๋ฃจํธ(Roots): ๋ฃจํธ๋ ๊ฐ์ฒด ๊ทธ๋ํ ์ํ์ ์์์ ์ ๋๋ค. ์ด์์๋ ๊ฒ์ผ๋ก ์๋ ค์ง ๊ฐ์ฒด๋ฅผ ๋ํ๋ด๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ๋ ์ง์คํฐ, ์คํ ๋๋ ์ ์ญ ๋ณ์์ ์์นํฉ๋๋ค. ์๋ก๋ ํจ์ ๋ด์ ์ง์ญ ๋ณ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด์์ ์ ๊ทผ ๊ฐ๋ฅํ ์ ์ญ ๊ฐ์ฒด๊ฐ ์์ต๋๋ค.
- ์ฐธ์กฐ(References): ์ฐธ์กฐ๋ ํ ๊ฐ์ฒด์์ ๋ค๋ฅธ ๊ฐ์ฒด๋ก์ ํฌ์ธํฐ์ ๋๋ค. ์ด๋ ๊ฐ์ฒด ๊ทธ๋ํ์ ์ฃ์ง๋ฅผ ์ ์ํ๋ฉฐ, ๊ทธ๋ํ๋ฅผ ์ํํ๊ณ ๋๋ฌ ๊ฐ๋ฅํ ๊ฐ์ฒด๋ฅผ ์๋ณํ๋ ๋ฐ ์ค์ํฉ๋๋ค.
- ๋๋ฌ ๊ฐ๋ฅ์ฑ(Reachability): ๊ฐ์ฒด๋ ๋ฃจํธ๋ก๋ถํฐ ํด๋น ๊ฐ์ฒด๊น์ง์ ๊ฒฝ๋ก๊ฐ ์๋ ๊ฒฝ์ฐ ๋๋ฌ ๊ฐ๋ฅํ๋ค๊ณ ๊ฐ์ฃผ๋ฉ๋๋ค. ๋๋ฌ ๊ฐ๋ฅ์ฑ์ ๊ฐ์ฒด๋ฅผ ๊ณ์ ์ ์งํด์ผ ํ๋์ง๋ฅผ ๊ฒฐ์ ํ๋ ๊ทผ๋ณธ์ ์ธ ๊ธฐ์ค์ ๋๋ค.
- ๋๋ฌ ๋ถ๊ฐ๋ฅํ ๊ฐ์ฒด(Unreachable Objects): ์ด๋ค ๋ฃจํธ์์๋ ๋๋ฌํ ์ ์๋ ๊ฐ์ฒด๋ ๊ฐ๋น์ง๋ก ๊ฐ์ฃผ๋๋ฉฐ ๊ฐ๋น์ง ์ปฌ๋ ํฐ์ ์ํด ์์ ํ๊ฒ ํ์๋ ์ ์์ต๋๋ค.
๋ฉ๋ชจ๋ฆฌ ์ฐธ์กฐ ์ถ์ ๊ธฐ๋ฒ
ํจ๊ณผ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์ฐธ์กฐ ์ถ์ ์ ์ ํํ๊ณ ํจ์จ์ ์ธ ๊ฐ์ฒด ๊ทธ๋ํ ๋ถ์์ ํ์์ ์ ๋๋ค. ์ฐธ์กฐ๋ฅผ ์ถ์ ํ๊ณ ๋๋ฌ ๊ฐ๋ฅํ ๊ฐ์ฒด๋ฅผ ์๋ณํ๊ธฐ ์ํด ์ฌ๋ฌ ๊ธฐ๋ฒ์ด ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ฌํ ๊ธฐ๋ฒ์ ํฌ๊ฒ ์ถ์ ๊ฐ๋น์ง ์ปฌ๋ ์ (tracing garbage collection)๊ณผ ์ฐธ์กฐ ์นด์ดํ (reference counting)์ ๋ ๊ฐ์ง ๋ฒ์ฃผ๋ก ๋ถ๋ฅ๋ ์ ์์ต๋๋ค.
์ถ์ ๊ฐ๋น์ง ์ปฌ๋ ์ (Tracing Garbage Collection)
์ถ์ ๊ฐ๋น์ง ์ปฌ๋ ์ ์๊ณ ๋ฆฌ์ฆ์ ๋ฃจํธ์์ ์์ํ์ฌ ์ฃผ๊ธฐ์ ์ผ๋ก ๊ฐ์ฒด ๊ทธ๋ํ๋ฅผ ์ํํ๊ณ ๋ชจ๋ ๋๋ฌ ๊ฐ๋ฅํ ๊ฐ์ฒด๋ฅผ ํ์ํ๋ ๋ฐฉ์์ผ๋ก ์๋ํฉ๋๋ค. ์ํ ํ ํ์๋์ง ์์ ๊ฐ์ฒด๋ ๊ฐ๋น์ง๋ก ๊ฐ์ฃผ๋์ด ํ์๋ ์ ์์ต๋๋ค.
์ผ๋ฐ์ ์ธ ์ถ์ ๊ฐ๋น์ง ์ปฌ๋ ์ ์๊ณ ๋ฆฌ์ฆ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ํ์ํ๊ณ ์ธ๊ธฐ(Mark and Sweep): ์ด๊ฒ์ ๋ ๋จ๊ณ๋ก ๊ตฌ์ฑ๋ ๊ณ ์ ์ ์ธ ์ถ์ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค: ๋๋ฌ ๊ฐ๋ฅํ ๊ฐ์ฒด๋ฅผ ํ์ํ๋ ํ์(mark) ๋จ๊ณ์ ํ์๋์ง ์์ ๊ฐ์ฒด๋ฅผ ํ์ํ๋ ์ธ๊ธฐ(sweep) ๋จ๊ณ์ ๋๋ค.
- ๋ณต์ฌ GC(Copying GC): ๋ณต์ฌ GC ์๊ณ ๋ฆฌ์ฆ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ ์์ญ์ผ๋ก ๋๋๊ณ ์ด์์๋ ๊ฐ์ฒด๋ฅผ ํ ์์ญ์์ ๋ค๋ฅธ ์์ญ์ผ๋ก ๋ณต์ฌํฉ๋๋ค. ์ด๋ ๋จํธํ๋ฅผ ์ ๊ฑฐํ๊ณ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
- ์ธ๋๋ณ GC(Generational GC): ์ธ๋๋ณ GC ์๊ณ ๋ฆฌ์ฆ์ ๋๋ถ๋ถ์ ๊ฐ์ฒด๊ฐ ์งง์ ์๋ช ์ ๊ฐ๋๋ค๋ ๊ด์ฐฐ์ ํ์ฉํฉ๋๋ค. ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ธ๋๋ณ๋ก ๋๋๊ณ , ๊ฐ๋น์ง๋ฅผ ํฌํจํ ๊ฐ๋ฅ์ฑ์ด ๋ ๋์ ์ ์ ์ธ๋๋ฅผ ๋ ์์ฃผ ์์งํฉ๋๋ค.
์์: ํ์ํ๊ณ ์ธ๊ธฐ(Mark and Sweep) ์คํ
A, B, C ์ธ ๊ฐ์ ๊ฐ์ฒด๋ก ๊ตฌ์ฑ๋ ๊ฐ๋จํ ๊ฐ์ฒด ๊ทธ๋ํ๋ฅผ ์์ํด ๋ณด์ธ์. ๊ฐ์ฒด A๋ ๋ฃจํธ์ ๋๋ค. ๊ฐ์ฒด A๋ ๊ฐ์ฒด B๋ฅผ ์ฐธ์กฐํ๊ณ , ๊ฐ์ฒด B๋ ๊ฐ์ฒด C๋ฅผ ์ฐธ์กฐํฉ๋๋ค. ํ์ ๋จ๊ณ์์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ ๊ฐ์ฒด A(๋ฃจํธ)์์ ์์ํ์ฌ ๋๋ฌ ๊ฐ๋ฅํ๋ค๊ณ ํ์ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ A์์ B๋ก์ ์ฐธ์กฐ๋ฅผ ๋ฐ๋ผ๊ฐ B๋ฅผ ๋๋ฌ ๊ฐ๋ฅํ๋ค๊ณ ํ์ํฉ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก B์์ C๋ก์ ์ฐธ์กฐ๋ฅผ ๋ฐ๋ผ๊ฐ C๋ฅผ ๋๋ฌ ๊ฐ๋ฅํ๋ค๊ณ ํ์ํฉ๋๋ค. ํ์ ๋จ๊ณ๊ฐ ๋๋๋ฉด A, B, C ๊ฐ์ฒด ๋ชจ๋ ๋๋ฌ ๊ฐ๋ฅ์ผ๋ก ํ์๋ฉ๋๋ค. ์ธ๊ธฐ ๋จ๊ณ์์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ ์ ์ฒด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ฐ๋ณตํ๋ฉฐ ํ์๋์ง ์์ ๊ฐ์ฒด๋ฅผ ํ์ํฉ๋๋ค. ์ด ๊ฒฝ์ฐ ๋ชจ๋ ๊ฐ์ฒด๊ฐ ๋๋ฌ ๊ฐ๋ฅํ๋ฏ๋ก ํ์๋๋ ๊ฐ์ฒด๋ ์์ต๋๋ค.
์ฐธ์กฐ ์นด์ดํ (Reference Counting)
์ฐธ์กฐ ์นด์ดํ ์ ๊ฐ ๊ฐ์ฒด๊ฐ ์์ ์ ๊ฐ๋ฆฌํค๋ ์ฐธ์กฐ์ ์๋ฅผ ์ ์งํ๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๊ธฐ๋ฒ์ ๋๋ค. ๊ฐ์ฒด์ ์ฐธ์กฐ ์นด์ดํธ๊ฐ 0์ผ๋ก ๋จ์ด์ง๋ฉด ๋ค๋ฅธ ์ด๋ค ๊ฐ์ฒด๋ ์ด๋ฅผ ์ฐธ์กฐํ์ง ์์์ ์๋ฏธํ๋ฉฐ ์์ ํ๊ฒ ํ์๋ ์ ์์ต๋๋ค.
์ฐธ์กฐ ์นด์ดํ ์ ๊ตฌํ์ด ๊ฐ๋จํ๊ณ ์ฆ๊ฐ์ ์ธ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ค์๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ๋จ์ ์ด ์์ต๋๋ค:
- ์ํ ์ฐธ์กฐ ๊ฐ์ง: ์ฐธ์กฐ ์นด์ดํ ์ ๊ฐ์ฒด๋ค์ด ์๋ก๋ฅผ ์ฐธ์กฐํ์ง๋ง ์ด๋ค ๋ฃจํธ์์๋ ๋๋ฌํ ์ ์๋ ๊ฐ์ฒด์ ์ํ์ ๊ฐ์งํ๊ณ ํ์ํ ์ ์์ต๋๋ค.
- ์ค๋ฒํค๋: ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ์ ์งํ๋ ๊ฒ์ ํนํ ๊ฐ์ฒด ์์ฑ ๋ฐ ์ญ์ ๊ฐ ๋น๋ฒํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์๋นํ ์ค๋ฒํค๋๋ฅผ ์ ๋ฐํ ์ ์์ต๋๋ค.
์์: ์ฐธ์กฐ ์นด์ดํ
๋ ๊ฐ์ฒด A์ B๋ฅผ ์๊ฐํด ๋ณด์ธ์. ๊ฐ์ฒด A๋ ์ด๊ธฐ์ ๋ฃจํธ์ ์ํด ์ฐธ์กฐ๋๋ฏ๋ก ์ฐธ์กฐ ์นด์ดํธ๊ฐ 1์ ๋๋ค. ๊ฐ์ฒด B๊ฐ ์์ฑ๋๊ณ A์ ์ํด ์ฐธ์กฐ๋๋ฉด B์ ์ฐธ์กฐ ์นด์ดํธ๋ 1๋ก ์ฆ๊ฐํฉ๋๋ค. ๋ง์ฝ ๋ฃจํธ๊ฐ A๋ฅผ ๋ ์ด์ ์ฐธ์กฐํ์ง ์์ผ๋ฉด A์ ์ฐธ์กฐ ์นด์ดํธ๋ 0์ด ๋๊ณ A๋ ์ฆ์ ํ์๋ฉ๋๋ค. A๊ฐ B๋ฅผ ์ฐธ์กฐํ๋ ์ ์ผํ ๊ฐ์ฒด์์ผ๋ฏ๋ก B์ ์ฐธ์กฐ ์นด์ดํธ๋ 0์ผ๋ก ๋จ์ด์ง๊ณ B ์ญ์ ํ์๋ฉ๋๋ค.
ํ์ด๋ธ๋ฆฌ๋ ์ ๊ทผ ๋ฐฉ์
์ค์ ๋ก ๋ง์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ ์ถ์ ๊ฐ๋น์ง ์ปฌ๋ ์ ๊ณผ ์ฐธ์กฐ ์นด์ดํ ์ ์ฅ์ ์ ๊ฒฐํฉํ ํ์ด๋ธ๋ฆฌ๋ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ ๊ฐ๋จํ ๊ฐ์ฒด์ ์ฆ๊ฐ์ ์ธ ํ์๋ฅผ ์ํด ์ฐธ์กฐ ์นด์ดํ ์ ์ฌ์ฉํ๊ณ , ์ํ ๊ฐ์ง ๋ฐ ๋ ๋ณต์กํ ๊ฐ์ฒด ๊ทธ๋ํ์ ํ์๋ฅผ ์ํด ์ถ์ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
WebAssembly GC ๊ฐ์ฒด ๊ทธ๋ํ ๋ถ์์ ๊ณผ์
WebAssembly GC ์ ์์ด ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์ํ ๊ฒฌ๊ณ ํ ๊ธฐ๋ฐ์ ์ ๊ณตํ์ง๋ง, ํจ์จ์ ์ด๊ณ ์ ํํ ๊ฐ์ฒด ๊ทธ๋ํ ๋ถ์์ ๊ตฌํํ๋ ๋ฐ์๋ ๋ช ๊ฐ์ง ๊ณผ์ ๊ฐ ๋จ์ ์์ต๋๋ค:
- ์ ํํ(Precise) GC vs. ๋ณด์์ ์ธ(Conservative) GC: ์ ํํ GC๋ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์๋ ๋ชจ๋ ๊ฐ์ฒด์ ์ ํํ ์ ํ๊ณผ ๋ ์ด์์์ ์์์ผ ํฉ๋๋ค. ๋ฐ๋ฉด, ๋ณด์์ ์ธ GC๋ ๊ฐ์ฒด์ ์ ํ๊ณผ ๋ ์ด์์์ ๋ํด ๊ฐ์ ์ ํ๋ฉฐ, ์ด๋ ๊ฑฐ์ง ์์ฑ(์ฆ, ๋๋ฌ ๊ฐ๋ฅํ ๊ฐ์ฒด๋ฅผ ๊ฐ๋น์ง๋ก ์๋ชป ์๋ณํ๋ ๊ฒฝ์ฐ)์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ์ ํํ GC์ ๋ณด์์ ์ธ GC ์ฌ์ด์ ์ ํ์ ์ฑ๋ฅ๊ณผ ์ ํ์ฑ ๊ฐ์ ์ ์ถฉ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
- ๋ฉํ๋ฐ์ดํฐ ๊ด๋ฆฌ: ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ ๊ฐ์ฒด์ ํฌ๊ธฐ, ์ ํ, ๋ค๋ฅธ ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ์ ๊ฐ์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ํ์๋ก ํฉ๋๋ค. ์ด ๋ฉํ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ด ์ฑ๋ฅ์ ๋งค์ฐ ์ค์ํฉ๋๋ค.
- ๋์์ฑ ๋ฐ ๋ณ๋ ฌ์ฑ: ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ ํฅ์์ ์ํด ์ข ์ข ๋์์ฑ๊ณผ ๋ณ๋ ฌ์ฑ์ ์ฌ์ฉํฉ๋๋ค. ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ ๊ฒฝ์ ์กฐ๊ฑด์ด๋ ๋ฐ์ดํฐ ์์์ ์ ๋ฐํ์ง ์๊ณ ๊ฐ์ฒด ๊ทธ๋ํ์ ๋ํ ๋์ ์ ๊ทผ์ ์ฒ๋ฆฌํ ์ ์์ด์ผ ํฉ๋๋ค.
- ๊ธฐ์กด Wasm ๊ธฐ๋ฅ๊ณผ์ ํตํฉ: Wasm GC ์ ์์ ์ ํ ๋ฉ๋ชจ๋ฆฌ ๋ฐ ํจ์ ํธ์ถ๊ณผ ๊ฐ์ ๊ธฐ์กด Wasm ๊ธฐ๋ฅ๊ณผ ์ํํ๊ฒ ํตํฉ๋์ด์ผ ํฉ๋๋ค.
Wasm GC๋ฅผ ์ํ ์ต์ ํ ๊ธฐ๋ฒ
WebAssembly GC์ ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํด ์ฌ๋ฌ ์ต์ ํ ๊ธฐ๋ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค:
- ์ฐ๊ธฐ ์ฅ๋ฒฝ(Write Barriers): ์ฐ๊ธฐ ์ฅ๋ฒฝ์ ๊ฐ์ฒด ๊ทธ๋ํ์ ์์ ์ ์ถ์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ฐธ์กฐ๊ฐ ๊ฐ์ฒด์ ์ฐ์ฌ์ง ๋๋ง๋ค ํธ์ถ๋๋ฉฐ, ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ์ ๋ฐ์ดํธํ๊ฑฐ๋ ๋์ค์ ์ฒ๋ฆฌํ ๊ฐ์ฒด๋ฅผ ๋ํฐ(dirty)๋ก ํ์ํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
- ์ฝ๊ธฐ ์ฅ๋ฒฝ(Read Barriers): ์ฝ๊ธฐ ์ฅ๋ฒฝ์ ๊ฐ์ฒด์ ๋ํ ์ ๊ทผ์ ์ถ์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ํ์ฌ ๊ฐ์ฒด์ ๋ํ ์ ๊ธ์ ๋ณด์ ํ์ง ์์ ์ค๋ ๋๊ฐ ๊ฐ์ฒด์ ์ ๊ทผํ ๋๋ฅผ ๊ฐ์งํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
- ๊ฐ์ฒด ํ ๋น ์ ๋ต: ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ์ฒด๊ฐ ํ ๋น๋๋ ๋ฐฉ์์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ์ ์ฑ๋ฅ์ ์๋นํ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋์ผํ ์ ํ์ ๊ฐ์ฒด๋ฅผ ์๋ก ๊ฐ๊น๊ฒ ํ ๋นํ๋ฉด ์บ์ ์ง์ญ์ฑ์ ํฅ์์ํค๊ณ ๊ฐ์ฒด ๊ทธ๋ํ ์ํ ๋น์ฉ์ ์ค์ผ ์ ์์ต๋๋ค.
- ์ปดํ์ผ๋ฌ ์ต์ ํ: ํ์ถ ๋ถ์(escape analysis) ๋ฐ ์ฃฝ์ ์ฝ๋ ์ ๊ฑฐ(dead code elimination)์ ๊ฐ์ ์ปดํ์ผ๋ฌ ์ต์ ํ๋ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ๊ด๋ฆฌํด์ผ ํ๋ ๊ฐ์ฒด์ ์๋ฅผ ์ค์ผ ์ ์์ต๋๋ค.
- ์ ์ง์ GC(Incremental GC): ์ ์ง์ GC ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ๋น์ง ์ปฌ๋ ์ ํ๋ก์ธ์ค๋ฅผ ๋ ์์ ๋จ๊ณ๋ก ๋๋์ด, ๊ฐ๋น์ง๊ฐ ์์ง๋๋ ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๊ณ์ ์คํ๋ ์ ์๋๋ก ํฉ๋๋ค. ์ด๋ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ๋ฏธ์น๋ ์ํฅ์ ์ค์ผ ์ ์์ต๋๋ค.
WebAssembly GC์ ํฅํ ๋ฐฉํฅ
WebAssembly GC ์ ์์ ์์ง ๊ฐ๋ฐ ์ค์ด๋ฉฐ, ํฅํ ์ฐ๊ตฌ์ ํ์ ์ ์ํ ๋ง์ ๊ธฐํ๊ฐ ์์ต๋๋ค:
- ๊ณ ๊ธ GC ์๊ณ ๋ฆฌ์ฆ: ๋์ ๋ฐ ๋ณ๋ ฌ GC์ ๊ฐ์ ๋ ๊ณ ๊ธ GC ์๊ณ ๋ฆฌ์ฆ์ ํ์ํ๋ฉด ์ฑ๋ฅ์ ๋์ฑ ํฅ์์ํค๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์๋ต์ฑ์ ๋ํ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์ํฅ์ ์ค์ผ ์ ์์ต๋๋ค.
- ์ธ์ด๋ณ ๊ธฐ๋ฅ๊ณผ์ ํตํฉ: ํน์ ์ธ์ด ๊ธฐ๋ฅ์ ๋ง๊ฒ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ฅผ ์กฐ์ ํ๋ฉด ์ฑ๋ฅ์ ํฅ์์ํค๊ณ ๊ฐ๋ฐ์ ๋จ์ํํ ์ ์์ต๋๋ค.
- ํ๋กํ์ผ๋ง ๋ฐ ๋๋ฒ๊น ๋๊ตฌ: ๊ฐ๋น์ง ์ปฌ๋ ํฐ์ ๋์์ ๋ํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํ๋ ํ๋กํ์ผ๋ง ๋ฐ ๋๋ฒ๊น ๋๊ตฌ๋ฅผ ๊ฐ๋ฐํ๋ฉด ๊ฐ๋ฐ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ต์ ํํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
- ๋ณด์ ๊ณ ๋ ค ์ฌํญ: ๊ฐ๋น์ง ์ปฌ๋ ํฐ์ ๋ณด์์ ๋ณด์ฅํ๋ ๊ฒ์ ์ทจ์ฝ์ ์ ๋ฐฉ์งํ๊ณ ์ ์์ ์ธ ๊ณต๊ฒฉ์ผ๋ก๋ถํฐ ๋ณดํธํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค.
์ค์ฉ์ ์ธ ์์์ ์ฌ์ฉ ์ฌ๋ก
์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์์ WebAssembly GC๋ฅผ ์ด๋ป๊ฒ ์ฌ์ฉํ ์ ์๋์ง ๋ช ๊ฐ์ง ์ค์ฉ์ ์ธ ์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
- ์น ๊ฒ์: WebAssembly GC๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋ฐ์๋ C# ๋ฐ Unity์ ๊ฐ์ ์ธ์ด๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๋ณต์กํ๊ณ ์ฑ๋ฅ์ด ๋ฐ์ด๋ ์น ๊ฒ์์ ๋ง๋ค ์ ์์ต๋๋ค. ๋ค์ดํฐ๋ธ GC๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ์ค๋ฒํค๋๋ฅผ ์ค์ฌ ๊ฐ๋ฐ์๊ฐ ๊ฒ์ ๋ก์ง๊ณผ ๊ฒ์ ํ๋ ์ด์ ์ง์คํ ์ ์๋๋ก ํฉ๋๋ค. ์๋ง์ ๊ฐ์ฒด์ ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ด ์๋ ๋ณต์กํ 3D ๊ฒ์์ ์์ํด ๋ณด์ญ์์ค. Wasm GC๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ํํ๊ฒ ์ฒ๋ฆฌํ์ฌ JavaScript ๊ธฐ๋ฐ GC์ ๋นํด ๋ ๋ถ๋๋ฌ์ด ๊ฒ์ ํ๋ ์ด์ ๋ ๋์ ์ฑ๋ฅ์ ์ ๊ณตํ ๊ฒ์ ๋๋ค.
- ์๋ฒ ์ธก ์ ํ๋ฆฌ์ผ์ด์ : WebAssembly๋ ๊ณ ์ฑ๋ฅ๊ณผ ํ์ฅ์ฑ์ด ์๊ตฌ๋๋ ์๋ฒ ์ธก ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. WebAssembly GC๋ ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ ๊ณตํ์ฌ ์ด๋ฌํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐ์ ๋จ์ํํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ค์์ ๋์ ์์ฒญ์ ์ฒ๋ฆฌํ๋ Java๋ก ์์ฑ๋ ์๋ฒ ์ธก ์ ํ๋ฆฌ์ผ์ด์ ์ ์๊ฐํด ๋ณด์ญ์์ค. Wasm GC๋ฅผ ์ฌ์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ด ํจ์จ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ์ฌ ๋์ ์ฒ๋ฆฌ๋๊ณผ ๋ฎ์ ์ง์ฐ ์๊ฐ์ ๋ณด์ฅํ ์ ์์ต๋๋ค.
- ์๋ฒ ๋๋ ์์คํ : WebAssembly๋ ์ ํ๋ ๋ฆฌ์์ค๋ฅผ ๊ฐ์ง ์๋ฒ ๋๋ ์์คํ ์ฉ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. WebAssembly GC๋ ํจ์จ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ํตํด ์ด๋ฌํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ค์ด๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. ์ ํ๋ RAM์ ๊ฐ์ง ์๋ฒ ๋๋ ์ฅ์น์์ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๋ค๊ณ ์์ํด ๋ณด์ญ์์ค. Wasm GC๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ต์ํํ๊ณ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ์ฌ ์์ ์ ์ด๊ณ ์ ๋ขฐํ ์ ์๋ ์๋์ ๋ณด์ฅํ ์ ์์ต๋๋ค.
- ๊ณผํ ์ปดํจํ : WebAssembly๋ ๊ณ ์ฑ๋ฅ๊ณผ ์์น ์ ํ๋๊ฐ ์๊ตฌ๋๋ ๊ณผํ ์ปดํจํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. WebAssembly GC๋ ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ ๊ณตํ์ฌ ์ด๋ฌํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐ์ ๋จ์ํํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ณต์กํ ์๋ฎฌ๋ ์ด์ ์ ์ํํ๋ Fortran์ผ๋ก ์์ฑ๋ ๊ณผํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๊ฐํด ๋ณด์ญ์์ค. Fortran ์ฝ๋๋ฅผ WebAssembly๋ก ์ปดํ์ผํ๊ณ GC๋ฅผ ํ์ฉํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ๋จ์ํํ๋ฉด์ ๊ณ ์ฑ๋ฅ์ ๋ฌ์ฑํ ์ ์์ต๋๋ค.
๊ฐ๋ฐ์๋ฅผ ์ํ ์ค์ง์ ์ธ ํต์ฐฐ๋ ฅ
WebAssembly GC ์ฌ์ฉ์ ๊ด์ฌ์ด ์๋ ๊ฐ๋ฐ์๋ฅผ ์ํ ๋ช ๊ฐ์ง ์ค์ง์ ์ธ ํต์ฐฐ๋ ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ฌ๋ฐ๋ฅธ ์ธ์ด ์ ํ: C#, Java ๋๋ Kotlin๊ณผ ๊ฐ์ด WebAssembly GC๋ฅผ ์ง์ํ๋ ์ธ์ด๋ฅผ ์ ํํ์ญ์์ค.
- GC ์๊ณ ๋ฆฌ์ฆ ์ดํด: ์ ํํ ์ธ์ด ๋ฐ ํ๋ซํผ์์ ์ฌ์ฉํ๋ ๊ฐ๋น์ง ์ปฌ๋ ์ ์๊ณ ๋ฆฌ์ฆ์ ์ต์ํด์ง์ญ์์ค.
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ์ต์ ํ: ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฐ ํ ๋น ํด์ ๋ฅผ ์ต์ํํ๋ ์ฝ๋๋ฅผ ์์ฑํ์ญ์์ค.
- ์ ํ๋ฆฌ์ผ์ด์ ํ๋กํ์ผ๋ง: ํ๋กํ์ผ๋ง ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ์ญ์์ค.
- ์ต์ ์ ๋ณด ์ ์ง: WebAssembly GC์ ์ต์ ๊ฐ๋ฐ ๋ํฅ์ ๊ณ์ ์ฃผ์ํ์ญ์์ค.
๊ฒฐ๋ก
WebAssembly GC๋ WebAssembly ๊ธฐ์ ์ ์ค์ํ ๋ฐ์ ์ ์๋ฏธํ๋ฉฐ, ๊ฐ๋ฐ์๋ค์ด ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ์์กดํ๋ ์ธ์ด๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๋ณต์กํ๊ณ ์ฑ๋ฅ์ด ๋ฐ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์๊ฒ ํด์ค๋๋ค. ๊ฐ์ฒด ๊ทธ๋ํ ๋ถ์๊ณผ ๋ฉ๋ชจ๋ฆฌ ์ฐธ์กฐ ์ถ์ ์ ์ดํดํ๋ ๊ฒ์ WebAssembly GC์ ์ ์ฌ๋ ฅ์ ์ต๋ํ ํ์ฉํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. WebAssembly GC๊ฐ ์ ์ํ๋ ๋์ ๊ณผ์ ์ ๊ธฐํ๋ฅผ ์ ์คํ๊ฒ ๊ณ ๋ คํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ ํจ์จ์ ์ด๊ณ ์ ๋ขฐํ ์ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์์ต๋๋ค.