Design: Webasm์€ ๋ธŒ๋ผ์šฐ์ €์—์„œ Javascript๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์— ๋งŒ๋“  2017๋…„ 08์›” 17์ผ  ยท  15์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: WebAssembly/design

C# ๋Ÿฐํƒ€์ž„์€ JS๋ฅผ ์™„์ „ํžˆ ๋Œ€์ฒดํ•˜๋Š” ์™„์ „ํ•œ ๊ธฐ๋Šฅ์˜ ํ”„๋กœํ† ํƒ€์ž…์ธ wasm์œผ๋กœ ์ด์‹๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Š” ๋ฏธ๋ž˜์— ๋Ÿฐํƒ€์ž„์ด ๋ธŒ๋ผ์šฐ์ €์—์„œ JS๋ฅผ ๋Œ€์ฒดํ•˜๊ณ  Java, C# ๋˜๋Š” C++๋กœ ํด๋ผ์ด์–ธํŠธ ์ธก ์›น ์•ฑ์„ ์ž‘์„ฑํ•˜๊ณ  "์ฝ”๋“œ๋Š” ๋„ค์ดํ‹ฐ๋ธŒ์— ๊ฐ€๊น๊ฒŒ ์‹คํ–‰๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค" , "์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ๋Š” VM๋ณด๋‹ค ๋น ๋ฆ…๋‹ˆ๋‹ค" ๋ผ๋Š” ๋ช…๋ น๋ฌธ๊ณผ ํ•จ๊ป˜ ๋“ฑ์žฅํ•  ๊ฒƒ์„ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” JavaScript์˜ ๋„์›€ ์—†์ด๋Š” ๋ฌด์—‡์ด๋“  ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ œ๊ฐ€ ๋งํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฐ”๋ฅผ ์ด ์˜์ƒ ์„ ๋ด์ฃผ์„ธ์š”.

WebAsm์€ JS๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๋„์ž…๋˜์—ˆ์ง€๋งŒ ์ด์ œ๋Š” ์ผ๋ฅ˜ ์–ธ์–ด๋ฅผ ๋Œ€์ฒดํ•˜์—ฌ ์™„์ „ํžˆ ์ธ์ˆ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€๊นŒ์šด ์žฅ๋ž˜์— ๊ธฐ๋ณธ์ ์œผ๋กœ ์ปดํŒŒ์ผ๋œ ์„œ๋ฒ„์—์„œ ์›น ํŽ˜์ด์ง€๊ฐ€ ์ œ๊ณต๋  ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

Webassembly๋Š” ๋‹ค๋ฅธ ์–ธ์–ด์˜ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ Javascript์™€ ๊ฒฝ์Ÿํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์„ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด WebAssembly์˜ ๋ชฉ์  ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ์€ WebAssembly FAQ ์˜ ์ธ์šฉ๋ฌธ์ž…๋‹ˆ๋‹ค.

WebAssembly๋Š” ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๋งŽ์€ ์–ธ์–ด๋ฅผ ์›น์œผ๋กœ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์ง€๋งŒ JavaScript๋Š” ์—„์ฒญ๋‚œ ์ถ”์ง„๋ ฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ์œ„์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์›น์˜ ์œ ์ผํ•œ ๋™์  ์–ธ์–ด๋กœ ๋‚จ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ JavaScript์™€ WebAssembly๋Š” ์—ฌ๋Ÿฌ ๊ตฌ์„ฑ์—์„œ ํ•จ๊ป˜ ์‚ฌ์šฉ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค.

  • JavaScript๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ชจ๋“  ๊ฒƒ์„ ๊ฒฐํ•ฉํ•˜๋Š” ์ „์ฒด ์ปดํŒŒ์ผ๋œ C++ ์•ฑ์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์–ธ์–ด ๋Š” ์ˆ˜๋…„ ๋™์•ˆ JavaScript๋กœ ์ปดํŒŒ์ผ๋˜์—ˆ์œผ๋ฉฐ WebAssembly๊ฐ€ ์žˆ๋“  ์—†๋“  ๊ณ„์† ๊ทธ๋ ‡๊ฒŒ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋ฏธ C#, F#, C++, OCaml, Elm, PureScript, Haskell, Java, Python, Ruby, Perl ๋“ฑ์„ JavaScript๋กœ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

.NET ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ JavaScript๋กœ ์ปดํŒŒ์ผ ํ•  ์ˆ˜ ์žˆ๊ณ  GWT๋Š” 11๋…„ ๋™์•ˆ ์ฃผ๋ณ€์— ์žˆ์—ˆ๊ณ  ํฐ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ํ”„๋กœ์ ํŠธ๋Š” ์ˆ˜๋…„ ๋™์•ˆ ์ง„ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ •๋ง๋กœ ์ƒˆ๋กœ์šด ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

JavaScript๋Š” ์ด๋ฏธ ๋‹ค๋ฅธ ์–ธ์–ด์™€ ๊ฒฝ์Ÿํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. WebAssembly๋Š” ๋‹ค๋ฅธ ์–ธ์–ด๋ฅผ ๋” ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค.


์ฒ˜์Œ์—๋Š” V8 ๋ฐ ๊ธฐํƒ€์™€ ๊ฐ™์€ VM์—์„œ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด JS ์ฝ”๋“œ๋ฅผ ๋ณด๋‹ค ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ธฐ์ˆ ์„ ์ฑ„ํƒํ–ˆ์ง€๋งŒ ์ด์ œ๋Š” JS ์ฝ”๋“œ๋ฅผ ๋›ฐ์–ด๋„˜์„ ์ˆ˜ ์žˆ๋Š” ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ, ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ VM์€ ๋‹น์‹ ์ด ์ฝ”๋“œ ์‹คํ–‰์˜ ๊ฝ‰ ๋‚ฎ์€ ์ˆ˜์ค€์˜ ์ œ์–ด๋ฅผ ํ•„์š”๋กœ ๋” ๋†’์€ ์„ฑ๋Šฅ์„ ์›ํ•˜๋Š” ๊ทธ๋ ‡๋‹ค๋ฉด ๋•Œ๋ฌธ์— JIT ์—”์ง„์˜ ์˜ค๋ฒ„ ํ—ค๋“œ (์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ์˜ ๋ณธ๋ž˜ ๋™์  ํŠน์„ฑ)์˜ ๋„ค์ดํ‹ฐ๋ธŒ ์„ฑ๋Šฅ์„ ๋‹ฌ์„ฑํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. WebAssembly๋Š” ์ด๋Ÿฌํ•œ ์ œ์–ด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.


