Design: ํ† ๋ก : WebAssembly, ์œ ๋‹ˆ์ฝ”๋“œ ๋ฐ ์›น ํ”Œ๋žซํผ

์— ๋งŒ๋“  2021๋…„ 05์›” 22์ผ  ยท  19์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: WebAssembly/design

์ด ๋ฌธ์ œ๋Š” "WebAssembly, ์œ ๋‹ˆ์ฝ”๋“œ ๋ฐ ์›น ํ”Œ๋žซํผ"์— ๋Œ€ํ•œ ํ† ๋ก ์„ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ”„๋ฆฌ์  ํ…Œ์ด์…˜์€ ์‚ฌ์ „ ๋…นํ™”๋˜์—ˆ์œผ๋ฉฐ https://github.com/WebAssembly/meetings/pull/775 ์—์„œ ์‹œ๋„ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์œผ๋ฉฐ ํ† ๋ก  ์‹œ๊ฐ„์€ 6์›” 22์ผ CG ํ™”์ƒ ํšŒ์˜๋กœ ์˜ˆ์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.


(์žฌ์ƒํ•˜๋ ค๋ฉด ํด๋ฆญ)

CG ๋ฉค๋ฒ„๋“ค ์‚ฌ์ด์—์„œ ์ž˜ ์•Œ๋ ค์ ธ ์žˆ์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ฐœ๋…์„ ์–ธ๊ธ‰ํ–ˆ์ง€๋งŒ ์ฃผ์ œ์— ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ์‚ฌ๋žŒ๋“ค๋„ ํ”„๋ ˆ์  ํ…Œ์ด์…˜์— ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํฌํ•จํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ”ผ๋“œ๋ฐฑ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!

๊ด€๋ จ ๋ฌธ์ œ:

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

ํ•˜๋‚˜์˜ ๊ฐ„๋‹จํ•œ ํ•ด๊ฒฐ์ฑ…์€ ์–ธ์–ด / ์ˆ˜๋ฝํ•˜๊ฑฐ๋‚˜ ์œ ํšจํ•˜์ง€ ์•Š์€ ์œ ๋‹ˆ ์ฝ”๋“œ ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•˜๋Š” ์ƒ์‚ฐ API๋ฅผ ๊ฐ€์ง€๊ณ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค (list u8) ๋˜๋Š” (list u16) (๊ฐ™์€ ๊ฐ€๋Šฅ์„ฑ์„ ๊ฐ€์ง„ ๋ฉ‹์ง„ ๋ณ„์นญ byte_string ์˜๋„ ์˜์‚ฌ ์†Œํ†ต)๋ณด๋‹ค๋Š”๋ฅผ IT string ์œ ํ˜•์œผ๋กœ, IIRC๋Š” (list char) ์˜ ๋ณ„์นญ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ํ˜„์žฌ ๋‚ด๊ฐ€ ์„ ํ˜ธํ•˜๋Š” ์†”๋ฃจ์…˜์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. string ๊ฐ€ ํ˜„์žฌ (list char) ๋Œ€ํ•œ ๋ณ„์นญ์œผ๋กœ ์ •์˜๋œ ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ wtf16string ์œ ํ˜•์€ (list u16) ์˜ ๋ณ„์นญ์ด ๋ฉ๋‹ˆ๋‹ค (list char) . ๋ณ„์นญ IIUC์˜ ๊ฐ’์€ JS๊ฐ€ ํ˜ธ์ถœํ•œ (list u16) ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ๊ฐ€ JS ๋ชฉ๋ก(์ˆซ์ž)์œผ๋กœ ๋‚˜ํƒ€๋‚˜๋Š” ๋ฐ˜๋ฉด wtf16string ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ๋Š”

ํ‘œ์ค€ ABI ์ดˆ์•ˆ์— ์ถ”๊ฐ€ wtf16string ๋ณ„์นญ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์ƒ๋Œ€์ ์œผ๋กœ ๋ฐฉํ•ด๊ฐ€ ๋˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  19 ๋Œ“๊ธ€

์ง€๊ธˆ๊นŒ์ง€ ์˜คํ”„๋ผ์ธ ํ”ผ๋“œ๋ฐฑ์—์„œ ์ˆ˜์ง‘ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ž ์žฌ์ ์ธ ์†”๋ฃจ์…˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ณ„๋„์˜ WTF-16

