javascript engines - Lee-hyuna/33-js-concepts-kr GitHub Wiki
์๋ฐ์คํฌ๋ฆฝํธ ์์ง๋ค - ๊ฐ๋ฐ์๋ฅผ ์ํ ์ง์นจ์
์๋ฌธ Javascript Engines
์น๊ณผ ๊ด๋ จ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ ๊ฐ๋ฐ์๊ฐ ์ผ๋ จ์ ๋ฌธ์๋ฅผ ์์ฑํ๊ณ , ๊ทธ ๋ฌธ์๋ค์ด ๋ธ๋ผ์ฐ์ ๋ด์์ ์ด๋ฏธ์ง, ๋จ์ด ๋ฐ ๋์์ผ๋ก ๋ณํ๋ค๋ ์ ์์ ๋๋๋ก ๋ง๋ฒ์ฒ๋ผ ๋๊ปด์ง๋ค. ์ด ๊ธฐ์ ์ ์ดํดํ๋ฉด ๊ฐ๋ฐ์๋ค์ด ํ๋ก๊ทธ๋๋จธ์์ ๊ธฐ์ ์ ๋ ์ ์กฐ์ ํ ์ ์๋ค.
Javascript ์์ง์ ๋ณต์กํ ๊ธฐ์ ์ด๋ค. ๊ฐ๋ฅํํ ์ต๋จ ์๊ฐ์ ์ต์ ํ ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ ค๋ ๊ฐ๋ฐ์๋ค์๊ฒ ์๋ก ๋ค๋ฅธ ํ๋ซํผ์ด ์๋ก ๋ค๋ฅธ ์์ง์ ์ฌ์ฉํ๋ ์ด์ ๋ฅผ ์๋ ๊ฒ์ด ํ์์ ์ด๋ค.
๊ฐ์ ๋จธ์
Javascript ์์ง์ ์ฃผ์ด์ง ์ปดํจํฐ ์์คํ ์ ๊ฐ์ ๋จธ์ ๋๋ ์ํํธ์จ์ด ๊ตฌ๋ ์๋ฎฌ๋ ์ด์ ์ ํ์ผ๋ก ์ ์๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ๊ฐ์ ์ปดํจํฐ์๋ ๋ค์ํ ์ ํ์ด ์์ผ๋ฉฐ ์ค์ ์ค์ ์ปดํจํฐ๋ฅผ ์๋ฎฌ๋ ์ด์ ํ๊ฑฐ๋ ๋์ฒด ํ ์์๋ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ ๋ถ๋ฅ ๋๋ค.
์๋ฅผ ๋ค์ด, ๊ฐ์ ๋จธ์ ์์คํ ์ ์ด์ ์ฒด์ ๊ฐ ์คํ๋ ์ ์๋ ํ๋ซํผ์ ์์ ํ ์๋ฎฌ๋ ์ด์ ์ ์ ๊ณตํ๋ค. Mac ์ฌ์ฉ์๋ Windows๋ฅผ Mac์์ ์คํํ ์ ์๋ ๊ฐ์ ๋จธ์ ์์คํ ์ธ Parallels๋ฅผ ๋ค์ด ๋ดค์ ๊ฒ์ด๋ค.
๋ฐ๋ฉด์ ํ๋ก์ธ์ค ๊ฐ์ ๋จธ์ ์ ๋ ๊ธฐ๋ฅ์ ์ด๋ฉฐ ํ๋์ ํ๋ก๊ทธ๋จ์ด๋ ํ๋ก์ธ์ค๋ง ์คํํ ์ ์๋ค. Wine์ Windows ์์ฉ ํ๋ก๊ทธ๋จ์ Linux ์ปดํจํฐ์์ ์คํํ ์ ์๊ฒ ํด์ฃผ๋ ํ๋ก์ธ์ค ๊ฐ์ ๋จธ์ ์ด์ง๋ง ์ ์ฒด Windows OS๋ฅผ Linux์์ ์คํํ ์ ์๋ค.
Javascript ์์ง์ Javascript ์ฝ๋๋ฅผ ํด์ํ๊ณ ์คํํ๋๋ก ํน๋ณํ ์ค๊ณ๋ ํ๋ก์ธ์ค ๊ฐ์ ๋จธ์ ์ ์ผ์ข ์ด๋ค. ์น ํ์ด์ง๋ฅผ ๊ตฌ์ฑํ์ฌ ๋ธ๋ผ์ฐ์ ์ ์ฑ๋ฅ์ ํฅ์์ํค๋ ๋ ์ด์์ ์์ง๊ณผ ์ฝ๋๋ฅผ ํด์ํ๊ณ ์คํํ๋* ๋ฎ์ ์์ค์ Javascript ์์ง*์ ๊ตฌ๋ณํ๋ ๊ฒ์ด ์ค์ํ๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด๋ ๋ฌด์์ธ๊ฐ?
Javascript ์์ง์ ๊ธฐ๋ณธ ์์ ์ ๊ฐ๋ฐ์๊ฐ ์์ฑํ Javascript ์ฝ๋๋ฅผ ๋น ๋ฅด๊ฒ ๋ณํํ๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ด์ฅํ ํ๊ฑฐ๋ ๋ธ๋ผ์ฐ์ ๊ฐ ํด์ ๊ฐ๋ฅํ๋๋ก ์ต์ ํ ํ๋ ๊ฒ์ด๋ค.
๋ณด๋ค ์ ํํ๊ฒ, ๊ฐ Javascript ์์ง์ ECMAScript ๋ฒ์ ์ ๊ตฌํํ๋ค.์ด ๋ฒ์ ์ Javascript๋ ๋ฐฉ์ธ(?)์ด๋ค. ECMAScript๊ฐ ์งํํ๋ฉด Javascript ์์ง๋ ๋ฐ์ ํ๋ค. ๊ฐ๊ธฐ ๋ค๋ฅธ ์น ๋ธ๋ผ์ฐ์ , ํค๋๋ฆฌ์ค ๋ธ๋ผ์ฐ์ ๋๋ Node.js์ ๊ฐ์ ๋ฐํ์์์ ์๋ํ๋๋ก ์ค๊ณ๋์์ผ๋ฏ๋ก ๋งค์ฐ ๋ค์ํ ์์ง์ด ์๋ค. ํค๋๋ฆฌ์ค ๋ธ๋ผ์ฐ์ ๋ ๊ทธ๋ํฝ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๊ฐ์๋ ์น ๋ธ๋ผ์ฐ์ ๋ก, ์น ์ ํ์ ๋ํ ์๋ ํ ์คํธ๋ฅผ ์คํํ๋ ๋ฐ ์ ์ฉํ๋ค. ์ข์ ์๊ฐ PhantomJS์ด๋ค. Node.js๋ Javascript๋ฅผ ์๋ฒ ์ธก์์ ์ฌ์ฉํ ์์๋ ๋น๋๊ธฐ์ ์ด๋ฒคํธ ๊ธฐ๋ฐ ํ๋ ์์ํฌ์ด๋ค. ์ด๊ฒ๋ค์ Javascript๋ก ๊ตฌ๋๋๋ ๋๊ตฌ์ด๊ธฐ ๋๋ฌธ์ Javascript ์์ง์ ์ํด ๊ตฌ๋๋๋ค.
๋ค์ํ Javascript ์์ง์ ์ฌ์ฉํ์ฌ ํด๋ผ์ด์ธํธ ์ธก ์ฝ๋๋ฅผ ํด์, ๊ตฌ๋ฌธ ๋ถ์ ๋ฐ ์คํํ ์ ์๋ค. ๋ธ๋ผ์ฐ์ ๋ฒ์ ์ด ์๋ก์ด ์ถ์๋๋ฉด Javascript ์์ง์ด ์ต์ฒจ๋จ Javascript ์ฝ๋ ์คํ์ ๋ฐ๋ผ๊ฐ ์ ์๋๋ก ๋ณ๊ฒฝ๋๊ฑฐ๋ ์ต์ ํ ๋ ์ ์๋ค.
Javascript ์์ง์ ์ด๋ป๊ฒ ๋์ํ ๊น?
๊ฐ์ ๋จธ์ ์ ์ ์๋ฅผ ๊ฐ์ํ ๋ Javascript ์์ง์ ํ๋ก์ธ์ค ๊ฐ์ ๋จธ์ ์ด๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฒ์ Javascript ์ฝ๋๋ฅผ ์ฝ๊ณ ์ปดํ์ผํ๋ ๊ฒ์ด ๋ชฉ์ ์ด๊ธฐ ๋๋ฌธ์ ์๋ฏธ๊ฐ ์๋ค. ์ด๊ฒ์ Javascript ์์ง์ด ๋จ์ํ ๊ฒ์ ์๋ฏธํ์ง ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, JavaScriptCore์๋ Javascript ์ฝ๋๋ฅผ ๋ถ์, ํด์, ์ต์ ํ ๋ฐ ๊ฐ๋น์ง ์์ง(garbage collect)๋ฑ 6 ๊ฐ์ ๋น๋ฉ ๋ธ๋ก์ด ์๋ค.
๊ทธ๋ฌ๋ฉด ์ด๋ป๊ฒ ๋์ํ ๊น? ๋ฌผ๋ก ์์ง์ ๋ฐ๋ผ ๋์ํ๋ค. WebKit์ JavascriptCore์ Google์ V8 ์์ง์ด ์ฃผ์ ์์ง์ด๋ค. NativeScript๊ฐ ์ด๊ฒ๋ค์ ํ์ฉํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ด ๋ ์์ง์ ์ฝ๋ ์ฒ๋ฆฌ๋ฅผ ๋ค๋ฅด๊ฒ ์ฒ๋ฆฌํ๋ค.
JavaScriptCore๋ ์คํฌ๋ฆฝํธ๋ฅผ ํด์ํ๊ณ ์ต์ ํํ๋ ์ผ๋ จ์ ๋จ๊ณ๋ฅผ ์ํํ๋ค. ์ดํ ๋ถ์์ ์ํํ์ฌ ์์ค๋ฅผ ์ผ๋ จ์ ํ ํฐ ๋๋ ์๋ณ ๋ ์๋ฏธ์ ๋ฌธ์์ด๋ก ๋๋๋๋ค. ๊ทธ๋ฐ ๋ค์ ๊ตฌ๋ฌธ ๋ถ์๊ธฐ์์ ํ ํฐ์ ๋ถ์ํ๊ณ ๊ตฌ๋ฌธ ํธ๋ฆฌ๋ก ์์ฑํ๋ค. 4 ๊ฐ์ JIT (just-in-time) ํ๋ก์ธ์ค๊ฐ ํ์์ ์ํด ์์ฑ ๋ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ๋ถ์, ์คํํ๋ค. ๊ฐ๋จํ ๋งํด์, JavaScriptCore๋ ์์ค ์ฝ๋๋ฅผ ๊ฐ์ ธ ์์ ๋ฌธ์์ด๋ก ๋ถํดํ๋ค. (๋ณ๋ช ์ ๋ ์ค).์ด ๋ฌธ์์ด์ ์ปดํ์ผ๋ฌ๊ฐ ์ดํดํ ์์๋ ๋ฐ์ดํธ ์ฝ๋๋ก ๋ณํ ํ ๋ค์ ์คํํ๋ค.
C ++๋ก ์์ฑ๋ Google์ V8 ์์ง์ ๋ํ Javascript ์์ค ์ฝ๋๋ฅผ ์ปดํ์ผ ๋ฐ ์คํํ๊ณ , ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ์ฒ๋ฆฌํ๋ฉฐ, ๊ฐ๋น์ง ์์ง์ ๋จ์ ๋ถ๋ถ์ ์์งํ๋ค. ๊ทธ ์ค๊ณ๋ ์์ค ์ฝ๋๋ฅผ ๊ธฐ๊ณ์ด ์ฝ๋๋ก ์ง์ ์กฐ๋ฆฝํ๋ ๋ ๊ฐ์ ์ปดํ์ผ๋ฌ๋ก ๊ตฌ์ฑ๋๋ค.
๊ตฌ์ฑ๋๋ ๋๊ฐ์ง ์ปดํ์ผ๋ฌ๋ ์ต์ ํ๋์ง ์์ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ณ ์ ์ปดํ์ผ๋ฌ ์ธ Full-codegen๊ณผ ๋น ๋ฅด๊ณ ์ต์ ํ ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋๋ฆฐ ์ปดํ์ผ๋ฌ ์ธ Crankshaf์ด๋ค.
Crankshaft๊ฐ Full-codegen์ ์ํด ์์ฑ ๋ ์ต์ ํ๋์ง ์์ ์ฝ๋๊ฐ ์ต์ ํ๊ฐ ํ์ํ ๊ฒ์ผ๋ก ํ๋จํ๋ฉด,์ด๋ฅผ 'crankshafting'์ด๋ผ๊ณ ํ๋ ํ๋ก์ธ์ค๋ก ๋์ฒดํ๋ค.
์ปดํ์ผ ๊ณผ์ ์์ ๊ธฐ๊ณ ์ฝ๋๊ฐ ์์ฑ๋๋ฉด ์์ง์ NativeScript์ฒ๋ผ ECMA ํ์ค์ ์ง์ ๋ ๋ชจ๋ ๋ฐ์ดํฐ ์ ํ, ์ฐ์ฐ์, ๊ฐ์ฒด ๋ฐ ํจ์๋ฅผ ์ฌ์ฉํด์ผํ๋ ๋ธ๋ผ์ฐ์ ๋๋ ๋ฐํ์์ ๋ ธ์ถํ๋ค.
์ด๊ฒ์ ๊ฐ๋ฐ์๋ค์๊ฒ ๋ฌด์์ ์๋ฏธํ๋?
Javascript ์์ง์ ์ฝ๋ ๊ตฌ๋ฌธ ๋ถ์ ๋ฐ ์คํ ํ๋ก์ธ์ค์ ๋ชฉํ๋ ์ต๋ํ ์งง์ ์๊ฐ ๋ด์ ์ต์ ํ ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด๋ค.
๊ฒฐ๋ก ์ ์ด๋ฌํ ์์ง์ ์งํ๋ ์น๊ณผ ๋ชจ๋ฐ์ผ ์์ญ์ ์งํ์์ผ ๊ฐ๋ฅํ ํ ์ ์๋ํ๋๋ก ํ๋ ค๋ ํ๊ตฌ์ ๋ณํ๋๋ค. ์ด ์งํ๋ฅผ ์ถ์ ํ๊ธฐ ์ํด arewefastyet.com๊ณผ ๊ฐ์ ์ฌ์ดํธ์์ ์์ฑ๋ ๋ฒค์น๋งํน ๊ทธ๋ํ๋ ๋ค์ํ ์์ง์ ์ํธ ๋น๊ต ์ฑ๋ฅ์ ๋ณด์ฌ์ค๋ค.
๋ชจ๋ ์น ๊ฐ๋ฐ์๋ ์์ฑ, ๋๋ฒ๊ทธ ๋ฐ ์ ์ง ๊ด๋ฆฌ๋๋ ์ฝ๋๋ฅผ ํ์ํ๋ ๋ธ๋ผ์ฐ์ ์ ๊ณ ์ ํ ์ฐจ์ด์ ์ ์ธ์ํด์ผํ๋ค. ๋ ๊ตฌ์ฒด์ ์ผ๋ก ๋งํ์๋ฉด ํน์ ์คํฌ๋ฆฝํธ๊ฐ ํ ๋ธ๋ผ์ฐ์ ์์ ๋ค๋ฅธ ์คํฌ๋ฆฝํธ๋ณด๋ค ๋ ๋นจ๋ฆฌ ์๋ํ๋ ์ด์ ๋ฅผ ์ดํดํ๋ ๊ฒ์ด ์ค์ํ๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก ๋ชจ๋ฐ์ผ ๊ฐ๋ฐ์, ํนํ ์น ๋ธ๋ผ์ฐ์ ๋ฅผ ์ฌ์ฉํ์ฌ ํ์ด๋ธ๋ฆฌ๋ ๋ชจ๋ฐ์ผ ์์ฉ ํ๋ก๊ทธ๋จ์ ์์ฑํ์ฌ NativeScript์ ๊ฐ์ ๋ฐํ์์ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์๋ Javascript ์ฝ๋๋ฅผ ํด์ํ๋ ์์ง์ ์๊ณ ์ถ์ดํ๋ค. ๋ชจ๋ฐ์ผ ์น ๊ฐ๋ฐ์๋ ์์ ์ฅ์น์์ ๋ค์ํ ๋ธ๋ผ์ฐ์ ๊ฐ ์ ๊ณตํ๋ ๊ณ ์ ํ ํ๊ณ์ ๊ฐ๋ฅ์ฑ์ ์ดํดํด์ผํ๋ค. Javascript์์ง์ ๋ณํ๋ฅผ ๋ฐ๋ผ ์ก๋ ๊ฒ์ ์น, ๋ชจ๋ฐ์ผ ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์๋ก์ ์งํํ๋ ค๋ ์ฌ๋๋ค์๊ฒ ์ ๋ง ํจ๊ณผ์ ์ด๋ค.
๋ณ์ญ์ ํ๋ฉฐ ๋๋์
- ์๋ก ์ ์ธ ์ค๋ช ์ด๋ผ์ ๋์์ด ๋๋์ง๋ ์ ๋ชจ๋ฅด๊ฒ ๋ค.