๋”ฐ๋ผ์„œ ์š”์ ์€ API ๋ธŒ๋ฆฌ์ง€๋ฅผ ์ถ”์ƒํ™”ํ•˜๊ณ  ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋Ÿฐํƒ€์ž„์„ ํฌํŒ…ํ•˜์—ฌ JS๊ฐ€ ์ œ์™ธ๋˜๊ฑฐ๋‚˜ ์‚ฌ์ง„์—์„œ ์ œ๊ฑฐ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•„๋‹ˆ์š”, ์‚ฌ๋žŒ๋“ค์€ ๊ณ„์† JavaScript๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ˆ˜๋…„ ๋™์•ˆ ๋ฐ์Šคํฌํƒ‘์—๋Š” Python, Perl, Ruby, PHP, Haskell, JavaScript(Node.js), OCaml, C++, Java ๋“ฑ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ๋งŽ์€ ์–ธ์–ด๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ๋žŒ๋“ค์€ JavaScript๋ฅผ ๋น„๋กฏํ•œ ๋งŽ์€ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. JavaScript๋Š” ์•„๋ฌด๋ฐ๋„ ๊ฐ€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

JavaScript๊ฐ€ ์ผ๊ธ‰ ์–ธ์–ด๊ฐ€ ์•„๋‹Œ ( ๋งค์šฐ ๊ฐ€๋Šฅ์„ฑ์ด ๋‚ฎ์€) ๊ฐ€์ƒ์˜ ์„ธ๊ณ„์—์„œ๋„ ์‚ฌ๋žŒ๋“ค์€ ์—ฌ์ „ํžˆ โ€‹โ€‹JavaScript๋ฅผ WebAssembly๋กœ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์ด์ œ TypeScript, CoffeeScript ๋“ฑ๊ณผ ๊ฐ™์€ ๋ณ€ํ™˜๊ธฐ๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ์›น์šฉ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿด ๊ฐ€๋Šฅ์„ฑ์€ ์—†์ง€๋งŒ ์‚ฌ๋žŒ๋“ค์ด TypeScript์™€ JavaScript๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์—๋Š” ์—ฌ์ „ํžˆ ํƒ€๋‹นํ•œ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  TypeScript์— ๋Œ€ํ•œ ๋Œ€์•ˆ ์ด ์žˆ์„ ๊ฒƒ์ด๊ณ  ์–ด๋–ค ์‚ฌ๋žŒ๋“ค์€ ์ด๋Ÿฌํ•œ ๋Œ€์•ˆ์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ด์ง€๋งŒ TypeScript๋Š” ์‚ฌ๋ผ์งˆ ๊ฒƒ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๋ฏธ (๊ฐ™์€ ๋…„ ํƒ€์ดํ”„ ์ข‹์€ ๋Œ€์•ˆ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ง Haxe )ํ•˜์ง€๋งŒ ๊ทธ๋“ค์€ ํƒ€์ดํ”„ ๋ผ์ดํ„ฐ๋ฅผ ๋Œ€์ฒดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

๋‚˜๋Š” C#์— ์ต์ˆ™ํ•˜์ง€ ์•Š์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” wasm์ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์™„์ „ํžˆ ์ธ์ˆ˜ํ•  ์ˆ˜๋Š” ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋จผ์ €, ์‹œ๋„ํ–ˆ๋‹ค๋ฉด JavaScript์—์„œ ํ˜ธ์ถœํ•  ๋•Œ ์•ฝ๊ฐ„์˜ ์˜ค๋ฒ„ํ—ค๋“œ ๋•Œ๋ฌธ์— "+,-,*,/" ๋ฐ ๊ธฐํƒ€ ์ˆ˜ํ•™ ๊ด€๋ จ ์—ฐ์‚ฐ๊ณผ ๊ฐ™์€ ์ผ๋ถ€ ํ•˜์œ„ ์ˆ˜์ค€ ์—ฐ์‚ฐ์—์„œ JavaScript๊ฐ€ wasm๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฅด๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. WebAssembly๋กœ ๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œ. #1120

๋‘˜์งธ, ์›น ๊ฐœ๋ฐœ์ž๋“ค์€ ์ด๋ฏธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ ๊ทธ ๋ฌธ๋ฒ•์— ์ต์ˆ™ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์›น์ด ์•„๋‹Œ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ ์–ธ์–ด๋กœ ์›น ์•ฑ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆํ•„์š”ํ•˜๊ณ  ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

๋งˆ์นจ๋‚ด " Binary AST "์˜ ๋„์›€์œผ๋กœ ํ˜„์žฌ ์›น ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ์„ฑ๋Šฅ์€ ํ•ด๋‹น ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•œ ์ˆ˜์ • ์—†์ด ์ƒˆ๋กœ์šด ์ˆ˜์ค€์œผ๋กœ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.

์ถ”์‹ :
C#์ด๋‚˜ Java์— ์ƒ๊ด€์—†์ด ์ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ํ›จ์”ฌ ๋” ์นœ์ˆ™ํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด "์•ฝํ•œ ์œ ํ˜•"๊ณผ ๊ฐ™์€ ์ผ๋ถ€ "์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”" ๊ธฐ๋Šฅ๊ณผ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ(๋ฐ˜๋Œ€์˜ ๊ฒฝ์šฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€)์œผ๋กœ ์ธํ•ด ์ด ์–ธ์–ด์˜ ํšจ์œจ์„ฑ์ด ์ œํ•œ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@Becavalier JS ์ปจํ…์ŠคํŠธ ์˜ค๋ฒ„ํ—ค๋“œ์—์„œ wasm ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์˜ˆ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ๋Ÿฐํƒ€์ž„์€ DOM ์ฟผ๋ฆฌ/์กฐ์ž‘, CSS ์ธ๋ผ์ธ, Canvas ํŽ˜์ธํŠธ์™€ ๊ฐ™์ด ๋…์ ์ ์œผ๋กœ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ฉด Javascript์™€ ํ†ต์‹ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. _etc.._ wasm ์ปจํ…์ŠคํŠธ ๋‚ด์—์„œ ์ผ์–ด๋‚˜๋Š” ๋ชจ๋“  ์‹คํ–‰์€ ์ƒ๋‹นํžˆ ๋น ๋ฆ…๋‹ˆ๋‹ค. ์ง€์—ฐ์€ #1120์˜ ๊ฒฝ์šฐ์™€ ๊ฐ™์ด ์ถ”๊ฐ€ ์ง€์—ฐ์ธ wasm ์ปจํ…์ŠคํŠธ์—์„œ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜์— ๋Œ€ํ•ด Javascript ์ปจํ…์ŠคํŠธ์—์„œ ์„ฑ๋Šฅ ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ์ธ์‡„ํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด JS ๋ธŒ๋ฆฌ์ง€๊ฐ€ ๋„์ž…๋  ๋•Œ ๊ทธ๋ฆผ์œผ๋กœ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