์ธํ„ฐํŽ˜์ด์Šค ์œ ํ˜•์—์„œ ๋‹ค์Œ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

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 ์–ด๋Œ‘ํ„ฐ ๋ช…๋ น์—์„œ ๋ฏธ๋ž˜๋ฅผ ์œ„ํ•œ ๊ณต๊ฐ„์„ ์ฆ‰์‹œ ์˜ˆ์•ฝํ•˜์—ฌ ์—ด์–ด๋‘˜ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

UTF-any

์ธํ„ฐํŽ˜์ด์Šค ์œ ํ˜•์—์„œ ๋‹ค์Œ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

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 ์ดํ›„์— ์ถ”๊ฐ€ ์ตœ์ ํ™”๋กœ ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ์ผ๋ถ€๋Š” ๋ฐ”๋กœ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

WTF-๋ชจ๋“ 

์ธํ„ฐํŽ˜์ด์Šค ์œ ํ˜•์—์„œ ๋‹ค์Œ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

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 ํ›„ ์ตœ์ ํ™”๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

ํ†ตํ•ฉ W/UTF-any

์ธํ„ฐํŽ˜์ด์Šค ์œ ํ˜•์—์„œ ๋‹ค์Œ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

  • "๋Œ€๋ฆฌ ์Œ์„ ์ˆ˜์ •ํ•˜๋Š” ์œ ๋‹ˆ์ฝ”๋“œ ์ฝ”๋“œ ํฌ์ธํŠธ ๋ชฉ๋ก"์„ ์˜ฌ๋ฆฌ์ง€๋งŒ "์œ ๋‹ˆ์ฝ”๋“œ ์Šค์นผ๋ผ ๊ฐ’ ๋ชฉ๋ก"์„ ๋‚ฎ์ถฅ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ 16๋น„ํŠธ ๋ฆฌํ”„ํŒ… ์ค‘์—๋งŒ ์ ์šฉ๋˜๋Š” ๋น„๊ธฐ๋Šฅ์  ๋””์ž์ธ ์ „์šฉ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.
  • "์œ ๋‹ˆ์ฝ”๋“œ ์ฝ”๋“œ ํฌ์ธํŠธ ๋ชฉ๋ก"์„ ์–ป๊ธฐ ์œ„ํ•ด ๋‚ฎ์ถœ ๋•Œ ์„ ํƒ์  passthrough ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฌด์†์‹ค ํŒจ์Šค์Šค๋ฃจ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๊ธฐ๋Šฅ์  ์ถ”๊ฐ€์ž…๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ์„ ๋‹ฌ์„ฑํ•ฉ๋‹ˆ๋‹ค:

  • ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž˜ ํ˜•์„ฑ๋จ
  • ์˜ต์…˜์œผ๋กœ WTF ์–ธ์–ด์— ๋Œ€ํ•œ ๋ฌด์†์‹ค ์ธ์ฝ”๋”ฉ
  • https://github.com/WebAssembly/interface-types/issues/136#issuecomment -861799460๊ณผ ๊ฒฐํ•ฉํ•  ๋•Œ: ์ž˜ ์ง€์›ํ•˜๊ณ ์ž ํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜(๋ชจ๋“ ?) ์–ธ์–ด์šฉ ๋‚ด์žฅ ์ธ์ฝ”๋”

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 ์˜๋„ ์˜์‚ฌ ์†Œํ†ต)๋ณด๋‹ค๋Š”๋ฅผ IT string ์œ ํ˜•์œผ๋กœ, 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์˜ ๊ฒฝ์šฐ:

  1. ๋Œ€๋ฆฌ์ž๋ฅผ ์ „๋‹ฌํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ ์ข…์ข… ์˜๋ฏธ๊ฐ€ ์—†๋‹ค๊ณ  ๋ฏฟ์„ ๋งŒํ•œ ์ถฉ๋ถ„ํ•œ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ์‚ฌ์šฉ์ž ์ •์˜ JS API ๋ฐ”์ธ๋”ฉ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ํ•ญ์ƒ ํƒˆ์ถœ๊ตฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(์›น API์˜ 100%๊ฐ€ ์›น API์— ๋Œ€ํ•œ JS-๊ธ€๋ฃจ๋ฆฌ์Šค ๋ฐ”์ธ๋”ฉ์„ ๊ฐ€์ ธ์•ผ ํ•˜๋Š” ์š”๊ตฌ ์‚ฌํ•ญ์€ ์•„๋‹™๋‹ˆ๋‹ค)

๋”ฐ๋ผ์„œ 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" ์˜ต์…˜์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. :)

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