C# ๋ฐํ์์ JS๋ฅผ ์์ ํ ๋์ฒดํ๋ ์์ ํ ๊ธฐ๋ฅ์ ํ๋กํ ํ์ ์ธ wasm์ผ๋ก ์ด์๋์์ต๋๋ค. ๋ฐ๋ผ์ ์ด๋ ๋ฏธ๋์ ๋ฐํ์์ด ๋ธ๋ผ์ฐ์ ์์ JS๋ฅผ ๋์ฒดํ๊ณ Java, C# ๋๋ C++๋ก ํด๋ผ์ด์ธํธ ์ธก ์น ์ฑ์ ์์ฑํ๊ณ "์ฝ๋๋ ๋ค์ดํฐ๋ธ์ ๊ฐ๊น๊ฒ ์คํ๋ ๊ฒ์ ๋๋ค" , "์ปดํ์ผ๋ ์ฝ๋๋ VM๋ณด๋ค ๋น ๋ฆ ๋๋ค" ๋ผ๋ ๋ช ๋ น๋ฌธ๊ณผ ํจ๊ป ๋ฑ์ฅํ ๊ฒ์ ๊ธฐ๋ํ ์ ์์์ ์๋ฏธํฉ๋๋ค. ๋๋ JavaScript์ ๋์ ์์ด๋ ๋ฌด์์ด๋ ๊ฐ๋ฅํฉ๋๋ค.
์ ๊ฐ ๋งํ๊ณ ์ ํ๋ ๋ฐ๋ฅผ ์ด ์์ ์ ๋ด์ฃผ์ธ์.
WebAsm์ JS๋ฅผ ๋ณด์ํ๊ธฐ ์ํด ๋์ ๋์์ง๋ง ์ด์ ๋ ์ผ๋ฅ ์ธ์ด๋ฅผ ๋์ฒดํ์ฌ ์์ ํ ์ธ์ํ ์ ์์ต๋๋ค.
๊ฐ๊น์ด ์ฅ๋์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ปดํ์ผ๋ ์๋ฒ์์ ์น ํ์ด์ง๊ฐ ์ ๊ณต๋ ๊ฒ์ผ๋ก ๊ธฐ๋ํ ์ ์์ต๋๋ค.
๋๋ 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๊ฐ์ง ์ฐจ์ด์ ์ด ์์ต๋๋ค.
WebAssembly๋ ์ผ๋ฐ์ ์ผ๋ก asm.js๋ณด๋ค ์ฝ๊ฐ(5%) ๋น ๋ฆ ๋๋ค.
64๋นํธ ์ ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ WebAssembly๋ asm.js๋ณด๋ค ํจ์ฌ (~400%) ๋น ๋ฆ ๋๋ค.
WebAssembly๋ ํจ์ฌ ๋น ๋ฅด๊ฒ ๊ตฌ๋ฌธ ๋ถ์ํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ํ๋ก๊ทธ๋จ์ ๋ฐํ์ ์๋๋ฅผ ํฅ์์ํค์ง๋ ์์ง๋ง WebAssembly์์ ์ด๊ธฐ ๋ก๋ ์๊ฐ ์ด ๋ ๋น ๋ฅด๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
WebAssembly ํ์ผ ํฌ๊ธฐ๋ asm.js ํ์ผ ํฌ๊ธฐ๋ณด๋ค ์์ต๋๋ค(์ฝ 10-20% ์์).
WebAssembly ๋ ๋ฏธ๋์ asm.js์ ์๋ ๋ฉ์ง ๊ธฐ๋ฅ(์ค๋ ๋, ๋์์ฑ, ์ ๋ก ๋น์ฉ ์์ธ ๋ฑ)์ ์ป์ ์ ์์ต๋๋ค.
WebAssembly ๋ ์์ผ๋ก JavaScript์ ๊ฐ๋น์ง ์์ง๊ธฐ์ ์ก์ธ์คํ ์ ์์ต๋๋ค(์ฆ, ๋ ์ด์ ์ธ์ด์ ๊ฐ๋น์ง ์์ง๊ธฐ๋ฅผ WebAssembly๋ก ์ปดํ์ผํ ํ์๊ฐ ์์ผ๋ฏ๋ก ํ์ผ ํฌ๊ธฐ๊ฐ ์์์ง).
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์์ ์ป์ ์ ์๋ ์ฑ๋ฅ ํฅ์์ ์ํด ์ด์ ๋ธ๋ฆฌ๋ฅผ ์์ฑํ ์ ์ด ์์ต๋๊น?
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๊ทธ๋ ์ต๋๋ค. ๊ทธ๊ฒ์ด WebAssembly์ ๋ชฉ์ ์ค ํ๋์ ๋๋ค.
๋ค์์ WebAssembly FAQ ์ ์ธ์ฉ๋ฌธ์ ๋๋ค.
๋ค๋ฅธ ์ธ์ด ๋ ์๋ ๋์ JavaScript๋ก ์ปดํ์ผ๋์์ผ๋ฉฐ WebAssembly๊ฐ ์๋ ์๋ ๊ณ์ ๊ทธ๋ ๊ฒ ํ ๊ฒ์ ๋๋ค.
์ด๋ฏธ C#, F#, C++, OCaml, Elm, PureScript, Haskell, Java, Python, Ruby, Perl ๋ฑ์ JavaScript๋ก ์ปดํ์ผํ ์ ์์ต๋๋ค.
.NET ๋ฐ์ดํธ ์ฝ๋๋ฅผ JavaScript๋ก ์ปดํ์ผ ํ ์ ์๊ณ GWT๋ 11๋ ๋์ ์ฃผ๋ณ์ ์์๊ณ ํฐ ํ๋ก์ ํธ์์ ์ฌ์ฉ๋์์ต๋๋ค.
์ด๋ฌํ ํ๋ก์ ํธ๋ ์๋ ๋์ ์งํ๋์์ต๋๋ค. ๊ทธ๊ฒ์ ์ ๋ง๋ก ์๋ก์ด ๊ฒ์ด ์๋๋๋ค.
JavaScript๋ ์ด๋ฏธ ๋ค๋ฅธ ์ธ์ด์ ๊ฒฝ์ํ๊ณ ์์ต๋๋ค. WebAssembly๋ ๋ค๋ฅธ ์ธ์ด๋ฅผ ๋ ํจ์จ์ ์ผ๋ก ๋ง๋๋ ๊ฒ๋ฟ์ ๋๋ค.
์, ์๋ฐ ์คํฌ๋ฆฝํธ VM์ ๋น์ ์ด ์ฝ๋ ์คํ์ ๊ฝ ๋ฎ์ ์์ค์ ์ ์ด๋ฅผ ํ์๋ก ๋ ๋์ ์ฑ๋ฅ์ ์ํ๋ ๊ทธ๋ ๋ค๋ฉด ๋๋ฌธ์ JIT ์์ง์ ์ค๋ฒ ํค๋ (์๋ฐ ์คํฌ๋ฆฝํธ์ ๋ณธ๋ ๋์ ํน์ฑ)์ ๋ค์ดํฐ๋ธ ์ฑ๋ฅ์ ๋ฌ์ฑํ์ง ๋ชปํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. WebAssembly๋ ์ด๋ฌํ ์ ์ด๋ฅผ ์ ๊ณตํฉ๋๋ค.
์๋์, ์ฌ๋๋ค์ ๊ณ์ JavaScript๋ฅผ ์ฌ์ฉํ ๊ฒ์ ๋๋ค.
์๋ ๋์ ๋ฐ์คํฌํ์๋ Python, Perl, Ruby, PHP, Haskell, JavaScript(Node.js), OCaml, C++, Java ๋ฑ ์ ํํ ์ ์๋ ๋ง์ ์ธ์ด๊ฐ ์์์ต๋๋ค.
์ฌ๋๋ค์ JavaScript๋ฅผ ๋น๋กฏํ ๋ง์ ์ธ์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค. JavaScript๋ ์๋ฌด๋ฐ๋ ๊ฐ์ง ์์ต๋๋ค.
JavaScript๊ฐ ์ผ๊ธ ์ธ์ด๊ฐ ์๋ ( ๋งค์ฐ ๊ฐ๋ฅ์ฑ์ด ๋ฎ์) ๊ฐ์์ ์ธ๊ณ์์๋ ์ฌ๋๋ค์ ์ฌ์ ํ โโJavaScript๋ฅผ WebAssembly๋ก ์ปดํ์ผํ ์ ์์ต๋๋ค.
๊ทธ๋ด ๊ฐ๋ฅ์ฑ์ ์์ง๋ง ์ฌ๋๋ค์ด TypeScript์ JavaScript๋ฅผ ์ฌ์ฉํ๋ ๋ฐ์๋ ์ฌ์ ํ ํ๋นํ ์ด์ ๊ฐ ์์ต๋๋ค.
๋ฌผ๋ก TypeScript์ ๋ํ ๋์ ์ด ์์ ๊ฒ์ด๊ณ ์ด๋ค ์ฌ๋๋ค์ ์ด๋ฌํ ๋์์ ์ฌ์ฉํ ๊ฒ์ด์ง๋ง TypeScript๋ ์ฌ๋ผ์ง ๊ฒ ๊ฐ์ง ์์ต๋๋ค.
๋๋ ์ด๋ฏธ (๊ฐ์ ๋ ํ์ดํ ์ข์ ๋์ ๋์๊ธฐ ๋๋ฌธ์ ๋ง Haxe )ํ์ง๋ง ๊ทธ๋ค์ ํ์ดํ ๋ผ์ดํฐ๋ฅผ ๋์ฒดํ์ง ์์ต๋๋ค.