Typescript, Kotlin์˜ Android ๋˜๋Š” Swift์˜ iOS๋ฅผ ์ฑ„ํƒํ•œ ์™„์ „ํ•œ ๊ฐœ์ •ํŒ์ธ Angular2/4์™€ ๊ฐ™์€ ์ธ๊ธฐ ์žˆ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ ๋˜๋Š” ์ผ๋ถ€ ํ”„๋ ˆ์ž„์›Œํฌ ๋˜๋Š” ์–ธ์–ด ๋’ค์— ํฐ ์ด๋ฆ„์ด ์žˆ์„ ๋•Œ ์ „ ์„ธ๊ณ„์ ์œผ๋กœ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ฑ„ํƒํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์š”์ ์€ API ๋ธŒ๋ฆฌ์ง€๋ฅผ ์ถ”์ƒํ™”ํ•˜๊ณ  ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋Ÿฐํƒ€์ž„์„ ํฌํŒ…ํ•˜์—ฌ JS๊ฐ€ ์ œ์™ธ๋˜๊ฑฐ๋‚˜ ์‚ฌ์ง„์—์„œ ์ œ๊ฑฐ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Webassembly๋Š” ๋‹ค๋ฅธ ์–ธ์–ด์˜ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ Javascript์™€ ๊ฒฝ์Ÿํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์„ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค.

์ฒ˜์Œ์—๋Š” V8 ๋ฐ ๊ธฐํƒ€์™€ ๊ฐ™์€ VM์—์„œ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด JS ์ฝ”๋“œ๋ฅผ ๋ณด๋‹ค ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ธฐ์ˆ ์„ ์ฑ„ํƒํ–ˆ์ง€๋งŒ ์ด์ œ๋Š” JS ์ฝ”๋“œ๋ฅผ ๋›ฐ์–ด๋„˜์„ ์ˆ˜ ์žˆ๋Š” ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ TypeScript, CoffeeScript ๋“ฑ๊ณผ ๊ฐ™์€ ๋ณ€ํ™˜๊ธฐ๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ์›น์šฉ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Javascript ๊ฐœ๋ฐœ์ž, ์†๊ฐ€๋ฝ์„ ๊ต์ฐจ ์‹œํ‚ค์‹ญ์‹œ์˜ค. ์•ž์œผ๋กœ ๋ช‡ ๋…„ ๋™์•ˆ ํฐ ์›€์ง์ž„์„ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถ”์‹  : ์ €๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ C-Lang์„ ์‚ฌ๋ž‘ํ•ฉ๋‹ˆ๋‹ค

Webassembly๋Š” ๋‹ค๋ฅธ ์–ธ์–ด์˜ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ Javascript์™€ ๊ฒฝ์Ÿํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์„ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด WebAssembly์˜ ๋ชฉ์  ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ์€ WebAssembly FAQ ์˜ ์ธ์šฉ๋ฌธ์ž…๋‹ˆ๋‹ค.

WebAssembly๋Š” ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๋งŽ์€ ์–ธ์–ด๋ฅผ ์›น์œผ๋กœ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์ง€๋งŒ JavaScript๋Š” ์—„์ฒญ๋‚œ ์ถ”์ง„๋ ฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ์œ„์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์›น์˜ ์œ ์ผํ•œ ๋™์  ์–ธ์–ด๋กœ ๋‚จ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ JavaScript์™€ WebAssembly๋Š” ์—ฌ๋Ÿฌ ๊ตฌ์„ฑ์—์„œ ํ•จ๊ป˜ ์‚ฌ์šฉ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค.

  • JavaScript๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ชจ๋“  ๊ฒƒ์„ ๊ฒฐํ•ฉํ•˜๋Š” ์ „์ฒด ์ปดํŒŒ์ผ๋œ C++ ์•ฑ์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์–ธ์–ด ๋Š” ์ˆ˜๋…„ ๋™์•ˆ JavaScript๋กœ ์ปดํŒŒ์ผ๋˜์—ˆ์œผ๋ฉฐ WebAssembly๊ฐ€ ์žˆ๋“  ์—†๋“  ๊ณ„์† ๊ทธ๋ ‡๊ฒŒ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋ฏธ C#, F#, C++, OCaml, Elm, PureScript, Haskell, Java, Python, Ruby, Perl ๋“ฑ์„ JavaScript๋กœ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

.NET ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ JavaScript๋กœ ์ปดํŒŒ์ผ ํ•  ์ˆ˜ ์žˆ๊ณ  GWT๋Š” 11๋…„ ๋™์•ˆ ์ฃผ๋ณ€์— ์žˆ์—ˆ๊ณ  ํฐ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ํ”„๋กœ์ ํŠธ๋Š” ์ˆ˜๋…„ ๋™์•ˆ ์ง„ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ •๋ง๋กœ ์ƒˆ๋กœ์šด ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

JavaScript๋Š” ์ด๋ฏธ ๋‹ค๋ฅธ ์–ธ์–ด์™€ ๊ฒฝ์Ÿํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. WebAssembly๋Š” ๋‹ค๋ฅธ ์–ธ์–ด๋ฅผ ๋” ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค.


์ฒ˜์Œ์—๋Š” V8 ๋ฐ ๊ธฐํƒ€์™€ ๊ฐ™์€ VM์—์„œ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด JS ์ฝ”๋“œ๋ฅผ ๋ณด๋‹ค ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ธฐ์ˆ ์„ ์ฑ„ํƒํ–ˆ์ง€๋งŒ ์ด์ œ๋Š” JS ์ฝ”๋“œ๋ฅผ ๋›ฐ์–ด๋„˜์„ ์ˆ˜ ์žˆ๋Š” ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ, ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ VM์€ ๋‹น์‹ ์ด ์ฝ”๋“œ ์‹คํ–‰์˜ ๊ฝ‰ ๋‚ฎ์€ ์ˆ˜์ค€์˜ ์ œ์–ด๋ฅผ ํ•„์š”๋กœ ๋” ๋†’์€ ์„ฑ๋Šฅ์„ ์›ํ•˜๋Š” ๊ทธ๋ ‡๋‹ค๋ฉด ๋•Œ๋ฌธ์— JIT ์—”์ง„์˜ ์˜ค๋ฒ„ ํ—ค๋“œ (์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ์˜ ๋ณธ๋ž˜ ๋™์  ํŠน์„ฑ)์˜ ๋„ค์ดํ‹ฐ๋ธŒ ์„ฑ๋Šฅ์„ ๋‹ฌ์„ฑํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. WebAssembly๋Š” ์ด๋Ÿฌํ•œ ์ œ์–ด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.


