์ด ๋ฌธ์ ๋ "WebAssembly, ์ ๋์ฝ๋ ๋ฐ ์น ํ๋ซํผ"์ ๋ํ ํ ๋ก ์ ์ํ ๊ฒ์ ๋๋ค. ํ๋ฆฌ์ ํ ์ด์ ์ ์ฌ์ ๋ นํ๋์์ผ๋ฉฐ https://github.com/WebAssembly/meetings/pull/775 ์์ ์๋ํ๊ธฐ๋ก ๊ฒฐ์ ํ์ผ๋ฉฐ ํ ๋ก ์๊ฐ์ 6์ 22์ผ CG ํ์ ํ์๋ก ์์ ๋์ด ์์ต๋๋ค.
CG ๋ฉค๋ฒ๋ค ์ฌ์ด์์ ์ ์๋ ค์ ธ ์์ ๊ฒ์ผ๋ก ์์๋๋ ๋ช ๊ฐ์ง ๊ฐ๋ ์ ์ธ๊ธํ์ง๋ง ์ฃผ์ ์ ์ต์ํ์ง ์์ ์ฌ๋๋ค๋ ํ๋ ์ ํ ์ด์ ์ ์ฝ๊ฒ ์ ๊ทผํ ์ ์๋๋ก ํฌํจํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ํผ๋๋ฐฑ ํ์ํฉ๋๋ค!
๊ด๋ จ ๋ฌธ์ :
์ง๊ธ๊น์ง ์คํ๋ผ์ธ ํผ๋๋ฐฑ์์ ์์งํ ๋ช ๊ฐ์ง ์ ์ฌ์ ์ธ ์๋ฃจ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ธํฐํ์ด์ค ์ ํ์์ ๋ค์์ ์ ์ํฉ๋๋ค.
string := list char
string16 := list u16
๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ ์ฐ๊ฒฐํ๋ ๋์ ์ ์ฉ๋๋ ๊ฐ์ ๋ณํ์ ์ ์ํฉ๋๋ค.
| ์์ | ๋ก | ๊ธฐ๋
|------------|------------|-------------
| string
| string16
| UTF-8์์ UTF-16์ผ๋ก ๋ค์ ์ธ์ฝ๋ฉ
| string16
| string
| WTF-16์์ UTF-8๋ก ๋ค์ ์ธ์ฝ๋ฉ(๋์ฒด ์ต์
)
๊ฐ์ ๋ string
๋ฐ string16
๋ชจ๋์ด ๋ชจ๋ string
๊ฒฝ์ฐ์๋ ์๋ก ์ธํฐํ์ด์คํ ์ ์๋๋ก string16
๋ชจ๋์ด ๊ฐ๊ฐ WASI ํธ์คํธ์์ ์๋ํ๋๋ก ํฉ๋๋ค string
๋ฐ string16
๋ชจ๋ ๋๋ ํธ์คํธ๋ ๋์ผํ string
๋๋ string16
๋ด๋ณด๋ด๊ธฐ๋ฅผ ํธ์ถํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ชจํธํฉ๋๋ค.
์ด๊ฒ์ ๋ํ list u16
๋ฅผ JS์ ์ ๋ฌํ๋ ๊ฒ์ด Uint16Array
๋๋ DOMString
๊ฐ ๋ ์ ์๋ค๋ ์ ์์ ์น ์๋ฒ ๋ฉ์ ๋ชจํธ์ฑ์ ๋์
ํฉ๋๋ค. Uint16Array
์์ DOMString
๋ก์ JS ์ ์ฒด ๊ฐ์ ๋ณํ์ ๋ฐ๋์งํ์ง ์์ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง JS ์ ํ์ string16
๋ณ์นญ์ ๋ช
์์ ์ผ๋ก ์ฌ์ฉํ์ฌ ์์ํ ์ ์์ต๋๋ค(์์ฒด ๋ฐ์ด๋๋ฆฌ id, string16 :> list u16
๋ ์ด๋ํฐ ๋ชจ๋์์ list u16
๋์ ํ์ํ ๊ฒฝ์ฐ ์์ ํ ์๋ฏธ๋ก ์ ์
๋๋ค. ๋ฐ๋ผ์ ๋ณ์นญ. ์ด ๊ฒฝ์ฐ string16
๋ DOMString
๋๊ณ list u16
๋ Uint16Array
๋ฉ๋๋ค.
์ ๋ string16
๋ผ๋ ์ด๋ฆ์ ํน๋ณํ ์ง์ฐฉํ์ง ์์ผ๋ฉฐ ๋ค๋ฅธ ์ด๋ฆ์ด๋ ๋ชจํธ์ฑ์ ํด๊ฒฐํ๊ธฐ ์ํด ์ด๋ฆ/ID๊ฐ ํ์ํ์ง ์์ ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ํด๋ ๊ด์ฐฎ์ต๋๋ค.
list.count
์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก list.is_canon
์ ์ ์ฌํ ์ต์ ํ๋ ์ฌ๊ธฐ์์ ํ์ํ์ง ์์ต๋๋ค. ๋ํ ์๋์ ๊ฐ์ด UTF-any ๋ฐ ์ ์ฌ์ ์ธ Latin1 ์ต์ ํ๋ฅผ ํฅํ ๋ฌธ์ list.*_canon
์ด๋ํฐ ๋ช
๋ น์์ ๋ฏธ๋๋ฅผ ์ํ ๊ณต๊ฐ์ ์ฆ์ ์์ฝํ์ฌ ์ด์ด๋ ์ ์์ต๋๋ค.
์ธํฐํ์ด์ค ์ ํ์์ ๋ค์์ ์ ์ํฉ๋๋ค.
list.lift_canon $unit [...]
list.is_canon $unit [...]
list.lower_canon $unit [...]
where the $unit immediate is
0: 8-bit (UTF-8, ASCII-compatible)
1: 16-bit (UTF-16)
2: 32-bit (UTF-32)
3: 8-bit (Latin1, narrow UTF-16)
์ด ์ ์ฌ์ ์๋ฃจ์
์ ์ ํ์ฑ๋์ด์ผ ํ๋ ๊ฒฝ์ฐ์ ๊ณ ๋ ค๋ ์ ์์ต๋๋ค. ์ด์ค ์ฌ์ธ์ฝ๋ฉ ์ค๋ฒํค๋์ ์ฝ๋ ํฌ๊ธฐ์ ๋ํ ๊ฐ์ ์ ์ธ ์ํฅ์ ๋ฐฉ์งํ์ง๋ง ๋๋ฆฌ ๋ฌธ์ ๋ ํด๊ฒฐ๋์ง ์์ ์ํ๋ก ๋ก๋๋ค. $unit
1-3์ MVP ์ดํ์ ์ถ๊ฐ ์ต์ ํ๋ก ์ถ๊ฐ๋๊ฑฐ๋ ์ผ๋ถ๋ ๋ฐ๋ก ์์ํ ์ ์์ต๋๋ค.
์ธํฐํ์ด์ค ์ ํ์์ ๋ค์์ ์ ์ํฉ๋๋ค.
list.lift_canon $unit [...]
list.is_canon $unit [...]
list.lower_canon $unit [...]
where the $unit immediate is
0: 8-bit (WTF-8, ASCII-compatible)
1: 16-bit (WTF-16)
2: 32-bit (Code points except surrogate pairs)
3: 8-bit (Latin1, narrow WTF-16)
์ด ์ ์ฌ์ ์ธ ์๋ฃจ์
์ ๋ํ char
๋ฅผ ์ ๋์ฝ๋ ์ค์นผ๋ผ ๊ฐ์์ ์ ๋์ฝ๋ ์ฝ๋ ํฌ์ธํธ๋ก ์ฌ์ ์ํ๋ ํํธ char
๋ชฉ๋ก์ ์ ํํ์ฌ ๋๋ฆฌ ์์ ํฌํจํ์ง ์๋๋ก(๊ทธ๋ฌ๋ ๊ฒฉ๋ฆฌ๋ ๋๋ฆฌ๋ฅผ ํ์ฉํจ) ํด์ ํ ๋ ์ ์ฌ์ ์ผ๋ก ์ํํด์ผ ํฉ๋๋ค. ๋ค์ ๋งํ์ง๋ง, MVP์ ๊ตฌ์ฒด์ ์ธ $unit
๋ ๋
ผ์์ ์ฌ์ง๊ฐ ์์ต๋๋ค.
์ด๊ฒ์ ์์ฒด์ ์ผ๋ก ์์ค์ ์ ๋ฐํ์ง ์์ผ๋ฏ๋ก ๋ค๋ฅธ ๋ชจ๋ ๊ฒ์ ์ค์ ๋ก MVP ํ ์ต์ ํ๊ฐ ๋ฉ๋๋ค.
์ธํฐํ์ด์ค ์ ํ์์ ๋ค์์ ์ ์ํฉ๋๋ค.
passthrough
์ต์
์ ์ถ๊ฐํฉ๋๋ค. ์ด๊ฒ์ ๋ฌด์์ค ํจ์ค์ค๋ฃจ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐ์
๋๋ค.๊ทธ๋ ๊ฒ ํจ์ผ๋ก์จ ์ฐ๋ฆฌ๋ ๋ค์์ ๋ฌ์ฑํฉ๋๋ค:
IIUC์ ๊ทผ๋ณธ ๋ฌธ์ ๋ IT์์ ๋ฌธ์์ด์ด ์ ๋์ฝ๋ ์ฝ๋ ํฌ์ธํธ์ ์ํ์ค๊ฐ โโ๋๊ธฐ๋ฅผ ์ํ์ง๋ง ์ผ๋ถ ์ธ์ด์์๋ ๋ฌธ์์ด์ ์ ๊ตฌ์ฑ๋ ์ ๋์ฝ๋ ๋ฌธ์์ด์ ํด๋นํ๊ฑฐ๋ ํด๋นํ์ง ์์ ์ ์๋ i8 ๋๋ i16 ๊ฐ์ ์ํ์ค๋ก ๊ฐ์ฃผํ๋ค๋ ๊ฒ์
๋๋ค. ํ๋์ ๊ฐ๋จํ ํด๊ฒฐ์ฑ
์ ์ธ์ด / ์๋ฝํ๊ฑฐ๋ ์ ํจํ์ง ์์ ์ ๋ ์ฝ๋ ๋ฌธ์์ด์ ์ฌ์ฉํ๋ ์์ฐ API๋ฅผ ๊ฐ์ง๊ณ ํ๋ ๊ฒ์
๋๋ค (list u8)
๋๋ (list u16)
(๊ฐ์ ๊ฐ๋ฅ์ฑ์ ๊ฐ์ง ๋ฉ์ง ๋ณ์นญ byte_string
์๋ ์์ฌ ์ํต)๋ณด๋ค๋๋ฅผ IT string
์ ํ์ผ๋ก, IIRC๋ (list char)
์ ๋ณ์นญ์
๋๋ค. ๊ทธ๋ ๊ฒ ํ๋ ๊ฒ์ ์ฅ๋จ์ ์ ๋ํด ๋
ผ์ํ ์ ์ด ์์ต๋๊น?
IT๊ฐ char
๋ฅผ "์ ๋์ฝ๋ ์ค์นผ๋ผ ๊ฐ"์ผ๋ก ์ ์ํ๊ธฐ๋ฅผ ์ํ๋ค๋ ์ ์์ ๋ฌธ์ ๊ฐ ์ข ๋ ๋ฏธ๋ฌํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด ๊ฐ์ ์๋ก๊ฒ์ดํธ ์ฝ๋ ํฌ์ธํธ๊ฐ ์์ด์ผ ํ๋ ์์น์ ๊ตฌ๋ฉ์ด ์์ผ๋ฏ๋ก ๊ฒฉ๋ฆฌ๋ ์๋ก๊ฒ์ดํธ๋ฅผ ๋ํ๋ผ ์ ์์ต๋๋ค. . ๋ฐ๋ฉด์ WTF๋ ์ด ์ ํ์ด ์๋ "์ ๋์ฝ๋ ์ฝ๋ ํฌ์ธํธ"์ด์ง๋ง ์๋ก๊ฒ์ดํธ ์ฝ๋ ํฌ์ธํธ ์์ ํฌํจํ์ง ์๋๋ก ์ํ์ค๊ฐ โโ์ ํ๋ฉ๋๋ค(์ด๋ค์ ๋ณด์กฐ ์ฝ๋ ํฌ์ธํธ > U+FFFF๋ก ๋์ฒด๋์ง๋ง ๊ฒฉ๋ฆฌ๋ ์๋ก๊ฒ์ดํธ๋ ๊ด์ฐฎ์). ์ด๊ฒ์ด ๋น์ ์ด ์๋ฏธํ๋ ๋ฌด์์
๋๊น?
๊ทธ ์ธ์๋ const char*
ํ์ฌ C์ ๊ฐ์ ๋ฐ์ดํธ ๋ฌธ์์ด์ ๋ํด์๋ ์์ง ๋
ผ์๋์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค. ๋ด๊ฐ ๋์ณค์ ์๋ ์์ง๋ง.
ํ๋์ ๊ฐ๋จํ ํด๊ฒฐ์ฑ ์ ์ธ์ด / ์๋ฝํ๊ฑฐ๋ ์ ํจํ์ง ์์ ์ ๋ ์ฝ๋ ๋ฌธ์์ด์ ์ฌ์ฉํ๋ ์์ฐ API๋ฅผ ๊ฐ์ง๊ณ ํ๋ ๊ฒ์ ๋๋ค
(list u8)
๋๋(list u16)
(๊ฐ์ ๊ฐ๋ฅ์ฑ์ ๊ฐ์ง ๋ฉ์ง ๋ณ์นญbyte_string
์๋ ์์ฌ ์ํต)๋ณด๋ค๋๋ฅผ ITstring
์ ํ์ผ๋ก, IIRC๋(list char)
์ ๋ณ์นญ์ ๋๋ค.
์ด๊ฒ์ ํ์ฌ ๋ด๊ฐ ์ ํธํ๋ ์๋ฃจ์
์ด๊ธฐ๋ ํฉ๋๋ค. string
๊ฐ ํ์ฌ (list char)
๋ํ ๋ณ์นญ์ผ๋ก ์ ์๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก wtf16string
์ ํ์ (list u16)
์ ๋ณ์นญ์ด ๋ฉ๋๋ค (list char)
. ๋ณ์นญ IIUC์ ๊ฐ์ JS๊ฐ ํธ์ถํ (list u16)
๋ฐํํ๋ ํจ์์ ๊ฒฐ๊ณผ๊ฐ JS ๋ชฉ๋ก(์ซ์)์ผ๋ก ๋ํ๋๋ ๋ฐ๋ฉด wtf16string
๋ฐํํ๋ ํจ์์ ๊ฒฐ๊ณผ๋
ํ์ค ABI ์ด์์ ์ถ๊ฐ wtf16string
๋ณ์นญ์ ์ถ๊ฐํ๋ ๊ฒ์ ์๋์ ์ผ๋ก ๋ฐฉํด๊ฐ ๋์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ฐ๋ฉด์ WTF๋ ์ด ์ ํ์ด ์๋ "์ ๋์ฝ๋ ์ฝ๋ ํฌ์ธํธ"์ด์ง๋ง ์๋ก๊ฒ์ดํธ ์ฝ๋ ํฌ์ธํธ ์์ ํฌํจํ์ง ์๋๋ก ์ํ์ค๊ฐ โโ์ ํ๋ฉ๋๋ค(์ด๋ค์ ๋ณด์กฐ ์ฝ๋ ํฌ์ธํธ > U+FFFF๋ก ๋์ฒด๋์ง๋ง ๊ฒฉ๋ฆฌ๋ ์๋ก๊ฒ์ดํธ๋ ๊ด์ฐฎ์).
์, ๊ทธ๊ฒ์ WTF-8์ด ์ด ์ถ๊ฐ ์ ํ์ด ์๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ (list u16)
์ ๋์ผํ์ง ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๊น? ๋๋ ๊ทธ ๋์์ค๋ฅผ ๋์ด ํ๊ฐํ์ง ์์๋ค. ๋ด ์ง๊ด์ (list u16)
๊ฐ๊น์ด wtf16string
์ ํ๋ฟ๋ง ์๋๋ผ ์ ๊ตฌ์ฑ๋ ์ ๋์ฝ๋ ์ค์นผ๋ผ ๊ฐ์ ์ํ์ค๋ฅผ ๋ํ๋ด๋ string
์ ํ์ ๋ชจ๋ ๊ฐ๋ ๊ฒ์ ๊ณผ๋ํ๋ค๋ ๊ฒ์
๋๋ค wtf16string
์ถ๊ฐ ์ ํ ์ฌํญ์ด ์์ต๋๋ค. ๋ฌด์ ํ (list u16)
๋ณ์นญ์ ์ฌ์ฉํ๋ฉด ์ ๋์ฝ๋ ํ์์ ์ ์ฉํ์ง ์๋ ์์คํ
์์ ์ถฉ๋ถํ ์ ์๋ํฉ๋๊น? WTF-8 ์ฌ์์ ์ด ๋ฉ๋ชจ๋ ๊ทธ๋ด ๊ฒ์ด๋ผ๊ณ ์ ์ํฉ๋๋ค.
์, ๊ทธ๊ฒ์ WTF-8์ด ์ด ์ถ๊ฐ ์ ํ์ด ์๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ(๋ชฉ๋ก u16)๊ณผ ๋์ผํ์ง ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๊น?
"UTF-8์ด UTF-16๊ณผ ์ผ์น์ํค๊ธฐ ์ํด ์ธ์์ ์ผ๋ก ์ ๋์ฝ๋ ํ
์คํธ๋ก ์ ํ๋๋ ๊ฒ์ฒ๋ผ WTF-8์ ์ ์ฌ์ ์ผ๋ก ์๋ชป๋ ํ์์ UTF-16๊ณผ ์ผ์น์ํค๊ธฐ ์ํด ๋๋ฆฌ ์ฝ๋ ํฌ์ธํธ ์์ ์ ์ธํ๋๋ก ์ธ์์ ์ผ๋ก ์ ํ๋ฉ๋๋ค." Iiuc, UTF-8์ด ๋๋ฌด ๊ธธ๊ฑฐ๋ ์๋ฆฐ ๋ฐ์ดํธ ์ํ์ค๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ์๊ณผ ์ ์ฌํ๊ฒ ์ฒ๋ฆฌํฉ๋๋ค. WTF-8์ ๋ชจ๋ (list u16)
๋ํ๋ผ ์ ์์ง๋ง ๋ชจ๋ (list u8)
๊ฐ ์ ํจํ WTF-8์ ์๋๋๋ค.
unrestricted(list u16)์ ๋ํ ๋ณ์นญ์ ์ฌ์ฉํ๋ฉด ์ ๋์ฝ๋ ํ์์ ์ ์ฉํ์ง ์๋ ์์คํ ์์ ์ถฉ๋ถํ ์ ์๋ํฉ๋๊น?
WTF-16์ 1:1์ ์์์ u16
๊ฐ์ ๋งคํํ๊ณ ์ด๋ฌํ ๊ฐ์ด ํด์๋๋ ๋ฐฉ์์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ฏ๋ก ์, (list u16)
๊ฐ ์๋ํฉ๋๋ค.
IIUC, WTF-8์ ์์์ list u8
์ ์์ ํ ๋์ผํ์ง ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, "๋๋ฆฌ ์ ๋ฐ์ดํธ ์ํ์ค"๋ฅผ ๊ธ์งํฉ๋๋ค( ์ฌ๊ธฐ ์ฐธ์กฐ).
๊ทธ๋ฌ๋ WTF-16์ _is_ list u16
์ ๋์ผํฉ๋๋ค. ๊ทธ๋ค์ด ๋ค์ด๋ฐ ํ
๋ง๋ฅผ ๊ณต์ ํ๋ค๋ ๊ฒ์ด ์กฐ๊ธ ์ด์ํฉ๋๋ค.
ํธ์ง: ์๋ก ๊ณ ์ณ์ผ ํฉ๋๋ค :)
๋๋ interface-types/#135 ์ ๋๋ฆฌ ์ง๋ฌธ์ ์ด์ ์ ๋ง์ถ ์ฒซ ๋ฒ์งธ ์ง๋ฌธ/๋ต๋ณ์ ๊ฒ์ํ์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ์์ ๋นํธ๋ผ๊ณ ์๊ฐํ๋ฉฐ, ์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ์ ๋์ํ ์ ์๋ค๋ฉด ํ๋ ์ด์์ ์ธ์ฝ๋ฉ ํ์ ์ง์์ ๋ํ ํ์ ๋ ผ์๊ฐ ๋ ๊ฐ๋จํด์ง ๊ฒ์ ๋๋ค.
๊ณ ๋ง์, ๋ฃจํฌ.
์์ ๊ฐ์ด "๋ณ๋์ WTF-16"์ ์ง์ํ๋ ค๋ ๊ฒฝ์ฐ(๊ฐ์ ๋ ฅ์ WASI API์ ์ก์ธ์คํ๊ณ ๊ธ๋ฃจ ์ฝ๋ ์์ด JavaScript์ ์ธํฐํ์ด์คํ๋ ๋ฐ ์ค์ํฉ๋๋ค) ์ ์๋ char
ํธ์ํจ์ ๋๋ ๊ฒ์
๋๋ค. ๊ฐ ๋ฒ์. ๊ทธ๋ฐ ๋ค์ WTF-16 ์ธ์ด๋ ํตํฉํ๋ ๋ฐ ํ์ํ ์ด์ค์ผ์ดํ ํด์น๋ฅผ ๊ฐ์ง ๋ฟ๋ง ์๋๋ผ ๋์ผํ ์ธ์ด์ธ JavaScript๋ก ์์ฑ๋ ๋ชจ๋๊ณผ UTF-* ์ธ์ด๋ก ๊ต์ฒดํ๋ ๋ฐฉ๋ฒ์ ํตํด ์ป์ ์ ์์ต๋๋ค. ๋ํ ๋ฌธ์์ด ์ธ์ฝ๋ฉ์ ๋ถ์ผ์น๋ก ์ธํด ๋ฐ์ํ๋ ์ฃผ์ ๋ฌธ์ ์ ์ด ๊ฐ์ ๋ก ํด๊ฒฐ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ WASI btw์ ๋ํด ํจ์ฌ ๋ ์ข๊ฒ ๋๋ ๊ฒ์
๋๋ค.
์๋ก๊ฒ์ดํธ๋ก ์ ์ํ ๊ฒ์ฒ๋ผ ๋ณ๋์ string16
์ ํ์ ์ฌ์ฉํ๋ฉด ์ฌ์ ํ interface-types/#135 ์ ์ค๋ช
๋ ์๋ก๊ฒ์ดํธ์ ๋ํ ๋ชจ๋ ๋ฌธ์ ๊ฐ ์์ผ๋ฏ๋ก ๋ ๊ฐ์ ๋ฌธ์์ด ์ ํ์ ๊ฐ๋ ๊ฒ์ด ๋ ์ข์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. .one(ํนํ ์์์ ์ผ๋ก ์ํธ ๋ณํํ ์ ์๋ ๊ฒฝ์ฐ ์๋ฏธ ์๋ ๋ณ๋์ ์ ํ์ด ์๋). ๋ ๊ฐ์ ๋ฌธ์์ด ์ ํ์ ์ฌ์ฉํ๋ฉด ๋ชจ๋ ์ธํฐํ์ด์ค ๋์์ด๋์ ์๋น์์๊ฒ ์ ์ ์ ๋ถ๋ด์ ์ฃผ์ด ์ํฉ์ ๋์ฑ ์
ํ์ํฌ ์๋ ์์ต๋๋ค("์ ๋ ๊ฐ์ง ์ ํ์ด ์์ต๋๊น? ์ฐจ์ด์ ์ด ๋ฌด์์
๋๊น? ์ธ์ ๋ ์ค ํ๋๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๊น?"). ๋ง์ง๋ง์ผ๋ก WTF-16์ ๋ํ ์ง์์ ์ถ๊ฐํ๋ ๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก interface-types/#135 ์์๋ ์ธ๊ธ๋ ๋ฏธ๋ ํ์ค ์งํ ์ง์นจ Web/IETF์ ์๋ฐฐ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ธํฐํ์ด์ค ์ ํ์ด ์์ด๋ ์คํ ๊ฐ๋ฅํ์ง ์๋ค๋ ์ค์ ๊ตฌ์ฒด์ ์ธ ์ฆ๊ฑฐ๊ฐ ์๋ ํ ๋๋ฆฌ ๋ฒ ์ด๋ง ์ ํ์ ์ถ๊ฐํ๋ ๊ฒ์ ๊ณ ๋ คํด์ผ ํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
์น ์ ์ฉ ์ฌ์ฉ ์ฌ๋ก์ ๊ฒฝ์ฐ JS ๋๋ Web API์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด, wasm ๊ฐ์ ธ์ค๊ธฐ ๋ฐ ๋ด๋ณด๋ด๊ธฐ๋ฅผ "๋ฐ์ธ๋ฉ"ํ๊ธฐ ์ํ JS API๋ฅผ ์ฝ๊ฒ ์์ํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ์ด๋ฏธ ์คํ ์ ํ๊ณผ ๊ฐ์ ๋ค๋ฅธ ์ ํฅ JS API์์ ์ฑํ๋ ์ ๊ทผ ๋ฐฉ์์ด๋ฉฐ ์น์ ์ฒ๋ฆฌํ ์ ์๋ ์ผ๋ฐ์ ์ธ "๋ฐ์ธ๋ ๊ฐ์ ธ์ค๊ธฐ"/"๋ฐ์ธ๋ ๋ด๋ณด๋ด๊ธฐ" JS API๊ฐ ์ด๋๋ก ๊ฐ๊ณ ์๋์ง ๊ถ๊ธํฉ๋๋ค. -Promises, JS ๋ฌธ์์ด ๋ฐ ํ์ํ๋ ๋ฐฐ์ด ๋ณด๊ธฐ์ ํน์ ์ฌ๋ก.
์๋ก๊ฒ์ดํธ๋ก ์ ์ํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ณ๋์ string16 ์ ํ์ ์ฌ์ฉํ๋ฉด ์ฌ์ ํ interface-types/135์ ์ค๋ช ๋ ์๋ก๊ฒ์ดํธ์ ๋ํ ๋ชจ๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๊ธฐ์ ์ ์ผ๋ก ์ฌ์ค์ด์ง๋ง ์ด๋ค ์ข
๋ฅ์ ๋ชจ๋๊ณผ ์ธํฐํ์ด์คํ๋์ง์ ๋ํ ์ฌ์ ์ง์ ์์ด๋ ๋ฌธ์์ด์ด ๋์ผํ ์ธ์ด, ํธํ๋๋ ๋ชจ๋ ์ธ์ด ๋ฐ JavaScript๋ก ๋ณ๋๋ก ์ปดํ์ผ๋ ๋ชจ๋ ์ฌ์ด์์ ํญ์ ์๋ํ๋ค๋ ์ ์ ๋์น๊ณ ์์ต๋๋ค. ์ ๊ฐ ์๊ฐํ๋ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ์
๋๋ค. ์ํ๋ char
๊ฐ ๋ฒ์๋ฅผ ์ ๊ตฌ์ฑ๋(USV) ๋ฌธ์์ด์ ํ ๋นํ ์ ์๊ธฐ ๋๋ฌธ์ ํฉ๋ฆฌ์ ์ธ ์ ์ถฉ์์ฒ๋ผ ๋ณด์
๋๋ค.
๋ ๊ฐ์ ๋ฌธ์์ด ์ ํ์ ์ฌ์ฉํ๋ฉด ๋ชจ๋ ์ธํฐํ์ด์ค ๋์์ด๋์ ์๋น์์๊ฒ ์ ์ ์ ๋ถ๋ด์ ์ฃผ์ด ์ํฉ์ ๋์ฑ ์ ํ์ํฌ ์ ์์ต๋๋ค.
๊ฐ๋ ํ์๋๋ ๋์์ ๋์๊ฒ ํจ์ฌ ๋ ๋์ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋์ ๊ทธ๊ฒ์ด ํ์ํ ๊ฒฝ์ฐ ๋๋ถ๋ถ์ ์ฌ๋๋ค์ด ๊ด์ฐฎ์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์๋ง๋ ๋ ๋ฒ์งธ ๋ฌธ์์ด ์ ํ์ ๋ํ ์ข์ ์ด๋ฆ( domstring
?)์ ์ด ์ฌ์ํ ๋ฌธ์ ๋ฅผ ์ํํ๊ธฐ์ ์ถฉ๋ถํ ๊ฒ์
๋๋ค.
๋ง์ง๋ง์ผ๋ก WTF-16์ ๋ํ ์ง์์ ์ถ๊ฐํ๋ฉด ์ผ๋ฐ์ ์ผ๋ก ๋ฏธ๋ ํ์ค ์งํ ์ง์นจ Web/IETF์ ์๋ฐฐ๋ฉ๋๋ค.
๋ถํํ๋ ์ํฅ์ ๋ฐ๋ ์ธ์ด์ ๋ํ ํ์ถ๊ตฌ๊ฐ ์์ผ๋ฉด IT MVP๊ฐ ๋๊ตฐ๊ฐ๋ฅผ ์ํด ์ด๋๊ฐ์์ ๋ฌด์ธ๊ฐ๋ฅผ ๊นจ๋จ๋ฆด ๊ฒ์ด๊ณ ๊ฑฐ์ ์ธ๋ชจ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์๋ ค์ง ์ถ์ธ์ ๋ํ ๋๊ตฐ๊ฐ์ ์ถ๋ก ์ด ์ผ๋ง๋ ๊ฑด์ ํ์ง๋ ๋ณ๋ก ์ค์ํ์ง ์์ต๋๋ค. ๋ด๊ฐ ์์ ํ๊ณ ์๋ JavaScript์ ๊ฐ์ ์ธ์ด์ ๋ํด์๋ ๋ฐ๋ํ ์ ๋ฐ์ ์์ต๋๋ค.
๊ทธ๋์ ์ ๋ ๋ชจ๋๊ฐ ํจ๊ป ์ด ์ ์๋ ํฉ๋ฆฌ์ ์ธ ํด๊ฒฐ์ฑ ์ด๋ ํํ์ ์ ์ฐพ์ผ๋ ค๊ณ ๋ ธ๋ ฅํ๊ณ ์์ผ๋ฉฐ, ํ๋ ฅํ ์ ์๋ค๋ฉด ๊ธฐ์ ๊ฒ์ ๋๋ค.
๋๋ ๋น์ ์ด ๋งํ๋ ๊ฒ์ด interface-types/#135 ์์ ์ ๊ธฐ๋ ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํ๋์ง ๋๋ IT๊ฐ ์๋ก์ด domstring
์ ํ์ ํฌํจํ์ง ์๊ณ ๋ ์ผ๋ฐ์ ์ผ๋ก ์คํ ๊ฐ๋ฅํ์ง ์์ ๊ฒ์ด๋ผ๋ ๋ฐ์ฆ์ ์ ๊ณตํ๋์ง ์ ์ ์์ต๋๋ค. ๊ธฐ์กด JS API๋ ์ด๋ฏธ ๊ฒฝ๊ณ์์ ์์์ ๊ฐ ๋ณํ์ ์ํํ๊ธฐ ์ํ ๋ฒ์ฉ ์ด์ค์ผ์ดํ ํด์น๋ฅผ ์ ๊ณตํ๋ฏ๋ก ์ด ์ด๊ธฐ ์์ ์์ ๋ ๋ฒ์งธ ์ด์ค์ผ์ดํ ํด์น๊ฐ ์ด๋ป๊ฒ ํ์ํ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋๋ฆฌ์๋ฅผ ํฌํจํ๋ ์ถ๊ฐ ์ ํ ๋ฌธ์์ด์ ๋ํด ์ ๊ณต๋ ๊ฐ๋ ฅํ ์ง์นจ์ ๋์ํ๊ธฐ ์ํด ๋ ๋ง์ ๊ฒฝํ ๊ธฐ๋ฐ ์ฆ๊ฑฐ๊ฐ ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
(FWIW, ์ฐ๋ฆฌ๊ฐ ๋๋ฆฌ์๊ฐ ์๋ค๋ ๋ฐ ๋์ํ ์ ์๋ค๋ฉด string
์ ํ์ค ABI์์ ์ถ๊ฐ ์ธ์ฝ๋ฉ์ผ๋ก U TF-16์ ์ง์ํ๋ ๊ฒ์ ๋ํด ์ด์ผ๊ธฐํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ์์ ํ ๋ณ๊ฐ์ ์ฃผ์ ์
๋๋ค. ๋ช ๊ฐ์ง ์ต์
์ด ์์ผ๋ฏ๋ก ๋จผ์ ์ดํดํด์ผ ํ๋ ์ถ์ ๋ฌธ์์ด ์๋ฏธ์ ํผ๋ํ๊ณ ์ถ์ง ์์ต๋๋ค.)
์ด๋ฏธ ๋งค์ฐ ์ฑ๊ฐ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค๋ ์ ์์ ๋ ๋ฒ์งธ ๋จ๋ฝ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. UTF-16 ์ง์์ด ๋ฐ๋ก๋ฐ๋ก ์ ์ฉํ๋ค๋ ์ ์ ๋์ํ๊ณ , Explainer/MVP์ ์ถ๊ฐํด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค. ๋๋ฅผ ๊ปด์ค!
๊ทธ๋ฌ๋ ์ฒซ ๋ฒ์งธ ๋จ๋ฝ์์ ๊ทํ์ ์ฃผ์ฅ์ ๋ฐ๋ฅด๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค. ์๋ง๋ ๋ด ๋ง์ ๋ฏฟ์ง ๋ชปํ๊ฒ ๋ค๋ฉด ์ฌ๊ธฐ Linus Torvalds๊ฐ Linux ์ปค๋์ ๋์ด ํ์ฅ๋๋ ๋งค์ฐ ์ค์ํ ๊ท์น์ ์ค๋ช ํ๊ณ ์์ต๋๋ค. Don't break userspace . ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ ๊ฐ์ ๊ฐ์ฐ์์ ํ๋ก๊ทธ๋๋จธ์ ์งํ์ธ If it's an bug on the ์ฌ๋๋ค์ด ์์กดํ๋ ๋ฒ๊ทธ๋ผ๋ฉด ๋ฒ๊ทธ๊ฐ ์๋๋ผ
์ ์ฒด ์์คํ ์์ ๊ฐ์ฅ ํต์ฌ์ ์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ABI๋ฅผ "๊ฐ์ "ํ๊ณ "์์ "ํ๋ ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์์ ๋ ์ ๋ง ์ฌํ ์ผ์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋๋ฆฌ์์ ๋ํด ๊ฑฑ์ ํ ํ์๊ฐ ์๋ ๊ฒ์ ์ค์ ๋ก ์ผ์ข
์ ๊ธฐ๋ฅ์
๋๋ค. ์ฌ์ฉ์๊ฐ ์ฌ๊ธฐ ์ ๊ธฐ์ ๋ถ์ฃผ์ํ๊ฒ substring(0, 1)
์ํํ๊ณ ์ด๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ธ์จ ํจ์๋ฅผ ํธ์ถํ๊ฑฐ๋ split("")
, ์ ๋ฌ ๋ฐ join()
๋ค์, ๋๋ StringBuilder
๋ฅผ ๋ชจ๋๋ก ์์ฑํ์ฌ ๋ง๋ฒ์ฒ๋ผ ๊ฐ๋ ์ด์ค ๋์ฒด ๋ฌธ์๋ฅผ ์์ฑํ์ง ์์ต๋๋ค. ๋ด ๋ง์, ๋ง์ ์ธ๊ธฐ ์๋ ์ธ์ด๋ค์ด ์ฌ๋ฐ๋ฅธ ํ์์ ์ ์ฉํ๋ ๊ฒ์ ๋ฐ๋ํ๋ ์ด์ ๊ฐ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ Wasm์ด ์ด๋ฌํ ์ธ์ด์ ๊ทธ ์ฌ์ฉ์๋ฅผ ์ ์ง์ํ๊ธฐ๋ฅผ ์ํ ๋ Wasm์ด ๋ชจ๋ํ๋ ์๋ก ๊ฒฝ๊ณ๋ ๋ ์ปค์ง ๊ฒ์
๋๋ค. ํจ์๊ฐ ์ด๋ค ๋ชจ๋์ ์๋์ง ๋งํ๊ธฐ๊ฐ ๋ ์ด๋ ค์์ง๊ณ ๋ฌธ์ ๊ฐ ๋ ๋ถ๋ช
ํด์ง๋๋ค.
ํ์ฌ์ ํ์ค์ ๋ฌด์ํ๋ ๋ฐฉ์์ผ๋ก ๋ฌด์ธ๊ฐ๋ฅผ ์ค๊ณํ๋ ๊ฒ์ด ๋์ ์๊ฐ์ด๋ผ๋ ๊ฒ์ ์ฆ๋ช ํ๊ธฐ ์ํด ์ผ๋ง๋ ๋ ๋ง์ ์ฆ๊ฑฐ๊ฐ ํ์ํ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ฌ์ค, ์ด๊ฒ์ ์ธํฐํ์ด์ค ์ ํ์์๋ง ๊ด์ฐฎ์ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ์ฐ๋ฆฌ๋ ๋ค๋ฅธ ๋ชจ๋ ์ ์์ ๋งค์ฐ ๋์ ํ์ค์ผ๋ก ์ ์งํ๊ณ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋ ์ด๊ฒ์ ๋ํ ์ ๋ฌธ๊ฐ๋ ์๋์ง๋ง USV๋ฅผ ์ฃผ์ฅํจ์ผ๋ก์จ UCS-2 ์ธ์ด์ ์๊ตฌ์ ๊ด๋ จํ์ฌ ์ด์ ๋๊ฐ์ ์ค์๋ฅผ ํ ๊ฒ์ ์ ๋์ฝ๋ ํ์ค ์์ฒด์๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ ๋ก (์ ์ฒด ์ค๋ ๋๋ฅผ ์ถ์ฒํ ์ ์์ง๋ง ํนํ ์นจ๋ฌตํ๊ธฐ ์ ๋ง์ง๋ง ์๊ฒฌ), 2014๋ WTF-8 ์ธ์ฝ๋ฉ์ธ ์ผ๋ฐ์ ์ผ๋ก ์ ์ฉ๋๋ ์ค์ฉ์ ์ธ ์๋ฃจ์ ์ ๋ํ ์ค๋ช ์์ ์ ์ ์ ๋ฌํ์ต๋๋ค.
๋นํธ์คํธ๋ฆผ์์ ๋ฌธ์ ์ธ์ฝ๋ฉ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๋ ๋์ฒด ๋ฌธ์๋ฅผ ๋ด๋ณด๋ด๋ ๊ฒ์ ์ํํ ์๋ ๋ฐ์ดํฐ ์์์ ์ ์๋ ค์ง ํํ์ด๋ฉฐ ๋ฌด๊ฒฐ์ฑ์ด ํ์ํ ์์คํ ์์๋ ์ด๋ฅผ ๊ธ์งํฉ๋๋ค.
์ด์ ๊ด๋ จํ์ฌ, codePointAt๊ฐ ๊ณ ๋ ํ ๋๋ฆฌ๋ฅผ ๋๋ฆด ๋ ์์ธ๋ฅผ throwํ๋ฉด ๋๊ตฐ๊ฐ๊ฐ ์ค์๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฌธ์์ด์์ ์๋ชป๋ ์์น์ ์ด๋ชจํฐ์ฝ ๋ฌธ์๋ฅผ ๋ฃ์๊ธฐ ๋๋ฌธ์ ์ ์ฒด ์์ฉ ํ๋ก๊ทธ๋จ์ ์ค๋จ์ํค๋ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
๋ถํํ๋ ecmascript๋ ์ง์ ์ด๋ฃจ์ง ์์ ์๋ก๊ฒ์ดํธ ์ฝ๋ ํฌ์ธํธ๊ฐ ์๋ ๋ฌธ์์ด์ ์์ฑํ์ง ์๋๋ก ํ๋ ๊ฒ์ ๋งค์ฐ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค. ๋ฌธ์์ด์์ ์ฒ์ 157 .length ๋จ์๋ฅผ ๊ฐ์ ธ์ค๊ณ ์๋ง๋ "..."๋ฅผ ์ถ๊ฐํ์ฌ ์ถ์ฝํ๋ ๊ฒ๋งํผ ์ฝ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ BMP๊ฐ ์๋ ์บ๋ฆญํฐ๊ฐ ๋๋ฌผ๊ธฐ ๋๋ฌธ์ ์ค์ ๋ก ๊ทธ๋ฐ ์ผ์ด ์ผ์ด๋๋ค๋ฉด ๊ทธ๊ฒ์ ๊ธฐ์ดํ ์ฌ๊ณ ์ ๋๋ค. ์ฐ๋ฆฌ๋ ์ ๋์ฝ๋ ์์์ ๊ฐ์ ํ๊ธฐ ์ํด ์ํ ์์๋ฅผ ๋์ ํ๋ ๊ฒ์ ๋งค์ฐ ๊บผ๋ คํด์ผ ํฉ๋๋ค.
JS, Java ๋ฐ C#์ ๋ฌธ์์ด์ด ์๋ ์ด์ ๋ ์ ๋์ฝ๋๊ฐ 2๋ฐ์ดํธ๋ก๋ ์ถฉ๋ถํ์ง ์์ UCS-2๊ฐ ์คํ ๊ฐ๋ฅํ์ง ์๋ค๋ ๊ฒ์ ๊นจ๋ฌ์์ ๋ ์ด๋ฏธ ๋ง์ ์ฝ๋๊ฐ ์์ฑ๋์๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ์ธ์ด๋ ๋จ์ํ ์ ํ์ ์ฌ์ง๊ฐ ์์ต๋๋ค. ์ ์ฌํ๊ฒ, ์ฌ์ฉ์ ๊ณต๊ฐ์ ๋ ธ์ถ๋ Linux ์์คํ ํธ์ถ์ ๊ฒฝ์ฐ. ๋์กฐ์ ์ผ๋ก ์ค๋๋ IT์์ ์ ์ํ API๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋๋ ์กด์ฌํ์ง ์์ผ๋ฏ๋ก ๋์ผํ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ ์๊ตฌ ์ฌํญ์ด ์์ต๋๋ค. ์ฌ๋ฌ ๊ฐ์ง ์ด์ ๋ก wasm ๋ฐ ์ธํฐํ์ด์ค ์ ํ์ ์๋์ ์ผ๋ก ๊ธฐ์กด ๋จ์ผ ์ธ์ด ๋๋ ์์คํ ํธ์ถ ABI๋ฅผ ์๋ฒฝํ๊ฒ ์๋ฎฌ๋ ์ดํธ ํ์ง ์์ต๋๋ค . ์ ํจํ ๋ชฉํ์ผ ์ ์์ง๋ง ๊ตฌ์ฑ ์์ ๋ชจ๋ธ๊ณผ ๋ณ๋์ ํ๋ก์ ํธ/ํ์ค/๊ณ์ธต์ด ๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ด ๊ณ์ธตํ ๋ฐ ๋ฒ์ ์ง์ ์ ์ด์ ์ ๋๋ค. ๊ฐ๋ฅํ ๋ชจ๋ ๋ชฉํ๋ฅผ ๋ฌ์ฑํ๋ ๋ฐ ํ ๊ฐ์ง๊ฐ ํ์ํ์ง ์์ต๋๋ค.
๋ฌผ๋ก ์ปดํฌ๋ํธ ๋ด๋ถ ์์ ๋ฌธ์์ด์ ์ธ์ด์ ์ ์ ํ ๋ฐฉ์์ผ๋ก ํํ๋ ์ ์๋ค๋ ์ ์ ๋ค์ ๊ฐ์กฐํ๊ณ ์ถ์ต๋๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๋ API ์ ์๋ฏธ๋ก ์ ๋ํด์๋ง ์ด์ผ๊ธฐํ๊ณ ์์ต๋๋ค. ์ด๋ฏธ ์ ์๋ Web API์ ๊ฒฝ์ฐ:
๋ฐ๋ผ์ WTF-16 ๋ฌธ์์ด ์๋ฏธ๋ฅผ ์ ๋ฌํ์ง ์๊ณ ๋ IT๊ฐ ์คํ ๊ฐ๋ฅํ์ง ์์ ๊ฒ์ด๋ผ๋ ์ฆ๊ฑฐ๊ฐ ์์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๊ฒ์ด MVP์ ๋ํ ์ ์ ํ ์ง๋ฌธ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋ด๊ฐ ๋์ํ์ง ์๋ ๋ช ๊ฐ์ง ์ :
๋๋ ๋น์ ์ด ๋งํ๋ ๊ฒ์ด interface-types/#135์์ ์ ๊ธฐ๋ ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํ๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์ด๊ฒ์ ์ง๊ธ ๋ณ๊ฐ์ ๋ฌธ์ ์ด๋ฉฐ, ์์ค์ ํด๊ฒฐํ๊ธฐ ์ํด ํฉ๋ฆฌ์ ์ธ ํํ์ด๋ผ๊ณ ์๊ฐํ๋ ๊ฒ์ ๋ํด ์ด์ผ๊ธฐํ๊ธฐ ์ ์ ๊ฒ์๋ฌผ์์ ์ด์ผ๊ธฐํ์ต๋๋ค. ํนํ, ๋ณ๋์ ๋ฌธ์ ์์ ๊ทํ์ ์ถ๋ก ์ ๋์ํ์ง๋ง, ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฌด์์ค ํด๋ฐฑ์ด ์๋ ๊ฒฝ์ฐ์๋ง ๊ฐ๋ฅํฉ๋๋ค. ์ด๊ฒ์ ์ ์๊ฐ์ ์ด๋ ์ชฝ๋ ์๋๋๋ค. ๊ทธ๋ ์ง ์๋ค๋ฉด WTF-8/16์ด ๋ ํฌ๊ด์ ์ด๊ณ ๋ ์ ํ์ ์ธ ์ ํ์ด๋ฉฐ, ๋ํ Wasm์ ๋์ ์์ค์ ๋ชฉํ ์ค ํ๋๊ฐ ์น ํ๋ซํผ๊ณผ ์ํํ๊ฒ ํตํฉ๋๋ ๊ฒ์ด๋ฏ๋ก ๋ฐ๋์งํ๋ค๋ ์๊ฒฌ์ ์ ์งํฉ๋๋ค. - ์น์ ํธํ ๊ฐ๋ฅํ ํน์ฑ์ด๋ฉฐ ์ธํฐํ์ด์ค ์ ํ์๋ ์ ์ฉ๋ฉ๋๋ค.
๊ธฐ์กด JS API๋ ์ด๋ฏธ ๊ฒฝ๊ณ์์ ์์์ ๊ฐ ๋ณํ์ ์ํํ๊ธฐ ์ํ ๋ฒ์ฉ ์ด์ค์ผ์ดํ ํด์น๋ฅผ ์ ๊ณตํ๋ฏ๋ก ์ด ์ด๊ธฐ ์์ ์์ ๋ ๋ฒ์งธ ์ด์ค์ผ์ดํ ํด์น๊ฐ ์ด๋ป๊ฒ ํ์ํ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์ฌ์ฉ์ ์ ์ JS API ๋ฐ์ธ๋ฉ์ ์ฌ์ฉํ๋ ํ์ถ๊ตฌ๊ฐ ํญ์ ์์ต๋๋ค.
ํ์ฌ ๋ค์๊ณผ ๊ฐ์ ๊ธ๋ฃจ ์ฝ๋๊ฐ ์๋ ์ฐ๋ฆฌ์ ๊ฒฝ์ฐ์๋ ์ฌํ๊ฒ๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค.
const STRING_SMALLSIZE = 192; // break-even point in V8
const STRING_CHUNKSIZE = 1024; // mitigate stack overflow
const utf16 = new TextDecoder("utf-16le", { fatal: true }); // != wtf16
/** Gets a string from memory. */
function getStringImpl(buffer, ptr) {
let len = new Uint32Array(buffer)[ptr + SIZE_OFFSET >>> 2] >>> 1;
const wtf16 = new Uint16Array(buffer, ptr, len);
if (len <= STRING_SMALLSIZE) return String.fromCharCode(...wtf16);
try {
return utf16.decode(wtf16);
} catch {
let str = "", off = 0;
while (len - off > STRING_CHUNKSIZE) {
str += String.fromCharCode(...wtf16.subarray(off, off += STRING_CHUNKSIZE));
}
return str + String.fromCharCode(...wtf16.subarray(off));
}
}
์ฒซ์งธ, ์ฐ๋ฆฌ๋ Chrome๊ณผ Node.js์ ๋ํด ๋ง์ ๊ด์ฌ์ ๊ฐ๊ณ ์๊ธฐ ๋๋ฌธ์ UTF-16LE์ ๋ํ V8์ TextDecoder
๊ฐ ๋ค๋ฅธ ์์ง๋ณด๋ค ํจ์ฌ ๋๋ฆฌ๋ค๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค(SM์ ์ ๋ง ๋น ๋ฆ). ๋ฐ๋ผ์ String.fromCharCode
๋ ํน์ ์์ต๋ถ๊ธฐ์ ๊น์ง V8์์ ์ค์ ๋ก ๋ ๋น ๋ฆ
๋๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๋ ์ง๊ธ ๊ทธ๊ฒ์ ์ค์ฌ์ผ๋ก ์ต์ ํํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ๋ค์์ผ๋ก WTF-16์๋ TextDecoder
๊ฐ ์์ผ๋ฏ๋ก(๋ณ๋์ ์ฑ๊ฐ์ ) ๋จผ์ ์ ๊ตฌ์ฑ๋ UTF-16์ ๋์ฝ๋ฉํ๋ ค๊ณ ์๋ํ๊ณ ์คํจํ๋ฉด ๋์ง๊ณ ์ฒญํฌ๋ฅผ ํตํด ํด๋ฐฑํ๋๋ก ํฉ๋๋ค. ํจ์ฌ ๋๋ฆฐ String.fromCharCode
. ์คํ ์ค๋ฒํ๋ก ๊ฐ๋ฅ์ฑ์ด ์์ผ๋ฏ๋ก ๊ธด ๋ฌธ์์ด์ String.fromCharCode
๋ฅผ ๋จ์ํ ์ ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฒญํน์ด ํ์ํฉ๋๋ค.
๋ค๋ฅธ ํํธ์ผ๋ก, ์๋ฅผ ๋ค์ด Rust๋ ์ด๊ฒ์ ํ์๋ก ํ์ง ์์ ๊ฒ์
๋๋ค. ์ด๊ฒ์ด ์ ๊ฐ ํ์ฌ IT๊ฐ ๋ง๋
ํ ๊ทธ๋์ผ ํ ๋งํผ ์ค๋ฆฝ์ ์ด์ง ์๋ค๊ณ ์๊ฐํ๋ ์ด์ ์ค ํ๋์
๋๋ค. ์ผ๋ฐ์ ์ผ๋ก IT string
์ ์์ ์ ์ฌ์ ํ โโ์ฐ๋ฆฌ์ ์ฃผ์ interop ๋์์ธ JS์ ์ ์ธํฐํ์ด์คํ ์ ์๋ค๋ ๊ฒ์
๋๋ค.
ํ์ฌ IT์ ์ ์๋ API๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋๊ฐ ์์ผ๋ฏ๋ก ๋์ผํ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ ์๊ตฌ ์ฌํญ์ด ์์ต๋๋ค.
IT๊ฐ ์์ง ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ ์ ๋ฐ๋ถ๋ ๊ธฐ์ ์ ์ผ๋ก ์ฌ์ค์ด์ง๋ง IIUC์ ์๊ตฌ ์ฌํญ์๋ ์๋ฅผ ๋ค์ด ์์ ์ํฌ๋ฅธ ๊ธ๋ฃจ ์ฝ๋ ๋ฉ์ด๋ฆฌ๋ฅผ ์ค๋ช ํ๋ ๊ฒ๊ณผ ๊ฐ์ ๊ธฐ์กด ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๊ฐ์ ํ๋ ๊ฒ์ด ํฌํจ๋ฉ๋๋ค. ๊ฐ๋ฅํ ํ ๋ง์ ์ธ์ด์ ๋ํด ์ด์์ ์ผ๋ก๋ MVP ์ดํ๋ ํ๋ ์ ํ ์ด์ ์์ ๋งํ๋ฏ์ด ์ค์ ๋ก "์ต์ ํ"๊ฐ ๋ฉ๋๋ค. ๋ฐ๋๋ก, ์ง๊ธ IT๋ ๊ธฐ๋ณธ์ ์ผ๋ก UTF-8 ์ธ์ฝ๋/๋์ฝ๋๋ฅผ ์ฌ์ฉํ ์ ์๋ ์ธ์ด์ ๋ํด ์ด๋ฏธ ์ต์ ํ๋ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค. ์ด๋ ์ค๋ฆฝ์ ์ด์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
wasm ๋ฐ ์ธํฐํ์ด์ค ์ ํ์ ์๋์ ์ผ๋ก ๊ธฐ์กด ๋จ์ผ ์ธ์ด ๋๋ ์์คํ ํธ์ถ ABI๋ฅผ ์๋ฒฝํ๊ฒ ์๋ฎฌ๋ ์ดํธํ์ง ์์ต๋๋ค.
๋๋ ์ด ์๊ฒฌ์ ๋์ํ๋ ๊ฒ์ฒ๋ผ ์ด ๊ธ์ ์ฝ์์ผ๋ฉฐ, ์ ์ ์ผ๋ก ๊ทธ๋ ์ง ์์ต๋๋ค. ๋๋ ์ฌ๊ธฐ์์ ์์ฌ์ ์ฌ์ง๊ฐ ์๋ ์ด์ ์ ๊ธฐ๊บผ์ด ์ ๊ณตํ์ง๋ง ๋ด ์๊ฒฌ์ผ๋ก๋ IT๊ฐ ํ์ฌ ๋ถํ์ํ๊ฒ ์ ํ๋์ด ์์ผ๋ฏ๋ก ๋งค์ฐ ํน์ ํ ์ธ์ด ์งํฉ๋ง ์ ์ง์ํ๋ค๊ณ ๋ง๋ถ์ด๊ณ ์ถ์ต๋๋ค. ๋ฐ๋๋ก WTF-8/16์ JS ๋ฌธ์์ด๋ก ์๋ณตํ๊ธฐ ๋๋ฌธ์ ๋ ผ๋ฆฌ์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์์ํ๋ ๋ณด๋ค ํฌ๊ด์ ์ธ ์ธ์ฝ๋ฉ์ ๋๋ค. ์ฐ๋ฆฌ๋ ์ฌ๊ธฐ์ ๋์ํ์ง ์์ง๋ง ์ ์ ํ ํ์ถ๊ตฌ๊ฐ ์๋ ๊ฒฝ์ฐ์๋ง ๊ฐ๋ฅํฉ๋๋ค. ์คํ ๊ฐ๋ฅํ ๋ฌด์์ค ๋์์ด ์กด์ฌํ์ฌ ์๋ฌด๋ ์์๋๊ฑฐ๋ ๋ถํ์ํ๊ฒ ๋ถ์ด์ต์ ๋ฐ์ง ์๋๋ค๋ฉด ๊ธฐ๋ณธ ๋ฌธ์์ด ์ ํ์ ๋ํ ๊ทํ์ ์ถ๋ก ์ ๋ฌธ์ ๊ฐ ์์ ๊ฒ์ ๋๋ค.
๋๋ฆฌ์๋ฅผ ์ ๋ฌํ ํ์๊ฐ ์์ผ๋ฉฐ ์ข ์ข ์๋ฏธ๊ฐ ์๋ค๊ณ ๋ฏฟ์ ๋งํ ์ถฉ๋ถํ ์ด์ ๊ฐ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ์ฌ๊ธฐ์ ๋์ํ์ง ์์ต๋๋ค. ํนํ, ์ ๋ฐํ์ ๋ ผํ์ ๋๋ฌผ๊ธด ํ์ง๋ง ๋งค์ฐ ์๋ฏธ ์๋ ์ผ(์: ๋ฌด๊ฒฐ์ฑ์ด ์๊ตฌ๋๋ ๊ฒฝ์ฐ)์ผ ์ ์๋ค๋ ํฉ๋ฆฌ์ ์ธ ์์ฌ์ ๋ถ๋ฌ์ผ์ผํฌ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ ๋์ฝ๋ ์์์ ๊ฐ์ ํ๊ธฐ๋ฅผ ํฌ๋งํ๋ ์ํ" ์ฆ, ๊ฐ๋ฅํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ค์ํ ๊ฒฝ์ฐ์๋ ์๋ํ๋๋ก ๋ณด์ฅ๋๋ ๋ฐฉ์์ผ๋ก ํ์ค ABI๋ฅผ ์ค๊ณํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. Java/C#/AS<->JS, Java/C#/AS<-> ์๋ฐ/C#/AS. ๋ค๋ฅธ ๊ฒฝ๋ก๋ก์ ๊ต์ฒด๋ ๋ถ๊ฐํผํ ์ ์์ง๋ง ์ต์ํ ์ธ์ด์ ์ฌ์ฉ์๋ ์ ํ๊ถ์ด ์์ต๋๋ค. ๋๋ฌธ ๊ฒฝ์ฐ์ง๋ง ๊ธฐ๋ณธ๊ฐ์ ์ด๋ฏธ ๊นจ์ง์ง ์์์ต๋๋ค.
๋๋ ์ฌ์ ํ IT๊ฐ ์ด๋ฌํ WTF-16 ๋ฌธ์์ด ์๋ฏธ๋ฅผ ์ ๋ฌํ์ง ์๊ณ ๋ ์คํ ๊ฐ๋ฅํ์ง ์์ ๊ฒ์ด๋ผ๋ ์ฆ๊ฑฐ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
ํฉ๋ฆฌ์ ์ธ ์์ฌ์ด ์๊ณ ๋ด๊ฐ ํฉ๋ฆฌ์ ์ธ ํํ์ด๋ผ๊ณ ๋ฏฟ๋ ๊ฒ์ ํ๊ตฌํ ์์ง๊ฐ ์๋ ์ํฉ์์ ์ ์ฆ ์ฑ ์์ ์ด์ ๊ทํ์๊ฒ ์๋ค๊ณ ์์ํฉ๋๋ค. ๋ค์ ๋งํ์ง๋ง, ๋๋ ๊ธฐ๋ณธ ๋ฌธ์์ด์ ์ฌ๋ฌ๋ถ๊ณผ ์ ๊ตฌ์ฑ๋ ๋ฏธ๋์ ๊ธฐ๊บผ์ด ๋งก๊ธธ ์ฉ์๊ฐ ์์ง๋ง, ๋๋ฌผ์ง๋ง ์ฌ์ ํ ์ํํ ์ ์๋ ๊ฒ์ ์ค๋ช ํ์ง ์๋ ํฌ์์ ๊ฐ์ํ์ง ์์ต๋๋ค. ๋ง์ ๋์ค์ ์ธ ์ธ์ด๊ฐ ์ด๊ฒ์ ์ํฅ์ ๋ฐ์ ์ ์์ผ๋ฉฐ, ์ผ๋จ ๊นจ๋ซ๊ณ ๋๋ฉด ์ด๋ฅผ ์ ๋นํํ๊ธฐ๊ฐ ์ ๋ง ์ด๋ ค์ธ ์ ์์ต๋๋ค.
JS ๊ธ๋ฃจ ์ฝ๋๊ฐ ์ด์์ ์ด์ง ์๋ค๋ ์ ์๋ ๋์ํ์ง๋ง, ์ด์ ๋ํ ์ฌ๋ฐ๋ฅธ ์์ ์ JS API ๋๋ JS์ ์์ผ๋ฉฐ, ์ ์ฒด ๋ฏธ๋ ๊ตฌ์ฑ ์์ ์์ฝ์์คํ ์ wtf-16-string ๊ฐ๋ ์ ์ถ๊ฐํ๋ ๊ฒ์ด ์๋๋๋ค. ๊ทธ ์ธ์๋ ์์ง ์๋ตํ์ง ์์ ์๋ต์ ๋ํ ์๋ก์ด ์ ๋ณด๊ฐ ์์ต๋๋ค. ๋ชฉํ/๋ฒ์์ ๋ํ ์ง๋ฌธ์ ๋๋ถ๋ถ ๋์ํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
TextDecoder
์ด์ ํ์์ JS์์ ์์ ํ๊ธฐ๊ฐ ํจ์ฌ ๋ ์ด๋ ค์ธ ๊ฒ์ผ๋ก ์์๋ฉ๋๋ค. ์ด๋ฏธ ์ด๊ฒ์ด ๋ฒ์๋ฅผ ๋ฒ์ด๋ฌ๋ค๊ณ ๋ถ๋ช
ํ ๊ฒฐ์ ํ๊ธฐ ๋๋ฌธ์
๋๋ค. JS์ TextDecoder
๋ ๋ ํจ์ ํธ์ถ ์ฌ์ด์ ํธ์ถ๋๋ ๊ฒ์ด ์๋๋ผ ๋๋ถ๋ถ ๋คํธ์ํฌ๋ ์ ์ฅ์์์ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๋ ๋ฐ ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ JS๋ ๊ทธ๋ ๊ฒ ํ ์ ์์ต๋๋ค.
์ง์ ๋ ํฅ๋ฏธ๋ก์ด ์ด์์ด ์กด์ฌ์กฐ์ฐจํ์ง ์์, ๊ทธ๋ฌ๋,์ด๋ค TextEncoder
UTF-16LE์ ์ํด, ๊ทธ๋์ ํ๋๊ฐ ๊ด๋ จ์ด์๋ค :
/** Allocates a new string in the module's memory and returns its pointer. */
function __newString(str) {
if (str == null) return 0;
const length = str.length;
const ptr = __new(length << 1, STRING_ID);
const U16 = new Uint16Array(memory.buffer);
for (var i = 0, p = ptr >>> 1; i < length; ++i) U16[p + i] = str.charCodeAt(i);
return ptr;
}
๋ณด์๋ค์ํผ ์ด๊ฒ์ Java, C#, AS ๋ฐ ๊ธฐํ ํญ๋ชฉ์ ๋ํ ์ฃผ์ ๋ฌธ์ ์ ์ด๋ฉฐ list u16
๊ฐ ์ ๋ฌ๋ ๋ ์ด ๋ ๊ฐ์ง ๋ชจ๋ ์ฌ์ ํ ํ์ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ๋ฌธ์ ์ ๋งฅ๋ฝ์์ ๋์ผํ ์ธ์ด์ ๋ ๋ชจ๋ ์ฌ์ด์ ์ด์ค ์ฌ์ธ์ฝ๋ฉ + ์์ค์ด ๊ทธ๋ ๊ฒ ๋ค๋ฅด์ง ์๋ค๋ ์ ์์ JS API์๋ง ๊ตญํ๋์ง ์์ต๋๋ค.
TextEncoder
/ TextDecoder
์ธ์๋ ์น์์ ํด๋น ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ ์ฒด ์ต์
๊ณต๊ฐ์ด ์์ต๋๋ค. ๋ค๋ฅธ ํ๋๋ new WebAssembly.Function()
(์ผ๋ถ ๋ธ๋ผ์ฐ์ ์์ ์ด๋ฏธ ๊ตฌํ๋จ)๋ฅผ ํ์ฅํ์ฌ ์์ฑ์์ ์ถ๊ฐ ์ ํ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ถ๊ฐํ์ฌ ๋ฌธ์์ด ๋ณํ์ ์ํํ๋ ๊ฒ์
๋๋ค. ์ด๋ฌํ ์ ๊ทผ ๋ฐฉ์์ ๋ํ wasm์ ๋น๊ตฌ์ฑ ์์ ์ฌ์ฉ์์๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๊ฒ ํ์ฌ(์ ์ฌ์ ์ผ๋ก ํจ์ฌ ๋ ๋นจ๋ฆฌ) JS API๊ฐ ์ด ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ฒ๋ฆฌํ๊ธฐ์ ์ ํฉํ ์ฅ์๋ผ๋ ์ ์ ๊ฐํํฉ๋๋ค.
์ฐธ๊ณ : ์์ ์ ์ ๋ชฉ๋ก ์ https://github.com/WebAssembly/interface-types/issues/135#issuecomment -863493832์ ๋์จ "ํตํฉ W/UTF-any" ์ต์ ์ ์ถ๊ฐํ์ต๋๋ค. :)
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด๊ฒ์ ํ์ฌ ๋ด๊ฐ ์ ํธํ๋ ์๋ฃจ์ ์ด๊ธฐ๋ ํฉ๋๋ค.
string
๊ฐ ํ์ฌ(list char)
๋ํ ๋ณ์นญ์ผ๋ก ์ ์๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋กwtf16string
์ ํ์(list u16)
์ ๋ณ์นญ์ด ๋ฉ๋๋ค(list char)
. ๋ณ์นญ IIUC์ ๊ฐ์ JS๊ฐ ํธ์ถํ(list u16)
๋ฐํํ๋ ํจ์์ ๊ฒฐ๊ณผ๊ฐ JS ๋ชฉ๋ก(์ซ์)์ผ๋ก ๋ํ๋๋ ๋ฐ๋ฉดwtf16string
๋ฐํํ๋ ํจ์์ ๊ฒฐ๊ณผ๋ํ์ค ABI ์ด์์ ์ถ๊ฐ
wtf16string
๋ณ์นญ์ ์ถ๊ฐํ๋ ๊ฒ์ ์๋์ ์ผ๋ก ๋ฐฉํด๊ฐ ๋์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.