WebAssembly๋ ํ์ฌ ์ฃผ์ด์ง(๋ณดํต JS) ์ธํฐํ๋ฆฌํฐ์์ ์์์ ์ธ์ด๋ก ์์ฑ๋ ์ฝ๋๋ฅผ ์คํํ๋ ๋ฐ ๋งค์ฐ ๋ฅ์ํ์ง๋ง ์ฌ๋ฌ ์์์ ์ธ์ด๋ฅผ ํจ๊ป ๊ฒฐํฉํ ๋ ๋ช ๊ฐ์ง ์ฃผ์ ๊ธฐ๋ฅ์ด ๋ถ์กฑ
์ด๋ฌํ ๊ธฐ๋ฅ ์ค ํ๋๋ ์ธ์ด์ ๊ตฌ์ ๋ฐ์ง ์๋ ์ ํ ์์คํ ์ ๋๋ค. WebAssembly์ ์ด๋ฌํ ์์คํ ์ ํ๋ ๋๋ ์ฌ๋ฌ ๊ฐ ์ถ๊ฐํ ๊ฒ์ ์ ์ํ๊ณ ์ถ์ต๋๋ค.
์ ์ณ๋๊ณ , ์ด์ ๊ธฐ๋ฅ ํ ๋ก ์์ ์ผ๋ถ ๊ธฐ๊ณ ์๋ ์ธ์ด ์ํธ ์ด์ฉ์ฑ์ด WebAssembly์ ์ค๊ณ ๋ชฉํ๊ฐ ๋์ด์๋ ์ ๋๋ค๊ณ ํํํ์ต๋๋ค. ๋ฐ๋์ ์ฐ์ ์์ ๊ฐ
๋ฎ์ ์ธ์ด ๋ ์ธ์ด ์ฅ๋ฒฝ์ ์ด์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
wasm ์ฌ์ฉ์๋ฅผ ์ํ ๋ ๋ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ : ๋งํ ํ์๋ ์์ด ์ธ์ด ์ํธ ์ด์ฉ์ฑ์ ๊ฐ์ ํ๋ฉด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ฌ์ฉ ์ค์ธ ๊ฒ๊ณผ ๋ค๋ฅธ ์ธ์ด๋ก ์์ฑ๋ ๊ฒฝ์ฐ์๋ ์ฌ์ฉ์๊ฐ ๊ธฐ์กด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ ์์ฃผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์์ ์ธ์ด์ ๋ ์ฌ์ด ์ฑํ: ํ์ฌ ์์ฅ์์ ๊ธฐ์ ์ง์์ด ์๋ ์ธ์ด๋ ๊ฒฌ์ธ๋ ฅ์ ์ป๊ธฐ ์ด๋ ค์ด ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์๋ก์ด ์ธ์ด(์ฌ์ง์ด D์ ๊ฐ์ด ์๋ ๊ฐ ๊ฐ์ ๋ ์ธ์ด)๋ ๋๊ท๋ชจ ์ํ๊ณ๋ฅผ ๊ฐ์ง ์ธ์ด์ ๊ฒฝ์ํด์ผ ํ๋ฉฐ ์์ฒด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ถ์กฑ์ผ๋ก ์ด๋ ค์์ ๊ฒช์ต๋๋ค. ์ธ์ด ์ํธ ์ด์ฉ์ฑ์ ํตํด Python ๋๋ Java์ ๊ฐ์ ๊ธฐ์กด ์ํ๊ณ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ ๋์ ์ธ์ด ๋ถ๊ฐ์ง๋ก ์ ๋๊ตฌ ๋ชจ์ : ํ์ฌ ๋๋ถ๋ถ์ ์ธ์ด์๋ ๊ณ ์ ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ก๋ฉ ๋ฐฉ์๊ณผ ํจํค์ง ๊ด๋ฆฌ์๊ฐ ์์ต๋๋ค(๋๋ C/C++์ ๊ฒฝ์ฐ ์ฌ๋ฌ ๋น๊ณต์์ ์ธ ๊ฒ). ์ธ์ด์ ๊ตฌ์ ๋ฐ์ง ์๋ ํ๋ก์ ํธ ๋น๋๋ฅผ ์์ฑํ๋ ๊ฒ์ ์ด๋ ค์ด ์ผ์ ๋๋ค. ์๋ํ๋ฉด ์ด๋ฌํ ์ธ์ด์๋ ํด๊ฒฐํ๊ธฐ ์ํด ๋ชจ๋๋ฆฌ์ ํ๋ก์ ํธ ์ ์ฒด ์๋ฃจ์ ์ด ํ์ํ ๋ฏธ๋ฌํ ์ข ์์ฑ๊ณผ ABI ๋นํธํ์ฑ์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ฐ๋ ฅํ ์ธ์ด ๊ฐ ์ ํ ์์คํ ์ ์ฌ์ฉํ๋ฉด ํ๋ก์ ํธ๋ฅผ npm๊ณผ ๊ฐ์ ์๋ฃจ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ ๋ ์์ ๋ชจ๋๋ก ์ฝ๊ฒ ๋ถํ ํ ์ ์์ต๋๋ค.
์ ๋ฐ์ ์ผ๋ก ์ฒซ ๋ฒ์งธ ์์ ์ด ๊ฐ์ฅ ์ค์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ ๋์ ์ ํ ์์คํ ์ ๋ค๋ฅธ ์ธ์ด์ ๋ํ ๋ ๋์ ์ก์ธ์ค๋ฅผ ์๋ฏธํ๋ฉฐ, ์ด๋ ์ฝ๋๋ฅผ ์ฒ์๋ถํฐ ์์ฑํ๋ ๋์ ์ฌ์ฌ์ฉํ ๊ธฐํ๊ฐ ๋ ๋ง๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๊ทธ๊ฒ์ด ์ผ๋ง๋ ์ค์ํ์ง ์๋ฌด๋ฆฌ ๊ฐ์กฐํด๋ ์ง๋์น์ง ์์ต๋๋ค.
์ด๋ฅผ ์ผ๋์ ๋๊ณ ์ธ์ด ๊ฐ ์ ํ ์์คํ ์ด ํต๊ณผํด์ผ ํ๋ ์๊ตฌ ์ฌํญ์ ๊ฐ๋ตํ๊ฒ ์ค๋ช ํ๊ณ ์ถ์ต๋๋ค.
๋๋ ์ ํ ์์คํ ์ด ๋ชจ๋ ๊ฐ์ ์ ๋ฌ๋๋ ํจ์์ ์ฃผ์์ ๋ฌ๊ธฐ ์ํด ์๊ฒฉํ๊ฒ ์ฌ์ฉ๋๋ฉฐ ์ธ์ด๊ฐ ์ด๋ค ๋ฐฉ์์ผ๋ก๋ ์์ฒด ์ ํ ๋๋ ๊ด๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ํ์ธํ์ง ์์ ๊ฒ์ด๋ผ๋ ๊ฐ์ ํ์ ๊ธ์ ์ฐ๊ณ ์์ต๋๋ค.
wasm ์ค์ ์์ ์ง์ ์ผ๋ก ์ ์ฉํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ ํ ์์คํ ์ด ํ์ํฉ๋๋ค.
๋ด๊ฐ ์ ์ํ๋ ๊ฒ์ @kentonv๊ฐ Cap'n'Proto IDL ์ ๋ฐ์ธ๋ฉํ์ฌ Webassembly ์ ์ถ๊ฐํ๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ค์ WebIDL ๋ฐ์ธ๋ฉ๊ณผ ์ ์ฌํ ๋ฐฉ์์ผ๋ก ์๋ํฉ๋๋ค. wasm ๋ชจ๋์ ๊ธฐ๋ฅ์ ๋ด๋ณด๋ด๊ณ ํน์ ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ํ์ํ๋ ์๋ช ์ ๋ฐ์ธ๋ฉํฉ๋๋ค. ๋ค๋ฅธ ๋ชจ๋์ ์ด๋ฌํ ์๋ช ์ ๊ฐ์ ธ์์ ์์ฒด ๊ธฐ๋ฅ์ ๋ฐ์ธ๋ฉํฉ๋๋ค.
๋ค์ ์์ฌ ๊ตฌ๋ฌธ์ ์ด๋ฌํ ๋ฐ์ธ๋ฉ์ด ์ด๋ป๊ฒ ์๊ฒผ๋์ง์ ๋ํ ์์ด๋์ด๋ฅผ ์ ๊ณตํ๊ธฐ ์ํ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ WebIDL ์ ์์์ ํฌ๊ฒ ์๊ฐ์ ๋ฐ์ ๊ทผ์ฌ์น์ด๋ฉฐ ์์ ํ ์ง์นจ ๋ชฉ๋ก์ ์ ๊ณตํ๋ ๊ฒ๋ณด๋ค ๊ธฐ์ ์ ์ธ ๋ฌธ์ ์ ๋ ์ค์ ์ ๋ก๋๋ค.
Capnproto ๋ฐ์ธ๋ฉ ์ง์นจ์ ๋ชจ๋ ์๋ก์ด Cap'n'proto ๋ฐ์ธ๋ฉ ์น์ ์ ์ ์ฅ๋ฉ๋๋ค.
ํ์ค์๋ capnproto์ ์คํค๋ง ์ธ์ด์ ๋ํ ๋ด๋ถ ํํ์ด ํ์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์ Capnproto ์ ํ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
```์บก์ค ํ๋กํ
๊ตฌ์กฐ์ฒด ์ฌ๋ {
์ด๋ฆ @0 :ํ
์คํธ;
์๋
์์ผ @3 :๋ ์ง;
์ด๋ฉ์ผ @1 :ํ
์คํธ;
์ ํ @2 :List(PhoneNumber);
๊ตฌ์กฐ์ฒด ์ ํ๋ฒํธ {
๋ฒํธ @0 :ํ
์คํธ;
์ ํ @1 :์ ํ;
enum Type {
mobile @0;
home @1;
work @2;
}
}
}
๊ตฌ์กฐ์ฒด ๋ ์ง {
์ฐ๋ @0 : Int16;
์ @1 :UInt8;
์ผ @2 :UInt8;
}
might be represented as
```wasm
(<strong i="32">@capnproto</strong> type $Date (struct
(field "year" Int16)
(field "month" UInt8)
(field "day" UInt8)
))
(<strong i="33">@capnproto</strong> type $Person_PhoneNumber_Type (enum 0 1 2))
(<strong i="34">@capnproto</strong> type $Person_PhoneNumber (struct
(field "number" Text)
(field "type" $Person_PhoneNumber_Type)
))
(<strong i="35">@capnproto</strong> type $Person (struct
(field "name" Text)
(field "email" Text)
(field "phones" (generic List $Person_PhoneNumber))
(field "birthdate" $Data)
))
Capnproto ๋ฉ์์ง๋ ์ธ๊ทธ๋จผํธ(์์ ๋ฐ์ดํธ)์ ๊ธฐ๋ฅ์ด๋ผ๋ ๋ ๊ฐ์ง ์ ํ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํฉ๋๋ค.
์ด๋ค์ ๋๋ต WebAssembly์ ์ ํ ๋ฉ๋ชจ๋ฆฌ ๋ฐ ํ ์ด๋ธ์ ๋งคํ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์น ์ด์ ๋ธ๋ฆฌ๊ฐ capnproto ๋ฉ์์ง๋ฅผ ์์ฑํ๋ ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ์ธ๊ทธ๋จผํธ์ ๊ฒฝ์ฐ ์คํ์ ๊ณผ ๊ธธ์ด๋ฅผ ์ ํ ๋ฉ๋ชจ๋ฆฌ์ ์ ๋ฌํ๊ณ ๊ธฐ๋ฅ์ ์ํ ํ ์ด๋ธ์ ์คํ์ ๊ณผ ๊ธธ์ด๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ ๋๋ค.
(๋ฐํ์ ์ ํ ๊ฒ์ฌ๋ฅผ ํผํ๊ธฐ ์ํด ๊ธฐ๋ฅ์ ๋ํด ๋ ๋์ ์ ๊ทผ ๋ฐฉ์์ ๊ณ ์ํ ์ ์์ต๋๋ค.)
์ค์ ์ง๋ ฌํ ๊ณ์ฐ์ ๊ธ๋ฃจ ์ฝ๋์์ ๋ฐ์ํฉ๋๋ค(๊ธ๋ฃจ ์ฝ๋ ์์ฑ ์ฐธ์กฐ).
| ์ฐ์ฐ์ | ์ฆ์ | ์ด๋ฆฐ์ด | ์ค๋ช
|
| :--- | :--- | :--- | :--- |
| ์ธ๊ทธ๋จผํธ | off-idx
lenโidx | | ์์ค ํํ์ off-idx
'๋ฒ์งธ ๋ฐ len-idx
'๋ฒ์งธ wasm ๊ฐ์ ์ทจํฉ๋๋ค. ๋ ๋ค i32
์ฌ์ผ ํฉ๋๋ค. ์ธ๊ทธ๋จผํธ๊ฐ ์ ์ฅ๋ฉ๋๋ค. |
| ํฌ๋ก | off-idx
lenโidx | | ์์ค ํํ์ off-idx
'๋ฒ์งธ ๋ฐ len-idx
'๋ฒ์งธ wasm ๊ฐ์ ์ทจํฉ๋๋ค. ๋ ๋ค i32
์ฌ์ผ ํฉ๋๋ค. ๋ฅ๋ ฅ ํ
์ด๋ธ์ด ์ ์ฅ๋ฉ๋๋ค. |
| ๋ฉ์์ง | capnprotoํ
๋ฅ๋ ฅ ํ
์ด๋ธ | ์ธ๊ทธ๋จผํธ | ์ ๊ณต๋ ๊ธฐ๋ฅ ํ
์ด๋ธ๊ณผ ์ธ๊ทธ๋จผํธ๋ฅผ ์ฌ์ฉํ์ฌ capnproto-type
ํ์์ capnproto ๋ฉ์์ง๋ฅผ ๋ง๋ญ๋๋ค. |
GC ์ ์์ด ๋์ฐฉํ๊ธฐ ์ ์ ํน์ ๋์์ ํ์ ํ๋ ๊ฒ์ ์ด๋ ต์ต๋๋ค. ๊ทธ๋ฌ๋ ์ผ๋ฐ์ ์ธ ๊ตฌํ์ capnproto ๋ฐ์ธ๋ฉ์ด ๋จ์ผ ๋ณํ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ GC ์ ํ์์ capnproto ์ ํ์ ๊ฐ์ ธ์ค๋ ๊ฒ์ ๋๋ค.
์ ์์ค ์ ํ์ ๋ํ ๋ณํ ๊ท์น์ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค. i8์ Int8, UInt8 ๋ฐ bool๋ก ๋ณํํ๊ณ , i16์ Int16์ผ๋ก ๋ณํํฉ๋๋ค. ๊ณ ๊ธ ์ ํ์ capnproto ๋ฑ๊ฐ๋ฌผ๋ก ๋ณํ๋ฉ๋๋ค. ๊ตฌ์กฐ ๋ฐ ๋ฐฐ์ด ์ฐธ์กฐ๋ ํฌ์ธํฐ, ๋ถํฌ๋ช ์ฐธ์กฐ๋ก ๋ณํ๋ฉ๋๋ค. ๋ฅ๋ ฅ์ผ๋ก ์ ํํฉ๋๋ค.
๋ณด๋ค ์์ ํ ์ ์์ enum ๋ฐ unions์ ๋ํ ์ ๋ต์ ์ ์ํด์ผ ํฉ๋๋ค.
| ์ฐ์ฐ์ | ์ฆ์ | ์ด๋ฆฐ์ด | ์ค๋ช
|
| :--- | :--- | :--- | :--- |
| ๋ก | capnprotoํ
์์ด๋ | | ์ฐธ์กฐ์ฌ์ผ ํ๋ ์์ค ํํ์ idx
'๋ฒ์งธ wasm ๊ฐ์ ์ทจํ์ฌ capnproto-type
์ capnproto ๊ฐ์ ์์ฑํฉ๋๋ค. |
์ ํ ๋ฉ๋ชจ๋ฆฌ๋ก ์ญ์ง๋ ฌํํ๋ ๊ฒ์ ์ง๋ ฌํ์ ๊ฑฐ์ ๋น์ทํ์ง๋ง ํ ๊ฐ์ง ์ฃผ์ ์ฌํญ์ด ์ถ๊ฐ๋์์ต๋๋ค. wasm ์ฝ๋๋ ์ข ์ข capnproto ์ ํ์ด ์ผ๋ง๋ ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ง ๋ฏธ๋ฆฌ ์์ง ๋ชปํ๋ฉฐ ํธ์คํธ์ ์ผ์ข ์ ๋์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋ฐฉ๋ฒ์ ์ ๊ณตํด์ผ ํฉ๋๋ค. .
WebIDL ๋ฐ์ธ๋ฉ ์ ์์์ ์ ์๋ ์๋ฃจ์ ์ ํ ๋น์ ์ฝ๋ฐฑ์ ํธ์คํธ ๊ธฐ๋ฅ์ ์ ๋ฌํ๋ ๊ฒ์ ๋๋ค. capnproto ๋ฐ์ธ๋ฉ์ ๊ฒฝ์ฐ ๋์ ํ ๋น์ด ํธ์ถ์ ์ธก๊ณผ ํธ์ถ ์์ ์ ์ธก ๋ชจ๋์์ ๋ฐ์ํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ด ๋ฐฉ๋ฒ์ ์ถฉ๋ถํ์ง ์์ต๋๋ค.
๋ ๋ค๋ฅธ ํด๊ฒฐ์ฑ ์ ๋ค์ด์ค๋ ๋ฐ์ธ๋ฉ ๋งต ์ด ๋ ๊ฐ์ ๋ค์ด์ค๋ ๋ฐ์ธ๋ฉ ์ (๋ฐ๋ผ์ ๋ ๊ฐ์ ํจ์)์
๊ด๋ฆฌ๋๋ ๋ฉ๋ชจ๋ฆฌ๋ก ์ญ์ง๋ ฌํํ๋ฉด ๋ฐ๋ ๋ฐฉํฅ๊ณผ ๊ฐ์ ์ข ๋ฅ์ ๋ณํ ์ฐ์ฐ์๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
๋ ๊ฐ์ wasm ๋ชจ๋์ ํจ๊ป ์ฐ๊ฒฐํ ๋(์ ์ ์ผ๋ก๋ ๋์ ์ผ๋ก๋ ) ์๋ฒ ๋๋ ๋ ๋ชจ๋์ ๊ณตํต์ ์ธ ๋ชจ๋ capnproto ์ ํ, ํจ์ ์ ํ๊ณผ capnproto ์ ํ ๊ฐ์ ๋ฐ์ธ๋ฉ์ ๋์ดํ๊ณ ๋ชจ๋ ๋ค๋ฅธ ํจ์ ์ ํ ์ ์ฌ์ด์ ๊ธ๋ฃจ ์ฝ๋๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค.
๊ธ๋ฃจ ์ฝ๋๋ ๋ฐ์ธ๋ฉ๋ ๋ฐ์ดํฐ์ ์ ํ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. ์ ํ ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ธ๋ฉ ๊ฐ์ ๊ธ๋ฃจ ์ฝ๋๋ memcpy ํธ์ถ๋ก ์์ฝ๋ฉ๋๋ค. ๊ด๋ฆฌ๋๋ ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ธ๋ฉ ๊ฐ์ ๊ธ๋ฃจ ์ฝ๋๋ ์ฐธ์กฐ๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ผ๋ก ์์ฝ๋ฉ๋๋ค. ๋ฐ๋ฉด์ ์ ํ ๋ฉ๋ชจ๋ฆฌ์ ๊ด๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ๊ฐ์ ๊ธ๋ฃจ ์ฝ๋์๋ ๋ ๋ณต์กํ ์ค์ฒฉ ๋ณํ ์์ ์ด ํฌํจ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด, Java ๋ชจ๋์ ์ธ์๋ฅผ GC ์ ํ์ผ๋ก ์ฌ์ฉํ์ฌ ํจ์๋ฅผ ๋ด๋ณด๋ด๊ณ ํด๋น ํจ์๋ฅผ ์ ํ์ด ์ง์ ๋ ์๋ช ์ ๋ฐ์ธ๋ฉํ ์ ์์ต๋๋ค. ์ธํฐํ๋ฆฌํฐ๋ Python ๋ชจ๋๊ณผ C++๊ฐ ํด๋น ์ ํ ์๋ช ์ ๊ฐ์ ธ์ฌ ์ ์๋๋ก ํด์ผ ํฉ๋๋ค. C++ ๋ฐ์ธ๋ฉ์ ์ ํ ๋ฉ๋ชจ๋ฆฌ์์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๋ฐ๋ฉด Python ๋ฐ์ธ๋ฉ์ GC ๋ฉ๋ชจ๋ฆฌ์์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํฉ๋๋ค. ํ์ํ ๋ณํ ์ Java, Python ๋ฐ C++ ์ปดํ์ผ๋ฌ์
์ด ์น์ ์์๋ ๋ฐ์ดํฐ๋ฅผ ๊ตํํ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ๊ณผ ์๊ตฌ ์ฌํญ ์น์ ์ ์ ์๋ ๋ฉํธ๋ฆญ์ ๋ํ ํ๊ฐ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๋ฌด์ฐจ๋ณ ๋์ ์๋ฃจ์ ์ ๋๋ค. ๊ทธ ๊ฒฐํจ์ด ์๋นํ ๋ช ๋ฐฑํ๊ธฐ ๋๋ฌธ์ ๋๋ ๊ทธ๊ฒ์ ๋ํด ๋ง์ ์๊ฐ์ ํ ์ ํ์ง ์์ ๊ฒ์ ๋๋ค. ์๊ตฌ ์ฌํญ 2, 4 ๋ฐ 6์ ์ถฉ์กฑํ์ง ๋ชปํฉ๋๋ค.
๋ถ๋ถ์ ์ธ ํด๊ฒฐ์ฑ ์ ๋๋ค. wasm ๋ชจ๋์ด ์ ํ ๋ฉ๋ชจ๋ฆฌ ์กฐ๊ฐ๊ณผ ํ ์ด๋ธ์ ๋ค๋ฅธ ๋ชจ๋๋ก ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์ ์ ์ํ๋ฉด ๋ชจ๋ ์์ฑ์๋ ์ง๋ ฌํ ํ์(capnproto, protobuff ๋๋ ๊ธฐํ)์ ์ฌ์ฉํ์ฌ ๊ตฌ์กฐํ๋ ๊ทธ๋ํ๋ฅผ ๋ฐ์ดํธ ์ํ์ค๋ก ์ธ์ฝ๋ฉํ๊ณ , ๋ฐ์ดํธ๋ฅผ ์ ๋ฌํ๊ณ , ๋์ผํ ํ์์ ์ฌ์ฉํ์ฌ ๋์ฝ๋ฉํฉ๋๋ค.
1๊ณผ 3์ ์ ๋ฌํ๊ณ ์ฝ๊ฐ์ ์กฐ์ ์ ํตํด 2์ 4๋ฅผ ์ ๋ฌํ ์ ์์ต๋๋ค(์: ์ฐธ์กฐ๋ฅผ ํ ์ด๋ธ์ ๋ํ ์ธ๋ฑ์ค๋ก ์ ๋ฌ). ์ฌ์ฉ์๊ฐ ์ง๋ ฌํ ์ ํ์ ํธ์ถ์์ ์ธ์ด๋ก ๋ ์ ํ ์ ์๋ก ๋ด๋ณด๋ด๋๋ก ํ๋ ๊ฒฝ์ฐ 6์ ์ ๋ฌํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์๊ตฌ ์ฌํญ 5์ 7์์๋ ์คํจํฉ๋๋ค. ๋ GC ๊ตฌํ ๊ฐ์ ๋ฐ์ธ๋ฉํ ๋๋ ๋น์ค์ฉ์ ์ ๋๋ค. ์๋ฅผ ๋ค์ด Protobuf๋ฅผ ํตํด Java ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํธ์ถํ๋ Python ๋ชจ๋์ ์ฌ์ ์ ์ ํ ๋ฉ๋ชจ๋ฆฌ๋ก ์ง๋ ฌํํ๊ณ ํด๋น ๋ฉ๋ชจ๋ฆฌ ์กฐ๊ฐ์ ์ ๋ฌํ ๋ค์ Java ๊ฐ์ฒด๋ก ์ญ์ง๋ ฌํํด์ผ ํฉ๋๋ค. JIT ๊ตฌํ.
๊ทธ๋ฆฌ๊ณ ๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฑ์๊ฐ ๊ณ ์ ํ ์ง๋ ฌํ ํ์(JSON, Protobuf, FlatBuffer, Cap'n Proto, SBE)์ ์ฌ์ฉํ๋๋ก ๊ถ์ฅํฉ๋๋ค. ์ด๋ ์ํธ ์ด์ฉ์ฑ์ ์ ํฉํ์ง ์์ต๋๋ค. tool-conventions ์์ ํ์ค ์ง๋ ฌํ ํ์์ ์ ์ํ์ฌ ์ํํ ์ ์์ง๋ง.
๊ทธ๋ฌ๋ ์ ํ ๋ฉ๋ชจ๋ฆฌ์ ์์ ์กฐ๊ฐ์ ์ ๋ฌํ ๊ฐ๋ฅ์ฑ์ ์ถ๊ฐํ๋ ๊ฒ์ด ์ข์ ์ฒซ ๋ฒ์งธ ๋จ๊ณ๊ฐ ๋ ๊ฒ์ ๋๋ค.
์๋ก์๊ฒ GC ๊ฐ์ฒด๋ฅผ ๋ณด๋ด๋ ๋ชจ๋์ ์์กดํ๋ ๊ฒ์ด ๊ฐ๋ฅ
์ด ์๋ฃจ์ ์๋ ๋ช ๊ฐ์ง ์ฅ์ ์ด ์์ต๋๋ค. GC ์ ์์ด ์ด๋ฏธ ์งํ ์ค์ ๋๋ค. 1, 3, 4, 7์ ํต๊ณผํฉ๋๋ค. GC์์ ์์งํ ๋ฐ์ดํฐ๋ ํ ๋นํ๋ ๋ฐ ๋น์ฉ์ด ๋ง์ด ๋ค์ง๋ง ์ ๋ฌํ๋ ๋ฐ ๋น์ฉ์ด ์ ๋ ดํฉ๋๋ค.
๊ทธ๋ฌ๋ ๊ทธ ์๋ฃจ์ ์ C ๊ณ์ด ์ธ์ด์ ์ ํฉํ์ง ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฐ์ดํฐ๋ฅผ Rust ๋ชจ๋์ ์ ๋ฌํ๋ D ๋ชจ๋์ ๋ฐ์ดํฐ๋ฅผ GC ๊ทธ๋ํ๋ก ์ง๋ ฌํํ๊ณ ๊ทธ๋ํ๋ฅผ Rust ํจ์์ ์ ๋ฌํด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ๊ทธ๋ํ๊ฐ ์ ํ ๋ฉ๋ชจ๋ฆฌ๋ก ์ญ์ง๋ ฌํ๋ฉ๋๋ค. ์ด ํ๋ก์ธ์ค๋ ๋ง์ ๋ถํ์ํ ์ค๋ฒํค๋๋ฅผ ์ํด ์ฆ์ ํ๊ธฐ๋๋ GC ๋ ธ๋๋ฅผ ํ ๋นํฉ๋๋ค.
๊ทธ ์ธ์๋ ํ์ฌ GC ์ ์์๋ ์ด๊ฑฐํ ๋ฐ ๊ณต์ฉ์ฒด์ ๋ํ ๊ธฐ๋ณธ ์ ๊ณต ์ง์์ด ์์ต๋๋ค. ์ปดํ์ผ๋ฌ๊ฐ wasm GC ์ ํ์ ์ฝ๊ณ ์ดํดํ ์ ์๋ค๋ฉด ์ค๋ฅ ์ฒ๋ฆฌ๋ ์ปดํ์ผ ์๊ฐ ๋์ ๋งํฌ ์๊ฐ ๋๋ ๋ฐํ์์ ์ํ๋ฉ๋๋ค.
์ ํ ์์คํ ์ ์ ์ํ๋ ์ง๋ ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ wasm์์ ์๋ํ ์ ์์ต๋๋ค.
Capnproto๋ ์ ๋ก ์นดํผ์ ๋ํ ๊ฐ์กฐ์ ์ฐธ์กฐ ์ ํ์ ๊น๋ํ๊ฒ ๋งคํ๋๋ ๋ด์ฅ ๊ฐ์ฒด ๊ธฐ๋ฅ ๋๋ฌธ์ ๊ฐ์ฅ ์ ์ ํด ๋ณด์ ๋๋ค.
์ด ๊ธฐ๋ณธ์ ์ธ ์ ์์ ์ปค๋ฎค๋ํฐ ๊ทธ๋ฃน์ ์ ์ถํ ์ ์๋ ๋ฌธ์๋ก ๋ฐ๊พธ๋ ค๋ฉด ๋ค์ ๊ฐ๋ ์ ๊ตฌ์ฒดํํด์ผ ํฉ๋๋ค.
๊ทธ๋์ ์ ๊ฐ ์ด๋ฏธ ์์ฑํ ๋ด์ฉ์ ๋ํ ํผ๋๋ฐฑ์ ํ์ํฉ๋๋ค. ์ฌ๊ธฐ์ ๋ฒ์๋ ๊ฝค ๋ฐฉ๋ํ๋ฏ๋ก ์ด ์ ์์์์ ๋ต๋ณํด์ผ ํ๋ ์ง๋ฌธ์ ์ขํ๋ ๋ฐ ๋์์ ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
์ด๊ฒ์ ์ ๋ง ํฅ๋ฏธ ๋กญ์ต๋๋ค! ๋๋ ๋นจ๋ฆฌ ์ฝ์์ ๋ฟ์ด๋ฉฐ ๋ช ๊ฐ์ง ์ด๊ธฐ ์๊ฐ์ด ์์ง๋ง ๊ฐ์ฅ ์ค์ํ ์ง๋ฌธ์ ๋๋ถ๋ถ์ ์ธ์ด๊ฐ ์ด๋ฏธ ์ ๊ณต/์ฌ์ฉํ๋ ๊ธฐ์กด FFI ๋ฉ์ปค๋์ฆ์ด WebAssembly์ ์ถฉ๋ถํ์ง ์์ ์ด์ ๋ฅผ ๋ฌป๋ ๊ฒ์
๋๋ค. ๋ด๊ฐ ์น์ํ ๊ฑฐ์ ๋ชจ๋ ์ธ์ด์๋ C FFI ํ์์ด ์์ผ๋ฏ๋ก ์ค๋๋ ์๋ ์ด๋ฏธ ์ํธ ์ด์ฉํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ธ์ด ์ค ์๋น์๋ ์ด๋ฌํ ๋ฐ์ธ๋ฉ์ ๊ธฐ๋ฐ์ผ๋ก ์ ์ ์ ํ ๊ฒ์ฌ๋ ์ํํ ์ ์์ต๋๋ค. ๊ฒ๋ค๊ฐ ์ด๋ฏธ ์ด๋ฌํ ์ธํฐํ์ด์ค์ ๋ํ ๋ง์ ๋๊ตฌ๊ฐ ์์ต๋๋ค(์: Rust์ ๊ฒฝ์ฐ bindgen
crate, Erlang/BEAM์ ๊ฒฝ์ฐ erl_nif
๋ฑ). C FFI๋ ์ด๋ฏธ ๊ฐ์ฅ ์ค์ํ ์๊ตฌ ์ฌํญ์ ๋ค๋ฃจ๊ณ ์์ผ๋ฉฐ ์ด๋ฏธ ์
์ฆ๋๊ณ ์ค์ ๋ก ๋๋ฆฌ ์ฌ์ฉ๋๋ ์ฃผ์ ์ด์ ์ด ์์ต๋๋ค.
5 - ๋ฉ๋ชจ๋ฆฌ ๋ ์ด์์ ๊ฐ์ ๋ธ๋ฆฌ์ง
์ด์์ ์ธ ์ ํ ์์คํ ์ ์๋ฏธ๋ก ์ ์ ํ์ ํํํด์ผ ํ๋ฉฐ ์ธ์ด๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ์ด๋ฅผ ํด์ํ๋ ๋ฐฉ๋ฒ์ ๊ฒฐ์ ํ๋๋ก ํด์ผ ํฉ๋๋ค. ๋ฉ๋ชจ๋ฆฌ ๋ ์ด์์์ด ํธํ๋์ง ์๋ ์ธ์ด ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ฉด ํญ์ ์ฝ๊ฐ์ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ์ง๋ง ์ ์ฌํ ์ธ์ด ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ ์ด์์ ์ผ๋ก ์ ๋ ดํด์ผ ํฉ๋๋ค(์: memcpy๊ฐ ๋์ผํ ์์ ์ ์ํํ ์ ์๋ ๊ฒฝ์ฐ ์๋ฒ ๋๋ ์ง๋ ฌํ-์ญ์ง๋ ฌํ ๋จ๊ณ๋ฅผ ํผํด์ผ ํฉ๋๋ค).
์๋ฏธ ์ ํ์ด ํธํ๋๋ ํ ๋ ๋ชจ๋ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ๋ ๋ณํ ์์ ์ ๊ฐ๋ฐ์์๊ฒ ํฌ๋ช ํด์ผ ํฉ๋๋ค.
FFI ์ฅ๋ฒฝ์ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ๋ ํ ๋ ์ด์์์ ๋ค๋ฅธ ๋ ์ด์์์ผ๋ก ํฌ๋ช ํ๊ฒ ๋ณํํ๋ ๊ฒ์ ์ค์ ๋ก ์ปดํ์ผ๋ฌ ๋ฐฑ์๋ ๋๋ ์ธ์ด ๋ฐํ์์ ์ํ ์์ ์ฒ๋ผ ๋ณด์ด๋ฉฐ C/C++/Rust/๋ฑ๊ณผ ๊ฐ์ ์ฑ๋ฅ์ ๋ฏผ๊ฐํ ์ธ์ด์์๋ ์ ํ ๋ฐ๋์งํ์ง ์์ ์ ์์ต๋๋ค. ํนํ, FFI๋ฅผ ํตํด ์ฃผ๊ณ ๋ฐ์ ๊ณํ์ธ ๊ฒฝ์ฐ ๋ฒ์ญ ๋น์ฉ์ด ๋๋ฌด ๋ง์ด ๋ค ์ ์์ผ๋ฏ๋ก ์ด๋ค ์ข ๋ฅ์ ๋ฒ์ญ๋ณด๋ค ๊ณตํต ABI๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ํญ์ ๋ ๋์ ๊ฒ ๊ฐ์ต๋๋ค. ํ๋ซํผ์ ๊ณตํต ABI ์ด์ธ์ ๋ ์ด์์์ ์ ํํ๋ ์ด์ ์ ๊ทธ๋งํ ๊ฐ์น๊ฐ ์์ ๊ฒ ๊ฐ์ง๋ง ๋์ฒด ๋ ์ด์์์ด ์๋ฏธํ๋ ๋ฐ๋ฅผ ์คํดํ ์ ์์์ ์ฝ๊ฒ ์ธ์ ํฉ๋๋ค.
์ ์ณ๋๊ณ , ์ปดํ์ผ๋ฌ/๋ฐํ์์ ๊ฒฌ๊ณ ํ FFI ๋๊ตฌ์ ๋ถ๋ด์ ๊ฐํ๋ ๊ฒ์ ์ถ๊ฐ์ ์ธ ์ด์ ์ด ์์ต๋๋ค. ๋ชจ๋ ๊ฐ์ ์ฌํญ์ ๋ค๋ฅธ ํ๋ซํผ์ ์ ์ฉ ๊ฐ๋ฅํ๊ณ ๋ฐ๋์ ๊ฒฝ์ฐ๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ์ ๋ ์ฃผ์ฅ์ด ๊ทผ๋ณธ์ ์ผ๋ก ์ฒ์๋ถํฐ ์์ํ์ฌ ์๋ก์ด FFI ๋ฉ์ปค๋์ฆ์ ๊ตฌ์ถํ๊ธฐ ์ํด ์ ๋ง ์ค๋๋ ฅ์ด ์์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ ์์ ๋ชฉ์ ์ ์๋ชป ์ดํดํ๊ฑฐ๋ ์์์ ์ธ๊ธํ ๊ฒ์ฒ๋ผ ์ค์ํ ๊ฒ์ ๋์ณค๋ค๋ฉด ์ฌ๊ณผ๋๋ฆฝ๋๋ค. ๋ค์ ํ ๋ฒ ๋ ์์ธํ ์ฝ์ด์ผ ํ์ง๋ง ์๊ฐ์ด ์๋ ๋์ ์ด๊ธฐ ์ง๋ฌธ์ ์ ๊ธฐํด์ผ ํ ๊ฒ ๊ฐ์์ต๋๋ค.
Apache Arrow ๋ ์ด๋ฅผ ์ํด ์กด์ฌํ์ง๋ง ๊ณ ์ฑ๋ฅ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ์ค์ ์ ๋ก๋๋ค.
๋๋ ์ฌ๊ธฐ์ ์ผ๋ฐ์ ์ธ ๋๊ธฐ์ ๋์ํ๊ณ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฏธ๋์ Web IDL ๋ฐ์ธ๋ฉ ์ ์ผ๋ฐํํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ํด ๋ ผ์ํ ๋ด์ฉ๊ณผ ์ผ์นํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ค์ ๋ก, ์ค๋ช ์์ ์ด๊ธฐ ์ด์์๋ ์ด ์ธ์ด ๊ฐ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ธ๊ธํ๋ FAQ ํญ๋ชฉ์ด ํฌํจ๋์ด ์์ต๋๋ค.
๋ด ์ฃผ์ ๊ด์ฌ์ฌ(๊ทธ๋ฆฌ๊ณ ๊ทธ FAQ ํญ๋ชฉ์ ์๋ตํ ์ด์ )๋ ๋ฒ์์ ๋๋ค. N๊ฐ ์ธ์ด๋ฅผ ๋ฐ์ธ๋ฉํ๋ ์ผ๋ฐ์ ์ธ ๋ฌธ์ ๋ ํนํ ์๋ฌด๋ ์ด๋ฏธ ํ๊ณ ์์ง ์๋ค๋ ์ ์ ๊ฐ์ํ ๋ ๋ง์ ๊ฐ๋ฐฉํ(๊ทธ๋ฆฌ๊ณ ์๋ง๋ ๋น์ข ๋ฃํ) ํ ๋ก ์ ์์ฑํ ๊ฐ๋ฅ์ฑ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค( ๋ฌผ๋ก ๋ญ๊ณผ ๋ฌ๊ฑ์ ๋ฌธ์ ์ ๋๋ค.) ๋์กฐ์ ์ผ๋ก, Web IDL Bindings์ ์ํด ํด๊ฒฐ๋ ๋ฌธ์ ๋ ์ค๋๋ Rust/C++์์ ์๋นํ ๊ตฌ์ฒด์ ์ด๊ณ ์ฝ๊ฒ ์ ์ฆ๋์ด ์ฐ๋ฆฌ๊ฐ (์ฌ์ํ์ง ์์) ๋ ธ๋ ฅ์ ํ์คํ/๊ตฌํํ๊ณ ์ ์๋ ์๋ฃจ์ ์ ํ๋กํ ํ์ /๊ฒ์ฆ์ ๋ํ ๋๊ธฐ๋ฅผ ๋ถ์ฌํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๋ด ํฌ๋ง์ Web IDL ๋ฐ์ธ๋ฉ์ ํตํด ์ฐ๋ฆฌ๊ฐ ์ด ๋ญ๊ณผ ๋ฌ๊ฑ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ Web IDL์ ๊ตญํ๋์ง ์๋ ์๋ก์ด ํ์ฅ์ด๋ ๋ฐ๋๋๋ค . (ํ์ฌ ์ ์๋ ๋๋ก ํธํ ๊ฐ๋ฅํ Web IDL ๋ฐ์ธ๋ฉ์ ์ฌ์ฉํ๋ ๋ ๊ฐ์ wasm ๋ชจ๋์ด ์๋ก๋ฅผ ํธ์ถํ๋ ๊ฒฝ์ฐ, Cap'n Proto์ ์์ ํ ํํ ์์ด๋ ์ต์ ํ impl์ด ์ฌ๊ธฐ์์ ์ธ๊ธํ ์ต์ ํ๋ฅผ ์ํํ ์ ์์ต๋๋ค.)
๋๋ ์์ง ๊ทธ ์ ์์ ์์ ํ ๋ฐ์๋ค์ผ ์๊ฐ์ด ์์๋ค๋ ๊ฒ์ ๋ฏธ๋ฆฌ ๋งํด์ผ ํฉ๋๋ค.
๊ทธ ์ด์ ๋ ๊ทธ ์ผ์ด ๋ถ๊ฐ๋ฅํ๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์
๋๋ค. ์ฌ๊ธฐ์๋ ๋ ๊ฐ์ง ๊ทผ๋ณธ์ ์ธ ์ด์ ๊ฐ ์์ต๋๋ค.
NS. ๋ค๋ฅธ ์ธ์ด์๋ ์ ํ ์ฃผ์์์ ๋ฐ๋์ ์บก์ฒ๋์ง ์๋ ๋ค๋ฅธ ์๋ฏธ ์ฒด๊ณ๊ฐ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, Prolog์ ํ๊ฐ๋ C++์ ํ๊ฐ์ ๊ทผ๋ณธ์ ์ผ๋ก ๋ค๋ฆ
๋๋ค. (Prolog์ ๊ฒฝ์ฐ ๋ค๋ฅธ ์ฌ๋ฌ ์ธ์ด๋ก ๋์ฒด ๊ฐ๋ฅ)
NS. ์ ์์ ๋ฐ๋ผ ์ ํ ์์คํ
์ LCD๋ ์ง์ ๋ ์ธ์ด์ ๋ชจ๋ ์ ํ ์ธ์ด๋ฅผ ์บก์ฒํ ์ ์๋ค๊ณ ๋ณด์ฅ๋์ง ์์ต๋๋ค. ์ด๋ ์ธ์ด ๊ตฌํ์์๊ฒ ๋งค์ฐ ๋ถํธํ ์ ํ์ ๋จ๊น๋๋ค. ์์ ์ ์ธ์ด๋ฅผ ์ง์ํ๊ฑฐ๋ ํด๋น ์ธ์ด์ ์ ํ ์์คํ
์ ์ด์ ์ ํฌ๊ธฐํ๋ ๊ฒ์
๋๋ค. ์ฌ๋ก: Haskell์๋ '์ ํ ํด๋์ค'๊ฐ ์์ต๋๋ค. ์ ํ ํด๋์ค๋ฅผ ์ง์ํ์ง ์๋ ๊ฒ๊ณผ ๊ด๋ จ๋ Haskell์ ๊ตฌํ์ ํจ๊ณผ์ ์ผ๋ก ์ด๋ฅผ ๋ด์ฅํ๊ณ ์ฌ์ฉํ ์ ์๊ฒ ๋ง๋ญ๋๋ค.
๋ ๋ค๋ฅธ ์: C++์์ ์ ๋ค๋ฆญ์ ์ง์ํ๋ ค๋ฉด ์ปดํ์ผ ํ์์ ์ ๋ค๋ฆญ์ ์ ๊ฑฐํด์ผ ํฉ๋๋ค. ๋ฐ๋ฉด์ ML, Java(๋ฐ ๊ธฐํ ์ฌ๋ฌ ์ธ์ด)๋ ๋ฒ์ฉ ํํ ํ์์ ์ฌ์ฉํฉ๋๋ค. ์ด๋ C++์์ ์ฌ์ฉํ๋ ์ ๊ทผ ๋ฐฉ์๊ณผ ํธํ๋์ง ์์ต๋๋ค.
๋ค๋ฅธ ํํธ์ผ๋ก ๋ด๋ณด๋ธ/๊ฐ์ ธ์จ ์ ํ์ ๋ ํํ์์ ๊ฐ๋ ๊ฒ์ ์์ฒด ๋ฌธ์ ๋ฅผ ์ ๊ธฐํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ธ์ด ์์คํ ์ ๋ ํํ์์ด ์ด๋ค ์๋ฏธ์์ ์ผ๊ด์ฑ์ด ์๋์ง ํ์ธํด์ผ ํฉ๋๊น? ์ด ์ผ์ ํ๋ ๊ฒ์ ๋๊ตฌ์ ์ฑ ์์ ๋๊น?
@lukewagner ๋งํฌ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค! ํ์คํ ๊ทธ ๋ฌธ์๋ฅผ ์ฝ์ ๊ธฐํ๊ฐ ์๊ฒจ์ ๊ธฐ์ฉ๋๋ค!
์ด ํน์ ํ ๋ก ์๋ ๋ ๊ฐ์ง๊ฐ ํผํฉ๋์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์๋ ๋ด์ฉ ์ค ์ผ๋ถ๋ ๋ด๊ฐ ์ดํดํ ๋ด์ฉ์ ๋ค์ ํ์ธํ ์ ์๋๋ก ์์ฑ๋์์ผ๋ฏ๋ก ๋ด๊ฐ ์คํดํ๊ฑฐ๋ ๋์น ๋ถ๋ถ์ด ์์ผ๋ฉด ์์ ๋กญ๊ฒ ์ง์ ํด ์ฃผ์ญ์์ค.
source
์์ฑ๋ ๋ชจ๋๊ณผ dest
์์ฑ๋ ๋ ๋ชจ๋์ด ์ฃผ์ด์ง๋ฉด ์์ค->dest ๋ฐ/๋๋ dest->source์์ ํธ์ถํ์ฌ ์๋ก ์ ํ์ ๊ณต์ ํฉ๋๋ค.source type -> common type -> dest type
์ธ์ด ์ฅ๋ฒฝ์ ๋์ด ํธ์ถํ ๋ ํธ์คํธ ํ๊ฒฝ์์ ์ ๊ณตํ๋ ์ผ๋ถ ๊ณตํต ๋ถ๋ชจ ์ ํ์ ํตํด ์ต์ ํ๋์ง ์์ ๊ฒฝ๋ก๊ฐ ์ ๊ณต๋ฉ๋๋ค. .source
์์ dest
๋ก ์ง์ ๋ง๋ค ์ ์์ง๋ง ์ฌ์ ํ ๋ฒ์ญ ์ค๋ฒํค๋๋ฅผ ๋ถ๊ณผํฉ๋๋ค.source
๋ฐ dest
๊ฐ ABI(์: C ABI)๋ฅผ ๊ณต์ ํ๋ฉด source
๋ฐ dest
๊ฐ ๋ค์์ ์ฌ์ฉํ์ฌ ์๋ก ์ง์ ํธ์ถํ ์ ์์ต๋๋ค. FFI๋ฅผ ํตํด ์ค๋ฒํค๋๊ฐ ์ ํ ์์ต๋๋ค. ์ด๊ฒ์ ์๋ง๋ ์ค์ ๋ก ๊ฐ์ฅ ๊ฐ๋ฅ์ฑ์ด ๋์ ์๋๋ฆฌ์ค์ผ ๊ฒ์
๋๋ค.๋ฐ๋ผ์ ๋ด ์๊ฐ์ WebIDL ๋๋ ์ด์ ์ ์ฌํ ๊ฒ(์ฆ, ๊ด๋ฒ์ํ ํธ์คํธ API/ํ๊ฒฝ ์ธํธ๋ฅผ ์ง์ํ๋ ์์ ์ธํธ)์ ํ์ฉํ๋ฉด ํ์คํ ์ด์ ์ด ์์ง๋ง ์ค์ ๋ก๋ 1์ ์ค๋ช ๋ ๋ฌธ์ ์ ๋ํ ์๋ฃจ์ ์ผ ๋ฟ์ด๋ฉฐ ํ์ ์งํฉ์ ๋๋ค. FFI๋ฅผ ์ฌ์ฉํ ์ ์๋ ์ธ์ด ๊ฐ ๋ฐ์ธ๋ฉ์ ์ฒ๋ฆฌํ๋ 2๊ฐ ์ค. FFI๋ฅผ ์ฌ์ฉํ ์ ์๋ 2์ ํ์ ์งํฉ์ ๊ทธ ์์ฒด๋ก ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋์๋ณด๋ค ๋ถ๋ช ํ ์ ํธ๋ฉ๋๋ค.
FFI๊ฐ ์ต์ ์ธ ๊ฒฝ์ฐ์๋ IDL์ ์ฌ์ฉํด์ผ ํ๋ ํ๋นํ ์ด์ ๊ฐ ์์ต๋๊น? ๋ถ๋ช ํ ๋งํด์, ๋๋ ์ธ๊ธ๋ ๋ค๋ฅธ ์ฌ์ฉ ์ฌ๋ก์ ๋ํด IDL์ ์ฌ์ฉํ๋ ๋ฐ ํ์คํ ๋์ํ์ง๋ง ํนํ ํธ์คํธ ๋ฐ์ธ๋ฉ์ด ์๋๋ผ ์ธ์ด ์ํธ ์ด์ฉ์ฑ์ ๋งฅ๋ฝ์์ ๋ฌป๊ณ ์์ต๋๋ค.
C FFI(์: ๊ฐ์ฅ ์ผ๋ฐ์ ์ด๊ธฐ ๋๋ฌธ์)์ IDL์ด ๋์์ ์ฌ์ฉ/์กด์ฌํ๋ ๊ฒฝ์ฐ ๋ช ๊ฐ์ง ์ถ๊ฐ ์ง๋ฌธ์ด ์์ต๋๋ค.
source
๋ฐ dest
์ธ์ด๊ฐ ๊ณตํต ABI์ ๋ฐ๋ผ ๋์ผํ ๊ธฐ๋ณธ ๋ฉ๋ชจ๋ฆฌ ๋ด ํํ์ ์ฌ์ฉํ์ฌ ๊ณต์ ์ ํ์ ๋ํด ๋ค๋ฅธ ์ ํ ์ ์๋ฅผ ์ ๊ณตํ๋ ๊ฒฝ์ฐ(์: ๊ฐ๋ณ ๊ธธ์ด ๋ฐฐ์ด์ ๋ํ ๊ณตํต ํํ ) - ํธ์คํธ ์์ง์ด ํ์ค FFI๋ฅผ ์ฌ์ฉํ์ฌ ์๋ก ์์ ํ๊ฒ ํธ์ถํ ์ ์์์๋ ๋ถ๊ตฌํ๊ณ IDL ์ง์๋ฌธ์ด ์๋ค๋ ์ด์ ๋ง์ผ๋ก ์ด๋ฌํ ์ ํ ๊ฐ์ ๋ณํ์ ์ํํ๋ ค๊ณ ํฉ๋๊น?add/2
ํจ์๋ฅผ ์ ์ํ๋ ๋ค๋ฅธ ์ธ์ด๋ก ์์ฑ๋ ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํธ์ถํ๊ณ ์๊ณ add/2
size_t
์ ํ์ ๋ ์ธ์๋ฅผ ์์ํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ๋ด ์ธ์ด๋ ๋ช
๋ชฉ์ size_t
์ ๋ํด ๋ฐ๋์ ์์ง๋ ๋ชปํ์ง๋ง, ๊ธฐ๊ณ ๋๋น์ ๋ถํธ ์๋ ์ ์์ ๋ํ ์์ฒด ABI ํธํ ํํ์ธ usize
๊ฐ ์์ผ๋ฏ๋ก ๋ด ์ธ์ด์ ํด๋น ๊ธฐ๋ฅ์ ๋ํ FFI ๋ฐ์ธ๋ฉ์ ๋ด ์ธ์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ธ์ด ์ ํ. ์ด๋ฅผ ๊ฐ์ํ ๋ ๋ด ์ปดํ์ผ๋ฌ๋ usize
๋ฅผ size_t
๋งคํํ๋ IDL์ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์ ์ ์์ต๋๋ค. ๋๋ ์ฌ์ ํ WebIDL๊ณผ ๊ทธ ์ ์์์ ์ ์ฒด ์ธ๋ถ ์ฌํญ์ ํํค์น๋ ค๊ณ ๋ ธ๋ ฅํ๊ณ ์์์ ์ธ์ ํ ๊ฒ์ ๋๋ค. ์ด ๋ชจ๋ ๊ฒ์ด ๋ค๋ฅธ ํธ์คํธ(๋ธ๋ผ์ฐ์ ๋ ๋น ๋ธ๋ผ์ฐ์ )์ ์ด๋ป๊ฒ ๋ค์ด๋ง๋์ง ๋ฑ์ ๋๋ค. ๋ด๊ฐ ๊ฐ๊ณผํ๋ค๋ฉด ํ์คํ ์๋ ค์ฃผ์ญ์์ค. ๋ฌด์.
@bitwalker
์ด๊ฒ์ ์ ๋ง ํฅ๋ฏธ ๋กญ์ต๋๋ค!
๋ค๊ฐ ์ข๋ค ๋ ๊ธฐ์๋ค!
๊ทธ๋ฌ๋ ์ ์ฒซ ๋ฒ์งธ์ด์ ๊ฐ์ฅ ์ค์ํ ์ง๋ฌธ์ ๋๋ถ๋ถ์ ์ธ์ด๊ฐ ์ด๋ฏธ ์ ๊ณต/์ฌ์ฉํ๋ ๊ธฐ์กด FFI ๋ฉ์ปค๋์ฆ์ด WebAssembly์ ์ถฉ๋ถํ์ง ์์ ์ด์ ๋ฅผ ๋ฌป๋ ๊ฒ์ ๋๋ค.
C ์ ํ ์์คํ ์ ์ธ์ด ๊ฐ IDL๋ก ๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
WebAssembly์์ ์์ ํ์ง ์๊ณ ์๋์ ์ผ๋ก ๋ณด์ ํ์ง ์๋ ๊ณต์ ์ฃผ์ ๊ณต๊ฐ์ ๊ฐ์ ํ์ฌ ์๋ํฉ๋๋ค. (JS-to-C FFI์ ๋ํ ๋ด ์์ ์ ๊ฒฝํ์ ๋ฐ๋ฅด๋ฉด ๊ตฌํ์ ์๋์ ์์ ์ ๊ฑฐ๋ํ๋ ๊ฒฝํฅ์ด ์์)
๋์ ๊ธธ์ด ๋ฐฐ์ด, ํ๊ทธ๊ฐ ์ง์ ๋ ๊ณต์ฉ์ฒด, ๊ธฐ๋ณธ๊ฐ, ์ ๋ค๋ฆญ ๋ฑ์ ๋ํ ๊ธฐ๋ณธ ์ง์์ด ์์ต๋๋ค.
์ฐธ์กฐ ์ ํ์ ์ง์ ์ ์ผ๋ก ํด๋นํ๋ ๊ฒ์ ์์ต๋๋ค.
C++๋ ์ด๋ฌํ ๋ฌธ์ ์ค ์ผ๋ถ(๊ฐ์ฅ ํฐ ๋ฌธ์ ์ธ ๊ณต์ ์ฃผ์ ๊ณต๊ฐ์ด ์๋)๋ฅผ ํด๊ฒฐํ์ง๋ง IPC์์ ์ค์ ๋ก ์ ์ฉํ์ง ์์ ๋ง์ ๊ฐ๋ ์ ์ถ๊ฐํฉ๋๋ค. ๋ฌผ๋ก , ํญ์ C์ ์์ ์งํฉ์ด๋ C++์ ํ์ ์งํฉ์ IDL๋ก ์ฌ์ฉํ๊ณ ์ด์ ๋ํ ๋ฐ์ธ๋ฉ ๊ท์น์ ๊ณ ์ํ ์ ์์ง๋ง ๊ทธ ์์ ์์ ๊ธฐ์กด ์ฝ๋์ ์ด์ ์ ๊ฑฐ์ ์ป์ง ๋ชปํ๋ฏ๋ก ๊ธฐ์กด ์ฝ๋๋ฅผ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. IDL.
ํนํ FFI์์ ์๋ค๋ก ์ ๋ฌํ ๊ณํ์ธ ๊ฒฝ์ฐ
๋๋ ๋น์ ์ด ๊ทธ๊ฒ์ ์๋ฏธํ๋ ๋ฐฉ๋ฒ์ด ์ ํํ์ง ์์ง๋ง ๋ช ํํ๊ฒ: ๋๋ ๋ชจ๋ ์ฌ์ด์์ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๋ฐ์ดํฐ๋ฅผ ์๋ค๋ก ์ ๋ฌํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ์ ๊ฐ๋ฅํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ์ด ์ ์์ ๋ค๋ฅธ ๋ชจ๋์ด ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ ๋ณด๊ฐ ์๋ ๋ชจ๋ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๊ณ ๊ทธ ๋๊ฐ๋ก ๋ณ๊ฒฝํ ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ป๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํ๋ ค๊ณ ํฉ๋๋ค.
ํ๋ซํผ์ ๊ณตํต ABI ์ด์ธ์ ๋ ์ด์์์ ์ ํํ๋ ์ด์ ์ ๊ทธ๋งํ ๊ฐ์น๊ฐ ์์ ๊ฒ ๊ฐ์ง๋ง ๋์ฒด ๋ ์ด์์์ด ์๋ฏธํ๋ ๋ฐ๋ฅผ ์คํดํ ์ ์์์ ์ฝ๊ฒ ์ธ์ ํฉ๋๋ค.
๋ฌธ์ ๋ ํ์ฌ ์ผ๋ฐ์ ์ธ ABI๊ฐ ์ ํ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋ ๋ฐ์ดํธ ์กฐ๊ฐ์ด๋ผ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋ฏธ๋์ GC ์ ์์ด ๊ตฌํ๋๋ฉด ์ผ๋ถ ์ธ์ด(Java, C#, Python)๋ ์ ํ ๋ฉ๋ชจ๋ฆฌ์ ๊ฑฐ์ ์ ์ฅํ์ง ์๊ฑฐ๋ ์ ํ ์ ์ฅํ์ง ์์ ๊ฒ์ ๋๋ค. ๋์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ GC ๊ตฌ์กฐ์ ์ ์ฅํฉ๋๋ค. ์ด๋ฌํ ์ธ์ด ์ค 2๊ฐ๊ฐ ํต์ ์ ์๋ํ๋ ๊ฒฝ์ฐ ์ด๋ฌํ ๊ตฌ์กฐ๋ฅผ ๋ฐ์ดํธ ์คํธ๋ฆผ์ผ๋ก ์ง๋ ฌํํ์ฌ ์ฆ์ ์ญ์ง๋ ฌํํ๋ ๊ฒ์ ๋ถํ์ํ ์ค๋ฒํค๋๊ฐ ๋ ๊ฒ์ ๋๋ค.
@KronicDeth ๊ฐ์ฌํฉ๋๋ค. ์กฐ์ฌํ๊ฒ ์ต๋๋ค.
๋ฌธ์ ํ์ด๋ณด๊ธฐ์์ ์ด๊ฒ์ ํนํ ์ฑ๋ฅ ํฅ์์ ์ํ Flatbuffer์ ์์ ์งํฉ์ธ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค. ์ด๋ ์ชฝ์ด๋ , Flatbuffers ๋๋ Capnproto์ ๋น๊ตํ์ฌ WebAssembly ๋ชจ๋ ์ํธ ์ด์ฉ์ฑ์ ๊ณ ์ ํ๊ฒ ๋์ธ ์ ์๋ ํน์ฑ์ ๋ฌด์์ ๋๊น?
@lukewagner
๊ทธ๋ฌ๋ ์ ํฌ๋ง์ Web IDL ๋ฐ์ธ๋ฉ์ ํตํด ์ฐ๋ฆฌ๊ฐ ์ด ๋ญ๊ณผ ๊ณ๋์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ Web IDL์ ๊ตญํ๋์ง ์๊ณ ์๋ก์ด ํ์ฅ์ ๋ฌผ๊ฒฐ์ ์ผ์ผํฌ ์ ์๋ ์ธ์ด ๊ฐ ๋ฐ์ธ๋ฉ์ ๋ํ ๊ฒฝํ์ ์ป์ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
๋์. ์ด ์ ์์ ์์ฑํ ๋์ ๊ฐ์ ์ ๋ชจ๋ capnproto ๋ฐ์ธ๋ฉ ๊ตฌํ์ด WebIDL ์ ์ ๊ตฌํ์ ํผ๋๋ฐฑ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ค๋ ๊ฒ์ด์์ต๋๋ค.
๋ด ์ฃผ์ ๊ด์ฌ์ฌ(๊ทธ๋ฆฌ๊ณ ๊ทธ FAQ ํญ๋ชฉ์ ์๋ตํ ์ด์ )๋ ๋ฒ์์ ๋๋ค. N๊ฐ ์ธ์ด๋ฅผ ๋ฐ์ธ๋ฉํ๋ ์ผ๋ฐ์ ์ธ ๋ฌธ์ ๋ ํนํ ์๋ฌด๋ ์ด๋ฏธ ํ๊ณ ์์ง ์๋ค๋ ์ ์ ๊ฐ์ํ ๋ ๋ง์ ๊ฐ๋ฐฉํ(๊ทธ๋ฆฌ๊ณ ์๋ง๋ ๋น์ข ๋ฃํ) ํ ๋ก ์ ์์ฑํ ๊ฐ๋ฅ์ฑ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค( ๋ฌผ๋ก ๋ญ๊ณผ ๋ฌ๊ฑ์ ๋ฌธ์ ์ ๋๋ค.)
์ ๋ capnproto ๊ตฌํ์ ๋ํด ๋ ผ์ํ๋ ๊ฒ์ด ์ด ์ด๊ธฐ์๋ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
ํนํ ๊ตฌํ์ด ์ถฉ์กฑํด์ผ ํ๊ฑฐ๋ ์๋ํ ์ ์๋ ์๊ตฌ ์ฌํญ์ ๊ฐ๋ตํ๊ฒ ์ค๋ช ํ๋ ค๊ณ ํ์ต๋๋ค. ์ธ์ด ๊ฐ ์ ํ ์์คํ ์ด ํด๊ฒฐํ๋ ค๊ณ ํ ์ ์๋ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋์ดํ๋ ๊ฒ๋ ์ ์ฉํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
N-to-N ๋ฌธ์ ์ ๊ด๋ จํ์ฌ ๋ค์ ์๋ฃจ์ ์ ์ค์ ์ ๋๊ณ ์์ต๋๋ค.
RPC ์คํ์ผ ๋ฐ์ดํฐ ์ ์ก์ ๋ํด์๋ง ๊ฑฑ์ ํ์ญ์์ค. "๋ฒกํฐ์๋ 'x', 'y' ๋ฐ 'z'๋ผ๋ ์ธ ๊ฐ์ ํ๋๊ฐ ์์ผ๋ฉฐ ๋ชจ๋ ๋ถ๋ ์์์ ์ ๋๋ค.
์ธ์ด ๋ฐ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์ ๋ต์ "ํด๋ฌ์คํฐ"๋ก ๊ทธ๋ฃนํํ์ญ์์ค. ์ด๋ฌํ ํด๋ฌ์คํฐ์ ์ค์ฌ์ ์ ๋ต์ ์๋ฆฝํฉ๋๋ค. ์ธ์ด ์ปดํ์ผ๋ฌ๋ ์ฃผ์ด์ง ์ ๋ต์ ๋ฐ์ธ๋ฉํ๊ณ ์ธํฐํ๋ฆฌํฐ๋ ๋๋จธ์ง NxN ์์ ์ ์ํํฉ๋๋ค.
@fgmccabe
๊ทธ ์ด์ ๋ ๊ทธ ์ผ์ด ๋ถ๊ฐ๋ฅํ๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ฌ๊ธฐ์๋ ๋ ๊ฐ์ง ๊ทผ๋ณธ์ ์ธ ์ด์ ๊ฐ ์์ต๋๋ค.
NS. ๋ค๋ฅธ ์ธ์ด์๋ ์ ํ ์ฃผ์์์ ๋ฐ๋์ ์บก์ฒ๋์ง ์๋ ๋ค๋ฅธ ์๋ฏธ ์ฒด๊ณ๊ฐ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, Prolog์ ํ๊ฐ๋ C++์ ํ๊ฐ์ ๊ทผ๋ณธ์ ์ผ๋ก ๋ค๋ฆ ๋๋ค. (Prolog์ ๊ฒฝ์ฐ ๋ค๋ฅธ ์ฌ๋ฌ ์ธ์ด๋ก ๋์ฒด ๊ฐ๋ฅ)
์ ํ ํด๋์ค๋ฅผ ์ง์ํ์ง ์๋ ๊ฒ๊ณผ ๊ด๋ จ๋ Haskell์ ๊ตฌํ์ ํจ๊ณผ์ ์ผ๋ก ์ด๋ฅผ ๋ด์ฅํ๊ณ ์ฌ์ฉํ ์ ์๊ฒ ๋ง๋ญ๋๋ค.
์, ์์ด๋์ด๋ ์๋ฒฝํ "๋ชจ๋ ์ธ์ด์ ์ฝ๊ฒ ํธํ๋๋" ์ถ์ํ๋ฅผ ์ ์ํ๋ ๊ฒ์ด ์๋๋๋ค.
์ฆ, ๋๋ถ๋ถ์ ์ธ์ด๋ ๋ฐ์ดํฐ๋ฅผ ๊ตฌ์กฐํํ๋ ๋ฐฉ์์์ ์ฝ๊ฐ์ ์ ์ฌ์ ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค(์: "๋ชจ๋ ์ฌ๋์๊ฒ๋ ์ด๋ฆ, ์ด๋ฉ์ผ ๋ฐ ๋์ด๊ฐ ์์ต๋๋ค" ๋๋ "๋ชจ๋ ๊ทธ๋ฃน์๋ ์ฌ๋ ๋ชฉ๋ก์ด ์์ต๋๋ค. ์์์ ํฌ๊ธฐ").
์ด๋ฌํ ์ ์ฌ์ฑ์ ํ์ฉํ์ฌ ๋ชจ๋ ๊ฐ์ ๋ง์ฐฐ์ ํฌ๊ฒ ์ค์ด๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค๊ณ ์๊ฐํฉ๋๋ค. (lukewagner์ ๋ํ ๋ด ๋๋ต๋ ์ฐธ์กฐํ์ญ์์ค)
NS. ์ ์์ ๋ฐ๋ผ ์ ํ ์์คํ ์ LCD๋ ์ง์ ๋ ์ธ์ด์ ๋ชจ๋ ์ ํ ์ธ์ด๋ฅผ ์บก์ฒํ ์ ์๋ค๊ณ ๋ณด์ฅ๋์ง ์์ต๋๋ค. ์ด๋ ์ธ์ด ๊ตฌํ์์๊ฒ ๋งค์ฐ ๋ถํธํ ์ ํ์ ๋จ๊น๋๋ค. ์์ ์ ์ธ์ด๋ฅผ ์ง์ํ๊ฑฐ๋ ํด๋น ์ธ์ด์ ์ ํ ์์คํ ์ ์ด์ ์ ํฌ๊ธฐํ๋ ๊ฒ์ ๋๋ค.
์. ์ฌ๊ธฐ์์ ๊ฒฝํ์ ๊ท์น์ "๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฒฝ๊ณ์ธ ๊ฒฝ์ฐ capnproto ์ ํ์ผ๋ก ๋ง๋ค๊ณ ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ ์ ํ์ ์ฌ์ฉํ์ญ์์ค"๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋ค๋ฅธ ํํธ์ผ๋ก ๋ด๋ณด๋ธ/๊ฐ์ ธ์จ ์ ํ์ ๋ ํํ์์ ๊ฐ๋ ๊ฒ์ ์์ฒด ๋ฌธ์ ๋ฅผ ์ ๊ธฐํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ธ์ด ์์คํ ์ ๋ ํํ์์ด ์ด๋ค ์๋ฏธ์์ ์ผ๊ด์ฑ์ด ์๋์ง ํ์ธํด์ผ ํฉ๋๊น? ์ด ์ผ์ ํ๋ ๊ฒ์ ๋๊ตฌ์ ์ฑ ์์ ๋๊น?
์, ์ฒ์์๋ ๋ถ๋ณ ๊ฒ์ฌ์ ๋ํ ์น์ ๊ณผ ์ ํ ํธํ์ฑ์ ๋ํ ์น์ ์ ํฌํจํ๊ณ ์ถ์์ง๋ง ์ฉ๊ธฐ๋ฅผ ์์์ต๋๋ค.
"๋๊ตฌ์ ์ฑ ์์ธ์ง"์ ๋ํ ๋๋ต์ ์ผ๋ฐ์ ์ผ๋ก "์์ ์"์ ๋๋ค(๊ทธ๋ค์ ์์ ํ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ์์ฌ์ค๋ฌ์ด ๊ฒ์ผ๋ก ๊ฐ์ ํด์ผ ํ๊ธฐ ๋๋ฌธ์). ๊ทธ๋ฌ๋ ์ธํฐํ๋ฆฌํฐ๊ฐ ํธ์ถ์๊ฐ ์ ํ ๋ถ๋ณ์ฑ์ ์กด์คํ๋ค๋ ๊ฒ์ ์ฆ๋ช ํ ์ ์๋ ๊ฒฝ์ฐ ๊ฒ์ฌ๋ฅผ ์๋ตํ ์ ์์ต๋๋ค.
Cํ ์์คํ ์ ์ธ์ด๊ฐ IDL๋ก์ ๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๋ถ๋ช ํ ํ๊ธฐ ์ํด IDL๋ก ์ ์ํ์ง ์์ต๋๋ค. ์คํ๋ ค ์ ๋ ๋ฐ์ด๋๋ฆฌ ์ธํฐํ์ด์ค(C ABI)๊ฐ ์ด๋ฏธ ์กด์ฌํ๊ณ , ์ ์ ์๋์ด ์์ผ๋ฉฐ, ์ด๋ฏธ ๊ด๋ฒ์ํ ์ธ์ด ์ง์์ ๊ฐ์ง๊ณ ์๋ค๊ณ ์ ์ํ๊ณ ์์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด ํด๊ฒฐ๋๋ ๋ฌธ์ ๊ฐ ์ธ์ด ๊ฐ ์ํธ ์ด์ฉ์ฑ์ ๋์ด์์ง ์๋ ํ WebAssembly๊ฐ ๋ค๋ฅธ ์๋ฃจ์ ์ ์ ๊ณตํ ํ์๊ฐ ์๋ค๋ ์๋ฏธ์ ๋๋ค.
WebAssembly์์ ์์ ํ์ง ์๊ณ ์๋์ ์ผ๋ก ๋ณด์ ํ์ง ์๋ ๊ณต์ ์ฃผ์ ๊ณต๊ฐ์ ๊ฐ์ ํ์ฌ ์๋ํฉ๋๋ค.
๊ทธ๋์ ์ ๋ ์ฌ๊ธฐ์ ์คํด์ ์ผ๋ถ๋ฅผ ๋ณธ ๊ฒ ๊ฐ์์. ์ฌ๊ธฐ์ ๋งํ๋ FFI์๋ ๋ ๊ฐ์ง ํด๋์ค๊ฐ ์์ต๋๋ค. ํ๋๋ ์ ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํ๋ ๊ฒ(๋ณด๋ค ์ ํต์ ์ธ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ FFI)์ด๊ณ ๋ค๋ฅธ ํ๋๋ ๊ทธ๋ ์ง ์์ต๋๋ค(๋ณด๋ค ์ ํต์ ์ธ IPC/RPC). ๋๋ ์ ์์ ๋ํด ์ด์ผ๊ธฐํ๊ณ , ๋๋ ๋น์ ์ด ํ์์ ๋ ์ด์ ์ ๋ง์ถ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ชจ๋์ ์ ์ดํ ๋ ๋ชจ๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํ๋ ๊ฒ์ด(์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ผ๋ถ๋ก ์ฌ๋ฌ ๋ ๋ฆฝ ๋ชจ๋์ ํจ๊ป ์ฐ๊ฒฐํ๋ ๊ฒฝ์ฐ์ ๊ฐ์ด) ํจ์จ์ฑ์ ์ํด์๋ ๋ฐ๋์งํ์ง๋ง ๋ณด์์ด ํฌ์๋ฉ๋๋ค. ๋ฐ๋ฉด์ FFI๋ฅผ ์ํด ํน๋ณํ ์ง์ ๋ ์ ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํ๋ ๊ฒ์ด ๊ฐ๋ฅํ์ง๋ง ์ค๋๋ ๊ธฐ๋ณธ ๋๊ตฌ๋ก ์ผ๋ง๋ ์ค์ฉ์ ์ธ์ง๋ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๊ณต์ ๋ฉ๋ชจ๋ฆฌ FFI, ์ฆ IPC/RPC๋ฅผ _์ฌ์ฉํ์ง ์๋_ ๋ชจ๋ ๊ฐ ์ํธ ์ด์ฉ์ฑ์ WebIDL, capnproto ๋๋ ๊ทธ ๋งฅ๋ฝ์์ ๋ค๋ฅธ ์ ์ ์ค ํ๋์ ํ์คํ ์ ๋ง๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค. ์๋ํ๋ฉด ๊ทธ๊ฒ์ด ๊ทธ๋ค์ ๋นต๊ณผ ๋ฒํฐ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ด๊ฐ ํ์ ํ ์ ์๋ ๋ถ๋ถ์ ์ด๋ ์ชฝ์ ์ด์ ๋ ํฌ์ํ์ง ์๋ ๋ฐฉ์์ผ๋ก ๋ ๋ฒ์ฃผ๋ฅผ ํผํฉํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ํ ์ชฝ ๋๋ ๋ค๋ฅธ ์ชฝ์ ์ ํํ๋ ๊ฒ์ ์ฌ์ฉ ์ฌ๋ก์ ํฌ๊ฒ ์์กดํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ ์ด๋ ๋ช ์๋ ๋ฐ์ ๊ฐ์ด ์ฐ๋ฆฌ๋ ๋ ์ค ํ๋๋ง ๊ฐ์ง ์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ ๋ค ์ง์ํ ์ ์๋ค๋ฉด ์ด์์ ์ผ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋์ ๊ธธ์ด ๋ฐฐ์ด, ํ๊ทธ๊ฐ ์ง์ ๋ ๊ณต์ฉ์ฒด, ๊ธฐ๋ณธ๊ฐ, ์ ๋ค๋ฆญ ๋ฑ์ ๋ํ ๊ธฐ๋ณธ ์ง์์ด ์์ต๋๋ค.
๋๋ ์ด๊ฒ์ด ์๋ง๋ ์ฐ๋ฆฌ๊ฐ ๋ ๊ฐ์ง ๋ค๋ฅธ ๊ฒ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์๋ค๋ ๊ฒ์ ๊นจ๋ฌ์๊ธฐ ๋๋ฌธ์ ๊ด๋ จ์ด ์๋ค๊ณ ์๊ฐํ์ง๋ง, ํ์์ ์ํด: ABI์๋ ํ์คํ ๊ฐ๋ณ ๊ธธ์ด ๋ฐฐ์ด๊ณผ ํ๊ทธ๊ฐ ์๋ ๊ณต์ฉ์ฒด์ ๋ํ _representation_์ด ์์ง๋ง C์๋ ๋ค์์ด ์์ต๋๋ค. ์ฝํ ์ ํ ์์คํ , ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ์ค์ ๋ก ์์ ์ด ์๋๋๋ค. ์ธ์ด๋ C ์ ํ ์์คํ ์ ๋ํด C FFI๋ฅผ ๋์์ผ๋ก ํ์ง ์์ต๋๋ค. C ABI๊ฐ ์ ์ฉํ ์ด์ ๋ ์ธ์ด๊ฐ ์ํธ ์์ฉํ๋ ์ ํ ์์คํ ์ ๋ํ ๊ฐ๋ ์ด ์๋ ๋ค๋ฅธ ์ธ์ด์ ํต์ ํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ๊ณตํต ๋ถ๋ชจ๋ฅผ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ ๋์ ์์ค์ ์ ํ ์์คํ ๊ธฐ๋ฅ์ ๋ถ์กฑ์ ์ด์์ ์ด์ง ์์ผ๋ฉฐ FFI๋ฅผ ํตํด ํํํ ์ ์๋ ๊ฒ์ ์ข ๋ฅ๋ฅผ ์ ํํ์ง๋ง ์ ํ์ ๋ํ ๊ทธ๊ฒ์ด ํ๋ ์ผ์์ ๋งค์ฐ ์ฑ๊ณต์ ์ธ ์ด์ ์ ์ผ๋ถ์ด๊ธฐ๋ ํฉ๋๋ค. ๊ฑฐ์ ๋ชจ๋ ์ธ์ด๊ฐ ๋ฐฉ๋ฒ์ ์ฐพ์ ์ ์์ต๋๋ค. ํด๋น ์ธํฐํ์ด์ค๋ฅผ ํตํด ๋ ธ์ถ๋ ๊ฒ์ ๋ํ๋ด๊ฑฐ๋ ๊ทธ ๋ฐ๋์ ๊ฒฝ์ฐ๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค.
C++๋ ์ด๋ฌํ ๋ฌธ์ ์ค ์ผ๋ถ(๊ฐ์ฅ ํฐ ๋ฌธ์ ์ธ ๊ณต์ ์ฃผ์ ๊ณต๊ฐ์ด ์๋)๋ฅผ ํด๊ฒฐํ์ง๋ง IPC์์ ์ค์ ๋ก ์ ์ฉํ์ง ์์ ๋ง์ ๊ฐ๋ ์ ์ถ๊ฐํฉ๋๋ค. ๋ฌผ๋ก , ํญ์ C์ ์์ ์งํฉ์ด๋ C++์ ํ์ ์งํฉ์ IDL๋ก ์ฌ์ฉํ๊ณ ์ด์ ๋ํ ๋ฐ์ธ๋ฉ ๊ท์น์ ๊ณ ์ํ ์ ์์ง๋ง ๊ทธ ์์ ์์ ๊ธฐ์กด ์ฝ๋์ ์ด์ ์ ๊ฑฐ์ ์ป์ง ๋ชปํ๋ฏ๋ก ๊ธฐ์กด ์ฝ๋๋ฅผ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. IDL.
๋์ํฉ๋๋ค. IPC/RPC์ ๊ฒฝ์ฐ C๋ ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ๋ ๋ฐ ๋์ฐํ ์ธ์ด์ ๋๋ค.
๋ฌธ์ ๋ ํ์ฌ ์ผ๋ฐ์ ์ธ ABI๊ฐ ์ ํ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋ ๋ฐ์ดํธ ์กฐ๊ฐ์ด๋ผ๋ ๊ฒ์ ๋๋ค.
๊ทธ๊ฒ์ ํ์คํ ์ฐ๋ฆฌ๊ฐ ์์ ํ๊ณ ์๋ ์์์ ์ด์ง๋ง C ABI๋ ๊ทธ ์์ ๋ง์ ๊ฒ์ ์ ์ํฉ๋๋ค.
๊ทธ๋ฌ๋ ๋ฏธ๋์ GC ์ ์์ด ๊ตฌํ๋๋ฉด ์ผ๋ถ ์ธ์ด(Java, C#, Python)๋ ์ ํ ๋ฉ๋ชจ๋ฆฌ์ ๊ฑฐ์ ์ ์ฅํ์ง ์๊ฑฐ๋ ์ ํ ์ ์ฅํ์ง ์์ ๊ฒ์ ๋๋ค. ๋์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ GC ๊ตฌ์กฐ์ ์ ์ฅํฉ๋๋ค. ์ด๋ฌํ ์ธ์ด ์ค 2๊ฐ๊ฐ ํต์ ์ ์๋ํ๋ ๊ฒฝ์ฐ ์ด๋ฌํ ๊ตฌ์กฐ๋ฅผ ๋ฐ์ดํธ ์คํธ๋ฆผ์ผ๋ก ์ง๋ ฌํํ์ฌ ์ฆ์ ์ญ์ง๋ ฌํํ๋ ๊ฒ์ ๋ถํ์ํ ์ค๋ฒํค๋๊ฐ ๋ ๊ฒ์ ๋๋ค.
๋๋ ๊ทธ ์ธ์ด๋ค์ด GC๋ฅผ ํธ์คํธ๋ก ๋ฏธ๋ฃจ๋ ๊ฒ์ ๋ฐ์ด๋์ ๊ฒ์ด๋ผ๊ณ ํ์ ํ์ง ๋ชปํ์ง๋ง ๊ทธ๊ฒ์ ๋จ์ง ๋ด ์ถ์ธก์ผ ๋ฟ์ ๋๋ค. ์ด์จ๋ ํธ์คํธ GC ๊ด๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๋ ์ธ์ด๋ capnproto๋ฅผ ์ฌ์ฉํ์ฌ ํํํ ์ ์๋ ๊ฒ์ฒ๋ผ ์ฝ๊ฒ CA ABI๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ๊ตฌ์กฐ์ ๋ํ ๊ณตํต ํํ์ ๊ฒฐ์ ํ ์ ์์ต๋๋ค. ์ ์ผํ ์ฐจ์ด์ ์ ํด๋น ํํ์ ์ฌ์์ด ์ด๋์ ์๋์ง์ ๋๋ค. ๊ทธ๋ ๊ธด ํ์ง๋ง, ๋๋ GC ์ ์์ ์ธ๋ถ ์ฌํญ๊ณผ ๊ทธ๊ฒ์ด ํธ์คํธ ๋ฐ์ธ๋ฉ ์ ์๊ณผ ์ด๋ป๊ฒ ์ฐ๊ฒฐ๋๋์ง์ ๋ํด ์์ฃผ ๋ฏธ์ฝํ๊ฒ ์ดํดํ๊ณ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ฌ๊ธฐ์์ ๋ด๊ฐ ๊ณผ๋ํ๊ฒ ๋ฒ์ด๋๋๋ผ๋ ์์ ๋กญ๊ฒ ๋ฌด์ํด๋ ๋ฉ๋๋ค.
TL;DR: ๊ณต์ ์ ํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์๋ํ์ง ์๋ ๋ชจ๋ ์ํธ ์ด์ฉ์ฑ์ ๋ํด ๋์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ์ง๋ง ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ ์ง์ํ๋ _is_ ์ค์ํ๋ค๊ณ ์๊ฐํ๊ณ C ABI๋ ๊ธฐ์กด ์ธ์ด ์ง์์ผ๋ก ์ธํด ํด๋น ์ฌ์ฉ ์ฌ๋ก์ ๊ฐ์ฅ ํฉ๋ฆฌ์ ์ธ ์ ํ์ ๋๋ค. ์ด ์ ์์ด ๋ฐ์ ํจ์ ๋ฐ๋ผ ๋ ๊ฐ์ง ๋ชจ๋๋ฅผ ์ง์ํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์ฐ๋ฆฌ์๊ฒ ํ์ํ ๊ฒ์ ๋จ์ํ ๋ฐ์ดํธ ๋ฒํผ๋ฅผ ๊ตํํ๋ ์ต๋ํ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ๊ณผ ์ธ์ด๊ฐ ํ์์ ๋์ํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์ด๊ฒ์ ํน์ ์ง๋ ฌํ ์์คํ ์ ๊ณ ์น ํ์๋ ์์ต๋๋ค. Cap'n Proto๊ฐ ์ด ๋ชฉ์ ์ ๊ฐ์ฅ ์ ํฉํ๋ค๋ฉด wasm์ ์ํด ์์๋์ง ์๊ณ ์ ๊ธฐ์ ์ผ๋ก ๊ณตํต ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋ฐ์ํ ์ ์์ต๋๋ค.
Cap'n Proto์ ํจ์จ์ฑ์ด ๋น์ทํ์ง๋ง ๋ ์ ์ฐํ๊ณ ๋ ๋๋ฆฌ ์ง์๋๋ FlatBuffers๋ฅผ ๋ง๋ค์
์ฃผ์ด์ง ํน์ ์ฌ์ฉ ์ฌ๋ก์์ ์ด ๋ ๊ฐ์ง ํ์๋ณด๋ค ์ ํธ๋ ์ ์๋ ๋ค๋ฅธ ํ์์ด ๋ง์ด ์์ต๋๋ค.
Cap'n Proto์ FlatBuffers๋ ๋ชจ๋ ๋ณต์ฌ๊ฐ ์๊ณ ์์ ์ก์ธ์ค๊ฐ ๊ฐ๋ฅํ๋ฉฐ ์ค์ฒฉ ํ์์์ ํจ์จ์ ์ ๋๋ค(๋ค๋ฅธ ํ์์ผ๋ก ๋ํ๋ ํ์์ด ๋ํ๋์ง ์์ ๊ฒ๋ณด๋ค ๋ ํจ์จ์ ์ด์ง ์์์ ์๋ฏธํจ). ์ด๋ ์ธ์ด ๊ฐ์ ์ํด ๊ณ ๋ คํด์ผ ํ ์ค์ ์์ฑ์ ๋๋ค. ์์ฌ ์ํต. "๋ค์ ๋ฐ์ดํธ๋ Cap'n Proto schema X"๋ฅผ ํฌํจํ์ฌ ๋ฒํผ์ ๋ํด ๋งค์ฐ ์ ํํ ๋ฐ์ดํธ ๋ ์ด์์์ ์ง์ ํ ์ ์๋ IDL์ ์์ํ ์ ์์ต๋๋ค.
๋ด๊ฐ ๋ฏธ๋ฌํ๊ฒ ์๊ธฐ ํ๋ณด๋ฅผ ํ๋ ๋์ ์คํค๋ง๊ฐ ์๋ FlatBuffers์ ๊ฐ์ FlexBuffers ์์ ์ฌ๋๋ค์
@aardappel
์ฐ๋ฆฌ์๊ฒ ํ์ํ ๊ฒ์ ๋จ์ํ ๋ฐ์ดํธ ๋ฒํผ๋ฅผ ๊ตํํ๋ ์ต๋ํ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ๊ณผ ์ธ์ด๊ฐ ํ์์ ๋์ํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์ด๊ฒ์ ํน์ ์ง๋ ฌํ ์์คํ ์ ๊ณ ์น ํ์๋ ์์ต๋๋ค. Cap'n Proto๊ฐ ์ด ๋ชฉ์ ์ ๊ฐ์ฅ ์ ํฉํ๋ค๋ฉด wasm์ ์ํด ์์๋์ง ์๊ณ ์ ๊ธฐ์ ์ผ๋ก ๊ณตํต ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋ฐ์ํ ์ ์์ต๋๋ค.
๋๋ wasm์ด ๋ค๋ฅธ ๊ฒฝ์์๋ค์๊ฒ ํ๋์ ํ์ค์ ๋ถ๊ณผํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ฌ์ฉ๋์ด์๋ ์ ๋๋ค๋ ์์์ ์ธ ์์ ์ ์ดํดํ๊ณ , IDL์ด ์ ํ๋๋ ๊ฒ์ ๊ฐ์ธ์ ์ผ๋ก ๋ฌด๊ด์ฌํฉ๋๋ค.
์ฆ, ๋ชจ๋ ๊ฒ์ด ๋๋๊ณ ์๋ฃ๋๋ฉด ๊ณ ๋ฌด๋ ์ด๋ ์์ ์์ ๋๋ก๋ฅผ ๋ง๋ ํ์๊ฐ ์์ต๋๋ค. wasm์ด ์ธ์ด ๊ฐ ํต์ ์ ์ฉ์ดํ๊ฒ ํ๋ ค๋ฉด(๋ฌผ๋ก ๋ชจ๋ ์ฌ๋์ด ๊ณต์ ํ๋ ๊ฐ์ ์ ์๋๋๋ค) "์ด ๋ฐ์ดํธ๊ฐ ์ซ์๋ฅผ ๊ตฌ์ฑํฉ๋๋ค" ์ด์์ ํํํ ์ ์๋ ํ์ค ํ์์ด ํ์ํฉ๋๋ค. ๊ทธ ํ์์ capnproto, C ๊ตฌ์กฐ, ํ๋ซ ๋ฒํผ ๋๋ wasm์ ํน์ ํ ๊ฒ์ด ๋ ์ ์์ง๋ง @fgmccabe์ ์ค๋ช ๋ ์ด์ ๋๋ฌธ์ ๋์์ ์ด๋ค ๋ชจ๋์ ํ์ ์งํฉ์ด ๋ ์๋ ์์ต๋๋ค.
๋ด๊ฐ ๋ฏธ๋ฌํ๊ฒ ์๊ธฐ ํ๋ณด๋ฅผ ํ๋ ๋์ ์คํค๋ง๊ฐ ์๋ FlatBuffers์ ๊ฐ์ FlexBuffers์์ ์ฌ๋๋ค์ ๊ฐ๋ฆฌํฌ ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋์ผํ ๋ฐ๋์งํ ์ ๋ก ์นดํผ, ๋๋ค ์ก์ธ์ค ๋ฐ ์ ๋ ดํ ์ค์ฒฉ ์์ฑ์ ๊ฐ์ง๊ณ ์์ง๋ง JSON์ด ์ฌ์ฉ๋๋ ๋ฐฉ์๊ณผ ์ ์ฌํ๊ฒ codegen์ ์ํํ์ง ์๊ณ ์คํค๋ง์ ๋์ํ์ง ์๊ณ ๋ ์ธ์ด๊ฐ ํต์ ํ ์ ์๋๋ก ํฉ๋๋ค.
ํธ์๋ ฅ์ด ์์ต๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ฑํ ๋ ์ด๊ฒ์ด ๋๋ถ๋ถ์ ์๊ฐ ๋์ ์ํ๋ ๊ฒ์ด ์๋๋ผ๊ณ ์๊ฐํฉ๋๋ค. (๋์ฐํ ๊ตฌ๋ฌธ ๋ถ์ ์๊ฐ์ ์ ์ธํ๊ณ ) JSON์ ๋ฌธ์ ๋ ์ฝ๋์ ์ด๋๊ฐ์ JSON ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ฌ ๋ ์์ฑํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ ๋ง์ ์ด๊ท ์ฝ๋๋ฅผ ์์ฑํ๊ฒ ๋๋ค๋ ๊ฒ์ ๋๋ค. ์:
assert(myObj.foo);
assert(isJsonObject(myObj.foo));
assert(myObj.foo.bar);
assert(isString(myObj.foo.bar));
loadUrl(myObj.foo.bar);
๊ทธ๋ ์ง ์์ผ๋ฉด ์ ์ฌ์ ์ธ ๋ณด์ ์ทจ์ฝ์ ์ด ์์ต๋๋ค.
์์ 6 - ์ปดํ์ผ ํ์ ์ค๋ฅ ์ฒ๋ฆฌ ๋ ์ฐธ์กฐํ์ญ์์ค.
@bitwalker
๋ง์ต๋๋ค. ๊ณต์ ์ ํ ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ๋ฅ์ฑ์ ๊ณ ๋ คํ์ง ์์์ต๋๋ค. ์ ๋ณด๋ค ์น์ด์ ๋ธ๋ฆฌ ๋์์ธ์ ๋ ์ต์ํ ์ฌ๋( @lukewagner ?)์ด ์ผ๋ง๋ ์คํ ๊ฐ๋ฅํ์ง, ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ด ๋ชจ๋ ๊ฐ ํธ์ถ์ ๋ฌ์ฑํ๋ ์ข์ ๋ฐฉ๋ฒ์ธ์ง ๋ ผ์ํ๊ธฐ ์ํด ํ์ํฉ๋๋ค. ๊ทธ๊ฒ์ ๋ํ wasm์ ๋ฉ๋ชจ๋ฆฌ ๋ ์ด์์์ ์ํด ๋ฌดํจํ๋๋ FFI๊ฐ ์์กดํ๋ ๊ฐ์ ์ ์์ ๋ฌ๋ ค ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, FFI๋ ํธ์คํธ ์ธ์ด๊ฐ C ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ ๋ค์ดํฐ๋ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ malloc ํจ์์ ๋ํ ์ง์ ์ก์ธ์ค ๊ถํ์ ๋ถ์ฌํ๋ค๋ ์ฌ์ค์ ์์ฃผ ์์กดํฉ๋๋ค. ๋ ๊ฐ์ ์ํธ ์์ฌ์ค๋ฌ์ด ๋ชจ๋์ ๋งฅ๋ฝ์์ ๊ทธ ์ ๋ต์ was๋ก ์ผ๋ง๋ ์ ๋ฒ์ญํ ์ ์์ต๋๊น?
Cap'n Proto์ ์ฐฝ์์๋ก์ ์ด ์ค๋ ๋์ ๋ํด ๋งํด์ผ ํ ๊ฒ ๊ฐ์ง๋ง ์ด์ํ๊ฒ๋ ์ ์๊ฒฌ์ด ๋ณ๋ก ์๋ค๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค. ํฅ๋ฏธ๋กญ๊ฑฐ๋ ๊ทธ๋ ์ง ์์ ์ ์๋ ๋ช ๊ฐ์ง ์ธ์ ํ ์๊ฐ์ ํํํด ๋ณด๊ฒ ์ต๋๋ค.
์ ๋ JavaScript์ WASM์ ์คํํ๋ "์๋ฒ๋ฆฌ์ค" ํ๊ฒฝ์ธ Cloudflare Workers์ ๊ธฐ์ ์ฑ ์์์ด๊ธฐ๋ ํฉ๋๋ค.
์ฐ๋ฆฌ๋ ์์ ์๋ค์ด ์๋ก ๋ํํ ์ ์๋ ํ๋กํ ์ฝ๋ก Cap'n Proto RPC ์ง์์ ๊ณ ๋ คํ๊ณ ์์ต๋๋ค. ํ์ฌ HTTP๋ก ์ ํ๋์ด ์์ด ๊ธฐ์ค์ด ์๋นํ ๋ฎ๊ฒ ์ค์ ๋์ด ์์ต๋๋ค. :)
์์ปค์์ ํ ์์ปค๊ฐ ๋ค๋ฅธ ์์ปค๋ฅผ ํธ์ถํ ๋ ๋์ผํ ํ๋ก์ธ์ค์์๋ ๋์ผํ ์์คํ ์์ ๋ ๋ค ์คํ๋๋ ๊ฒฝ์ฐ๊ฐ ๋งค์ฐ ์ผ๋ฐ์ ์ ๋๋ค. ์ด๋ฌํ ์ด์ ๋ก Cap'n Proto์ ๊ฐ์ ๋ฌด๋ณต์ฌ ์ง๋ ฌํ๋ ์ด๋ก ์ ์ผ๋ก ๋ฌผ๋ฆฌ์ ์ผ๋ก ๊ณต์ ๋ ์ ์๋ ์ ํ ๋ฉ๋ชจ๋ฆฌ์์ ์๋ํ๊ธฐ ๋๋ฌธ์ ํนํ WASM ์์ ์์๊ฒ ๋ง์ ์๋ฏธ๊ฐ ์์ต๋๋ค.
์ด๊ฒ์ด ์ ํฉํ๋ค๊ณ ์๊ฐํ๋ ์ ์๋ ค์ง์ง ์์ ๋ ๋ฒ์งธ ์ด์ ๋ RPC ์์คํ ์ ๋๋ค. Cap'n Proto๋ CapTP๋ฅผ ๋ชจ๋ธ๋ก ํ Promise ํ์ดํ๋ผ์ด๋์ด ํฌํจ๋ ์ ์ฒด ๊ฐ์ฒด ๊ธฐ๋ฅ RPC ํ๋กํ ์ฝ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฅผ ํตํด ์์ ํ๊ณ ์ฑ๋ฅ์ด ๋ฐ์ด๋ ๋ฐฉ์์ผ๋ก ํ๋ถํ ๊ฐ์ฒด ์งํฅ ์ํธ ์์ฉ์ ์ฝ๊ฒ ํํํ ์ ์์ต๋๋ค. Cap'n Proto RPC๋ ๋จ์ํ ์ง์ ๊ฐ ํ๋กํ ์ฝ์ด ์๋๋ผ ๋คํธ์ํฌ๋ก ์ฐ๊ฒฐ๋ ์ฌ๋ฌ ๋น์ฌ์ ๊ฐ์ ์ํธ ์์ฉ์ ๋ชจ๋ธ๋งํ๋ฉฐ ์ด๋ ๊ฝค ํฐ ๋ฌธ์ ๊ฐ ๋ ๊ฒ์ ๋๋ค.
ํํธ WASM ๋๋์์๋ WASI๊ฐ ๊ธฐ๋ฅ ๊ธฐ๋ฐ API๋ฅผ ๋์ ํ๊ณ ์๋ค. ์ฌ๊ธฐ์ ํฅ๋ฏธ๋ก์ด "์๋์ง"๊ฐ ์์ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ๋ ๊ธด ํด๋ Cap'n Proto์ ๋ช ๊ฐ์ง ์ค๊ณ ๋ชฉํ๋ FFI์ ํน์ ์ฌ์ฉ ์ฌ๋ก์ ์ ํฉํ์ง ์์ ์ ์์ต๋๋ค.
์์ปจ๋, ๊ฐ๋ณ ์๋๋ฐ์ค์ ๋ ๋ฆฝ์ ์ผ๋ก ๋ฐฐํฌ๋ ๋ชจ๋์ด ์๋ก ํต์ ํ ๋ Cap'n Proto๊ฐ ์๋ฏธ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋จ์ผ ์๋๋ฐ์ค์ ๋์์ ๋ฐฐํฌ๋ ๋ชจ๋์ ๊ฒฝ์ฐ ์ด๋ ์๋ง๋ ๊ณผ์์ ๋๋ค.
ํผ๋๋ฐฑ์ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
ํฌ์ธํฐ๋ ์๋์ ์ด๋ฉฐ ๋ฉ์์ง์ ๋ชจ๋ ๊ฐ์ฒด๋ ์ฐ์ ๋ฉ๋ชจ๋ฆฌ ๋๋ ์ต์ํ ์ ์ ์์ ์ธ๊ทธ๋จผํธ์ ํ ๋น๋์ด์ผ ํฉ๋๋ค. ์ด๊ฒ์ ๋ค์ดํฐ๋ธ ๊ฐ์ฒด์ ๋นํด ์ฌ์ฉ ๋ชจ๋ธ์ ์๋นํ ๋ณต์กํ๊ฒ ๋ง๋ญ๋๋ค. ๋์ผํ ์ ํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ ๋ด์์ FFI๋ฅผ ์ฌ์ฉํ ๋ ๋์จํ ํ ๊ฐ์ฒด์ ๋ค์ดํฐ๋ธ ํฌ์ธํฐ๋ฅผ ์ ๋ฌํ ์ ์์ผ๋ฏ๋ก ์ด ์ค๋ฒํค๋๊ฐ ๋ญ๋น๋ฉ๋๋ค.
๊ณต์ ์ ํ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ๋ฐฉ์์ด wasm์ ์ผ๋ง๋ ์คํ ๊ฐ๋ฅํ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค(์ ์ฐธ์กฐ).
์ฆ, ์ด๋ ์ชฝ์ด๋ ์๋ ํฌ์ธํฐ์ ์ค๋ฒํค๋๊ฐ ๊ทธ๋ ๊ฒ ๋์์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. WebAssembly๋ ์ด๋ฏธ ์ ํ ๋ฉ๋ชจ๋ฆฌ ์์๊ณผ ๊ด๋ จ๋ ์คํ์
์ ์ฌ์ฉํ๊ณ ๊ตฌํ์๋ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ADD
๋ช
๋ น์ด๋ฅผ ์ต์ ํํ๋ ํธ๋ฆญ์ด ์์ผ๋ฏ๋ก(๋ด ์๊ฐ์) ์๋ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ๋ ์ค๋ฒํค๋๋ ์ต์ ํ๋ ์ ์์ต๋๋ค.
Cap'n Proto ๋ฉ์์ง๋ ์คํค๋ง๋ฅผ ๋ชฐ๋ผ๋ ๋ฌด์์ค๋ก ๊ฐ์ฒด์ ํ์ ํธ๋ฆฌ๋ฅผ ๋ณต์ฌํ๋ ๊ธฐ๋ฅ์ ํฌํจํ์ฌ ์คํค๋ง ๋ฒ์ ๊ฐ์ ์๋ค๋ก ํธํ๋๋๋ก ์ค๊ณ๋์์ต๋๋ค. [...] FFI๋ฅผ ํตํด ํต์ ํ๋ ๋ ๊ฐ์ ๋ชจ๋์ด ๋์์ ์ปดํ์ผ๋๋ฉด ์ด ๋ฉํ๋ฐ์ดํฐ๊ฐ ํ์ํ์ง ์์ต๋๋ค.
๋๋ ๊ทธ๊ฒ์ด ์ฌ์ค์ด ์๋๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ชจ๋์ด ๊ฒฝ๊ณ์์ ์ด์ ๋ฒ์ ๊ณผ ํธํ๋๋ ์ ํ์ ์ ์ํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด wasm์ด ์ข ์์ฑ ํธ๋ฆฌ ๋ชจ๋ธ์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ๋๋ถ๋ถ Haskell์ ์ข ์์ฑ ๋ค์ด์๋ชฌ๋ ๋ฌธ์ ๋ฅผ ํผํ ์ ์์ต๋๋ค.
๋ฌด์๋ฏธํ ์ค๋ฒํค๋์ ๋ ํฐ ์์ธ์ capnproto xor
๊ฐ ๊ธฐ๋ณธ๊ฐ์ ๋ํด ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์
๋๋ค. ์ด๋ 0๋ฐ์ดํธ๊ฐ ์์ถ๋ ๋ ์ ์ฉํ์ง๋ง ์ ๋ก ๋ณต์ฌ ์ํฌํ๋ก์์๋ ๋น์์ฐ์ ์
๋๋ค.
๊ณต์ ์ ํ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ๋ฐฉ์์ด wasm์ ์ผ๋ง๋ ์คํ ๊ฐ๋ฅํ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค(์ ์ฐธ์กฐ).
์, TBH ํ ๋ก ์ ๊ทธ ๋ถ๋ถ์ ๋ฐ๋ฅผ ์ถฉ๋ถํ ๋งฅ๋ฝ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ณต์ ์ฃผ์ ๊ณต๊ฐ์ด ์๋ค๋ฉด ์, Cap'n Proto๊ฐ ๋ง์ ์๋ฏธ๋ฅผ ๊ฐ๊ธฐ ์์ํฉ๋๋ค.
์ด์ ๊ฐ์ ํ์์ ๋์์ธํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์กฐ์ธ์ ์ ๊ณตํ๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค. FWIW ์ค๋๋ ์ด๋ฏธ ์กด์ฌํ๋ ์ฑ๊ณผ์ ํธํ์ฑ์ ๋ํด ์ ๊ฒฝ ์ฐ์ง ์๋๋ค๋ฉด Cap'n Proto์์ ๋ณ๊ฒฝํ ๋ช ๊ฐ์ง ์ฌํญ์ด ์์ต๋๋ค. ํ์ง๋ง ๋๋ถ๋ถ์ ๋ฎ์ ์์ค์ ํฌ์ธํฐ ์ธ์ฝ๋ฉ ์ธ๋ถ ์ ๋ณด์ ๊ฐ์ต๋๋ค.
๋ฌด์๋ฏธํ ์ค๋ฒํค๋์ ๋ ํฐ ์์ธ์ capnproto๊ฐ ๊ธฐ๋ณธ๊ฐ์ ๋ํด ๋ณ์๋ฅผ xorํ๋ ๋ฐฉ์์ ๋๋ค. ์ด๋ 0๋ฐ์ดํธ๊ฐ ์์ถ๋ ๋ ์ ์ฉํ์ง๋ง ์ ๋ก ๋ณต์ฌ ์ํฌํ๋ก์์๋ ๋น์์ฐ์ ์ ๋๋ค.
์ฃผ์ ์์ ์กฐ๊ธ ๋ฒ์ด๋์ง๋ง XOR์ ๋ณต์ฌ๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ์ค๋ฒํค๋๊ฐ ์๋๋ผ ์ต์ ํ์ ๋๋ค. ๊ทธ๊ฒ์ ๋ชจ๋ ๊ตฌ์กฐ๊ฐ 0์ผ๋ก ์ด๊ธฐํ๋๋ค๋ ๊ฒ์ ๋ณด์ฅํฉ๋๋ค. ์ฆ, ๋ฒํผ๊ฐ ์ด๋ฏธ 0์ธ ๊ฒฝ์ฐ(์ข ์ข ์ด์จ๋ ๊ทธ๋ด ์ ์์) ๊ฐ์ฒด ํ ๋น์ ๋ํ ์ด๊ธฐํ๋ฅผ ์ํํ ํ์๊ฐ ์์ต๋๋ค. ์ปดํ์ผ ์๊ฐ ์์์ ๋ํ XOR์ ์๋ง๋ 1์ฌ์ดํด์ ๋น์ฉ์ด ๋ค์ง๋ง ๋ชจ๋ ์ข ๋ฅ์ ๋ฉ๋ชจ๋ฆฌ ์ก์ธ์ค๋ ํจ์ฌ ๋ ๋ง์ ๋น์ฉ์ด ๋ญ๋๋ค.
@lukewagner "์ ํ ๋ฉ๋ชจ๋ฆฌ ๊ณต์ " ๋ถ๋ถ์ ๋ํ ์๊ฐ์ด
์ ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํ๊ฑฐ๋ ๊ณต์ ํ์ง ์๋ ๊ฒฝ์ฐ ๋ชจ๋ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์์ผ๋ฉฐ ๊ถ๊ทน์ ์ผ๋ก ๋๊ตฌ๋ ๋ค์ ๋ ๊ฐ์ง๋ฅผ ๋ชจ๋ ์ง์ํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ค๋๋ ๊ธฐ๋ณธ ์ฑ์ด ์ ์ ๋๋ ๋์ ์ฐ๊ฒฐ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๊ณต์ ๋ ์๋ฏธ๊ฐ ์์ต๋๋ค. ๊ฒฐํฉ๋๋ ๋ชจ๋ ์ฝ๋๊ฐ ์์ ํ ์ ๋ขฐํ ์ ์๊ณ ํด๋น ์กฐํฉ์ด ๋ชจ๋ ๋์ผํ ๋๊ตฌ ์ฒด์ธ์ ์ฌ์ฉํ๊ฑฐ๋ ์๊ฒฉํ๊ฒ ์ ์๋ ABI๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋ ์ทจ์ฝํ ์ํํธ์จ์ด ๊ตฌ์ฑ ๋ชจ๋ธ์ ๋๋ค.
๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํ์ง ์๋ ๊ฒ์ ๊ณ ์ ์ ์ธ Unix ์คํ์ผ ๋์์ธ์ด ์ฝ๋๋ฅผ ํ์ดํ๋ก ์ฐ๊ฒฐ๋ ๋ณ๋์ ํ๋ก์ธ์ค์ ๋ฃ๋ ๋ณด๋ค ๋์จํ๊ฒ ๊ฒฐํฉ๋ ๋ชจ๋ ์ปฌ๋ ์ ์ ์ ํฉํฉ๋๋ค. ๊ฐ์ธ์ ์ผ๋ก ์ ๋ ์ด๊ฒ์ด ๋ณด๋ค ๊ตฌ์ฑ์ ์ธ ์ํํธ์จ์ด ์ํ๊ณ๋ฅผ ์ํ ๋ ํฅ๋ฏธ๋กญ๊ณ ๋ฏธ๋ ์งํฅ์ ์ธ ๋ฐฉํฅ์ด๋ผ๊ณ ์๊ฐํ๋ฏ๋ก ์ด๊ฒ์ด ESM ํตํฉ์ ํตํด
๋ง์นจ๋ด ์ด ๋ด์ฉ์ ๋ค ์ฝ๊ณ ๋๋ฉด ์ด ๋ถ๋ถ์ ๋ํ ๋ด ์๊ฐ๊ณผ ๋งค์ฐ ํก์ฌํ๊ฒ ๋ค๋ฆฝ๋๋ค(์ด ์ฃผ์ ์์๊ฐ ๋๋ฌด ์งง์ ๋ด๊ธฐ์๋ ์ด๋ค ๊ฒ์ด ์์ต๋๊น?).
ํนํ ๋ชจ๋ ๊ฐ ํต์ ๋ฌธ์ ์ ๋ํด ์คํค๋ง๋ก ๊ฐ์ฅ ์ ์ค๋ช ํ ์ ์๋ค๊ณ ์๊ฐํ์ต๋๋ค. ์ฆ, Cap'nProto ์ง๋ ฌํ ํ์์ด ํ์ํ์ง ์์ผ๋ฉฐ ์คํค๋ง๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ ๋ ํ์ฌ Cap'nProto์ ์คํค๋ง ์ธ์ด์ ๋ํด ํน๋ณํ ์๊ฒฌ์ด ์์ต๋๋ค.
WASI/ESM+npm ๊ด์ ์์ ์ด ํ์์ ์๋ฃจ์ ์ด ๊ฐ์ฅ ์๋ฏธ๊ฐ ์์ต๋๋ค. ๊ณต์ ABI์ ์์กดํ์ง ์๊ณ ABI์ ๋ํ ์ถ์ํ์ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก schema-lang API๋ก ์ธํฐํ์ด์ค๋ฅผ ์ค๋ช ํ๊ณ ์์ชฝ ๋์์ ๋ค์ดํฐ๋ธ์ฒ๋ผ ๋ณด์ด๋ ABI๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฌํ ์ธ์ด ๊ฒฝ๊ณ๋ฅผ ๋์ด ํธ์ถํ์ฌ ํธ์คํธ๊ฐ ๋ฒ์ญ์ ์ฒ๋ฆฌํ ์ ์๋๋ก ํฉ๋๋ค.
ํนํ, ์ด๊ฒ์ ๋ค๋ฅธ ๋ชจ๋๊ณผ ๋ ๋ง์ ์กฐ์ ์ ์ํ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ํฌํจํ์ง ์์ต๋๋ค. ABI๋ฅผ ๊ณต์ ํ ์ ์๋ค๋ ๊ฒ์ ํ์คํ ์๊ณ ์๋ค๋ฉด ์ค์ ๋ก ABI, C ๋๋ Haskell์ด๋ ๊ด๊ณ์์ด ๋ชจ๋ ABI๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ฌธ์ ์ ๋ชจ๋ wasm์ ์ ์ดํ๊ณ ์ปดํ์ผํ๋ฉด ํจ์ฌ ๋ ์ฝ๊ฒ ํด๊ฒฐํ ์ ์์ต๋๋ค. ์ ์ ์๋ ์์์ ์ฝ๋๋ฅผ ๋ก๋ํ๊ณ ์์ค ์ธ์ด๋ฅผ ๋ชจ๋ฅด๋ npm์ ๊ฒฝ์ฐ์๋ง ๋ชจ๋ ๊ฐ์ ์คํค๋ง ์์ค ์ํธ ์ด์ฉ์ฑ์ ๊ฐ๋ ๊ฒ๊ณผ ๊ฐ์ ๊ฒ์ด ๋งค์ฐ ๋งค๋ ฅ์ ์ ๋๋ค. ์๋ํ๋ฉด ์ฐ๋ฆฌ๋ wasm ์์ฒด์ LCD๋ฅผ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด๋ ๋ค์ดํฐ๋ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ์ฌํ ํธ๋ฅผ ๋ฐ๋ฅผ ๊ฒ์ผ๋ก ์์ํ๊ณ C ABI๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ์คํค๋ง ์ธ์ด๋ก ์ธ์ฝ๋ฉ๋ ์ธ์ด์ LCD๋ฅผ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์คํค๋ง๋ ์๊ตฌ ์ฌํญ 2)๋ฅผ ์ํํธ ์๊ตฌ ์ฌํญ์ผ๋ก ๋ง๋ค์ด ๋ ์ ์ฐํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด C์์ Rust๋ก, Nim์ผ๋ก ํจ์จ์ ์ผ๋ก ๋ณํํ ์ ์์ด์ผ ํ์ง๋ง C์์ Haskell๋ก ๋ ๋ง์ ์ค๋ฒํค๋๊ฐ ์๋ ๊ฒ์ ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค.
ํนํ ๋ชจ๋ ๊ฐ ํต์ ๋ฌธ์ ์ ๋ํด ์คํค๋ง๋ก ๊ฐ์ฅ ์ ์ค๋ช ํ ์ ์๋ค๊ณ ์๊ฐํ์ต๋๋ค. ์ฆ, ์ง๋ ฌํ ํ์์ด ํ์ํ์ง ์์ผ๋ฉฐ ์คํค๋ง๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋๋ ์ ์์ ๋์ํ๋ ๊ฒฝํฅ์ด ์์ง๋ง ํ์๊ฐ ๋ฐ๋ฅผ์ง๋ ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋๊ฐ ์คํค๋ง๋ฅผ ๊ตฌํํฉ๋๊น? ํธ์คํธ๊ฐ ์ ์ก์ ์ํํ๋๋ผ๋ ์ด๋ ์์ ์์ Wasm ๊ฐ/๋ฐ์ดํธ๊ฐ ์ค์ ๋ก ์์ชฝ ๋์์ ์๋น/์์ฑ๋๋์ง ์ ์ํด์ผ ํ๊ณ ๊ฐ ๋ชจ๋์ ํธ์คํธ๊ฐ ์ดํดํ ์ ์๋ ํ์์ผ๋ก ์์ฒด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ผ ํฉ๋๋ค. ์ฌ๋ฌ ํ์์ ์ฌ์ฉํ ์๋ ์์ง๋ง ์ฌ์ ํ ์ง๋ ฌํ ํ์๊ณผ ๋ค๋ฅด์ง ์๊ณ ์ฝ๊ฐ ๋ ๋์ ์์ค์ ๋๋ค.
C์์ Rust๋ก, Nim์ผ๋ก ํจ์จ์ ์ผ๋ก ๋ณํํ ์ ์์ด์ผ ํฉ๋๋ค.
์๋ ์๋ ์์ง๋ง ๊ทธ ์๋ฏธ๋ฅผ ์๊ณ ์์ด์ผ ํฉ๋๋ค. C ์ ์ฌ ์ธ์ด์ ๋ํ ๊ถํ์ ๋ถ์ฌํ๋ค๋ ๊ฒ์ ์ค๋ฒํค๋๊ฐ ์ ๋ฐ๋๊ธฐ ๋๋ฌธ์ Haskell์ด Haskell ๋ชจ๋์ ๋ํด ์ด ์ถ์ํ๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ด๋ ์ฐจ๋ก๋ก ์์ฒด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํด ๋์ผํ "npm" ์ํ๊ณ์ ์ฐธ์ฌํ์ง ์๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์์ "Haskell"์ ๊ฑฐ์ ๋ชจ๋ ๊ณ ๊ธ ์ธ์ด์ ๋๋ช ์ฌ์ ๋๋ค. ๋๋ถ๋ถ์ ์ธ์ด๋ C์ ์ ์ฌํ์ง ์์ต๋๋ค.
๋ ๋์ ์๋ฃจ์ ์ด ์๋ค๊ณ ์ฃผ์ฅํ์ง๋ ์์ง๋ง ๋จ์ผ ABI ๋๋ ์คํค๋ง ์ถ์ํ๊ฐ ์ผ๋ฐ์ ์ธ FFI ์คํ์ผ์ ๋จ๋ฐฉํฅ ์ํธ ์ด์ฉ์ฑ์ ๋์ด์ ์ผ๋ง๋ ํจ์จ์ ์ด๊ณ ๋งค๋ ฅ์ ์ผ ์ ์๋์ง์ ๋ํด ํ์ค์ฑ์ ์ ์งํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ํนํ ๋ฒ์ธ์ด์ ํจํค์ง ์ํ๊ณ๊ฐ ์ง๋์น๊ฒ ํ์ค์ ์ธ ๊ฒฐ๊ณผ๋ผ๊ณ ํ์ ํ์ง ์์ต๋๋ค.
C ์ ์ฌ ์ธ์ด์ ๋ํ ๊ถํ์ ๋ถ์ฌํ๋ค๋ ๊ฒ์ ์ค๋ฒํค๋๊ฐ ์ ๋ฐ๋๊ธฐ ๋๋ฌธ์ Haskell์ด Haskell ๋ชจ๋์ ๋ํด ์ด ์ถ์ํ๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ด๋ ์ฐจ๋ก๋ก ์์ฒด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํด ๋์ผํ "npm" ์ํ๊ณ์ ์ฐธ์ฌํ์ง ์๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์์ "Haskell"์ ๊ฑฐ์ ๋ชจ๋ ๊ณ ๊ธ ์ธ์ด์ ๋๋ช ์ฌ์ ๋๋ค. ๋๋ถ๋ถ์ ์ธ์ด๋ C์ ์ ์ฌํ์ง ์์ต๋๋ค.
ํน์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ ๊ณตํ ์ ์์ต๋๊น? ์ด์์ ์ผ๋ก๋ ์ง๋ ฌํ ์คํค๋ง๋ก ๋ณํํ๊ธฐ ์ด๋ ค์ด Haskell ๋๋ ๋ค๋ฅธ ์ธ์ด์ ๊ธฐ์กด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ต๋๊น?
๋๋ ๊ทธ๊ฒ์ด ์ฃผ๋ก ์ ํธ๋ฆฌํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ ๋น์ฆ๋์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๊ท๊ฒฐ ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ปจํ ์ด๋, ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ๋ฐ ์ธ์ด์ ์ ๋ค๋ฆญ์ ์์กดํ๋ ๊ธฐํ ์ ํธ๋ฆฌํฐ๋ wasm์ผ๋ก ์ ๋ณํ๋์ง ์์ง๋ง ํ์, GUI ์์ ฏ ๋ฐ ํ์ผ ์์คํ ๋๊ตฌ๋ ๋ณํ๋ฉ๋๋ค.
@PoignardAzur , ๋ฒ์ญํ๋ ๊ฒ์ ์ด๋ ต์ง ์์ง๋ง ๊ฐ ๊ต์ฐจ ๋ชจ๋ ํธ์ถ์ ์์ชฝ ๋์ ์๋ ๋ชจ๋ ์ธ์/๊ฒฐ๊ณผ๋ฅผ ๋ณต์ฌ(์ง๋ ฌํ/์ญ์ง๋ ฌํ)ํด์ผ ํฉ๋๋ค. ๋ถ๋ช ํ, ๋ชจ๋ ์ธ์ด ๋ด๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํธ์ถ์ ๋ํด ๊ทธ ๋น์ฉ์ ์ง๋ถํ๊ณ ์ถ์ง๋ ์์ต๋๋ค.
ํนํ Haskell์์๋ ๋ณต์ฌ๊ฐ ๊ฒ์ผ๋ฆ์ ์๋ฏธ์ ํธํ๋์ง ์๋๋ค๋ ์ถ๊ฐ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋ค๋ฅธ ์ธ์ด์์๋ ์ํ ์ ์ฅ ๋ฐ์ดํฐ์ ํธํ๋์ง ์์ ์ ์์ต๋๋ค.
๋๊ฐ ์คํค๋ง๋ฅผ ๊ตฌํํฉ๋๊น? ํธ์คํธ๊ฐ ์ ์ก์ ์ํํ๋๋ผ๋ ์ด๋ ์์ ์์ Wasm ๊ฐ/๋ฐ์ดํธ๊ฐ ์ค์ ๋ก ์์ชฝ ๋์์ ์๋น/์์ฑ๋๋์ง ์ ์ํด์ผ ํ๊ณ ๊ฐ ๋ชจ๋์ ํธ์คํธ๊ฐ ์ดํดํ ์ ์๋ ํ์์ผ๋ก ์์ฒด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ผ ํฉ๋๋ค. ์ฌ๋ฌ ํ์์ ์ฌ์ฉํ ์๋ ์์ง๋ง ์ฌ์ ํ ์ง๋ ฌํ ํ์๊ณผ ๋ค๋ฅด์ง ์๊ณ ์ฝ๊ฐ ๋ ๋์ ์์ค์ ๋๋ค.
ํธ์คํธ๋ ์คํค๋ง๋ฅผ ๊ตฌํํฉ๋๋ค. ์คํค๋ง๋ ๋ฐ์ดํธ๋ฅผ ์ ํ ์ค๋ช ํ์ง ์์ผ๋ฉฐ ๊ตฌํ ์ธ๋ถ ์ฌํญ์ด ๋๋๋ก ํฉ๋๋ค. ์ด๊ฒ์ ํฅ๋ฏธ๋ก์ด ๋ถ๋ถ์ด C ๊ตฌ์กฐ์ฒด์์ WebIDL ์ ํ์ผ๋ก์ ๋ณํ์ ์๋ WebIDL ๋ฐ์ธ๋ฉ ์ ์์ ๋์์ธ์์ ์ฐจ์ฉํ ๊ฒ์ ๋๋ค. ์ด๋ฌํ ์ข ๋ฅ์ ๋์์ธ์ WebIDL ์ ํ ๋์ Wasm ์ถ์ ์ธํฐํ์ด์ค ์ ํ(์ฝ์ด: WAIT)์ ์ฌ์ฉํฉ๋๋ค. WebIDL ์ ์์์ ์ฐ๋ฆฌ๋ "WebIDL๋ก ๋ณํ"๋์์ ๋ ๋ฐ์ดํฐ์ ์ด์ง ํํ์ ์๊ตฌํ๊ฑฐ๋ ์๊ตฌํ์ง ์์ต๋๋ค. ์๋ํ๋ฉด ์ฐ๋ฆฌ๋ ์ค๊ฐ์ ์ค๋จ ์์ด wasm์์ ๋ธ๋ผ์ฐ์ API๋ก ๋ฐ๋ก ์ด๋ํ ์ ์๊ธฐ๋ฅผ ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
C ์ ์ฌ ์ธ์ด์ ๋ํ ๊ถํ์ ๋ถ์ฌํ๋ค๋ ๊ฒ์ ์ค๋ฒํค๋๊ฐ ์ ๋ฐ๋๊ธฐ ๋๋ฌธ์ Haskell์ด Haskell ๋ชจ๋์ ๋ํด ์ด ์ถ์ํ๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
์, 100% ๋์ํฉ๋๋ค. ๋ ๋ช ํํ๊ฒ ํ๊ธฐ ์ํด ์์ ๋ฅผ ์๋ฃํ์ด์ผ ํ์ต๋๋ค. ํํธ, Haskell์์ Elm์์ C#์ผ๋ก ๋ณํํ๋ ๊ฒ๋ ์ ์ฌํ๊ฒ ํจ์จ์ ์ผ ์ ์์ง๋ง(wasm gc ์ ํ์ ์ฌ์ฉํ๋ค๊ณ ๊ฐ์ ํ ๋), C#์์ Rust๋ก ๋ณํํ๋ ๋ฐ ์ค๋ฒํค๋๊ฐ ์์ ์ ์์ต๋๋ค. ์ธ์ด ํจ๋ฌ๋ค์์ ๋ฐ์ด ๋์ ๋ ์ค๋ฒ ํค๋๋ฅผ ํผํ ์์๋ ๋ฐฉ๋ฒ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ฃผ์ด์ง ์ธ์ด์ ๋ํด ์ถฉ๋ถํ ์ธ์ฒด๊ณตํ์ + ์ฑ๋ฅ์ ์คํจํ๋ฉด ์ธํฐํ์ด์ค ์ฌ์ฉ์์ ๋ง์ ๊ฐ์น๋ฅผ ๋ณด์ง ๋ชปํ์ฌ ์ํ๊ณ์ ์ฐธ์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ ์ธ์ด์ ๋ํ ํน๊ถ์ ํผํ๋ ค๊ณ ์๋ํด์ผ ํ๋ค๋ ๊ทํ์ ๊ด์ฐฐ์ด ์ณ๋ค๊ณ ์๊ฐํฉ๋๋ค. .
์ ํ์ ์ถ์ํํ๊ณ ์ ์ ํ์์ ์ง์ ํ์ง ์์์ผ๋ก์จ ํธ์คํธ๊ฐ ์ต์ ํํ ์ ์๋ ์ฌ์ง๋ฅผ ํจ์ฌ ๋ ๋ง์ด ์ค ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. "C ์คํ์ผ ๋ฌธ์์ด์ด ํจ์จ์ "์ด๋ผ๊ณ ๋งํ๋ ๊ฒ์ด ๋ชฉํ๊ฐ ์๋ ๊ฒ ๊ฐ์ง๋ง "C ์คํ์ผ ๋ฌธ์์ด์ ๋ํด ์ถ๋ก ํ๊ณ ์ถ์ ์ธ์ด๊ฐ ๊ทธ๋ ๊ฒ ํจ์จ์ ์ผ๋ก ํ ์ ์๋ค"๋ผ๊ณ ๋งํ๋ ๊ฒ์ด ๋ชฉํ์ ๋๋ค. ๋๋ ์ด๋ค ํ์๋ ์ถ๋ณต์ ๋ฐ์์๋ ์ ๋์ง๋ง ํน์ ํธํ ๊ฐ๋ฅํ ํธ์ถ ์ฒด์ธ์ด ํจ์จ์ ์ด์ด์ผ ํ๊ณ ๋ชจ๋ ํธ์ถ ์ฒด์ธ์ด ๊ฐ๋ฅํด์ผ ํฉ๋๋ค.
์ฝ ์ฒด์ธ์ด๋ ๋ค์์ ์๋ฏธํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์์ "Haskell"์ ๊ฑฐ์ ๋ชจ๋ ๊ณ ๊ธ ์ธ์ด์ ๋๋ช ์ฌ์ ๋๋ค. ๋๋ถ๋ถ์ ์ธ์ด๋ C์ ์ ์ฌํ์ง ์์ต๋๋ค.
๋ค, ์ด๊ฒ์ด Haskell์ ๊ตฌ์ฒด์ ์ธ ์ธ์ด๋ก ์ฌ์ฉํ๋ ค๋ ์๋์์ต๋๋ค. (Nim์ GC๋ ๋ง์ด ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ C์ ๊ฐ์ ์ธ์ด์ ๋์ ์์ผ ์ ์์ง๋ง)
--
๋ด๊ฐ ์ถ์ ์ ํ์ ๋ํด ์๊ฐํด ์จ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ IR์ ๋๋ค. LLVM์ด ๋ค๋์ผ ๊ด๊ณ(๋ง์ ์ธ์ด -> ํ๋์ IR -> ๋ง์ ๋์)๋ฅผ ์ค๋ช ํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก wasm ์ถ์ ์ ํ์ ์ธ์ด+ํธ์คํธ์ ๋ค๋๋ค ๋งคํ์ ์ค์ฌํ ์ ์์ต๋๋ค. ์ธ์ด+ํธ์คํธ. ์ด ๋์์ธ ๊ณต๊ฐ์ ์ด๋ค ๊ฒ์ด N^2 ๋งคํ ๋ฌธ์ ๋ฅผ ๊ฐ์ ธ์ N+N ๋ฌธ์ ๋ก ๋ฐ๊ฟ๋๋ค.
ํธ์คํธ๋ ์คํค๋ง๋ฅผ ๊ตฌํํฉ๋๋ค.
๊ธ์์, ๊ทธ๊ฒ๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค. ๊ฐ ๋ชจ๋์ ํธ์คํธ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ ์ ์๋๋ก ๋ญ๊ฐ ๋ฅผ ๊ตฌํํด์ผ ํฉ๋๋ค. ํธ์คํธ๊ฐ C ๋ ์ด์์์ ๊ธฐ๋ํ๋ค๋ฉด ์ด C ๋ ์ด์์์ ์ ์ํด์ผ ํ๊ณ ๋ชจ๋ ํด๋ผ์ด์ธํธ๋ ๋ด๋ถ์ ์ผ๋ก ๋ง์ฌ๋ง/๋ง์ฌ๋ง ํด์ ํด์ผ ํฉ๋๋ค. ์ง๋ ฌํ ํ์๊ณผ ํฌ๊ฒ ๋ค๋ฅด์ง ์์ต๋๋ค.
๊ทธ๋ ๊ฒ ํ๋๋ผ๋ ์ง๋ ฌํ ํ์์ ์ ์ํ๋ ๊ฒ์ ์ฌ์ ํ โโ์ ์ฉํฉ๋๋ค(์: ๋คํธ์ํน ๋๋ ํ์ผ ๊ธฐ๋ฐ ์ง์์ฑ์ ํตํด ๋จ์ผ ์์ง ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ์กํด์ผ ํ๋ ์์ฉ ํ๋ก๊ทธ๋จ์ ๊ฒฝ์ฐ).
๊ธ์์, ๊ทธ๊ฒ๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค. ๊ฐ ๋ชจ๋์ ํธ์คํธ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ ์ ์๋๋ก ๋ญ๊ฐ๋ฅผ ๊ตฌํํด์ผ ํฉ๋๋ค. ํธ์คํธ๊ฐ C ๋ ์ด์์์ ์์ํ๋ ๊ฒฝ์ฐ ์ด C ๋ ์ด์์์ ์ ์ํด์ผ ํฉ๋๋ค.
ํธ์คํธ๋ ์๋ฌด๊ฒ๋ ๊ธฐ๋ํ์งํด์ผํ์ง๋ง, ํ์์ ๋ชจ๋ ๊ฒ์ ์ง์ํฉ๋๋ค. ์ข ๋ ๊ตฌ์ฒด์ ์ผ๋ก ์ค๋ช
ํ๋ฉด webidl-bindings ์ ์์ ์ฌ์ฉํ์ฌ ๊ฐ๊ฐ i32 (ptr)
๋ฐ i32 (ptr), i32 (len)
utf8-cstr
๋ฐ utf8-str
๊ฐ ์์ต๋๋ค. ์ฌ์์์ "ํธ์คํธ๊ฐ ๋ด๋ถ์ ์ผ๋ก ์ด๊ฒ์ C-๋ฌธ์์ด๋ก ๋ํ๋"์ ์ง์ ํ์ฌ ๋ ์ฌ์ด๋ฅผ ๊ตฌ์ฒด์ ์ผ๋ก ๋งคํํ ์ ์๋๋ก ํ ํ์๋ ์์ต๋๋ค.
๋ฐ๋ผ์ ๊ฐ ๋ชจ๋์ ๋ฌด์ธ๊ฐ๋ฅผ ๊ตฌํํ์ง๋ง ๋ฐ์ดํฐ์ ํํ์ ์ถ์ ๋ฐ์ดํฐ/์คํค๋ง ๊ณ์ธต์์ ํํ๋ ํ์๊ฐ ์์ต๋๋ค. ์ด๊ฒ์ด ์ฐ๋ฆฌ์๊ฒ ํด๋น ๋ฐ์ดํฐ ๋ ์ด์์์ ๋ํ ์ถ์ํ ์์ฑ์ ์ ๊ณตํ๋ ๋ฐฉ๋ฒ์
๋๋ค.
๋ํ ์ด๊ฒ์ ๊ตฌ์ฒด์ ์ธ wasm ์ ํ๊ณผ ์ถ์ ์ค๊ฐ ์ ํ์ ๋งคํํ๋ ๋ฐ์ธ๋ฉ ๋ ์ด์ด์์ ํ์ฅํ ์ ์์ต๋๋ค. Haskell ์ง์(๋ฌธ์์ด์ ๋จ์ ๋ชฉ๋ก๊ณผ ๋ฌธ์ ๋ฐฐ์ด๋ก ๋ชจ๋ธ๋ง)์ ์ถ๊ฐํ๊ธฐ ์ํด utf8-cons-str
๋ฐ utf8-array-str
๋ฐ์ธ๋ฉ์ ์ถ๊ฐํ ์ ์์ต๋๋ค. gc ์ ์ ๊ตฌ๋ฌธ) (type $haskellString (struct (field i8) (field (ref $haskellString))))
๋ฐ (type $haskellText (array i8))
.
์ฆ, ๊ฐ ๋ชจ๋์ ๋ฐ์ดํฐ๊ฐ ์์ฑ๋๋ ๋ฐฉ์์ ๊ฒฐ์ ํฉ๋๋ค. ์ถ์ ์ ํ + ๋ฐ์ธ๋ฉ์ ๋ชจ๋์ด ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ ๋ฐฉ์ ๊ฐ์ ๋ณํ์ ํ์ฉํ๋ฉฐ, ๋จ์ผ ํํ์ด ์ด๋ป๊ฒ๋ ํ์ค์ด ๋๋ ๊ฒ์ ์ถ๋ณตํ์ง ์์ต๋๋ค.
์ถ์ ์ ํ(์ผ๋ถ ํ์ ์งํฉ)์ ๋ํ ์ง๋ ฌํ ํ์์ ์ ์ฉํ์ง๋ง ์คํค๋ง ํ์์ ์๋น์๋ก ๊ตฌํํ ์ ์์ผ๋ฉฐ ์ง๊ต ๋ฌธ์ ๋ผ๊ณ ์๊ฐํฉ๋๋ค. FIDL์๋ ๋คํธ์ํฌ๋ฅผ ํตํด ์ ์กํ ์ ์๋ ์ ํ์ ํ์ ์งํฉ์ ๋ํ ์ง๋ ฌํ ํ์์ด ์์ผ๋ฉฐ ๋ถํฌ๋ช ํธ๋ค์ ๊ตฌ์ฒดํ๋ฅผ ํ์ฉํ์ง ์๋ ๋ฐ๋ฉด ์์คํ ๋ด์์ ์ ์ก๋๋ ๋ถํฌ๋ช ํธ๋ค์ ํ์ฉํฉ๋๋ค(IPC ์, RPC ์๋์).
๋น์ ์ด ์ค๋ช ํ๊ณ ์๋ ๊ฒ์ ๋ด๊ฐ ์ผ๋์ ๋์๋ ๊ฒ๊ณผ ๋งค์ฐ ๋น์ทํ์ง๋ง ํ ๊ฐ์ง ํฐ ์ฃผ์ ์ฌํญ์ด ์์ต๋๋ค. ์คํค๋ง์๋ ๊ฐ๋ฅํ ์ ์ ์์ ๊ณ ์ ๋ ํํ์ด ์์ด์ผ ํฉ๋๋ค. ์๋ก ๋ค๋ฅธ ํํ ์ฌ์ด๋ฅผ ์ฐ๊ฒฐํ๋ ๊ฒ์ N*N ๋ฌธ์ ์ ๋๋ค. ์ฆ, VM ์์ฑ์์๊ฒ ๊ณผ๋ถํ๊ฐ ๊ฑธ๋ฆฌ์ง ์๋๋ก ํํ ์๋ฅผ ์๊ฒ ์ ์งํด์ผ ํฉ๋๋ค.
๋ฐ๋ผ์ Haskell ์ง์์ ์ถ๊ฐํ๋ ค๋ฉด ์ฌ์ฉ์ ์ง์ ๋ฐ์ธ๋ฉ์ ์ถ๊ฐํ์ง ์๊ณ ๊ธฐ์กด ๋ฐ์ธ๋ฉ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
๋ช ๊ฐ์ง ๊ฐ๋ฅํ ํํ:
๊ฐ ์ธ์ด๊ฐ ๋ค๋ฅด๊ณ ์ผ๋ถ ๊ทน๋จ์ ์ธ ์ด์๊ฐ์ด ์์ง๋ง ์๋นํ ์ ์ ์์ ๋ฒ์ฃผ์ ์๋นํ ๋ง์ ์์ ์ธ์ด๋ฅผ ๋ง์ถ ์ ์๋ค๋ ์์ด๋์ด์ ๋๋ค.
๋ฐ๋ผ์ Haskell ์ง์์ ์ถ๊ฐํ๋ ค๋ฉด ์ฌ์ฉ์ ์ง์ ๋ฐ์ธ๋ฉ์ ์ถ๊ฐํ์ง ์๊ณ ๊ธฐ์กด ๋ฐ์ธ๋ฉ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์๊ฐํ๊ณ ์๋ ๊ธฐ์กด ๋ฐ์ธ๋ฉ์ ์ธ๋ถ์ฑ ์์ค์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. ๊ฐ๋ฅํ ๊ฐ ๋ฐ์ธ๋ฉ์ ์ธ์ฝ๋ฉํ๋ N<->N ์ธ์ด๋ 2*N*N์ด์ง๋ง N<->IR์ 2*N์ด๋ฉฐ N<->[๊ณตํต ๋ฐ์ธ๋ฉ ์คํ์ผ]<->IR์ด๋ผ๊ณ ํ๋ฉด ์ฌ๊ธฐ์ ์ซ์ ์ผ๋ฐ์ ์ธ ํ์์ k์ด๋ฉฐ, ์ฌ๊ธฐ์ k < N์ธ 2*k๋ฅผ ๋งํ๋ ๊ฒ์ ๋๋ค.
ํนํ, ๋ด๊ฐ ์ค๋ช
ํ๋ ๊ตฌ์ฑํ๋ฅผ ์ฌ์ฉํ๋ฉด Scheme์ ๋ฌด๋ฃ๋ก ์ป์ ์ ์์ต๋๋ค( utf8-cons-str
์ฌ์ฌ์ฉ). Java๊ฐ ๋ฌธ์์ด์ char ๋ฐฐ์ด๋ก๋ ๋ชจ๋ธ๋งํ๋ ๊ฒฝ์ฐ ์ด๋ utf8-array-str
๋ฐ์ธ๋ฉ์
๋๋ค. Nim์ด ๋ด๋ถ์ ์ผ๋ก string_views๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ utf8-str
. Zig๊ฐ C ABI๋ฅผ ์ค์ํ๋ ๊ฒฝ์ฐ utf8-cstr
. (์ ๋ Java/Nim/Zig์ ABI๋ฅผ ๋ชฐ๋ผ์ ์์์ ๊ตฌ์ฒด์ ์ธ ์๋ก ์ธ๊ธํ์ง ์์์ต๋๋ค.)
๋ฐ๋ผ์ ๊ฐ๋ฅํ ๊ฐ ์ธ์ด์ ๋ํ ๋ฐ์ธ๋ฉ์ ์ถ๊ฐํ๊ณ ์ถ์ง๋ ์์ง๋ง IR ์ ํ๋ณ๋ก ๋ช ๊ฐ์ง ๋ฐ์ธ๋ฉ์ ์ถ๊ฐํ์ฌ ๋๋ถ๋ถ์ ์ธ์ด๋ฅผ ํฌ๊ดํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์์ ๋์ํ์ง ์์ ์ ์๋ ์ฌ์ง๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ฐ์ธ๋ฉ์ด "๋ช ๊ฐ"์ธ์ง, ์ค์ํธ ์คํฟ์ด ๋ฌด์์ธ์ง, ์ธ์ด์ ABI๋ฅผ ์ง์ํ๋์ง ์ฌ๋ถ์ ๋ํ ๊ธฐ์ค์ ์ผ๋ง๋ ์๊ฒฉํด์ผ ํ ๊น์?
์ด ์ง๋ฌธ์ ๋ํ ๊ตฌ์ฒด์ ์ธ ๋ต๋ณ์ ์์ต๋๋ค. ๋์์ธ ๊ณต๊ฐ์ ๋ ์ ์ค๋ช
ํ๊ธฐ ์ํด ๋ง์ ๊ตฌ์ฒด์ ์ธ ์๋ฅผ ์ ๊ณตํ๋ ค๊ณ ํฉ๋๋ค.
๋ํ ํ ๊ฐ์ง ์คํ์ผ์ ๋ฐ์ดํฐ์ ๋ํ ํน๊ถ์ ํผํ๊ธฐ ์ํด ์ถ์ ์ ํ๋ณ๋ก ์ฌ๋ฌ ๋ฐ์ธ๋ฉ์ ์ง์ ํ๊ธฐ๋ฅผ ์ ๋์ ์ผ๋ก ์ํ๋ค๊ณ ์ฃผ์ฅํฉ๋๋ค. Strings์ ๋
ธ์ถํ๋ ์ ์ผํ ๋ฐ์ธ๋ฉ์ด utf8-cstr
์ธ ๊ฒฝ์ฐ C-ABI๊ฐ ์๋ ๋ชจ๋ ์ธ์ด๋ ํด๋น ๋ถ์ผ์น๋ฅผ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค. VM ์์ฑ ๋ณต์ก์ฑ์ ์ฆ๊ฐ์ํค๋ ๊ฒ์ ๊ด์ฐฎ์ต๋๋ค.
์ํ๊ณ์ ์ด ์์
์ O(VM ์์
+ ์ธ์ด ๊ตฌํ ์์
)์ด๋ฉฐ ๋ ์ฉ์ด ๋ชจ๋ N=์ธ์ด ์์ ํจ๊ป ์ด๋ค ์์ผ๋ก๋ ํ์ฅ๋ฉ๋๋ค. M = ์๋ฒ ๋ ์, k = ๋ฐ์ธ๋ฉ ์, a = ์ฃผ์ด์ง ์ธ์ด๊ฐ ๊ตฌํํด์ผ ํ๋ ํ๊ท ๋ฐ์ธ๋ฉ ์๋ฅผ a<=k๋ก ์ง์ ํฉ๋๋ค. ์ต์ํ M+N๊ฐ์ ๋ณ๋ wasm ๊ตฌํ์ด ์์ต๋๋ค.
๋ชจ๋ N ์ธ์ด๊ฐ ๋
๋ฆฝ์ ์ผ๋ก ๋ค๋ฅธ ๋ชจ๋ N ์ธ์ด์ ํจ๊ป ABI FFI๋ฅผ ๊ตฌํํ๋ ์์งํ ์ ๊ทผ ๋ฐฉ์์ O(M + N*N)์
๋๋ค. ์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ๋ค์ดํฐ๋ธ ์์คํ
์ ๋ํด ๊ฐ์ง๊ณ ์๋ ๊ฒ์ธ๋ฐ, ์ด๋ ๋ชจ๋ O(N*N)์ด ๋ค์ดํฐ๋ธ ์์คํ
๊ณผ ๋ค๋ฅด์ง ์์ ๊ฒฐ๊ณผ๋ก ์ด์ด์ง ๊ฒ์ด๋ผ๋ ๊ฐ๋ ฅํ ์ ํธ์
๋๋ค.
๋ชจ๋ VM์ด ๋ชจ๋ N*N ๋ฐ์ธ๋ฉ์ ๊ตฌํํด์ผ ํ๋ ๋ ๋ฒ์งธ ์์งํ ์ ๊ทผ ๋ฐฉ์: O(M*N*N + N), ์ด๋ ๋ถ๋ช
ํ ํจ์ฌ ๋ ๋์ฉ๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ ์ํ๋ ค๊ณ ํ๋ ๊ฒ์ ์ถ์ ์ธ์ด ์ฌ์ด์ ๋งคํ๋๋ k ๋ฐ์ธ๋ฉ์ด ์๊ณ ๋ชจ๋ ์ธ์ด์ ๋ค์ ๋งคํ๋๋ค๋ ๊ฒ์
๋๋ค. ์ด๋ ๊ฐ VM์ ๋ํด k ์์
์ ์๋ฏธํฉ๋๋ค. ๊ฐ ์ธ์ด์ ๋ํด ๋ฐ์ธ๋ฉ์ ํ์ ์งํฉ๋ง ๊ตฌํํ๋ฉด ๋ฉ๋๋ค. ์ด ์์
์ M*k + N*a์ด๋ฉฐ O(M*k + N*k)์
๋๋ค. k=N์ธ ๊ฒฝ์ฐ VM ์ธก์ด "์ ์ผํ" M*N์ด๋ฏ๋ก ์ฃผ์ด์ง VM์ ๋ํด ์ธ์ด ์์์ "์ ์ผํ" ์ ํ์
๋๋ค. ๋ถ๋ช
ํ ์ฐ๋ฆฌ๋ k << N์ ์ํ์ง๋ง, ๊ทธ๋ ์ง ์์ผ๋ฉด ์ฌ์ ํ O(N*N)์ด๋ฏ๋ก ์ฒซ ๋ฒ์งธ ์๋ฃจ์
๋ณด๋ค ๋ซ์ง ์์ต๋๋ค.
๊ทธ๋๋ O(M*k + N*k)๊ฐ ํจ์ฌ ๋ ๋ง์์ต๋๋ค. k๊ฐ O(1)์ด๋ฉด ์ ์ฒด ์ํ๊ณ๋ฅผ ๊ตฌํ ํ์์์ ์ ํ์ผ๋ก ๋ง๋ค๋ฉฐ, ์ด๋ ๊ด๋ จ๋ ๋
ธ๋ ฅ์ ์์ ๋ํ ํํ์ ์
๋๋ค. ๋ ๊ฐ๋ฅ์ฑ์ด ์๋ ๊ฒฝ๊ณ๋ k๊ฐ O(log(N))์ด๊ณ ๋๋ ์ฌ์ ํ ๊ฝค ๋ง์กฑํฉ๋๋ค.
๊ธด ๋ง์ด์ง๋ง ์ ๋ ์ด ๊ธฐ๋ฅ์ ๋ํ VM ๋ณต์ก์ฑ์ ์ผ์ ํ ์์๋ก ์ฆ๊ฐ์ํค๋ ๋ฐ ์์ ํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
IR ์ ํ๋ณ๋ก ๋ช ๊ฐ์ง ๋ฐ์ธ๋ฉ์ ์ถ๊ฐํ์ฌ ๋๋ถ๋ถ์ ์ธ์ด๋ฅผ ๋ค๋ฃฐ ์ ์์ต๋๋ค.
์ด๊ฒ์ ๋ด๊ฐ ๋จ์ํ ์ฌ์ค์ด ์๋๋ผ๊ณ ๋ฏฟ๋ ๊ฒฐ์ ์ ์ธ ๊ธฐ๋ณธ ๊ฐ์ ์ ๋๋ค. ๋ด ๊ฒฝํ์ ๋ฐ๋ฅด๋ฉด (์ ์ด๋!) ์ธ์ด ๊ตฌํ๋งํผ ๋ง์ ํํ ์ ํ์ด ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ๋ค์ ์์๋ก ๋ณต์กํ ์ ์์ต๋๋ค.
๋ค๋ฅธ ์ธ์ฝ๋ฉ, ์ด์ข ๋กํ ๋ฑ์ ํฌํจํ์ฌ ๋ฌธ์์ด์ ๋ํด ์์ญ(!)๊ฐ์ ํํ์ด ์๋ V8์ ์๋ก ๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
Haskell์ ๊ฒฝ์ฐ๋ ์ค๋ช ํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ๋ณต์กํฉ๋๋ค. Haskell์ ๋ชฉ๋ก์ ๊ฒ์ผ๋ฅด๋ฏ๋ก ๋ฌธ์์ด์ ๋ชจ๋ ๋จ์ผ ๋ฌธ์์ ๋ํด ์ฝํฌ๋ฅผ ํธ์ถํด์ผ ํ ์๋ ์์ต๋๋ค.
๋ค๋ฅธ ์ธ์ด๋ ๋ฌธ์์ด ๊ธธ์ด์ ๋ํด ์ฌ๋ฏธ์๋ ํํ์ ์ฌ์ฉํ๊ฑฐ๋ ๋ช ์์ ์ผ๋ก ์ ์ฅํ์ง ์์ง๋ง ๊ณ์ฐ์ ์๊ตฌํฉ๋๋ค.
์ด ๋ ๊ฐ์ง ์๋ ์ด๋ฏธ ์ ์ธ์ ๋ฐ์ดํฐ ๋ ์ด์์์ด ์๋ฆฌ์ง ์๋๋ค๋ ๊ฒ์ ๋ณด์ฌ์ค๋๋ค. ๋ฐํ์ ์ฝ๋๋ฅผ ํธ์ถํ ์ ์์ด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ผ๋ฉฐ, ๋ฐํ์ ์ฝ๋์๋ ๊ณ ์ ํ ํธ์ถ ๊ท์น์ด ์์ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ๊ฐ๋ ์ ์ผ๋ก ์๋นํ ๋จ์ํ ๋ฐ์ดํฐ ์ ํ์ธ ๋ฌธ์์ด์ผ ๋ฟ์ ๋๋ค. ์ธ์ด๊ฐ ์ ํ ์ ํ(ํํ/๊ตฌ์กฐ์ฒด/๊ฐ์ฒด)์ ๋ํ๋ด๋ ๋ฌดํํ ๋ฐฉ๋ฒ์ ๋ํด ์๊ฐํ๊ณ ์ถ์ง๋ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์์ ์ธก์ด ์์ต๋๋ค. ์ฌ๊ธฐ์์ ์ด๋ฌํ ๋ชจ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์์ฑ ํ ์ ์์ด์ผ ํฉ๋๋ค!
๋ฐ๋ผ์ "๋๋ถ๋ถ์ ์ธ์ด"๋ฅผ ์ง์ํ๋ ๋ฐ ์์ฃผ ์กฐ๊ธ์ด๋ผ๋ ๊ฐ๊น์์ง๋ค๋ ๊ฒ์ ์์ ํ ๋นํ์ค์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋์ , ์ฐ๋ฆฌ๋ ์ด๋ฏธ ์์์ ์ธ ๊ฒ๋ค์ ํฐ ๋๋ฌผ์์ ์ฑ์ฅ์ํค๋ฉด์ ์์์ ํน๊ถ์ ๋๋ฆฌ๊ธฐ ์์ํ ๊ฒ์ ๋๋ค. ๊ทธ๊ฒ์ ์ฌ๋ฌ ์์ค์์ ์น๋ช ์ ์ผ๋ก ๋ณด์ ๋๋ค.
๋ด ๊ฒฝํ์ ๋ฐ๋ฅด๋ฉด (์ ์ด๋!) ์ธ์ด ๊ตฌํ๋งํผ ๋ง์ ํํ ์ ํ์ด ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ๋ค์ ์์๋ก ๋ณต์กํ ์ ์์ต๋๋ค.
์์ ํ ๋์ ํด. ๋๋ถ๋ถ์ ์ธ์ด์ ๋ฐ์ดํฐ ๋ด๋ถ ํํ์ ์ด๋ป๊ฒ๋ ๋ค๋ฃฐ ์ ์๋ ์ ํ์ ์ค๊ณํ๋ ๊ฒ์ ๋ค๋ฃจ๊ธฐ ํ๋ค๊ณ ์ํ๊ณ๋ฅผ ์ง๋์น๊ฒ ๋ณต์กํ๊ฒ ๋ง๋ค ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๊ฒฐ๊ตญ ๋ฐ์ดํฐ์ ๊ด๋ จํ์ฌ ์ธ์ด ๊ฐ์ ๊ฐ์ฅ ๋ฎ์ ๊ณตํต ๋ถ๋ชจ๋ "๋ฒํผ"๋ฟ์ ๋๋ค. ๋ชจ๋ ์ธ์ด๋ ์ด๊ฒ์ ์ฝ๊ณ ๊ตฌ์ฑํ ์ ์์ต๋๋ค. ํจ์จ์ ์ด๊ณ ๊ฐ๋จํฉ๋๋ค. ๋ค, ๊ทธ๋ค์ ๋ด์ฉ์ ์ง์ ๋ค๋ฃฐ ์ ์๋ ์ธ์ด๋ฅผ ์ ํธํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ๊ทธ๊ฒ์ด (๊ฒ์ผ๋ฅธ) ์ฃ์ ์ธํฌ๋ฅผ ๊ฐ์ ์์ค์ ์ง์์ผ๋ก ์น๊ฒฉํจ์ผ๋ก์จ ํด๊ฒฐ๋๋ ๋ถํ๋ฑ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
์ฌ์ค, ํฌ์ธํฐ + len ์์ด๋ผ๋ ๋จ์ผ ๋ฐ์ดํฐ ์ ํ์ผ๋ก ๋งค์ฐ ๋ฉ๋ฆฌ ๊ฐ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ํด๋น ๋ฐ์ดํธ์ ์๋ ๋ด์ฉ์ ๋ํ๋ด๋ "์คํค๋ง"๊ฐ ํ์ํฉ๋๋ค. UTF-8 ์ค์๋ฅผ ์ฝ์ํฉ๋๊น? ๋ง์ง๋ง ๋ฐ์ดํธ๋ ํญ์ 0์ผ๋ก ๋ณด์ฅ๋ฉ๋๊น? ์ฒ์ 4/8๋ฐ์ดํธ ๊ธธ์ด/์ฉ๋ ํ๋์ ๋๊น? ์ด ๋ชจ๋ ๋ฐ์ดํธ๊ฐ WebGL๋ก ๋ฐ๋ก ๋ณด๋ผ ์ ์๋ ๋ฆฌํ ์๋์ ๋ถ๋ ์์์ ์ ๋๊น? ์ด ๋ฐ์ดํธ๊ฐ ๊ธฐ์กด ์ง๋ ฌํ ํ์์ ์คํค๋ง X์ ๋๊น? ๋ฑ?
๋๋ ์ด๋ฌํ ๋ชจ๋ ์ง๋ฌธ์ ๋ตํ ์ ์๋ ๋งค์ฐ ๊ฐ๋จํ ์คํค๋ง ์ฌ์์ ์ ์ํฉ๋๋ค(๊ธฐ์กด ์ง๋ ฌํ ํ์์ด ์๋๋ผ ๋ ๋ฎ์ ์์ค, ๋จ์ํ๊ณ wasm์ ํน์ ํ ๊ฒ). ๊ทธ๋ฐ ๋ค์ ์ง์ ๋ ํ์์ผ๋ก ์ด๋ฌํ ๋ฒํผ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฝ๊ณ ์ฐ๋ ๊ฒ์ด ๊ฐ ์ธ์ด์ ๋ถ๋ด์ด ๋ฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๊ทธ ์ฌ์ด์ ์๋ ๋ ์ด์ด๋ ๋ณต์ฌ ๋๋ ๊ฐ๋ฅํ ๊ฒฝ์ฐ ์ฐธ์กฐ/๋ณด๊ธฐ๋ฅผ ํตํด ์ฒ๋ฆฌํ์ง ์๊ณ ๋ฒํผ ์ฃผ์๋ฅผ ๋งน๋ชฉ์ ์ผ๋ก ์ ๋ฌํ ์ ์์ต๋๋ค.
์ด๊ฒ์ ๋ด๊ฐ ๋จ์ํ ์ฌ์ค์ด ์๋๋ผ๊ณ ๋ฏฟ๋ ๊ฒฐ์ ์ ์ธ ๊ธฐ๋ณธ ๊ฐ์ ์ ๋๋ค. ๋ด ๊ฒฝํ์ ๋ฐ๋ฅด๋ฉด (์ ์ด๋!) ์ธ์ด ๊ตฌํ๋งํผ ๋ง์ ํํ ์ ํ์ด ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ๋ค์ ์์๋ก ๋ณต์กํ ์ ์์ต๋๋ค.
๋๋ ์ด๊ฒ์ด ์ค์ํ ๊ธฐ๋ณธ ๊ฐ์ ์ด๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ์ฌ์ค์ด ์๋๋ผ๋ ๋ฐ ๋์ํ์ง ์์ง๋ง, ์๋ฏธ๋ก ์ ๋์์ค ๋๋ฌธ์ ๋ด๊ฐ ๋ถ๋ช ํ ํ์ง ์์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ฐ์ธ๋ฉ์ ๋ชจ๋ ์ธ์ด ํํ์ ์๋ฒฝํ๊ฒ ๋งคํ๋๋ ๊ฒ์ด ์๋๋ผ ๋ชจ๋ ์ธ์ด์
์ด๊ฒ์ ์ธ์ฝ๋ฉ์ ๊ด๊ณ์์ด ์ด๊ฒ์ ์ ํ ๋ค๋ฃจ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋๋ ์ค์ํ ๊ธฐ๋ณธ ๊ฐ์ ์ ๋๋ค. @aardappel ์ด ๋ค๋ฅธ ๋ฐฉํฅ์ผ๋ก ๋์๊ฐ ์ค์ ๋ก ๋ฐ์ดํธ๋ฅผ ๋์ฝ๋ฉ ๊ฐ๋ฅํ ๋ฒํผ๋ก ๊ตฌ์ฒดํํ๋ค๋ ์ ์์ ์ฃผ์ด์ง ํ๋ก๊ทธ๋จ ์๋ฏธ์ ์์ค ์ธ์ฝ๋ฉ์ด๋ฉฐ ๋ค๋ฅธ ๊ฒ๋ณด๋ค ์์ค์ด ๋ ๋ง๋ค๋ ๊ฐ์ ์ ๊ธฐ๋ฐํฉ๋๋ค.
Haskell์ ๊ฒฝ์ฐ๋ ์ค๋ช ํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ๋ณต์กํฉ๋๋ค. Haskell์ ๋ชฉ๋ก์ ๊ฒ์ผ๋ฅด๋ฏ๋ก ๋ฌธ์์ด์ ๋ชจ๋ ๋จ์ผ ๋ฌธ์์ ๋ํด ์ฝํฌ๋ฅผ ํธ์ถํด์ผ ํ ์๋ ์์ต๋๋ค.
์ฌ์ค ์๊ณ ์์๋๋ฐ ๊ทธ๊ฒ ์ค์ํ ๊ฑด ์๋ ๊ฒ ๊ฐ์์. ๋ชฉํ๋ ๋ชจ๋ ๊ฒฝ๊ณ์์ ์๋ฏธ๋ก ์ ๋์์ค๋ฅผ ๋ชจ๋ ์ ์งํ๋ฉด์ Haskell ๋ฌธ์์ด์ ํํํ๋ ๊ฒ์ด ์๋๋๋ค. ๋ชฉํ๋ ๊ฐ์ ๋ฐ๋ผ Haskell ๋ฌธ์์ด์ IR ๋ฌธ์์ด๋ก ๋ณํํ๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ํ์ฐ์ ์ผ๋ก ์ ์ฒด ๋ฌธ์์ด์ ๊ณ์ฐํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค.
์ด ๋ ๊ฐ์ง ์๋ ์ด๋ฏธ ์ ์ธ์ ๋ฐ์ดํฐ ๋ ์ด์์์ด ์๋ฆฌ์ง ์๋๋ค๋ ๊ฒ์ ๋ณด์ฌ์ค๋๋ค. ๋ฐํ์ ์ฝ๋๋ฅผ ํธ์ถํ ์ ์์ด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ผ๋ฉฐ, ๋ฐํ์ ์ฝ๋์๋ ๊ณ ์ ํ ํธ์ถ ๊ท์น์ด ์์ ์ ์์ต๋๋ค.
๋ฐ์ธ๋ฉ์ ์ง์ ํ๋ ๋ฐฉ๋ฒ(๋๋ ๋ฐ์ธ๋ฉ์ ๋ํด ๋ฌด์์ด๋ ์ง์ ํ๋ ๊ฒฝ์ฐ)์ ๊ด๊ณ์์ด ์ด๋ฅผ ๋ชจ๋ธ๋งํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉ์ ์์ญ์์ ์ฒ๋ฆฌํ๋ ๊ฒ์
๋๋ค. ์ธ์ด์ ํ์ ํํ์ด ๋ฐ์ธ๋ฉ์ ์ง์ ๋งคํ๋์ง ์๋ ๊ฒฝ์ฐ ๋งคํํ๋ ํํ์ผ๋ก ๋ณํํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด Haskell์ ๋ฌธ์์ด์ด ์ค์ ๋ก (type $haskellString (struct (field i8) (field (func (result (ref $haskellString))))))
๋ก ํํ๋๋ค๋ฉด ์๊ฒฉํ ๋ฌธ์์ด๋ก ๋ณํํ๊ณ Scheme๊ณผ ์ ์ฌํ ๋ฐ์ธ๋ฉ์ ์ฌ์ฉํ๊ฑฐ๋ Text ๋ฐฐ์ด๋ก ๋ณํํ๊ณ Java์ ๊ฐ์ ๋ฐ์ธ๋ฉ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. CFFIString์ ์ฌ์ฉํ๊ณ C์ ๊ฐ์ ๋ฐ์ธ๋ฉ์ ์ฌ์ฉํฉ๋๋ค. ๋ถ์์ ํ ๋ฐ์ธ๋ฉ ์ ํ์ด ์ฌ๋ฌ ๊ฐ ์๋ค๋ ๊ฐ์น ์ ์์ ๊ทธ ์ค ์ผ๋ถ๊ฐ ๋ค๋ฅธ ๊ฒ๋ณด๋ค Haskell์ ๋ ์ด์ํ๊ณ ์ปดํ์ผ๋ฌ๋ฅผ ์์ ํ ํ์ ์์ด Wasm-FFI ์ ํ์ ๊ตฌ์ฑํ ์ ์๋ค๋ ๊ฒ์
๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ๊ฐ๋ ์ ์ผ๋ก ์๋นํ ๋จ์ํ ๋ฐ์ดํฐ ์ ํ์ธ ๋ฌธ์์ด์ผ ๋ฟ์ ๋๋ค. ์ธ์ด๊ฐ ์ ํ ์ ํ(ํํ/๊ตฌ์กฐ์ฒด/๊ฐ์ฒด)์ ๋ํ๋ด๋ ๋ฌดํํ ๋ฐฉ๋ฒ์ ๋ํด ์๊ฐํ๊ณ ์ถ์ง๋ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์์ ์ธก์์ ์ด๋ฌํ ๋ชจ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์์ฑํ ์ ์์ด์ผ ํฉ๋๋ค!
ํผ๋์ค๋ฝ์ต๋๋ค. "์ธ์ด ๊ฐ์ ๋ฐ์ธ๋ฉ์ ์์ ํ ๋ถ๊ฐ๋ฅํ๋ฏ๋ก ์ ํ ์๋ํด์๋ ์ ๋ฉ๋๋ค."๋ผ๊ณ ๋งํ์ง๋ง ๊ทํ๊ฐ ๋งํ ๋ด์ฉ์ "๋๋ ๋ฏฟ์ง ์์ต๋๋ค. ์ฌ๊ธฐ์ ์ค๋ช ๋ ์ ๊ทผ ๋ฐฉ์์ ๋ค๋ฃจ๊ธฐ ์ฝ์ต๋๋ค." ํจ์ฌ ๋ ํฉ๋ฆฌ์ ์ผ๋ก ๋ณด์ ๋๋ค. ํนํ ์ด ๋ ผ์ฆ์ ๋ํ ๋์ ๋ฐ๋๋ ๊ทธ๊ฒ์ด ์์ผ๋ก ๋์๊ฐ ๊ธธ์ ์ค๋ช ํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ์ด ๋ฌธ์ ๊ฐ "๋งค์ฐ ์ด๋ ต๋ค"๋ ์ ์ ๊ฐ์ํ ๋ ์ฐ๋ฆฌ๋ ๋ฌด์์ ํด์ผ ํฉ๋๊น?
๋์ , ์ฐ๋ฆฌ๋ ๋ช ๊ฐ์ง ํน๊ถ์ ์์ํฉ๋๋ค
๊ฑฐ์ ํ์คํฉ๋๋ค. ๋ฌธ์ ๋ ์ต์ ์ผ๋ก ์ง์๋๋ ์์์ ์ธ์ด๊ฐ ์ด๋ ์ ๋ ํน๊ถ์ ๋๋ฆฌ๋๊ฐ ํ๋ ๊ฒ์ ๋๋ค. ์์ธ๋ ์ธ์ด๊ฐ ์ธ์ฒด๊ณตํ์ ์๋ฃจ์ ์ ์ฐพ๋ ๋ฐ ์ผ๋ง๋ ์ฌ์ ๊ฐ ์์ต๋๊น?
์ด๋ฏธ ์์์ ์ธ ๊ฒ๋ค์ ํฐ ๋๋ฌผ์์ ์ฑ์ฅ์ํค๋ ๋์.
๋ฌด์จ ๋ง์์ด์ ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์์์ ์ธ ๊ฒ์ ๋ํ ๋์ ํด์์ "์ฐ๋ฆฌ๋ ์ด๋ค ์ธ์ด๋ฅผ ์ง์ํฉ๋๊น?"์ด์ง๋ง ์ด๋ ์ด์ค์ผ๋ก ๊ณ์ฐ๋๋ "๋ช ๊ฐ์ง ๊ถํ ๋ถ์ฌ"์ ๋์ผํฉ๋๋ค. ๋ฐ๋ผ์ ์ด๊ฒ์ ์ฌ๋ฌ ์์ค์ด ์๋ ํ ์์ค์์๋ง ์น๋ช ์ ์ธ ๊ฒฐํจ์ด ์์ต๋๋ค. D
@aardappel ์งง์ ๋ฒ์ ์ ์ ์ธ์ ์ถ์ ์ ๊ทผ ๋ฐฉ์์ด ์คํจํ ๊ฒฝ์ฐ ๋ด ๋ฐฑ์ ๊ณํ์ ๋๋ค. ์์ ํ ๋ฐ๋ ๋ฐฉํฅ์ผ๋ก ์ด๋ํ์ฌ ์ง๋ ฌํ ํ์์ ์ค๋ช ํฉ๋๋ค. ์น ์์ฒด๋ ๋งค์ฐ ๋ฎ์ ๊ณตํต ๋ถ๋ชจ์ด๊ธฐ ๋๋ฌธ์ ๊ฑฐ์ ์ ์ ์ผ๋ก ํ ์คํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถ๋๋ค๋ ๊ด์ฐฐ์ด ์ด๋ฃจ์ด์ง๋๋ค. ํ ์คํธ๋ ๋ชจ๋ ๋๊ตฌ์์ ์ฝ๊ฒ ์ดํดํ ์ ์์ผ๋ฏ๋ก ์น๊ณผ ๊ฐ์ ๊ฒ์ด ๊ทธ ์์ ๊ฐ๋ฅํฉ๋๋ค.
๊ทธ ์ ๊ทผ ๋ฐฉ์์ ๋ค๋ฃจ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ค ์ ์๋ ๋ฒํผ ๋ด ๋ฐ์ดํฐ์ ๋ํ ๊ฐ์ฅ ํฐ ์ฐ๋ ค๋ ์ฐธ์กฐ ์ ํ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ๋ด๊ฐ ๊ฐ์ง ๊ฐ์ฅ ์ข์ ์์ด๋์ด๋ ํ ์ด๋ธ์ ๊ณต์ ํ๊ณ ์ธ๋ฑ์ค๋ฅผ ์ง๋ ฌํํ๋ ๊ฒ์ด์ง๋ง ์ค์ ๋ก ์ผ๋ง๋ ์ ์๋ํ๋์ง์ ๋ํ ์์ ํ ๊ทธ๋ฆผ์ ์์ต๋๋ค.
@jgravelle-google ์ฐธ์กฐ ์ ํ์ ๋ณ๋๋ก ์ ์งํด์ผ ํฉ๋๊น? ๋ฐ๋ผ์ ์ฃผ์ด์ง ํจ์์ ์์ ์๋ช
์ ref ref i32 i32 i32 i32
์ด๋ ์ค์ ๋ก 2๊ฐ์ anyref ๋ค์ ํน์ ์ ํ์ 2๊ฐ์ ๋ฒํผ๊ฐ ์์ต๋๋ค(์์ ๊ฐ์ ์คํค๋ง์ ์ง์ ๋จ).
(์ฌ๋ด์ผ๋ก, ๋๋ ํ์ค์ผ์ ์ต์ ํด์,ํ์ง๋ง ๋ฌธ์์ด์ ์์ด๋์ด๋ ๋ฌธ์์ ๊ฒ์ผ๋ฅธ ๋ชฉ๋ก์ ๋ด ๋ง์์ ๋ ๋ คํ๋ค. ์ง๊ธ๊น์ง ๋ฌด์์ด๋ ํ ์์๋ ๊ฐ์ฅ ํจ์จ์ ์ธ ๋๋ ํธ๋ฆฌํ ๋ฐฉ๋ฒ์ ๋ฐ์ดํธ์ ๋ชฉ๋ก์ ์ฐ๊ฒฐํ๋ฉด? ๋ด๊ฐ ํ์ค์ผ๊ฐ ๋ชจ๋ ๊ฒ์ ํ์๋ก ์ป์ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ๊ณ ์ฐ๊ฒฐ ๋ชฉ๋ก์ ์ ๋ ดํ ์ถ๊ฐ๋ฅผ ํ์ฉํ์ง๋ง ์ฐ๊ฒฐ ๋ชฉ๋ก์ ์ฌ์ฉํ์ง ์๊ณ ๋ถ๋ณ ๋ฌธ์์ด์ ๊ฐ์ ธ์ค๊ณ ์กฐ์ํ ์ ์์ต๋๋ค.)
๊ทธ ์ ๊ทผ ๋ฐฉ์์ ๋ค๋ฃจ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ค ์ ์๋ ๋ฒํผ ๋ด ๋ฐ์ดํฐ์ ๋ํ ๊ฐ์ฅ ํฐ ์ฐ๋ ค๋ ์ฐธ์กฐ ์ ํ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ๋ด๊ฐ ๊ฐ์ง ๊ฐ์ฅ ์ข์ ์์ด๋์ด๋ ํ ์ด๋ธ์ ๊ณต์ ํ๊ณ ์ธ๋ฑ์ค๋ฅผ ์ง๋ ฌํํ๋ ๊ฒ์ด์ง๋ง ์ค์ ๋ก ์ผ๋ง๋ ์ ์๋ํ๋์ง์ ๋ํ ์์ ํ ๊ทธ๋ฆผ์ ์์ต๋๋ค.
๊ทธ๊ฒ์ด ๋ด๊ฐ capnproto๋ฅผ ์ธ์ฝ๋ฉ์ผ๋ก ์ ์ํ ์ด์ ์ค ํ๋์ ๋๋ค. ์ฐธ์กฐ ํ ์ด๋ธ์ ๋ค์ ๋ด์ฅ๋์ด ์์ต๋๋ค.
์ด์จ๋ ์ฐ๋ฆฌ๋ ๋ฐ์ดํฐ ๊ทธ๋ํ์ ์ด๋ ๊ณณ์๋ ๋ฐฐ์นํ ์ ์๋ 1๊ธ ์๋ฏผ์ผ๋ก ์ฐธ์กฐ ์ ํ์ ๊ฐ๋๋ก ์ ํํ ๋ชจ๋ ํ์์ ์ํฉ๋๋ค. (์: ์ ํ ์ฌํญ, ๋ฐฐ์ด, ๋ณํ ๋ฑ)
์๊ฒฌ์ ๋ณด๋ด์ฃผ์ ๋ชจ๋ ๋ถ๋ค๊ป ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
๋๋ ์ฐ๋ฆฌ๊ฐ ๊ฑฐ์ ๋ณ๋ ์์ด ๋์ผํ ์ฃผ์ฅ์ ๋ค์ ์ฝ๋ ์ง์ ์ ๋๋ฌํ๊ธฐ ์์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋์ ์ ์์ ์ ๋ฐ์ดํธํ๊ณ ๋ชจ๋ ์ฌ๋์ ์ฐ๋ ค๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ๋ ธ๋ ฅํ ๊ฒ์ ๋๋ค. ์ ๋ฐ์ดํธ๋ ์ ์์ ์์ฑ์ ๋ง์น๋ฉด ์ ๋ฌธ์ ๋ก ๋ค์ ์์ํ ๊ฒ์ ๋๋ค.
์ง๊ธ๊น์ง์ ํผ๋๋ฐฑ์ ์์ฝํ์๋ฉด:
์ง๋ ฌํ ํ์์ด ์๋ ๊ฒฝ์ฐ wasm์ ๊ฐ์ฅ ์ ํฉํ ํ์์ ๋ํ ํฉ์๋ ๊ฑฐ์ ์์ต๋๋ค. ๋์์๋ FlatBuffers, ์์ ํฌ์ธํฐ๊ฐ ์๋ C ABI ๊ตฌ์กฐ ๊ทธ๋ํ, ๋ง์ถคํ wasm IDL ํ์ ๋๋ ์์ ์ผ๋ถ ์กฐํฉ์ด ํฌํจ๋ฉ๋๋ค.
์ ์์๋ ๋ ๊ฐ๋ ฅํ ๋ถ์ ์ ์ธ ๊ณต๊ฐ์ด ํ์ํฉ๋๋ค. ์ ์์ ๋ฒ์์ ์ฉ์ดํ๊ฒ ํ๋ ค๋ ์ฌ์ฉ ์ฌ๋ก(์ ์ ๋ ๋์ ์ฐ๊ฒฐ, ๋ชจ๋ ๋ ํธ์คํธ ๋ ํธ์คํธ ๋ ํธ์คํธ, ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๋ฐ์ดํฐ ๊ณต์ ๋ ๋ณ๊ฒฝํ ์ ์๋ ๋ฉ์์ง ์ ๋ฌ)์ ๋ํด ํผ๋์ค๋ฌ์ํ๋ ์ฌ๋ฌ ๋ ์.
@lukewagner ๋ ESM ํตํฉ๊ณผ ๊ฒฐํฉ๋ ๋ ์ํธ ์ ๋ขฐํ์ง ์๋ ๋ชจ๋์ ์ฐ๊ฒฐํ๋ ๋ชจ๋ ์์คํ ์ ์ ์ฌ๋ ฅ์ ๋ํด ์ฝ๊ฐ์ ์ด์๋ฅผ ํํ์ต๋๋ค. ์ ์์ ๋ค์ ๋ฐ๋ณต์ ๊ทธ ์ ์ฌ๋ ฅ์ ํ์ฅํด์ผ ํฉ๋๋ค. ํนํ, ์ด์ ๋ฒ์ ๊ณผ ํธํ๋๋ ์ ํ ์์คํ ์ ์ฌ์ฉํ๋ฉด wasm์ด npm๊ณผ ๊ฐ์ ์ข ์์ฑ ํธ๋ฆฌ ๋ชจ๋ธ์ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ฉด์ ์ข ์์ฑ ๋ค์ด์๋ชฌ๋ ๋ฌธ์ ์ ์ ๋ฉด์น๋ถ๋ฅผ ํผํ ์ ์๋ค๊ณ ๋ฏฟ์ต๋๋ค.
๊ธฐ๋ฅ ์ฃผ์ , ์ฆ ๋ฐํ ๋ฐ ์ ๋ฌํ ์ ์์ง๋ง ์์ ๋ฐ์ดํฐ์์ ์์ฑํ ์ ์๋ ๋ถํฌ๋ช ํ ๊ฐ์ ๋ํ ํผ๋๋ฐฑ์ ๊ฑฐ์ ์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ ๋ค์ ๋ฐ๋ณต์ด ๊ทธ๊ฒ๋ค์ ํจ์ฌ ๋ ์ค์ ์ ๋์ด์ผ ํ๋ค๋ ์ ํธ๋ก ๋ฐ์๋ค์ ๋๋ค.
๋ช๋ช ๋ ์๋ค์ ์ธ์ด ๊ฐ ์ ํ ์์คํ ์ ์คํ ๊ฐ๋ฅ์ฑ์ ๋ํด ์ฐ๋ ค๋ฅผ ํ๋ช ํ์ต๋๋ค. ์ด๋ฌํ ์ฐ๋ ค๋ ๋ถ๋ถ์ ์ผ๋ก ์ฃผ์ ๊ฐ ๋งค์ฐ ์ถ์์ ์ด๊ธฐ ๋๋ฌธ์ ๋ถ๋ถ์ ์ผ๋ก๋ ๋ค์ ๋ชจํธํ๊ณ ์ ์ํ๊ธฐ ์ด๋ ต์ต๋๋ค. ๋ถ๋ถ์ ์ผ๋ก๋ ์ง๊ธ๊น์ง ์ ์ ์์ฒด๊ฐ @lukewagner ์ ๋ญ๊ณผ ๋ฌ๊ฑ ๋ฌธ์ ๋ฅผ ๋ฐ์ํ๋ ๋งค์ฐ ๋ชจํธํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ํน์ ์ค๋ฅ ์ํ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋ค์ ์ ์ ๋ฐ๋ณต์์๋ ์ด๋ค ์์ผ๋ก๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผ ํฉ๋๋ค.
ํนํ, ํ ๋ก ์ ๋ช ๊ฐ์ง ์๋ฑํ ์์์ ์ถ๋ก ํ๋ ๋ฐ ๋ง์ ๋์์ด ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ฌํ ์์๋ n*n ๋ฌธ์ ๋ฅผ ์ค๋ช ํ๊ธฐ ์ํด ์๋ก ๋ค๋ฅธ ๋ฐ์ดํฐ ๋ ์ด์์(์: C++ ๋ฐ Java)์ ์ฌ์ฉํ์ฌ ์๋ก ๋ค๋ฅธ ์ธ์ด๋ก ์์ฑ๋ ์ต์ ๋ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํฌํจ๋๋ฉฐ ์๋ก ๋ค๋ฅธ ์ธ์ด(์: Rust ๋ฐ Python)์ ์ต์ ๋ ๊ฐ ์ด์์ ํ๋ก๊ทธ๋จ์์ ์ฌ์ฉ๋ฉ๋๋ค. ํด๊ฒฐํ๊ธฐ ์ํ ์ ๋ต์ ๋๋ค.
๋ํ ๋ ์๋ค์ด ์ง์ ํ๋ฏ์ด ์ด ์ ์์ ํ์ฌ ์ ํ ์คํค๋ง์ ๊ฐ๋ ๊ณผ ๊ทธ ํํ์ ๊ฐ๋ ์ ์ฝํ ์์ต๋๋ค. ์ ์์๊ฐ ํํ ํ์์ ์๊ตฌ ์ฌํญ์ ์ ์ ํ๊ฒ ๋ฐฐ์นํ๋ ๋์ ์ถ์ ์ ํ ์คํค๋ง์ ์๊ตฌ ์ฌํญ์ ๋จผ์ ๋ฐฐ์นํด์ผ ํฉ๋๋ค.
์ด์จ๋ ์ง๊ธ๊น์ง ์ด ํ ๋ก ์ ์ฐธ์ฌํด ์ฃผ์ ๋ชจ๋ ๋ถ๋ค๊ป ๋ค์ ํ ๋ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์ต๋ํ ๋น ๋ฅธ ์์ผ ๋ด์ ๋ณด๋ค ์ฒ ์ ํ ์ ์์ ๋๋ฆด ์ ์๋๋ก ๋ ธ๋ ฅํ๊ฒ ์ต๋๋ค. ์ฌ๊ธฐ ์๋ ๋๊ตฐ๊ฐ๊ฐ ์ ๊ฐ ์์ฑํ๋ ๋ฐ ๋์์ด ๋๋ค๋ฉด ์ ์๊ฒ ์ด๋ฉ์ผ์ ๋ณด๋ด์ฃผ์ธ์!
@jgravelle-google:
๋ฐ์ธ๋ฉ์ ์ง์ ํ๋ ๋ฐฉ๋ฒ(๋๋ ๋ฐ์ธ๋ฉ์ ๋ํด ๋ฌด์์ด๋ ์ง์ ํ๋ ๊ฒฝ์ฐ)์ ๊ด๊ณ์์ด ์ด๋ฅผ ๋ชจ๋ธ๋งํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉ์ ์์ญ์์ ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋๋ค.
๋ค, ์ ๋ ๋์ํฉ๋๋ค. ์ ์ฃผ์ฅ์ @aardappel ๊ณผ ๋น์ทํฉ๋๋ค. ๊ทธ๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ์ผ๋ฐ์ ์ผ๋ก ํด์ผ ํ๋ ์ผ์ด๋ผ๋ฉด ๊ทธ๋ฅ ๋ฐ์๋ค์ฌ์ผ ํ๊ณ ์ด์ํ ๊ฒฝ์ฐ๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ์์๋ก ์๋ํ์ง ์์์ผ ํฉ๋๋ค. Userland๋ Wasm์ ๋ค๋ฅธ ๋ชจ๋ ๊ฒ์ ์ ์ ์ผ๋ก ์ ํ์ด ์ํ๋ ๊ณณ์ ๋๋ค.
ํผ๋์ค๋ฌ์์ "์ธ์ด ๊ฐ์ ๋ฐ์ธ๋ฉ์ ์์ ํ ๋ถ๊ฐ๋ฅํ๋ฏ๋ก ์ ํ ์๋ํ์ง ์์์ผํฉ๋๋ค."
์ธ์ด ๊ฐ์ ๋ฐ์ดํฐ ์ํธ ์ด์ฉ์ฑ์ ์ํด DDL(์ ํ ์ฒด๊ณ)์ ์ ์ํ๋ ๊ฒ์ด ์์ ํ ๋ฐ๋์งํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ Wasm์ผ๋ก์ ๋ณํ์ ๊ตฌ์ถํ๋ ๊ฒ์ด ๋ค๋ฃจ๊ธฐ ํ๋ค๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ๋ณํ์ ์ฌ์ฉ์ ์์ญ์์ ๊ตฌํํด์ผ ํฉ๋๋ค. ๋ฐ์ธ๋ฉ ๋ ์ด์ด๋ ์ฌ์ฉ์ ์ฝ๋๊ฐ ์์ฑ/์๋นํด์ผ ํ๋ ํ์์ ๊ท์ ํฉ๋๋ค.
์ด๋ฏธ ์์์ ์ธ ๊ฒ๋ค์ ํฐ ๋๋ฌผ์์ ์ฑ์ฅ์ํค๋ ๋์.
๋ฌด์จ ๋ง์์ด์ ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์์์ ์ธ ๊ฒ์ ๋ํ ๋์ ํด์์ "์ฐ๋ฆฌ๋ ์ด๋ค ์ธ์ด๋ฅผ ์ง์ํฉ๋๊น?"์ด์ง๋ง ์ด๋ ์ด์ค์ผ๋ก ๊ณ์ฐ๋๋ "๋ช ๊ฐ์ง ๊ถํ ๋ถ์ฌ"์ ๋์ผํฉ๋๋ค.
์ฃ์กํฉ๋๋ค. ์ ๋ ์ด๋ฌํ ๋ณํ์ ๋ํด ๋งค์ฐ ํ์ค์ ์ธ ๊ฒ์ ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ฐ๋ผ์ ์ ํ์ "์์"์ ๊ฐ๋ณ ์๋ฏธ์ ๋๋ค.
์ฐธ์กฐ ์ ํ์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ ์์ต๋๊น?
์, ์ข์ ์ง๋ฌธ์ด๋ค์. FWIW, ์ฐ๋ฆฌ๋ Dfinity ํ๋ซํผ์ ์ํ IDL/DDL์ ๋ํด ๋ฐ๋ก ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ๋ ธ๋ ฅํ๊ณ ์์ต๋๋ค. anyref๋ง ์๋ ํ ์๋ฃจ์ ์ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค. ์ง๋ ฌํ ํ์์ ํฌ๋ช ํ ๋ฐ์ดํฐ๋ฅผ ํฌ์ํ๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ๋ผ์ด์ค์ ํฌํจ๋ ์ฐธ์กฐ๋ฅผ ํฌ์ํ๋ ํ ์ด๋ธ ์ฌ๋ผ์ด์ค์ ๋ ๋ถ๋ถ์ ์ ์ํฉ๋๋ค. ์ฌ๋ฌ ์ฐธ์กฐ ์ ํ์๋ ๊ทธ์ ๋ฐ๋ผ ์ฌ๋ฌ ํ ์ด๋ธ ์กฐ๊ฐ์ด ํ์ํฉ๋๋ค. ๊น๋ค๋ก์ด ์ง๋ฌธ์ ref ์ ํ ์ธํธ๊ฐ ๋ ์ด์ ์ ํํ์ง ์์ ๊ฒฝ์ฐ(์: ์ ํ์ด ์ง์ ๋ ํจ์ ์ฐธ์กฐ์ ๊ฒฝ์ฐ) ์ํํ ์์ ์ ๋๋ค.
GC ์ ํ์ด ์์ผ๋ฉด GC ๊ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ๋ ๋์ฒด ๋ฐฉ๋ฒ์ด ์์ด์ผ ํฉ๋๋ค. ์ด ๊ฒฝ์ฐ ์ฐธ์กฐ๋ ์์ ๋กญ๊ฒ ํผํฉ๋ ์ ์์ผ๋ฏ๋ก ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค.
@PoignardAzur :
์ฌ๋ด์ผ๋ก ์ ๋ Haskell์ ์ต์ํ์ง ์์ง๋ง ๋ฌธ์์ด์ ๊ฒ์ผ๋ฅธ ๋ฌธ์ ๋ชฉ๋ก์ผ๋ก ์๊ฐํ๋ฉด ๋ง์์ด ํ๋ค๋ฆฝ๋๋ค.
๋ค, ์์ฆ์ ๊ทธ๊ฒ์ด ์ค์๋ก ๋๋ฆฌ ๊ฐ์ฃผ๋๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ "๋จ์ํ" ๋ฐ์ดํฐ ์ ํ์ ๋ํด์๋ ์ผ๋ง๋ ๋ง์ ๋ค์์ฑ์ด ์๋์ง ๋ณด์ฌ์ค๋๋ค.
@rossberg
์ธ์ด ๊ฐ์ ๋ฐ์ดํฐ ์ํธ ์ด์ฉ์ฑ์ ์ํด DDL(์ ํ ์ฒด๊ณ)์ ์ ์ํ๋ ๊ฒ์ด ์์ ํ ๋ฐ๋์งํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ Wasm์ผ๋ก์ ๋ณํ์ ๊ตฌ์ถํ๋ ๊ฒ์ด ๋ค๋ฃจ๊ธฐ ํ๋ค๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ๋ณํ์ ์ฌ์ฉ์ ์์ญ์์ ๊ตฌํํด์ผ ํฉ๋๋ค.
๋์ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ง๋ถ์ด์๋ฉด: ์ ๋ wasm์ด ๋ค๋ฅธ ํ๋ซํผ๋ณด๋ค ์ธ์ด ๊ฐ ์๋ฃจ์ ์ด ๋ ํ์ ํ๋ค๊ณ ์๊ฐํ์ง ์๊ธฐ ๋๋ฌธ์ wasm ์ฌ์์ ๋ฌด์ธ๊ฐ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ํ์์ ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ wasm๋ ๊ทธ๋ ๊ฒ ์๊ฐํ์ง ์์ต๋๋ค ๋ค๋ฅธ ํ๋ซํผ๋ณด๋ค ์ด๋ฌํ ์๋ฃจ์ ์ ๊ตฌํํ ์ ์๋ ๋ฅ๋ ฅ์ด ๋ฐ์ด๋ฉ๋๋ค . ์ฌ๊ธฐ์ was์ ๋ํด ๋์๊ฒ ๋ช ๋ฐฑํ๊ฒ ํน๋ณํ ๊ฒ์ ์์ต๋๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๊ฐ @aardappel์ด ์ธ๊ธํ ๋ฒํผ์ ๊ฐ์ด ์ด ์์ญ์์ ํ์ค ์๋ฃจ์ ๋ณด๋ค ๋ ๋์ ์ด์ ๋ฅผ
์ ์ด๋ ์น์์ wasm์ด ๊ฐ์ง ํ ๊ฐ์ง ํน๋ณํ ๊ฒ์ ๋ฌธ์์ด ๋ฐ ๋ฐฐ์ด ๋ฑ์ ๋ํ JavaScript/Web API ์ ํ์ ๋๋ค. ๊ทธ๋ค๊ณผ ์ํธ ์์ฉํ ์ ์๋ค๋ ๊ฒ์ ๋ถ๋ช ํ ์ค์ํฉ๋๋ค.
๋๋ wasm์ด ๋ค๋ฅธ ํ๋ซํผ๋ณด๋ค ์ธ์ด ๊ฐ ์๋ฃจ์ ์ด ๋ ํ์ํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
์ ์๊ฐ์๋ ๊ทธ๋ ์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์น์์ ์ฌ์ฉ๋๋ค๋ ๊ฒ์ ์ฝ๋๊ฐ ๋ค๋ฅธ ์ปจํ
์คํธ์์ ์คํ๋ ์ ์๊ณ ์คํ๋ ๊ฒ์์ ์๋ฏธํฉ๋๋ค. <script src="http://some.other.site/jquery.js">
์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋๋ ์ฌ๋๋ค์ด cross-origin ๋ฐฉ์์ผ๋ก wasm ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฒฐํฉํ๋ ๊ฒ์ ๋ณด๊ณ ์ถ์ต๋๋ค. ์น์ด ์ ๊ณตํ๋ ์์์ฑ๊ณผ ๊ตฌ์ฑ์ฑ ์์ฑ์ผ๋ก ์ธํด ์ธ๋ถ ๋ชจ๋๊ณผ ์ธํฐํ์ด์คํ ์ ์๋ ๋ถ๊ฐ๊ฐ์น๋ ๋ค์ดํฐ๋ธ ์์คํ
์์ ๊ทธ ์ด๋ ๋๋ณด๋ค ๋์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋๋ wasm์ด ๋ค๋ฅธ ํ๋ซํผ๋ณด๋ค ๊ทธ๋ฌํ ์๋ฃจ์ ์ ๊ตฌํํ๋ ๋ฅ๋ ฅ์ด ๋ ๋ฐ์ด๋๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ทธ๋ ๊ฒ ์๊ฐํฉ๋๋ค. wasm์ ์๋ฒ ๋์ ์ํด / ํธ์คํธ์์ ์คํ๋๊ธฐ ๋๋ฌธ์ ์ฝ๋ ์์ฑ์ ํจ๊ณผ์ ์ผ๋ก ์ถ์ํ๋ฉ๋๋ค. ๊ทธ ๋๋ฌธ์ VM์ ๋ค์ดํฐ๋ธ ์์คํ ์์๋ ๋ถ๊ฐ๋ฅํ ๋ ๋์ ์์ค์ ๊ตฌ์ฑ์ ์ง์ํ ์ ์๋ ํจ์ฌ ๋ ๋ง์ ๋๊ตฌ์ ์ฌ์ ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
๊ทธ๋์ ์ ๋ ์ด ๊ณต๊ฐ์ ์ด๋ค ๊ฒ์ด ๋ค๋ฅธ ์์คํ ๋ณด๋ค ๋ ๊ฐ์น ์๊ณ ๋ ๊ฐ๋ฅ์ฑ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋์ wasm์ด ์ด ๋งฅ๋ฝ์์ ํน๋ณํ ์ด์ ์ ๋๋ค. ๋์๊ฒ JS interop์ wasm ๋ชจ๋์ด ์ธ๊ณ์ ๋ํ ๋งค์ฐ ๋ค๋ฅธ ๊ด์ ์ ๊ฐ์ง ์ธ๋ถ ์ฌ๋ฌผ๊ณผ ๋ํํ ์ ์์ด์ผ ํ๋ค๋ ๋ณด๋ค ์ผ๋ฐ์ ์ธ ๊ฐ๋ ์ ํน๋ณํ ๊ฒฝ์ฐ์ ๋๋ค.
์ด๋ฅผ ์ํ ๊ฒฝ๋ก๋ ํ์ฌ๋ก์๋ ์ด๊ฒ์ ์์ ํ ๋๊ตฌ ์์ค ์ํธ ์ด์ฉ์ฑ์ผ๋ก ๋ฐ์ด๋ฃ๊ณ ์น๋ฆฌํ ํ์์ด ๋์ฌ ๋๊น์ง ํ์คํ๋ฅผ ์ฐ๊ธฐํ๋ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ ๋ชฉํ๊ฐ ์ฃผ์ด์ง ์ธํฐํ์ด์ค ํ์์ ์ฌ์ฉํ์ฌ wasm ํจํค์ง ๊ด๋ฆฌ์์ ์์ฝ์์คํ ์ ์ง๋ฐฐํ๋ ๊ฒ์ด๋ผ๋ฉด(๊ทธ๋ฆฌ๊ณ NPM ๋๋ WAPM ๋๋ ์์ง ์์ฑ๋์ง ์์ ํจํค์ง ๊ด๋ฆฌ์์ธ๊ฐ์?) ํ์คํ์ ๋ ๋ฆฝ์ ์ผ๋ก ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด๋ก ์ ์ผ๋ก ์ฐ๋ฆฌ๋ ๋ ๋์ ์ฑ๋ฅ์ ์ป๊ธฐ ์ํด ์ฌ๋๋ค์ด ์ด๋ฏธ ํ๊ณ ์๋ ์ผ์ ํ์คํํ ์ ์์ง๋ง ์ธ์ฒด ๊ณตํ์ ์ฌ์ฉ์ ์์ญ์์ ๊ตฌํ๋ ์ ์์ต๋๋ค. ์ฐ์นํ ์ธ์ด ๊ฐ ํ์์ด ์ต์ ํ์ ์ ํฉํ์ง ์์ ์ฌ์ค์ ์ฐจ์ ์ ํ์ค์ด ๋๋ ์ํ์ด ์์ต๋๋ค. ๋์ค์ ํ์คํํ ์๋๋ก ํ์์ ๋์์ธํ ์ ์๋ค๋ฉด(์ฌ์ฉ์ ์ ์ ์น์ ์ ์ ์ธ์ ์คํ์ผ์ด ๋๋ถ๋ถ ์ถฉ๋ถํฉ๋๊น?) ์ด๋ฌํ ์ํ์ ์ ๊ฑฐํ์ง๋ง ์ฑ๋ฅ ํฅ์๋ ์ง์ฐ๋ฉ๋๋ค. ๋์๊ฒ ์ฑ๋ฅ์ ์ด๋ฐ ์ข ๋ฅ์ ๊ฒ์ ๊ฐ๊ฒ ํ๋ ๋ ํฅ๋ฏธ๋ก์ด ๋๊ธฐ ์ค ํ๋์ด๋ฏ๋ก ๋ค๋ฅธ ์ฌ๋๋ค์ ๋์ํ์ง ์์ ์ ์์ง๋ง ๋๋ ๊ทธ๊ฒ์ ๋ํด ๊ฝค ๊ด์ฐฎ์ต๋๋ค.
(๊ทธ๋ฆฌ๊ณ NPM์ด๋ WAPM ๋๋ ์์ง ์์ฑ๋์ง ์์ ํจํค์ง ๊ด๋ฆฌ์์ ๋๊น?)
WAPM์ด ์คํ ๊ฐ๋ฅํ ํจํค์ง ๊ด๋ฆฌ์๊ฐ ๋๊ธฐ์๋ ๋๋ฌด ์ด๋ฅด๋ค๊ณ ์๊ฐํฉ๋๋ค. wasm ํจํค์ง ๊ด๋ฆฌ์๊ฐ ์คํ ๊ฐ๋ฅํ๊ฒ ๋๊ธฐ ์ ์ ํ์คํํ ESM ํตํฉ, WASI ๋ฐ ์ผ๋ถ ํํ์ ์ธ์ด ๊ฐ ๋ฐ์ธ๋ฉ๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ด ํ์ํฉ๋๋ค.
์๋ ๊ทธ๋๋ก WAPM์ ์ข ์์ฑ ๊ด๋ฆฌ ๊ธฐ๋ฅ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋๋ wasm์ด ๋ค๋ฅธ ํ๋ซํผ๋ณด๋ค ์ธ์ด ๊ฐ ์๋ฃจ์ ์ด ๋ ํ์ํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
์ ์๊ฐ์๋ ๊ทธ๋ ์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์น์์ ์ฌ์ฉ๋๋ค๋ ๊ฒ์ ์ฝ๋๊ฐ ๋ค๋ฅธ ์ปจํ ์คํธ์์ ์คํ๋ ์ ์๊ณ ์คํ๋ ๊ฒ์์ ์๋ฏธํฉ๋๋ค. ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก
๋ณํ์ ์ฌ์ฉ์ ์์ญ์์ ๊ตฌํํด์ผ ํฉ๋๋ค. ๋ฐ์ธ๋ฉ ๋ ์ด์ด๋ ์ฌ์ฉ์ ์ฝ๋๊ฐ ์์ฑ/์๋นํด์ผ ํ๋ ํ์์ ๊ท์ ํฉ๋๋ค.
๊ทธ๊ฒ์ ๋์๊ฒ ์ข์ ์์ฝ์ ๋๋ค.
์ ์ด์์ ์์ฑํ๋ ๋์ ์ด ์ค๋ ๋์ ๋ชจ๋ ์ฌ๋์๊ฒ ์ด๋ ค ์๋ ์ง๋ฌธ์ด ์์ต๋๋ค.
WebAssembly๋ก ์ปดํ์ผ๋ ๊ฒฝ์ฐ ๋ชจ๋ ์ธ์ด์์ ์ฌ์ฉํ ์ ์๋ ๊ธฐ์กด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ต๋๊น?
์ ๋ ๋ณธ์ง์ ์ผ๋ก ๋์์ธ์ ๊ธฐ๋ฐ์ด ๋ ์ ์ฌ์ ์ธ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ฐพ๊ณ ์์ต๋๋ค. ์ ๋ง์ ๊ฒ(ํนํ React, Bullet ์์ง ๋ฐ ํ๋ฌ๊ทธ์ธ ์์คํ )์ด ์์ง๋ง ์์ ํ ์์ ๊ฐ ๋ ํ์ํฉ๋๋ค.
@PoignardAzur C์ ๋ง์ ์ธ์ด๋ ๋์ผํ Perl ํธํ ์ ๊ท์(PCRE) ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ง๋ง ๋ธ๋ผ์ฐ์ ์๋ฒ ๋ฉ์์๋ JS์ Regex API๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
@PoignardAzur BoringSSL๊ณผ libsodium์ด
๋ํ Cap'n Proto RPC ๊ตฌํ๋ ์์ง๋ง ์ด๊ฒ์ ์ด์ํ ๊ฒ์ ๋๋ค. Cap'n Proto์ _serialization_ ๋ ์ด์ด๋ ๋๋ถ๋ถ์ด ๊ด์ฉ์ ์ด๊ณ ์ธ๋ผ์ธ์ด์ด์ผ ํ๋ ๋๊ณ ์์ API ๋ ์ด์ด์ด๊ธฐ ๋๋ฌธ์ ํ์ค์ ์ผ๋ก ๊ฐ ์ธ์ด์์ ๋ ๋ฆฝ์ ์ผ๋ก ๊ตฌํ๋์ด์ผ ํฉ๋๋ค. -์น์ํ. RPC ๊ณ์ธต์ธ OTOH๋ ์ข์ง๋ง ๊น์ต๋๋ค. ์์น์ ์ผ๋ก FFI ๊ฒฝ๊ณ๋ฅผ ๋์ด capnp๋ก ์ธ์ฝ๋ฉ๋ ๋ฐ์ดํธ ๋ฐฐ์ด ์ฐธ์กฐ๋ฅผ ์ ๋ฌํ์ฌ ์์์ ์ธ์ด์ ์ง๋ ฌํ ๊ตฌํ ๋ค์์ C++ RPC ๊ตฌํ์ ์ฌ์ฉํ ์ ์์ด์ผ ํฉ๋๋ค...
์ ์๊ฐ์๋ ๊ถ๊ทน์ ์ผ๋ก ์ ์๋ ์์ ์ ์ํํ๋ ค๋ฉด ์ด๋ฏธ ์กด์ฌํ๋ ์น ์ด์ ๋ธ๋ฆฌ ์์ฒด์ ๋ํด ์๋นํ ์นจ์ ์ ์ธ ๋ณ๊ฒฝ์ด ํ์ํ์ง๋ง ๊ทธ๋งํ ๊ฐ์น๊ฐ ์์ ์ ์์ต๋๋ค.
SmallTalk ์ธ๊ณ๋ ๋ชจ๋ ์ ํ์ ํฌ๊ธฐ๋ฅผ ๋ค์ ํจ์จ์ ์ผ๋ก ๋ํ๋ผ ์ ์๋ ํจ์จ์ ์ธ ์ง๋ ฌํ ํ๋กํ ์ฝ์ธ ์ํ ๋ณต์ ํ๋กํ ์ฝ(SRP) ๊ฐ๋ฐ์ ๋์์ด ๋ ์ ์๋ ๊ทธ๋ฌํ ๋ ธ๋ ฅ์ ๋ํด ๊ธ์ ์ ์ธ ๊ฒฝํ์ ๊ฐ์ง๊ณ ์์์ ์๋ ค๋๋ฆฝ๋๋ค. VM ๋๋ FPGA๋ฅผ ์ํ ๊ธฐ๋ณธ ๋ฉ๋ชจ๋ฆฌ ๋ ์ด์์์ผ๋ก ๋ง๋๋ ๊ฒ์ ๊ณ ๋ คํ์ง๋ง ์๋ํ์ง ์์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ์ข์ ๊ฒฐ๊ณผ์ ํจ๊ป ์ ์ด๋ ํ๋์ ๋ค๋ฅธ ์ธ์ด์ธ Squeak์ผ๋ก ์ด์๋์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ํ์คํ ์ด ์ ์์ ๋ฌธ์ , ๋์ ๊ณผ์ ๋ฐ ๊ฒฝํ๊ณผ ํฌ๊ฒ ๊ฒน์น๋ ๋ถ๋ถ์ ์ฝ์ ์ ์์ต๋๋ค.
Web IDL์ด ๋ฐ์ธ๋ฉ ์ธ์ด๋ก์์ ๊ธฐ๋ณธ ์ ์์ธ ์ด์ ๋ฅผ ์ดํดํฉ๋๋ค. Web IDL์ ์น์ ์ํ ์ญ์ฌ์ ์ด๋ฉฐ ์ด๋ ์ ๋ ์ฑ์ํ ๋ฐ์ธ๋ฉ ์ธ์ด์ ๋๋ค. ๋๋ ๊ทธ ๊ฒฐ์ ์ ํฌ๊ฒ ์ง์งํ๋ฉฐ, ๋๋ ๊ฐ์ ๊ฒฐ์ ์ ํ์ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ํฝ๋๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ด ๋ค๋ฅธ ์ปจํ ์คํธ(์ดํด, ๋ค๋ฅธ ํธ์คํธ/์ธ์ด)์ ๊ฑฐ์ ๋ง์ง ์๋๋ค๋ ๊ฒ์ ์ธ์ํ ์ ์์ต๋๋ค. Wasm์ ํธ์คํธ์ ๊ตฌ์ ๋ฐ์ง ์๊ฑฐ๋ ์ธ์ด/ํ๋ซํผ์ ๊ตฌ์ ๋ฐ์ง ์๋๋ก ์ค๊ณ๋์์ต๋๋ค. ๋๋ ์ฑ์ํ ์น ๊ธฐ์ ์ ์ฌ์ฉํ๊ณ ์น์ด ์๋ ์๋๋ฆฌ์ค์ ๋ํ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ฐพ๋ ์์ด๋์ด๋ฅผ ์ข์ํ์ง๋ง Web IDL์ ๊ฒฝ์ฐ ์น๊ณผ ์ค์ ๋ก ์ฐ๊ฒฐ๋์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ด๊ฒ์ด ๋ด๊ฐ ์ฌ๊ธฐ์์ ๊ทธ ๋ํ๋ฅผ ๋งค์ฐ ๋ฐ์ ํ๊ฒ ๋ฐ๋ฅด๋ ์ด์ ์ ๋๋ค.
https://github.com/WebAssembly/webidl-bindings/issues/40 ์ ์ด์์ต๋๋ค. ์ด์ ๋ํ ์ธ๊ธ์ด ์์๊ธฐ ๋๋ฌธ์(๋๋ ๋์ณค๊ธฐ ๋๋ฌธ์) ์ฌ๊ธฐ์ ์ง๋ฌธ์ ํ๊ฒ ๋์์ต๋๋ค.
์ ์ฒด ๋ฐ์ธ๋ฉ ์ด์ผ๊ธฐ์์ "๋๊ฐ"๊ฐ ๋ฐ์ธ๋ฉ์ ์์ฑํ ์ฑ ์์ด ์๋์ง ๋ช ํํ์ง ์์ต๋๋ค.
๋๋ ๋ ๋ค ์ ํจํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ Web IDL์ ๊ฒฝ์ฐ ์ฝ๊ฐ์ ํ๊ณ๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค(์ ๋งํฌ ์ฐธ์กฐ). ์ด์ฉ๋ฉด ๋ด๊ฐ ๊ทธ ๊ณผ์ ์์ ์ค์ํ ๋จ๊ณ๋ฅผ ๋์ณค์ ์๋ ์์ผ๋ฏ๋ก ๋ด ๋ฉ์์ง๋ฅผ ์์ด ๋ฒ๋ฆฌ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค.
๋ชฉํ๊ฐ Web IDL์ ๋ ์น โโ์ค์ฌ์ ์ผ๋ก "์ฌ์ง์ค"ํ๋ ๊ฒ์ด์ง๋ง ํ์ฌ๋ก์๋ ๋งค์ฐ ์น ์ค์ฌ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋์์ ์ ์ํ๊ธฐ ์ํ ์ ์์ด ๋ฐ์ํฉ๋๋ค. ๋ฐ๋ผ์ ์ด ์ค๋ ๋์ ๋๋ค. ๋ฐ๋ผ์ ์ ์ฌ์ ์ธ ๋จํธํ๊ฐ ์ฐ๋ ค๋ฉ๋๋ค. ์ด์์ ์ผ๋ก(๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ด ์ง๊ธ๊น์ง Wasm์ด ์ค๊ณ๋ ๋ฐฉ์์ ๋๋ค) ๋ฐ์ธ๋ฉ์ ํฌํจํ๋ Wasm ๋ชจ๋์ด ์ฃผ์ด์ง๋ฉด ์๋ ๊ทธ๋๋ก ์ด๋์์๋ ์คํํ ์ ์์ต๋๋ค. Web IDL, Cap'n' Proto, FlatBuffers ๋ฑ์ผ๋ก ์์ฑ๋ ๋ฐ์ธ๋ฉ์ ์ฌ์ฉํ๋ฉด ๋ชจ๋ ์ปดํ์ผ๋ฌ๋ ํ๋ก๊ทธ๋จ ์์ฑ์๊ฐ ์ง์ ํ ํฌ๋ก์ค ํ๋ซํผ์ด ๋๊ธฐ ์ํด ๋ค๋ฅธ ๊ตฌ๋ฌธ์ผ๋ก ๋์ผํ ๋ฐ์ธ๋ฉ์ ์์ฑํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ํ์ ํฉ๋๋ค. ์๊ธฐ๊ฒ๋ ์ด๊ฒ์ ์์ผ๋ก ์ด ๋ฐ์ธ๋ฉ์ ์ฐฌ์ฑํ๋ ์ฃผ์ฅ์ ๋๋ค. ์ฌ๋๋ค์ ํ๋ซํผ P์ ๋ํ ๋ฐ์ธ๋ฉ์ ์์ฑํ์ฌ ํ๋ก๊ทธ๋จ์ ๊ธฐ์ฌํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ด ์ ํ ์ด์์ ์ด์ง ์๋ค๋ ๊ฒ์ ์ธ์ ํฉ์๋ค.
์์ฝํ์๋ฉด ์ ๋ ์น ๋ฐ์ธ๋ฉ๊ณผ ์น์ด ์๋ ๋ฐ์ธ๋ฉ ๊ฐ์ ๊ฐ๋ฅํ ๋จํธํ์ ๋ํด ์ฐ๋ คํ๊ณ ์์ต๋๋ค. ๋น ์น ๋ฐ์ธ๋ฉ ์ธ์ด๊ฐ ์ ์ง๋๋ค๋ฉด ์น ๋ธ๋ผ์ฐ์ ์์ ํ์ค์ ์ผ๋ก ๊ตฌํ๋ ๊น์? ๊ทธ๋ค์ ๋ฐ์ธ๋ฉ "Wasm โถ ๋ฐ์ธ๋ฉ ์ธ์ด B โถ Web IDL"์ ์์ฑํด์ผ ํฉ๋๋ค. ์ด๊ฒ์ ๋ชจ๋ ํธ์คํธ์ ๋ํด ๋์ผํ ์๋๋ฆฌ์ค์ ๋๋ค: Wasm โถ ๋ฐ์ธ๋ฉ ์ธ์ด B โถ ํธ์คํธ API.
ํธ๊ธฐ์ฌ์ด ์ฌ๋๋ค์ ์ํด, ๋๋ Wasmer์์ ์ผ์ํ๊ณ ๋๋์ ์ ์ ํด์ PHP- , Python- , Ruby- ๋ฐ ์ด๋ - Wasm ํตํฉ. ์ฐ๋ฆฌ๋ ๋งค์ฐ ๋ค๋ฅธ ํธ์คํธ์ ๋ํด ๋ค๋ฅธ ๋ฐ์ธ๋ฉ์ ํดํนํ ์ ์๋ ๋ฉ์ง ๋์ดํฐ๋ฅผ ๊ฐ๊ธฐ ์์ํ์ต๋๋ค. ๋ค๋ฅธ ์๋ฃจ์ ์ ํตํฉํ๊ฑฐ๋, ํผ๋๋ฐฑ์ ์์งํ๊ฑฐ๋, ์คํ์ ์๋ํ๊ธฐ๋ฅผ ์ํ๋ ์ฌ๋์ด ์๋ค๋ฉด, ์ฐ๋ฆฌ๋ ๋ชจ๋ ์ด๋ ค ์๊ณ ํ์ ํ๊ณ ๋ ๋ง์ ๋ฆฌ์์ค๋ฅผ ํฌ์ ํ ์ค๋น๊ฐ ๋์ด ์์ต๋๋ค.
'webIDL ๋ฐ์ธ๋ฉ'์ ํ์ฌ ๋ฐฉํฅ์ ์๋ง๋ webIDL์์ ๋ฉ์ด์ง ๊ฒ์
๋๋ค.
๊ทธ ์์ฒด. ๊ทธ๋ฌ๋ ๋๋ ๋ง๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋ชจ๋๊ฐ ๋ฐ ๋ชจ๋-ํธ์คํธ ํํ์ ์ํ '์์ฐ' ์ธ์ด
์ํธ ์ด์ฉ์ฑ์ WASM์ ์์ฐ์ด๋ณด๋ค ํจ์ฌ ํ๋ถํฉ๋๋ค. ์ด๊ฒ
์ฌ์ฉ ๊ฐ๋ฅํ IDL์ ํด๋นํ๋ ๋ชจ๋ ๊ฒ์ด ์๋นํ ์์์ ์ผ๋ก ๋ณด์ผ ๊ฒ์์ ์๋ฏธํฉ๋๋ค.
WASM์ ๊ด์
๋ฐ๋ฉด์ C/C++์ ๋ ์ฆ๋ก ์ธ์์ ๋ณด๋ ์ฌ๋๋ค์๊ฒ๋
(๊ทธ๋ฆฌ๊ณ Rust์ ๊ทธ ์ ์ฌ) WASM์ ๋ชจ๋ธ๋ณด๋ค ๋ ํ๋ถํ ๊ฒ์
์ธ ์ ์๋. ref ํตํฉ์ ์ด๋ ค์์ผ๋ก ์ด๋ฏธ ์ด๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
๋๊ตฌ ์ฒด์ธ์ ์
๋ ฅํฉ๋๋ค.
๋ํ ์ผ๋ฐ ์ง์์ ํ๋ ๊ฒ์ด WASM์ ์ง์ ์ ์ธ ๊ถํ์ ์๋๋๋ค.
์ธ์ด ๊ฐ ์ํธ ์ด์ฉ์ฑ. IMO๋ ์๋ฉ๋๋ค.
(๋ด๊ฐ ๋งํ ๋ ์ ํ๋ ๋ฒ์ ์ ์ธ์ด ๊ฐ ์ํธ ์ด์ฉ์ฑ์ด ์์ต๋๋ค.
๋ฏฟ์์ ์ง์งํ ์ ์์ ๋ฟ๋ง ์๋๋ผ ์ค์ํฉ๋๋ค.
๊ธฐ๋ฅ ์ ๊ณต์์ ๊ธฐ๋ฅ ์ฌ์ฉ์๊ฐ ์ถฉ์กฑํ ์ ์๋ ๊ด์ฌ
์ต์ํ์ ๋ง์ฐฐ๋ก. (๋ฅ๋ ฅ์ ๊ฒฝ์์ง์ ๋ง์ด์ง๋ง ๋๋
๋ ๋์ ์ฉ์ด๋ฅผ ์ฐพ์ง ๋ชปํ์ต๋๋ค.) ์ด๊ฒ์ ๋ค๋ฅธ ์คํ์ผ์ IDL๊ณผ ํ๋์
์์ ํ ์ธ์ด ๊ฐ ๊ตฌํ์ ํ์ํ ๊ฒ๋ณด๋ค ๊ตฌํํ๊ธฐ๊ฐ ๋ ์ฝ์ต๋๋ค.
์ธํฐ์ต.)
๊ฒฐ๋ก : IDL๊ณผ ๋๋ฑํ ๊ฒฝ์ฐ๊ฐ ์์ผ๋ฉฐ ํ์ํฉ๋๋ค.
์์ ๊ถ ๊ฒฝ๊ณ๋ฅผ ๋์ด ์ํธ ์ด์ฉ์ฑ์ ์ง์ํฉ๋๋ค. ๊ทธ๊ฒ์ด ๋๋๋ ๊ฒ
ํ์ฌ๋ก์๋ ๋ช
ํํ์ง ์๋ค.
2019๋
6์ 24์ผ ์์์ผ ์ค์ 7:02 Ivan Enderlin [email protected]
์ผ๋ค:
Web IDL์ด ๋ฐ์ธ๋ฉ ์ธ์ด๋ก ๊ธฐ๋ณธ ์ ์์ธ ์ด์ ๋ฅผ ์ดํดํฉ๋๋ค.
๊ทธ๊ฒ์ ์น์ ์ํ ์ญ์ฌ์ ์ด๋ฉฐ ์ด๋ ์ ๋ ์ฑ์ํ ๋ฐ์ธ๋ฉ ์ธ์ด์ ๋๋ค. NS
๊ทธ ๊ฒฐ์ ์ ํฌ๊ฒ ์ง์งํฉ๋๋ค.
๊ฐ์. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ด ๋ค๋ฅธ ๋งฅ๋ฝ์ ๊ฑฐ์ ๋ค์ด๋ง์ง ์๋๋ค๋ ๊ฒ์ ์ธ์ํ ์ ์์ต๋๋ค.
(๋ค๋ฅธ ํธ์คํธ/์ธ์ด ์ดํด). Wasm์ ํธ์คํธ์ ๊ตฌ์ ๋ฐ์ง ์๋๋ก ์ค๊ณ๋์์ต๋๋ค.
๋๋ ์ธ์ด/ํ๋ซํผ์ ๊ตฌ์ ๋ฐ์ง ์์ต๋๋ค. ๋๋ ์ฑ์ํ ์น์ ์ฌ์ฉํ๋ ์์ด๋์ด๋ฅผ ์ข์ํฉ๋๋ค.
๊ธฐ์ ๋ฐ ์น ์ด์ธ์ ์๋๋ฆฌ์ค์ ๋ํ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ฐพ๊ธฐ ์ํด
Web IDL์ ๊ฒฝ์ฐ ์ค์ ๋ก ์น๊ณผ ์ฐ๊ฒฐ๋์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ด๊ฐ ๋งค์ฐ
์ฌ๊ธฐ์์ ๊ทธ ๋ํ๋ฅผ ๋ฐ์ ํ๊ฒ ๋ฐ๋ฅด์ญ์์ค.WebAssembly/webidl-bindings#40์ ์ด์์ต๋๋ค.
https://github.com/WebAssembly/webidl-bindings/issues/40 , ๋๋ฅผ ์ด๋์์ต๋๋ค.
๋๋ ๊ทธ๊ฒ์ ๋ํ ์ธ๊ธ์ ๋ณธ ์ ์ด ์๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์์ ์ง๋ฌธ์ ํ์ญ์์ค(๋๋ ๋์ณค์ต๋๋ค).์ ์ฒด ๊ตฌ์๋ ฅ์๋ ์ด์ผ๊ธฐ์์ "๋๊ฐ"๊ฐ ์ฑ ์์ด ์๋์ง ๋ช ํํ์ง ์์ต๋๋ค.
๋ฐ์ธ๋ฉ ์์ฑ:
- ์ปดํ์ผ๋ฌ(ํ๋ก๊ทธ๋จ์ Wasm ๋ชจ๋๋ก ๋ณํ)์ ๋๊น?
- ํ๋ก๊ทธ๋จ ์์ฑ์์ ๋๊น(๋ฐ์ธ๋ฉ๋ ์์ผ๋ก ์์ฑํฉ๋๊น)?
๋๋ ๋ ๋ค ์ ํจํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ Web IDL์ ๊ฒฝ์ฐ ์ฝ๊ฐ์
์ ํ ์ฌํญ(์ ๋งํฌ ์ฐธ์กฐ). ์ด์ฉ๋ฉด ๋ด๊ฐ ์ค์ํ ๋จ๊ณ๋ฅผ ๋์น ๊ฒ์ผ ์๋ ์์ต๋๋ค.
๋ด ๋ฉ์์ง๋ฅผ ์์ด ๋ฒ๋ฆฌ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค.๋ชฉํ๊ฐ Web IDL์ ๋ ์น โโ์ค์ฌ์ ์ผ๋ก "์ฌ์ง์ค"ํ๋ ๊ฒ์ด๋๋ผ๋ ์ง๊ธ ๋น์ฅ์
๊ทธ๊ฒ์ ๋งค์ฐ ์น ์ค์ฌ์ด๋ค. ๋์์ ์ ์ํ๊ธฐ ์ํ ์ ์์ด ๋ฐ์ํ๊ณ ,
๋ฐ๋ผ์ ์ด ์ค๋ ๋. ๋ฐ๋ผ์ ์ ์ฌ์ ์ธ ๋จํธํ๊ฐ ์ฐ๋ ค๋ฉ๋๋ค.
์ด์์ ์ผ๋ก(๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ด ์ง๊ธ๊น์ง Wasm์ด ์ค๊ณ๋ ๋ฐฉ์์ ๋๋ค), ์ฃผ์ด์ง Wasm ๋ชจ๋
๋ฐ์ธ๋ฉ์ ํฌํจํ์ฌ ์ด๋์์๋ ์๋ ๊ทธ๋๋ก ์คํํ ์ ์์ต๋๋ค. ์ ํจ๊ป
Web IDL, Cap'n' Proto, FlatBuffers ๋ฑ์ผ๋ก ์์ฑ๋ ๋ฐ์ธ๋ฉ, ์ ๋
๋ชจ๋ ์ปดํ์ผ๋ฌ ๋๋ ํ๋ก๊ทธ๋จ ์์ฑ์๊ฐ ๋์ผํ๊ฒ ์์ฑํ์ง๋ ์์ ๊ฒ์ ๋๋ค.
์๋ก ๋ค๋ฅธ ๊ตฌ๋ฌธ์ ๋ฐ์ธ๋ฉ์ ์ง์ ํ ํฌ๋ก์ค ํ๋ซํผ์ ๋๋ค. ์๊ธฐ๊ฒ๋ ์ด๊ฒ์
์์ผ๋ก ์ด ์ ๋ณธ์ ์ฐฌ์ฑํ๋ ์ฃผ์ฅ: ์ฌ๋๋ค์
ํ๋ซํผ P์ ๋ํ ๋ฐ์ธ๋ฉ์ ์์ฑํ์ฌ ํ๋ก๊ทธ๋จ
์ ํ ์ด์์ ์ ๋๋ค.์์ฝํ์๋ฉด, ์ ๋ ์น๊ณผ
๋น ์น ๋ฐ์ธ๋ฉ. ์น ๋ฐ์ธ๋ฉ ์ธ์ด๊ฐ ์๋ ๊ฒฝ์ฐ
์น ๋ธ๋ผ์ฐ์ ์ ์ํด ํ์ค์ ์ผ๋ก ๊ตฌํ๋ฉ๋๊น? ๊ทธ๋ค์ ์์ฑํด์ผ ํ ๊ฒ์ ๋๋ค
๋ฐ์ธ๋ฉ "Wasm โถ ๋ฐ์ธ๋ฉ ์ธ์ด B โถ Web IDL". ๋์ผํ๋ ์ฐธ๊ณ ํ์ธ์
๋ชจ๋ ํธ์คํธ์ ๋ํ ์๋๋ฆฌ์ค: Wasm โถ ๋ฐ์ธ๋ฉ ์ธ์ด B โถ ํธ์คํธ API.๊ถ๊ธํ ๋ถ๋ค์ ์ํด ์ ๋ Wasmer์์ ์ผํ๊ณ PHP-
https://github.com/wasmerio/php-ext-wasm , ํ์ด์ฌ-
https://github.com/wasmerio/python-ext-wasm , ๋ฃจ๋น-
https://github.com/wasmerio/ruby-ext-wasm ๋ฐ Go-
https://github.com/wasmerio/go-ext-wasm Wasm ํตํฉ. ์ฐ๋ฆฌ๋ ์์ํ๋ค
๋งค์ฐ ๋ค๋ฅธ ๋ฐ์ธ๋ฉ์ ํดํนํ ์ ์๋ ๋ฉ์ง ๋์ดํฐ๊ฐ ์์ต๋๋ค.
ํธ์คํธ. ๋๊ตฐ๊ฐ ๋ด๊ฐ ๋ค๋ฅธ ์๋ฃจ์ ์ ํตํฉํ๊ณ ์์งํ๊ธฐ๋ฅผ ์ํ๋ฉด
ํผ๋๋ฐฑ์ ๋ฐ๊ฑฐ๋ ์คํ์ ์๋ํ ๋ ์ฐ๋ฆฌ๋ ๋ชจ๋ ์ด๋ ค ์๊ณ ํ๋ ฅํ ์ค๋น๊ฐ ๋์ด ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ๋ ๋ง์ ์์์ ํฌ์ ํ์ญ์์ค.โ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธ
https://github.com/WebAssembly/design/issues/1274?email_source=notifications&email_token=AAQAXUD6WA22DDUS7PYQ6F3P4DHYRA5CNFSM4HJUHVG2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AAQAXUGM66AWN7ZCIVBTXVTP4DHYRANCNFSM4HJUHVGQ
.
--
ํ๋์์ค ๋งฅ์ผ์ด๋ธ
SWE
์ฐ๋ฆฌ๋ ref ์ ํ์ ๋๊ตฌ ์ฒด์ธ์ ํตํฉํ๋ ์ด๋ ค์์ผ๋ก ์ด๋ฏธ ์ด๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
๋ค๋ฅธ ์ธ์ด๋ก๋ ๋งํ ์ ์์ง๋ง Rust + wasm-bindgen์ ์ด๋ฏธ ๋ค์์ ์ง์ํฉ๋๋ค.
WebIDL์์ ์๋ ์์ฑ๋๋ ๋ฐ์ธ๋ฉ์ด๋ฉฐ ๋์ค์ ๊ณต์ WebIDL ์ฐธ์กฐ ์ ํ์ผ๋ก ์ฝ๊ฒ ์ ๊ทธ๋ ์ด๋ํ ์ ์๋๋ก ์ ์คํ๊ฒ ์ค๊ณ๋์์ต๋๋ค.
๊ทธ๋์ ๊ถ๊ธํฉ๋๋ค. ์ด๋ค ์ด๋ ค์์ ๋ง์ํ์๋ ๊ฑด๊ฐ์?
์ด๋ ค์์ ๋ํ ๋์ ์ดํด๋ C++์ ๋ ๊ฐ๊น์ต๋๋ค. Rust๋ ์ธ์ด ์ธก๋ฉด์์ ์ด๊ฒ์ ๋ ํฉ๋ฆฌ์ ์ผ๋ก ๋ง๋ค๊ธฐ ์ํด ์ถฉ๋ถํ ๊ฐ๋ ฅํ ๋ฉํํ๋ก๊ทธ๋๋ฐ์ ๊ฐ์ง๊ณ ์์ง๋ง, userland C++๋ ์๋ฅผ ๋ค์ด anyref์ ๋ํด ์ถ๋ก ํ๋ ๊ฒ์ด ๋ ์ด๋ ต์ต๋๋ค.
์ฌ๊ธฐ์์ C++ ๊ด๋ จ ๋ฌธ์ ์ ๋ํด ๋ ๋ฃ๊ณ ์ถ์ต๋๋ค. (C++ ์ ์ฉ์ ๋๊น ์๋๋ฉด LLVM ์ ์ฉ์ ๋๊น?)
C++๋ ref ์ ํ์ด ๋ฌด์์ธ์ง ๋ชจ๋ฆ
๋๋ค. ๊ทธ๋์ ๋น์ ์ ๊ทธ๊ฒ์ ์์ ๊ฐ์ง ์ ์์ต๋๋ค
์์์ ๊ฐ์ฒด. ์ค์ ๋ก ์ธ์ด์ ์ผ๋ถ๊ฐ ์๋๋๋ค. ํ์ผ์ฒ๋ผ
์ค๋ช
์. ๋ฌธ์์ด์ ๋ํ ์ฌ๋ฏธ์๋ ์ฅ์.
2019๋ 6์ 24์ผ ์์์ผ ์คํ 3์ 77๋ถ Alon Zakai [email protected]์์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ์ต๋๋ค.
์ฌ๊ธฐ์์ C++ ๊ด๋ จ ๋ฌธ์ ์ ๋ํด ๋ ๋ฃ๊ณ ์ถ์ต๋๋ค. (๊ทธ๋ค์
C++ ํน์ ๋๋ LLVM ํน์ ?)โ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธ
https://github.com/WebAssembly/design/issues/1274?email_source=notifications&email_token=AAQAXUDW237MUBBUUJLKS6LP4FARJA5CNFSM4HJUHVG2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LN
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AAQAXUB4O3ZX4LRQSQRL763P4FARJANCNFSM4HJUHVGQ
.
--
ํ๋์์ค ๋งฅ์ผ์ด๋ธ
SWE
@fgmccabe์ ์คํ๋ผ์ธ์ผ๋ก ์ด์ผ๊ธฐํ๋ฉด ๊ตฌ์กฐ๊ฐ ์ ํ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ C++์ Rust ๋ชจ๋ ๊ตฌ์กฐ์ ref ์ ํ์ ์ง์ ์ ์ฅํ ์ ์๋ค๋ ๊ฒ์ด ์ฌ์ค์ ๋๋ค. C++์ Rust๋ ๋ฌผ๋ก ์ ์ ํธ๋ค์ ์ฌ์ฉํ์ฌ ํ์ผ ์ค๋ช ์, OpenGL ํ ์ค์ฒ ๋ฑ์ ์ฒ๋ฆฌํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ref ์ ํ์ ๊ฐ์ ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ๋ด ์๊ฐ์ ๊ทธ์ ์์ ์ ๋ ์ธ์ด ์ค ์ด๋ ๊ฒ๋ ref ์ ํ์ "์"/"๊ธฐ๋ณธ์ ์ผ๋ก" ์ฒ๋ฆฌํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค(์ ๊ฐ ํ๋ ธ๋ค๋ฉด ์์ ํด ์ฃผ์ธ์!). ์ด ์ธ์ด๋ ํญ์ ref ์ ํ์์ ๋ถ๋ฆฌํ ๊ฒ์ ๋๋ค. GC ์ธ์ด์ ๋น๊ตํ์ฌ ์์ .
์ฌ๊ธฐ์ C++์ ํน์ ํ ๊ฒ์ด ์๋์ง ๊ถ๊ธํฉ๋๋ค. ์๋ ๊ฒ ๊ฐ์๋ฐ?
์ฌ๊ธฐ์ C++๋ฅผ ์ด๋ ต๊ฒ ๋ง๋๋ ์์์ ๋ํ ๋ด ์ดํด๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
struct Anyref; // opaque declaration
void console_log(Anyref* item); // declaration of ref-taking external JS API
Anyref* document_getElementById(const char* str);
void wellBehaved() {
// This should work
Anyref* elem = document_getElementById("foo");
console_log(elem);
}
void notSoWellBehaved() {
// ????
Anyref* elem = document_getElementById("bar");
Anyref* what = (Anyref*)((unsigned int)elem + 1);
console_log(what);
}
์ข์ ์์์ ํ์์ ์๊ฐ UB๋ผ๋ ๊ฒ์ ๋๋ค(์๋ชป๋ ํฌ์ธํฐ๋ ์์ฑ๋์๋ง์ UB๊ฐ ๋จ). ๊ทธ๋ฌ๋ LLVM IR์์ ์ด๋ฅผ ๋ชจ๋ธ๋งํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์?
@jgravelle-google struct Anyref;
์กฐ์ฐจ๋ ์ ํ ๋ฉ๋ชจ๋ฆฌ์์ ์๋ฏธ๊ฐ ์๋ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค. ๋์ , OpenGL ํ
์ค์ฒ, ํ์ผ ํธ๋ค ๋ฑ๊ณผ ๊ฐ์ด ์์์ ์ธ๊ธํ ์ ์ ํธ๋ค๋ก ๋ชจ๋ธ๋งํ์ง ์๋ ์ด์ ๋ ๋ฌด์์
๋๊น?
using Anyref = uint32_t; // handle declaration
void console_log(Anyref item); // declaration of ref-taking external JS API
Anyref document_getElementById(const char* str);
void wellBehaved() {
// This should work
Anyref elem = document_getElementById("foo");
console_log(elem);
}
์ ์ ํธ๋ค์ ์ฌ์ฉ๋ ๋ ํ ์ด๋ธ์์ ์กฐํ๋์ด์ผ ํฉ๋๋ค. ๋ค์ ๋งํ์ง๋ง ์ด๊ฒ์ C++ ๋ฐ Rust์ ๊ฐ์ ์ ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ์ธ์ด์ ๋จ์ ์ผ ๋ฟ์ ๋๋ค. ๊ทธ๋ฌ๋ LLVM์ด ์๋ ๊ฒฝ์ฐ wasm ์์ค์์ ์ต์ํ ๋ก์ปฌ๋ก ์ต์ ํํ ์ ์์ต๋๋ค.
๊ทธ๊ฒ์ ์๋ํ์ง๋ง table_free(elem)
๋ฅผ ํธ์ถํด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์์ํ ์ฐธ์กฐ๋ฅผ ์ ์งํ ๊ฒ์
๋๋ค. C++์์ ์ด์ํ์ง ์์ ๊ฒ์ ๋น์ฐํฉ๋๋ค.
๋ ์ด์ด๋ง์ด ์ ๋์ง ์์์ ์ด์ํ ๋งคํ์ด ๋ ๊ฒ ๊ฐ์๋ฐ์? ๋ง์น OpenGL๊ณผ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ฒ๋ผ ๋๊ปด์ง์ง๋ง ์ ๊ณตํ๋ ์ปดํ์ผ๋ฌ ๋ง๋ฒ์ ์์กดํ๋ ๊ฒ์ฒ๋ผ - ๋ณ๋์ ์ ์ธ์ ์์กดํ๋ ๊ฒฝ์ฐ ์ธ๋ผ์ธ-wasm์ผ๋ก๋ C++์์ anyref.h
๋ฅผ ๋น๋ํ ์ ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ํ
์ด๋ธ.
์ด์จ๋ ๋๋ ๊ทธ๊ฒ์ด ๋ชจ๋ ๊ฐ๋ฅํ๊ณ ๋ค๋ฃจ๊ธฐ ์ฝ๋ค๊ณ ์๊ฐํ์ง๋ง ๊ฐ๋จํ์ง ์์ ๊ฒ์ด ์ ๋ถ์ ๋๋ค.
@kripken "์ ์ ํ" ๊ธฐ๋ณธ anyref
์ง์์ ์ํด์๋ LLVM(๋ฐ rustc)์ ์ฝ๊ฐ์ ๋ณ๊ฒฝ์ด ํ์ํ ๊ฒ์ด ์ฌ์ค์ด์ง๋ง ์ค์ ๋ก ์ฅ์ ๋ฌผ์ ์๋๋๋ค.
wasm-bindgen์ ์ค์ wasm anyref
s๋ฅผ wasm ํ
์ด๋ธ์ ์ ์ฅํ๊ณ ์ ํ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ ์ธ๋ฑ์ค๋ฅผ ํ
์ด๋ธ์ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ผ์ wasm table.get
๋ช
๋ น์ ์ฌ์ฉํ์ฌ anyref
์ ์ก์ธ์คํ ์ ์์ต๋๋ค.
wasm-gc๊ฐ ๊ตฌํ๋ ๋๊น์ง GC ์ธ์ด๋ ์ ํํ ๋์ผํ ์ ๋ต์ ์ฌ์ฉํด์ผ ํ๋ฏ๋ก Rust( et al)๊ฐ ๋๋ฝ๋์ง ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด LLVM์ ๊ธฐ๋ณธ anyref
์ง์์ด ์ฐ๋ฆฌ์๊ฒ ๋ฌด์์ ๊ฐ์ ธ๋ค ์ค๊น์? ๊ธ์, ๊ทธ๊ฒ์ wasm ํ
์ด๋ธ์ ํตํด anyref
๋ฅผ ๊ฐ์ ์ ์ผ๋ก ํ์๋ก ํ์ง ์๊ณ ํจ์์์ anyref
๋ฅผ ์ง์ ์ ๋ฌ/๋ฐํํ๋ ๊ฒ์ ๊ฐ๋ฅํ๊ฒ ํ ๊ฒ์
๋๋ค. ๊ทธ๊ฒ์ ์ ์ฉํ ๊ฒ์
๋๋ค. ํ์ง๋ง ๊ทธ๊ฒ์ ๋จ์ง ์ฑ๋ฅ ์ต์ ํ์ผ ๋ฟ์ด๋ฉฐ ์ค์ ๋ก anyref
์ฌ์ฉ์ ๋ฐฉํดํ์ง๋ ์์ต๋๋ค.
@ํ์ฐ์
wasm-bindgen์ ์ค์ wasm anyref๋ฅผ wasm ํ ์ด๋ธ์ ์ ์ฅํ ๋ค์ ์ ํ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ ์ธ๋ฑ์ค๋ฅผ ํ ์ด๋ธ์ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ผ์ wasm table.get ๋ช ๋ น์ ์ฌ์ฉํ์ฌ anyref์ ์ก์ธ์คํ ์ ์์ต๋๋ค.
๋ฐ๋ก, ์, ์ ๊ฐ ์ธ๊ธํ ๋ชจ๋ธ์ ๋๋ค.
wasm-gc๊ฐ ๊ตฌํ๋ ๋๊น์ง GC ์ธ์ด๋ ์ ํํ ๋์ผํ ์ ๋ต์ ์ฌ์ฉํด์ผ ํ๋ฏ๋ก Rust( et al)๊ฐ ๋๋ฝ๋์ง ์์ต๋๋ค.
์, ํ์ฌ GC ์ธ์ด๋ ๊ธฐ๋ณธ wasm GC๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ด์ ์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํฌ๋ง์ ์ผ๋ก ๊ทธ๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค! :) ๊ฒฐ๊ตญ ์ ์ด๋ GC๋ฅผ ์ ๋๋ก ์ํํ๋ค๋ฉด GC ์ธ์ด๊ฐ ์ฌ๊ธฐ์ ๋ถ๋ช ํ ์ด์ ์ ๊ฐ์ง ๊ฒ์ผ๋ก ๊ธฐ๋ํฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด LLVM์ ๊ธฐ๋ณธ anyref ์ง์์ ์ฐ๋ฆฌ์๊ฒ ๋ฌด์์ ๊ฐ์ ธ๋ค ์ค๊น์? ๊ธ์, ๊ทธ๊ฒ์ wasm ํ ์ด๋ธ์ ํตํด anyref๋ฅผ ๊ฐ์ ์ ์ผ๋ก ์ ๋ฌํ ํ์ ์์ด ํจ์์์ anyref๋ฅผ ์ง์ ์ ๋ฌ/๋ฐํํ๋ ๊ฒ์ ๊ฐ๋ฅํ๊ฒ ํ ๊ฒ์ ๋๋ค. ๊ทธ๊ฒ์ ์ ์ฉํ ๊ฒ์ ๋๋ค. ํ์ง๋ง ๊ทธ๊ฒ์ ๋จ์ง ์ฑ๋ฅ ์ต์ ํ์ผ ๋ฟ์ด๋ฉฐ ์ค์ ๋ก anyref๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ง์ง๋ ์์ต๋๋ค.
๋์ํฉ๋๋ค. ์, ์ด๊ฒ์ C++ ๋ฐ Rust ๋ฑ์ ๋นํด (๊ฒฐ๊ตญ) GC ์ธ์ด์ ์ฑ๋ฅ ์ด์ ์ผ ๋ฟ์ ๋๋ค. ์ฌ์ฉ์ ๋ฐฉํดํ์ง๋ ์์ต๋๋ค.
์ฌ์ดํด์ ํ ์ด๋ธ์ด ๋ฃจํธ์ด๊ธฐ ๋๋ฌธ์ C++์ Rust์์ ๋ ํฐ ๋ฌธ์ ์ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ธ๋ถ GC๊ฐ ์ดํดํ ์ ์๋๋ก C++/Rust ๋ด๋ถ์ GC ๋งํฌ ๊ตฌ์กฐ๋ฅผ ๋งคํํ๋ ์ด๋ค ๋ฐฉ๋ฒ์ผ๋ก ์ถ์ API ๋๋ "๊ทธ๋ฆผ์ ๊ฐ์ฒด"๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ์์ง ๊ทธ๋ค ์ค ์ด๋ค ๊ฒ์ ๋ํ ์ค์ง์ ์ธ ์ ์์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ฒฐ๊ตญ ์ ์ด๋ GC๋ฅผ ์ ๋๋ก ์ํํ๋ค๋ฉด GC ์ธ์ด๊ฐ ๋ถ๋ช ํ ์ด์ ์ ๊ฐ์ง ๊ฒ์ผ๋ก ๊ธฐ๋ํฉ๋๋ค.
๋ด๊ฐ ํ๋ฆด ์๋ ์์ง๋ง ๋ง์ฝ ๊ทธ๋ ๋ค๋ฉด ๋๋ ๋๋ ๊ฒ์ด๋ค. GC ์ธ์ด๋ wasm GC ๊ตฌ์กฐ์ฒด๋ฅผ ํ ๋นํด์ผ ํ๊ณ wasm ์์ง์ ๊ทธ๊ฒ์ด ํ๋ก๊ทธ๋จ์ ํตํด ํ๋ฅผ ๋ ๊ทธ๊ฒ์ ์ถ์ ํด์ผ ํ ๊ฒ์ด๋ค.
์ด์ ๋นํด Rust๋ ํ ๋น์ด ํ์ํ์ง ์๊ณ (ํ ์ด๋ธ์ ํ ๋นํ๊ธฐ๋ง ํ๋ฉด ๋จ) ์ ์๋ง ์ ์ฅํ๋ฉด ๋๋ฉฐ, wasm ์์ง์ GC ๋ชฉ์ ์ ์ํด 1๊ฐ์ ์ ์ ์ด๋ ํ ์ด๋ธ๋ง ์ถ์ ํ๋ฉด ๋ฉ๋๋ค.
anyref
์ก์ธ์ค ๊ฐ table.get
๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ GC ์ธ์ด์ ๋ํด ์ต์ ํ๋ ์ ์๋ค๊ณ ์๊ฐํ์ง๋ง table.get
๋ ์๋นํ ๋น ๋ฅผ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค.
๊ทธ๋์ wasm-gc ํ๋ก๊ทธ๋จ์ด wasm ํ ์ด๋ธ์ ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋จ๋ณด๋ค ๋ ๋์ ์ฑ๋ฅ์ ๊ธฐ๋ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๋ ์์ธํ ์ค๋ช ํ ์ ์์ต๋๊น?
์ถ์ : ์ด๊ฒ์ ์ฃผ์ ์์ ์๋นํ ๋ฒ์ด๋๊ธฐ ์์ํ์ต๋๋ค. ๋ฐ๋ผ์ ์ด ํ ๋ก ์ ์ ์ค๋ ๋๋ก ์ฎ๊ฒจ์ผ ํ ๊น์?
์ ๋ง ๊ทธ๋ฅ: table.get/table.set
ํฉ๋๋ค. GC๋ฅผ ์ฌ์ฉํ๋ฉด ์์ ํฌ์ธํฐ๊ฐ ๋ฐ๋ก ๊ฑฐ๊ธฐ์ ์์ด์ผ ํ๋ฉฐ ๊ฐ์ ์ฐธ์กฐ๋ฅผ ์ ์ฅํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ค, Rust์ C++๋ ์ ์๋ง ์ ์ฅํ๋ฉด ๋๋ฉฐ ์ ๋ฐ์ ์ผ๋ก ๋งค์ฐ ๋น ๋ฅด๊ธฐ ๋๋ฌธ์ GC ์ด์ ์ด ์ค์ํ์ง ์์ ์๋ ์์ต๋๋ค!
์ฐ๋ฆฌ๊ฐ ์ฃผ์ ์์ ๋ฒ์ด๋ ์ ์๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. ์ฃผ์ ์ ์๋ ๊ฒ์ ref ์ ํ์ด ์ ํ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ์ธ์ด์์ ์์ฐ์ค๋ฝ๊ฒ ๋ง์ง ์๋๋ค๋ @fgmccabe ์ ์์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๊ฒ์ ๋ฐ์ธ๋ฉ์ ๋ํด ์ด๋ค ๋ฐฉ์์ผ๋ก ์ฐ๋ฆฌ์๊ฒ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค(ํนํ C++ ๋ฐ Rust๊ฐ ์ด๋ฅผ ์ฒ๋ฆฌํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ดํด์ด ๊ฑฑ์ ๋์ง๋ง ๋ฐ์ธ๋ฉ์ด ์ด๋ฅผ ๋ฌด์ํ ์ ์์ต๋๊น?), ๊ทธ๋์ ์ ๊ฐ ์๊ฐํ๊ธฐ์ ์กฐ์ฌํด์ผ ํ ์ฌํญ - ๋ ๋ค ๊ฐ๋ฅํ ํ ๋ง์ ์ธ์ด์์ ์๋ํ๋๋ก ํ๊ณ ํน์ ์ธ์ด์ ์ ํ์ ์ง๋์น๊ฒ ์ํฅ์ ๋ฐ์ง ์๋๋ก ํฉ๋๋ค.
@kentonv
Cap'n Proto์ ์ง๋ ฌํ ๊ณ์ธต์ ๋๋ถ๋ถ์ด ๊ด์ฉ์ ์ด๊ณ ์ธ๋ผ์ธ ์นํ์ ์ด์ด์ผ ํ๋ ๋๊ณ ์์ API ๊ณ์ธต์ด๊ธฐ ๋๋ฌธ์ ํ์ค์ ์ผ๋ก ๊ฐ ์ธ์ด์์ ๋ ๋ฆฝ์ ์ผ๋ก ๊ตฌํ๋์ด์ผ ํฉ๋๋ค. RPC ๊ณ์ธต์ธ OTOH๋ ์ข์ง๋ง ๊น๋ค.
์ด๋ค ํด๋์ธ๊ฐ์?
@PoignardAzur ์ฃ์กํฉ๋๋ค, ๊ทํ์ ์ง๋ฌธ์ ์ดํดํ ์ ์์ต๋๋ค.
@kentonv capnproto Github ์ ์ฅ์๋ฅผ ์ดํด๋ณด๊ณ ์์ต๋๋ค. ์ง๋ ฌํ ๊ณ์ธต์ ์ด๋์ ์์ต๋๊น?
@PoignardAzur ๊ทธ๋์, ์ด๊ฒ์ ๋ด ์์ ์ผ๋ก ๋์๊ฐ๋๋ค. ๋น์ ์ด ๊ฐ๋ฆฌํค๊ณ "๊ทธ๊ฒ์ด ์ง๋ ฌํ ๊ณ์ธต์ ๋๋ค"๋ผ๊ณ ๋งํ ์ ์๋ ๊ณณ์ ์ค์ ๋ก ๋จ ํ ๊ณณ๋ ์์ต๋๋ค. ๋๋ถ๋ถ Cap'n Proto์ "์ง๋ ฌํ"๋ ๊ธฐ๋ณธ ๋ฒํผ์ ๋ํ ๋ก๋/์ ์ฅ์ ๋ํ ํฌ์ธํฐ ์ฐ์ ์ ๋๋ค. ์คํค๋ง ํ์ผ์ด ์ฃผ์ด์ง๋ฉด ์ฝ๋ ์์ฑ๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ ์คํค๋ง์ ์ ์๋ ํน์ ํ๋์ ๋ํด ์ฌ๋ฐ๋ฅธ ํฌ์ธํฐ ์ฐ์ ์ ์ํํ๋ ์ธ๋ผ์ธ ๋ฉ์๋๋ฅผ ์ ์ํ๋ ํค๋ ํ์ผ์ ์์ฑํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๋ ํ๋๋ฅผ ์ฝ๊ฑฐ๋ ์ธ ๋๋ง๋ค ์์ฑ๋ ์ ๊ทผ์๋ฅผ ํธ์ถํด์ผ ํฉ๋๋ค.
์ด๊ฒ์ด ๋ค๋ฅธ ์ธ์ด๋ก ์์ฑ๋ ๊ตฌํ์ ํธ์ถํ๋ ๊ฒ์ด ์๋ฏธ๊ฐ ์๋ ์ด์ ์ ๋๋ค. ๋ชจ๋ ํ๋ ์ก์ธ์ค์ ์์ FFI๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋งค์ฐ ์ฑ๊ฐ์ ์ผ์ด๋ฏ๋ก ์์ฌํ ์ฌ์ง ์์ด FFI๋ฅผ ๋ ์์(๊ทธ๋ฆฌ๊ณ ์คํค๋ง์ ๋ฐ๋ผ) ๊ฐ์ธ๋ ์ฝ๋ ์์ฑ๊ธฐ๋ฅผ ์์ฑํ๊ฒ ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์์ฑ๋ ์ฝ๋๋ ์ ์ด๋ Cap'n Proto๊ฐ ์ด๋ฏธ ๊ตฌํํ ์ฝ๋๋งํผ ๋ณต์กํ ๊ฒ์ ๋๋ค. ์๋ง๋ ๋ ๋ณต์กํ๊ณ ํจ์ฌ ๋๋ฆด ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ ๋์ ์ธ์ด์ ๋ํ ์ฝ๋ ์์ฑ๊ธฐ๋ฅผ ์ง์ ์์ฑํ๋ ๊ฒ์ด ๋ ํฉ๋ฆฌ์ ์ ๋๋ค.
Cap'n Proto ๊ตฌํ์๋ ๊ณต์ ํ ์ ์๋ ๋ด๋ถ ๋์ฐ๋ฏธ ๊ธฐ๋ฅ์ด ์์ ์ ์์ต๋๋ค. ํนํ layout.c++
/ layout.h
์๋ capnp์ ํฌ์ธํฐ ์ธ์ฝ๋ฉ์ ํด์ํ๊ณ ๊ฒฝ๊ณ ๊ฒ์ฌ ๋ฑ์ ์ํํ๋ ๋ชจ๋ ์ฝ๋๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ์์ฑ๋ ์ฝ๋ ์ ๊ทผ์๋ ํฌ์ธํฐ ํ๋๋ฅผ ์ฝ๊ณ ์ธ ๋ ํด๋น ์ฝ๋๋ฅผ ํธ์ถํฉ๋๋ค. ๋ฐ๋ผ์ ์ฌ๋ฌ ์ธ์ด์์ ํธ์ถ๋๋๋ก ํด๋น ๋ถ๋ถ์ FFI๋ก ๋ํํ๋ ๊ฒ์ ์์ํ ์ ์์ต๋๋ค. ํ์ง๋ง ์ฌ์ ํ ๊ฐ ๋์ ์ธ์ด์์ ์ฝ๋ ์์ฑ๊ธฐ์ ์ผ์ ๋์ ๋ฐํ์ ์ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ฑํ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค.
๋ค, ์ฃ์กํฉ๋๋ค. ๋ฐ๋๋ฅผ ์๋ฏธํ์ต๋๋ค ^^ (RPC ๋ ์ด์ด)
@PoignardAzur Ohhh, ๊ทธ๋ฆฌ๊ณ FFI์์ ์ธํฐํ์ด์ค๋ฅผ ๋ํํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์๊ฐํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ธํฐํ์ด์ค๋ฅผ ๋ณด๋ ๋ฐ ํนํ ๊ด์ฌ์ด ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ๊ทธ๋์ ๋น์ ์ ์ํฉ๋๋ค:
capability.h
: ์ด๋ก ์ ๋ค์ํ ๊ตฌํ์ผ๋ก ๋ท๋ฐ์นจ๋ ์ ์๋ ๊ธฐ๋ฅ ๋ฐ RPC ํธ์ถ์ ๋ํ๋ด๋ ์ถ์ ์ธํฐํ์ด์ค. (๊ฐ์ฅ ์ค์ํ ๋ถ๋ถ์
๋๋ค.)rpc.h
: ๋คํธ์ํฌ๋ฅผ ํตํ RPC ๊ตฌํ.rpc-twoparty.h
: ๋จ์ ์ฐ๊ฒฐ์ ํตํ RPC์ฉ ์ ์ก ์ด๋ํฐ.์ด ์ ์์ ์ด์ #1291: OCAP ๋ฐ์ธ๋ฉ์ผ๋ก ๋์ฒด๋์์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด๊ฒ์ ๋ด๊ฐ ๋จ์ํ ์ฌ์ค์ด ์๋๋ผ๊ณ ๋ฏฟ๋ ๊ฒฐ์ ์ ์ธ ๊ธฐ๋ณธ ๊ฐ์ ์ ๋๋ค. ๋ด ๊ฒฝํ์ ๋ฐ๋ฅด๋ฉด (์ ์ด๋!) ์ธ์ด ๊ตฌํ๋งํผ ๋ง์ ํํ ์ ํ์ด ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ๋ค์ ์์๋ก ๋ณต์กํ ์ ์์ต๋๋ค.
๋ค๋ฅธ ์ธ์ฝ๋ฉ, ์ด์ข ๋กํ ๋ฑ์ ํฌํจํ์ฌ ๋ฌธ์์ด์ ๋ํด ์์ญ(!)๊ฐ์ ํํ์ด ์๋ V8์ ์๋ก ๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
Haskell์ ๊ฒฝ์ฐ๋ ์ค๋ช ํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ๋ณต์กํฉ๋๋ค. Haskell์ ๋ชฉ๋ก์ ๊ฒ์ผ๋ฅด๋ฏ๋ก ๋ฌธ์์ด์ ๋ชจ๋ ๋จ์ผ ๋ฌธ์์ ๋ํด ์ฝํฌ๋ฅผ ํธ์ถํด์ผ ํ ์๋ ์์ต๋๋ค.
๋ค๋ฅธ ์ธ์ด๋ ๋ฌธ์์ด ๊ธธ์ด์ ๋ํด ์ฌ๋ฏธ์๋ ํํ์ ์ฌ์ฉํ๊ฑฐ๋ ๋ช ์์ ์ผ๋ก ์ ์ฅํ์ง ์์ง๋ง ๊ณ์ฐ์ ์๊ตฌํฉ๋๋ค.
์ด ๋ ๊ฐ์ง ์๋ ์ด๋ฏธ ์ ์ธ์ ๋ฐ์ดํฐ ๋ ์ด์์์ด ์๋ฆฌ์ง ์๋๋ค๋ ๊ฒ์ ๋ณด์ฌ์ค๋๋ค. ๋ฐํ์ ์ฝ๋๋ฅผ ํธ์ถํ ์ ์์ด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ผ๋ฉฐ, ๋ฐํ์ ์ฝ๋์๋ ๊ณ ์ ํ ํธ์ถ ๊ท์น์ด ์์ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ๊ฐ๋ ์ ์ผ๋ก ์๋นํ ๋จ์ํ ๋ฐ์ดํฐ ์ ํ์ธ ๋ฌธ์์ด์ผ ๋ฟ์ ๋๋ค. ์ธ์ด๊ฐ ์ ํ ์ ํ(ํํ/๊ตฌ์กฐ์ฒด/๊ฐ์ฒด)์ ๋ํ๋ด๋ ๋ฌดํํ ๋ฐฉ๋ฒ์ ๋ํด ์๊ฐํ๊ณ ์ถ์ง๋ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์์ ์ธก์ด ์์ต๋๋ค. ์ฌ๊ธฐ์์ ์ด๋ฌํ ๋ชจ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์์ฑ ํ ์ ์์ด์ผ ํฉ๋๋ค!
๋ฐ๋ผ์ "๋๋ถ๋ถ์ ์ธ์ด"๋ฅผ ์ง์ํ๋ ๋ฐ ์์ฃผ ์กฐ๊ธ์ด๋ผ๋ ๊ฐ๊น์์ง๋ค๋ ๊ฒ์ ์์ ํ ๋นํ์ค์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋์ , ์ฐ๋ฆฌ๋ ์ด๋ฏธ ์์์ ์ธ ๊ฒ๋ค์ ํฐ ๋๋ฌผ์์ ์ฑ์ฅ์ํค๋ฉด์ ์์์ ํน๊ถ์ ๋๋ฆฌ๊ธฐ ์์ํ ๊ฒ์ ๋๋ค. ๊ทธ๊ฒ์ ์ฌ๋ฌ ์์ค์์ ์น๋ช ์ ์ผ๋ก ๋ณด์ ๋๋ค.