๋”ฐ๋ผ์„œ ์š”์ ์€ API ๋ธŒ๋ฆฌ์ง€๋ฅผ ์ถ”์ƒํ™”ํ•˜๊ณ  ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋Ÿฐํƒ€์ž„์„ ํฌํŒ…ํ•˜์—ฌ JS๊ฐ€ ์ œ์™ธ๋˜๊ฑฐ๋‚˜ ์‚ฌ์ง„์—์„œ ์ œ๊ฑฐ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•„๋‹ˆ์š”, ์‚ฌ๋žŒ๋“ค์€ ๊ณ„์† JavaScript๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ˆ˜๋…„ ๋™์•ˆ ๋ฐ์Šคํฌํƒ‘์—๋Š” Python, Perl, Ruby, PHP, Haskell, JavaScript(Node.js), OCaml, C++, Java ๋“ฑ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ๋งŽ์€ ์–ธ์–ด๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ๋žŒ๋“ค์€ JavaScript๋ฅผ ๋น„๋กฏํ•œ ๋งŽ์€ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. JavaScript๋Š” ์•„๋ฌด๋ฐ๋„ ๊ฐ€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

JavaScript๊ฐ€ ์ผ๊ธ‰ ์–ธ์–ด๊ฐ€ ์•„๋‹Œ ( ๋งค์šฐ ๊ฐ€๋Šฅ์„ฑ์ด ๋‚ฎ์€) ๊ฐ€์ƒ์˜ ์„ธ๊ณ„์—์„œ๋„ ์‚ฌ๋žŒ๋“ค์€ ์—ฌ์ „ํžˆ โ€‹โ€‹JavaScript๋ฅผ WebAssembly๋กœ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์ด์ œ TypeScript, CoffeeScript ๋“ฑ๊ณผ ๊ฐ™์€ ๋ณ€ํ™˜๊ธฐ๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ์›น์šฉ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿด ๊ฐ€๋Šฅ์„ฑ์€ ์—†์ง€๋งŒ ์‚ฌ๋žŒ๋“ค์ด TypeScript์™€ JavaScript๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์—๋Š” ์—ฌ์ „ํžˆ ํƒ€๋‹นํ•œ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  TypeScript์— ๋Œ€ํ•œ ๋Œ€์•ˆ ์ด ์žˆ์„ ๊ฒƒ์ด๊ณ  ์–ด๋–ค ์‚ฌ๋žŒ๋“ค์€ ์ด๋Ÿฌํ•œ ๋Œ€์•ˆ์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ด์ง€๋งŒ TypeScript๋Š” ์‚ฌ๋ผ์งˆ ๊ฒƒ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๋ฏธ (๊ฐ™์€ ๋…„ ํƒ€์ดํ”„ ์ข‹์€ ๋Œ€์•ˆ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ง Haxe )ํ•˜์ง€๋งŒ ๊ทธ๋“ค์€ ํƒ€์ดํ”„ ๋ผ์ดํ„ฐ๋ฅผ ๋Œ€์ฒดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

2017๋…„ 9์›” 4์ผ 03:42 Pauan [email protected]์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.
>

JavaScript๋Š” ์ด๋ฏธ ๋‹ค๋ฅธ ์–ธ์–ด์™€ ๊ฒฝ์Ÿํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. WebAssembly๋Š”
๋‹ค๋ฅธ ์–ธ์–ด๊ฐ€ ๋” ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ์ „๋ถ€์ž…๋‹ˆ๋‹ค.

ํ›„์ž๋Š” ์ •ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Wasm์˜ ๋˜ ๋‹ค๋ฅธ ๋ชฉํ‘œ๋Š” ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
JavaScript์—์„œ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ž ์žฌ์ ์œผ๋กœ ์ง€์›ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์„์œ„ํ•œ
์˜ˆ๋ฅผ ๋“ค์–ด ๋™์‹œ์„ฑ, ๊ผฌ๋ฆฌ ํ˜ธ์ถœ ๋˜๋Š” ์žฌ๊ฐœ ๊ฐ€๋Šฅํ•œ ์˜ˆ์™ธ๋Š” ๋ชจ๋‘
๋กœ๋“œ๋งต.

@rossberg-chromium ์‹ค์ œ๋กœ ๋‹น์‹ ์ด ๋งž์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์žŠ์–ด ๋ฒ„๋ ธ์Šต๋‹ˆ๋‹ค. ๋ช…ํ™•ํžˆ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@Pauan ์ž์„ธํ•œ ๋‚ด์šฉ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์š”์  ์ค‘ ์ผ๋ถ€๋Š” ์œ ํšจํ•˜๊ณ  ์˜๋ฏธ๊ฐ€ ์žˆ์ง€๋งŒ ๋ชจ๋‘ ๋™์˜ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ ์ธก์˜ C# ์€ ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ Javascript๋ฅผ ์™„์ „ํžˆ ํ”ผํ•˜๋Š” ์œ ๋งํ•˜๊ณ  ํ‚ฌ๋Ÿฌ ์˜ˆ์ œ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ์ฆ‰.. C#์„ ์‚ฌ์šฉํ•˜์—ฌ Javascript ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ ์™„์ „ํ•œ ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ ์›น ์•ฑ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํƒœ๋„ ๊ธฐ๋ฐ˜ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์ ์–ด๋„ ์–ด๋Š ์ •๋„๊นŒ์ง€๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ ˆ๊ฑฐ์‹œ๋ฅผ ๋ฎคํŠธํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฏธ C#, F#, C++, OCaml, Elm, PureScript, Haskell, Java, Python, Ruby, Perl ๋“ฑ์„ JavaScript๋กœ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ, Javascript๊ฐ€ ๊ทธ๋ฆผ์— ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด์ œ WASM/Webasm ์„ ์‚ฌ์šฉํ•˜์—ฌ Javascript๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ๋™๊ธฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” wasm์œผ๋กœ ์ง์ ‘ ์ปดํŒŒ์ผํ•˜๊ณ  ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค Javascript์—์„œ API ๋งˆ์Šคํฌ ๋ ˆ์ด์–ด ๋˜๋Š” ๋ธŒ๋ฆฌ์ง€๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ฐœ๋ฐœ์ž ๊ธฐ๋ฐ˜์€ Webapp์œผ๋กœ ์›น ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•ด Javascript๋ฅผ ์•Œ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์–ธ์–ด๋Š” ์ˆ˜๋…„ ๋™์•ˆ JavaScript๋กœ ์ปดํŒŒ์ผ๋˜์—ˆ์œผ๋ฉฐ WebAssembly๊ฐ€ ์žˆ๋“  ์—†๋“  ๊ณ„์† ๊ทธ๋ ‡๊ฒŒ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋ฏธ C#, F#, C++, OCaml, Elm, PureScript, Haskell, Java, Python, Ruby, Perl ๋“ฑ์„ JavaScript๋กœ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งŽ์€ ์–ธ์–ด๊ฐ€ ์ด๋ฏธ JavaScript๋กœ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ์ง€๋งŒ Webasm์œผ๋กœ ์ปดํŒŒ์ผํ•˜๋ฉด ์ƒ๋‹นํ•œ ๋กœ๋“œ ๋ฐ ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋ ‡๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์–ธ์–ด ์ „์ฒด C VM์„ Webasm์œผ๋กœ ์ปดํŒŒ์ผํ•˜๋ฉด ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๊นŒ?

๋‹ค๋ฅธ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถˆ๊ฐ€ํ”ผํ•œ ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ ํ•ด๋‹น ์–ธ์–ด ์‚ฌ์–‘์„ ์œ„๋ฐ˜ํ•˜๋Š” ๋งŽ์€ ์œ„์น˜(์„ฑ๋Šฅ์ƒ์˜ ์ด์œ ๋กœ)๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ ๊ธฐ๊ปํ•ด์•ผ JavaScript๋ฅผ ๋ถ€๋ถ„์ ์œผ๋กœ ๋Œ€์ฒดํ•˜๊ณ  ์ผ๋ฐ˜์ ์œผ๋กœ "๊ต์ฒด"ํ•  ์ƒˆ ์ฝ”๋“œ๋ณด๋‹ค ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฅผ ์ด์‹ํ•˜๋Š” ๋ฐ ๋” ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. JavaScript"(JS๋กœ ๋ฉ‹์ง€๊ฒŒ ์ปดํŒŒ์ผ๋˜๋„๋ก ์„ค๊ณ„๋œ CoffeeScript, TypeScript ๋“ฑ ์ œ์™ธ).

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋Š” ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด ์ƒˆ๋กœ์šด Ruby -> Webasm ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜„์žฌ ๋ธŒ๋ผ์šฐ์ € JavaScript์™€ ๋น„์Šทํ•œ ์„ฑ๋Šฅ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

JavaScript ๋ฐ Ruby(Opal ํฌํ•จ)๋ฅผ ์˜ˆ์ œ๋กœ ์‚ฌ์šฉํ•˜๋ ค๋ฉด(์ด์ „์— ์‹œ๋„ํ–ˆ์ง€๋งŒ ๊ธฐ๋ณธ์ ์œผ๋กœ ํฌ๊ธฐํ•œ ๊ฒƒ์œผ๋กœ):

+ ์—ฐ์‚ฐ์ž๊ฐ€ ์žˆ๋Š” JavaScript์—์„œ๋Š” ์ˆซ์ž๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5 + " example" === "5 example"

Ruby๋Š” ํƒ€์ดํ•‘์ด ํ›จ์”ฌ ๋” ๊ฐ•๋ ฅํ•˜๋ฉฐ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

5 + " example"
#TypeError: String can't be coerced into Integer

๋”ฐ๋ผ์„œ Opal์€ ๋งŽ์€ ํ•ต์‹ฌ ์œ ํ˜•์— ๋Œ€ํ•ด ์ž์ฒด์ ์ธ ์žฅ์ ๊ณผ ์ƒ๋‹นํžˆ ๋ณต์žกํ•œ ๋ฐฉ๋ฒ•์„ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

function $rb_plus(lhs, rhs) {
  return (typeof(lhs) === 'number' && typeof(rhs) === 'number') ? lhs + rhs : lhs['$+'](rhs);
}
String.prototype['$+'] = function (r){var t=this,n=arguments.length;return 1!==n&&e.ac(n,1,this,"+"),r=ke.get("Opal").$coerce_to(r,ke.get("String"),"to_str"),t+r.$to_s()}

๋งŽ์€ ๊ธฐ๋ณธ ์ž‘์—…์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

# Ruby: if a || b
if ((($a = ((($b = a) !== false && $b !== nil && $b != null) ? $b : b)) !== nil && $a != null && (!$a.$$is_boolean || $a == true))) {

์ด๋ก ์ ์œผ๋กœ JIT๋Š” ์ด๋ฅผ ์™„์ „ํžˆ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฐ€๊น๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ตํ‹ฐ๋งˆ์ด์ €์˜ ์‚ถ์ด ๋” ์–ด๋ ต์Šต๋‹ˆ๊นŒ?

๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ผ๋ถ€ ์‚ฌํ•ญ์ด ์ž˜๋ชป๋˜์—ˆ๊ฑฐ๋‚˜ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(Webasm์—๋Š” ๊ธฐ๋ณธ ์ •์ˆ˜๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ JS๊ฐ€ ์•„๋‹Œ Webasm์œผ๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒฝ์šฐ ์‹œ์ž‘ํ•˜๊ธฐ๋ฅผ ํฌ๋งํ•ฉ๋‹ˆ๋‹ค).

1 / 2 == 0.5 # Should be 0, Ruby has integer division

str = "Hello"
str << " World" # Opal: String#<< not supported. Mutable String methods are not supported in Opal.
puts str # "Hello World"

@nirus

Javascript ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ C#์„ ์‚ฌ์šฉํ•˜์—ฌ ์™„์ „ํ•œ ๊ธฐ๋Šฅ์˜ ์›น ์•ฑ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ, ๋งค์šฐ ํ›Œ๋ฅญํ•˜๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค(์ €๋Š” WebAssembly๋กœ ์ปดํŒŒ์ผํ•  ์–ธ์–ด๋ฅผ ์ž‘์—… ์ค‘์ž…๋‹ˆ๋‹ค). ํ•˜์ง€๋งŒ ์ œ ์š”์ ์€ WebAssembly ์—†์ด๋„ ์ด๋ฏธ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•˜๋‚˜๋Š” wasm์œผ๋กœ ์ง์ ‘ ์ปดํŒŒ์ผํ•˜๊ณ  ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค Javascript์—์„œ API ๋งˆ์Šคํฌ ๋ ˆ์ด์–ด ๋˜๋Š” ๋ธŒ๋ฆฌ์ง€๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ฐœ๋ฐœ์ž ๊ธฐ๋ฐ˜์€ Webapp์œผ๋กœ ์›น ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•ด Javascript๋ฅผ ์•Œ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ, ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ์ด๋ฏธ ์ˆ˜๋…„ ๋™์•ˆ ๊ฐ€๋Šฅํ–ˆ์Šต๋‹ˆ๋‹ค. WebAssembly๋ฅผ ๊ธฐ๋‹ค๋ฆด ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. asm.js ๋Š” ๋ช‡ ๋…„ ๋™์•ˆ ์กด์žฌํ•ด ์™”์Šต๋‹ˆ๋‹ค.


@wnewbery

๋งŽ์€ ์–ธ์–ด๊ฐ€ ์ด๋ฏธ JavaScript๋กœ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ์ง€๋งŒ Webasm์œผ๋กœ ์ปดํŒŒ์ผํ•˜๋ฉด ์ƒ๋‹นํ•œ ๋กœ๋“œ ๋ฐ ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋ ‡๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์–ธ์–ด ์ „์ฒด C VM์„ Webasm์œผ๋กœ ์ปดํŒŒ์ผํ•˜๋ฉด ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๊นŒ?

๊ตฌ๋ฌธ ๋ถ„์„ ์‹œ๊ฐ„์—๋Š” ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ์—๋Š” ๋„์›€์ด ๋˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ •๋ฆฌ ํ•˜์ž๋ฉด asm.js ๋Š” ๋ช‡ ๋…„ ๋™์•ˆ ์กด์žฌํ•ด ์™”์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ”„๋กœ๊ทธ๋žจ์„ JavaScript๋กœ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ•ด๋‹น ํ”„๋กœ๊ทธ๋žจ์€ ๊ฑฐ์˜ ๊ธฐ๋ณธ ์†๋„๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋ฐ์Šคํฌํƒ‘์—์„œ ์‹คํ–‰๋˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ์†๋„๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด๋ฏธ ์–ธ์–ด๋ฅผ ๊ฐ€์ ธ์™€์„œ VM, ๋Ÿฐํƒ€์ž„ ๋ฐ ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘๊ธฐ๋ฅผ asm.js๋กœ ์ปดํŒŒ์ผํ•œ ๋‹ค์Œ ๋ฐ์Šคํฌํ†ฑ์—์„œ์™€ ๊ฑฐ์˜ ๋™์ผํ•œ ์†๋„๋กœ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์›ํ•˜๋Š” ๋ชจ๋“  ์–ธ์–ด๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ด๋ฏธ ๊ฝค ์˜ค๋žซ๋™์•ˆ ๊ฐ€๋Šฅํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ VM, ๋Ÿฐํƒ€์ž„ ๋ฐ ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘๊ธฐ๋ฅผ ์ปดํŒŒ์ผํ•˜๋ฉด ํŒŒ์ผ ํฌ๊ธฐ๊ฐ€ ์ƒ๋‹นํžˆ ์ปค์ง‘๋‹ˆ๋‹ค(์ˆ˜ ๋ฉ”๊ฐ€๋ฐ”์ดํŠธ).

๊ทธ๋ฆฌ๊ณ  DOM๊ณผ ๊ฐ™์€ JS API์™€ ํ†ต์‹ ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์–ด๋–ค ์‚ฌ๋žŒ๋“ค์€ ์–ด์จŒ๋“  ๊ทธ๊ฒƒ์„ ํ–ˆ๊ณ  PyPy ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋ฅผ asm.js๋กœ ์ปดํŒŒ์ผํ•˜๋Š” PyPy.js ์™€ ๊ฐ™์€ ๊ฒƒ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

CPython๋ณด๋‹ค ๋น ๋ฅด๊ฒŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค(์˜ˆ, ์ •๋ง! JavaScript ๋กœ

๊ทธ๋Ÿฌ๋‚˜ ํŒŒ์ผ ํฌ๊ธฐ๋Š” ์ƒ๋‹นํžˆ ๋‚˜์ฉ๋‹ˆ๋‹ค(5MB gzipped, 15MB raw).

๋‹น์‹ ์ด asm.js์— ๋ฃจ๋น„์˜ VM + ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ + ๋Ÿฐํƒ€์ž„์„ ์ปดํŒŒ์ผ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋งค์šฐ ๋น ๋ฅธ ๊ฒƒ,ํ•˜์ง€๋งŒ ๊ทธ๋ž˜์„œ ๊ทธ ๋ฌธ์ œ๊ฐ€์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋Œ€์‹  ์‚ฌ๋žŒ๋“ค์€ ์˜คํŒ”๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

WebAssembly๋Š” asm.js์˜ ์ฐจ์„ธ๋Œ€ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ๋กœ์„œ๋Š” WebAssembly๋กœ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์„ asm.js๋กœ๋„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ, ์–ธ์–ด + VM + ๋Ÿฐํƒ€์ž„ + ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘๊ธฐ๋ฅผ WebAssembly๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ ๊ฑฐ์˜ ๊ธฐ๋ณธ ์†๋„๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋ฌผ๋ก  asm.js์™€ ๊ฐ™์€ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ ํฌ๊ธฐ๊ฐ€ ๋งค์šฐ ํฌ๊ณ  JS API์™€ ํ†ต์‹ ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

WebAssembly์™€ asm.js์—๋Š” 7๊ฐ€์ง€ ์ฐจ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. WebAssembly๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ asm.js๋ณด๋‹ค ์•ฝ๊ฐ„(5%) ๋น ๋ฆ…๋‹ˆ๋‹ค.

  2. 64๋น„ํŠธ ์ •์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ WebAssembly๋Š” asm.js๋ณด๋‹ค ํ›จ์”ฌ (~400%) ๋น ๋ฆ…๋‹ˆ๋‹ค.

  3. WebAssembly๋Š” ํ›จ์”ฌ ๋น ๋ฅด๊ฒŒ ๊ตฌ๋ฌธ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ”„๋กœ๊ทธ๋žจ์˜ ๋Ÿฐํƒ€์ž„ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ค์ง€๋Š” ์•Š์ง€๋งŒ WebAssembly์—์„œ ์ดˆ๊ธฐ ๋กœ๋“œ ์‹œ๊ฐ„ ์ด ๋” ๋น ๋ฅด๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

  4. WebAssembly ํŒŒ์ผ ํฌ๊ธฐ๋Š” asm.js ํŒŒ์ผ ํฌ๊ธฐ๋ณด๋‹ค ์ž‘์Šต๋‹ˆ๋‹ค(์•ฝ 10-20% ์ž‘์Œ).

  5. WebAssembly ๋Š” ๋ฏธ๋ž˜์— asm.js์— ์—†๋Š” ๋ฉ‹์ง„ ๊ธฐ๋Šฅ(์Šค๋ ˆ๋“œ, ๋™์‹œ์„ฑ, ์ œ๋กœ ๋น„์šฉ ์˜ˆ์™ธ ๋“ฑ)์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  6. WebAssembly ๋Š” ์•ž์œผ๋กœ JavaScript์˜ ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘๊ธฐ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ฆ‰, ๋” ์ด์ƒ ์–ธ์–ด์˜ ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘๊ธฐ๋ฅผ WebAssembly๋กœ ์ปดํŒŒ์ผํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ ํŒŒ์ผ ํฌ๊ธฐ๊ฐ€ ์ž‘์•„์ง).

  7. WebAssembly๋Š” ๋ฏธ๋ž˜ ์— DOM๊ณผ ๊ฐ™์€ JS API๋ฅผ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์–ป๊ฒŒ ๋  ๊ฒƒ

๊ทธ๋Ÿฌ๋‚˜ ๋ฏธ๋ž˜์—๋„ ์—ฌ์ „ํžˆ ์–ธ์–ด์˜ VM + ๋Ÿฐํƒ€์ž„์„ WebAssembly๋กœ ์ปดํŒŒ์ผํ•ด์•ผ ํ•˜๋ฏ€๋กœ ํŒŒ์ผ ํฌ๊ธฐ๊ฐ€ ์—ฌ์ „ํžˆ ๋ฌธ์ œ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์–ธ์–ด์˜ VM + ๋Ÿฐํƒ€์ž„ + ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘๊ธฐ๋ฅผ asm.js๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด WebAssembly์—์„œ๋„ ์—ฌ์ „ํžˆ ํ—ˆ์šฉ๋˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์–ธ์–ด์˜ VM + ๋Ÿฐํƒ€์ž„ + ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘๊ธฐ๋ฅผ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ์ด ํ—ˆ์šฉ๋˜๋Š” ๊ฒฝ์šฐ asm.js๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง€๊ธˆ ๋ฐ”๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‚˜์ค‘์— WebAssembly๋กœ ์‰ฝ๊ฒŒ ์ „ํ™˜).

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋Š” ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด ์ƒˆ๋กœ์šด Ruby -> Webasm ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜„์žฌ ๋ธŒ๋ผ์šฐ์ € JavaScript์™€ ๋น„์Šทํ•œ ์„ฑ๋Šฅ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

WebAssembly์˜ ๋ชฉ์ ์€ ๊ธฐ๋ณธ ์†๋„๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๋ฐ์Šคํฌํƒ‘์—์„œ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ์†๋„๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ Ruby๋ฅผ WebAssembly๋กœ ์ปดํŒŒ์ผํ•˜๋ฉด Ruby๊ฐ€ ๋ฐ์Šคํฌํƒ‘์—์„œ ์‹คํ–‰๋˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ์†๋„๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

Ruby๋Š” ์ƒ๋‹นํžˆ ๋Š๋ฆฐ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ๋Š๋ฆฐ ์–ธ์–ด์™€ ๋Š๋ฆฐ ํ”„๋กœ๊ทธ๋žจ์€ WebAssembly๋กœ ์ปดํŒŒ์ผํ•˜๋”๋ผ๋„ ์—ฌ์ „ํžˆ ๋Š๋ฆฝ๋‹ˆ๋‹ค.

1 / 2 == 0.5 # Should be 0, Ruby has integer division

๊ทธ๊ฒƒ์€ ๋‹จ์ˆœํžˆ $rb_divide ํ•จ์ˆ˜์˜ ์ •์˜๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” Opal์˜ ๋ฒ„๊ทธ์ž…๋‹ˆ๋‹ค.

str << " World" # Opal: String#<< not supported. Mutable String methods are not supported in Opal.

์ด๋Š” Opal์ด ๋ฌธ์ž์—ด์„ JavaScript ๋ฐฐ์—ด(๋ณ€๊ฒฝ ๊ฐ€๋Šฅ)๋กœ ์ปดํŒŒ์ผํ•˜๋„๋ก ํ•˜์—ฌ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@ํŒŒ์šฐ์•ˆ

WebAssembly๋Š” ๋ฏธ๋ž˜์— asm.js์— ์—†๋Š” ๋ฉ‹์ง„ ๊ธฐ๋Šฅ(์Šค๋ ˆ๋“œ, ๋™์‹œ์„ฑ, ์ œ๋กœ ๋น„์šฉ ์˜ˆ์™ธ ๋“ฑ)์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์Šค๋ ˆ๋“œ๋Š” ๋งŽ์€ ์–ธ์–ด, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ๋งค์šฐ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ๊ฐ€ ์—†์œผ๋ฉด ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ์— ์˜์กดํ•˜๋Š” C++, C#, Java๋กœ ๋งŒ๋“  ๋งŽ์€ ์•ฑ์ด ์ด์ƒํ•œ ๋™์ž‘์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์›น ์•ฑ์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(SIMD์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์ข‹์€ ์ ์€ ๋งํ•  ๊ฒƒ๋„ ์—†์Šต๋‹ˆ๋‹ค. _์•ž์œผ๋กœ(?)_)๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ asm.js๋Š” ์„ฑ๋Šฅ๋„ ์ด์‹์„ฑ๋„ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ์ข‹๋‹ค๋ฉด ์˜ค๋ž˜ ์ „์— asm.js์— "ํฌํŒ…"๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋” ๋งŽ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋‘๊ฐ€ ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ธ๊ธฐ๊ฐ€ ์žˆ๊ณ  ๋ ˆ๊ฑฐ์‹œ ์ง€์›์„ ์œ„ํ•ด ์‚ฌ๋ผ์ง€์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ๋งํ–ˆ๋“ฏ์ด ๋Œ€๋ถ€๋ถ„์˜ ๋ธŒ๋ผ์šฐ์ €๋Š” ์—ฌ์ „ํžˆ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์„ ์ง€์›ํ•˜์ง€๋งŒ ๋ฏธ๋ž˜์—๋Š” ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ๋กœ ์ƒˆ๋กœ์šด ์›น ์‚ฌ์ดํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ์‚ฌ๋žŒ์ด ๋ชจ๋“  ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•ด ๊ทธ๊ฒƒ์„ wasm์œผ๋กœ ์ปดํŒŒ์ผ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค

@unmellow , ๊ทธ ์‹ ํ™”๋ฅผ ๋‹ค์‹œ ํญ๋กœํ•˜๊ธฐ ์œ„ํ•ด: JS๋ฅผ Wasm์œผ๋กœ ์ปดํŒŒ์ผํ•˜๋ฉด ๋งˆ๋ฒ• ๊ฐ™์€ ์„ฑ๋Šฅ ํ–ฅ์ƒ์ด ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜คํžˆ๋ ค ๊ทธ ๋ฐ˜๋Œ€์ž…๋‹ˆ๋‹ค. JS ์—”์ง„์ด ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋‚˜์€ ์„ฑ๋Šฅ์„ ์›ํ•œ๋‹ค๋ฉด ๋” ๋‚˜์€ ์–ธ์–ด๋ฅผ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค ๋” ๋นจ๋ฆฌ ๊ตฌ๋ฌธ ๋ถ„์„ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์žŠ์—ˆ์Šต๋‹ˆ๋‹ค
ํŽธ์ง‘ : ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ ์—”์ง„์„ ์ง€์›ํ•˜๋„๋ก ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ตœ์‹  ๋ฒ„์ „์˜ JavaScript ๊ฐ์ง€ ์‚ฌ๋žŒ๋“ค์€ ์„ฑ๋Šฅ ์†์‹ค ์—†์ด wasm์œผ๋กœ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” 1๋…„ ๋œ ํ‹ฐ์ผ“์„ ๊ฑท์–ด์ฐจ๋Š” ๊ฒƒ์ด ์ •๋ง ํŽธํ•˜์ง€ ์•Š์ง€๋งŒ, ํ† ๋ก ๊ณผ ์•ฝ๊ฐ„์˜ ํšก์„ค์ˆ˜์„ค์„ ์œ„ํ•ด์„œ์ž…๋‹ˆ๋‹ค.

๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด Javascript๋ฅผ WASM์œผ๋กœ ๋Œ€์ฒดํ•˜๋Š” ์•„์ด๋””์–ด์— ํšŒ์˜์ ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ•œ ๊ฐ€์ง€ ์‚ฌ์‹ค์€ WASM์ด ์„ฑ๋Šฅ์— ๊ด€ํ•œ ๊ฒƒ๋งŒ์€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ๋Œ€๋ถ€๋ถ„ ์žŠ๊ณ  ์žˆ๋Š” ๊ฒƒ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๊ทธ๋“ค์ด ์›ํ•˜๋Š”(๋˜๋Š” ์›ํ•˜๋Š”) ์–ธ์–ด๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด ๋ง์€, ์ตœ์†Œํ•œ ๋ฒ ์–ด๋ณธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์‚ฌ๋žŒ๋“ค์ด ์›ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ ์  ๋” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ํƒ€์‚ฌ ์–ธ์–ด์šฉ ์ปดํŒŒ์ผ๋Ÿฌ์ธ ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์‚ฌ๋žŒ๋“ค ์ด ํ‘œ์ค€์— ์˜์กดํ•˜๋Š” ๊ฒƒ์„

๊ทธ๋Ÿฌ๋‚˜ ๋ฒˆ์—ญ์€ ๋ณธ์งˆ์ ์œผ๋กœ ์ปดํŒŒ์ผ๋ณด๋‹ค ํ›จ์”ฌ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ํ•œ ์–ธ์–ด๋ฅผ ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ๋งคํ•‘ํ•˜๋Š” ์ˆ˜ํ•™์  ๋ฌธ์ œ๋Š” ํ•ญ์ƒ ์ง€์—ญ ๋ฒ”์œ„์— ๊ตญํ•œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ์ปจํ…์ŠคํŠธ ์ •๋ณด๋Š” ๋‹ค๋ฅธ ์ชฝ์œผ๋กœ ์ „๋‹ฌ๋˜์–ด์•ผ ํ•˜๋ฉฐ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ค์šด ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ ์œ ์‚ฌํ•˜์ง€ ์•Š์€ ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋„๋ฆฌ ์ฑ„ํƒ๋˜์ง€ ์•Š๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค(๋˜๋Š” ์˜์กดํ•ด์„œ๋Š” ์•ˆ ๋˜๋Š” ์ด์œ ).

๋˜ํ•œ ์ค‘๋ณต๋œ ๋…ธ๋ ฅ์—๋„ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ€ํ™˜๊ธฐ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์ด๊ณ  ๋ฒˆ๋“ค๋Ÿฌ๋Š” ๋ง์ปค์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ๋ชจ๋‘๋Š” ์˜ค๋žซ๋™์•ˆ ๊ทธ๋Ÿฌํ•œ ๋„๊ตฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“ˆ, ํŠธ๋ฆฌ ์‰์ดํ‚น, ์ฝ”๋“œ ๋ถ„ํ• , ๋™์ /์ง€์—ฐ ๋กœ๋”ฉ, ์ž์‚ฐ ๊ด€๋ฆฌ ๋“ฑ. ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ๊ฒƒ์€ ์—†์ง€๋งŒ ์‚ฌ๋žŒ๋“ค์€ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ์›น์šฉ์œผ๋กœ๋งŒ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ƒˆ๋กœ์šด ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ ์›น ์†”๋ฃจ์…˜์ด ์•„๋‹Œ ์†”๋ฃจ์…˜์—๋Š” ์นœํ™”์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

WASM์ด ํ•˜๋ฃจ์•„์นจ์— ๋ชจ๋“  ๊ฒƒ์„ ๋ฐ”๊พธ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. Javascript๋Š” ํ˜„์žฌ ์ž˜ ๊ตฌ์ถ•๋œ ์ƒํƒœ๊ณ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ ๋‹ค๋ฅธ ์–ธ์–ด๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Javascript๊ฐ€ ์‹ค์ œ๋กœ ์–ด๋”˜๊ฐ€๋กœ ๊ฐ€๊ธฐ๊นŒ์ง€๋Š” ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๊ฒ ์ง€๋งŒ ์žฅ๊ธฐ์ ์œผ๋กœ๋Š” ๋ถ„๋ช…ํžˆ ์ผ์–ด๋‚  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Javascript๋Š” ๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜๊ธฐ์— ๋”์ฐํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ๋‚˜์•„๊ฐ€๊ณ  ์žˆ์œผ๋ฏ€๋กœ WASM ๊ต์ฒด๋ฅผ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. ์ƒ๋‹นํ•œ ๊ฐœ์„ ์ด ์žˆ์—ˆ์ง€๋งŒ ์ง€๋‚œ ๋ช‡ ๋…„ ๋™์•ˆ ๋งŽ์€ ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ๋ฐฉํ–ฅ์ด ์ž˜๋ชป ์ธ๋„๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ ์ ˆํ•œ ์–ธ์–ด๋ฅผ.. ๋ฐ˜๋“œ์‹œ ๊ทธ ์ž๋ฆฌ๋ฅผ ์ฐจ์ง€ํ•  ํ•„์š”๋Š” ์—†์ง€๋งŒ ์ง์ ‘์ ์ธ ๊ฒฝ์Ÿ์ž๊ฐ€ ๋˜์–ด ์ด ์ƒˆ๋กœ์šด ๋ถˆ์พŒํ•œ JS ๋ฐ ๊ทธ "ํ”„๋ ˆ์ž„์›Œํฌ"๋ฅผ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

@spencerudnick C์—์„œ ์–ป์„ ์ˆ˜ ์—†๋Š” ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•ด ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ ์ž‘์„ฑํ•œ ์ ์ด ์—†์Šต๋‹ˆ๊นŒ?

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