Understanding How the Chrome V8 Engine Translates JavaScript into Machine Code - Lee-hyuna/33-js-concepts-kr GitHub Wiki
Chrome V8 ์์ง์ด JavaScript๋ฅผ ์ฝ๋๋ฅผ ์ฝ๋ ๋ฐฉ๋ฒ
ํฌ๋กฌ์ V8์ ํต์ฌ์ ๊น์ด ํ๊ณ ๋ค๊ธฐ ์ ์ ๋จผ์ ๊ธฐ์ด๋ถํฐ ์ข ๋ฎ์ถ๋๋ก ํ๊ฒ ์ต๋๋ค.
์ ํฌ์ ๋ชจ๋ ์์คํ ์ ๋ง์ดํฌ๋กํ๋ก์ธ์๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค. ์ด ํ๋ก์ธ์๋ ์ง๊ธ ์ฌ๋ฌ๋ถ์ ์ปดํจํฐ ์์ ์๊ณ ์ฌ๋ฌ๋ถ์ด ์ด๊ฒ์ ์ฝ์ ์ ์๊ฒ ํด์ค๋๋ค.
๋ง์ดํฌ๋กํ๋ก์ธ์๋ ์ ๊ธฐ ์ ํธ๋ก ์๋ํ๊ณ ์ง์๋ฅผ ๋ด๋ฆฝ๋๋ค.
์ง์นจ์ ๋ง์ดํฌ๋กํ๋ก์ธ์๊ฐ ํด์ํ ์ ์๋ ์ธ์ด๋ก ์์ฑ๋์ด ์์ต๋๋ค. ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๊ฒ์ IA-32, x86โ64, MIPS ๋ฐ ARM์ ๋๋ค.
์ด๋ฌํ ์ธ์ด๋ ํ๋์จ์ด์ ์ง์ ์ํธ ์์ฉํ๋ฏ๋ก ์ฌ๊ธฐ์ ๊ธฐ๋ก๋ ์ฝ๋๋ฅผ ๊ธฐ๊ณ ์ฝ๋๋ผ๊ณ ํฉ๋๋ค. ์ปดํจํฐ์ ์ฐ๋ ์ฝ๋๋ ๊ธฐ๊ณ ์ฝ๋๋ก ๋ณํ๋๊ฑฐ๋ ์ปดํ์ผ๋ฉ๋๋ค.
์์คํ ์ ํน์ ๋ฉ๋ชจ๋ฆฌ ์กฐ๊ฐ์์ ๋ฎ์ ์์ค์์ ์ํ๋๋ ์ง์นจ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ํ๋ก๊ทธ๋จ์ ์คํํ๊ธฐ ์ํด ์ด ๋ชจ๋ ๊ฒ์ ์ธ ํ์๊ฐ ์๋ ๊ฒ์ด ํ์ด์ด๋ผ๊ณ ๋๋ผ์ค ๊ฑฐ์์!
๋์ ์์ค์ ์ธ์ด๋ ์ธ์ด์์ ์ถ์ํ๋ฉ๋๋ค. ์๋์ ์ถ์ํ ์์ค์์๋ JavaScript๋ฅผ ๊ธฐ๊ณ ์์ค์์ ์ถ์ํํ๋ ์ ๋๋ฅผ ํ์ธํ ์ ์์ต๋๋ค. C/C++๋ ์๋์ ์ผ๋ก ํ๋์จ์ด์ ํจ์ฌ ๊ฐ๊น์ฐ๋ฉฐ ๋ค๋ฅธ ๊ณ ๊ธ ์ธ์ด๋ณด๋ค ํจ์ฌ ๋น ๋ฆ ๋๋ค.
์ด์ V8 ์์ง์ผ๋ก ๋์๊ฐ ๋ณด๊ฒ ์ต๋๋ค.
V8์ Google์ด ์ ๊ณตํ๋ ๊ฐ๋ ฅํ ์คํ ์์ค Javascript ์์ง์ ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด๋ ๋ฌด์์ผ๊น์?
์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ๋ง์ดํฌ๋กํ๋ก์ธ์๊ฐ ์ดํดํ ์ ์๋ ๋ฎ์ ๋ ๋ฒจ ๋๋ ๊ธฐ๊ณ ์ฝ๋๋ก ๋ณํํ๋ ํ๋ก๊ทธ๋จ์ ๋๋ค.
Rhino, JavaScriptCore ๋ฐ SpiderMonkey๋ฅผ ๋น๋กฏํ ๋ค์ํ JavaScript ์์ง์ด ์์ต๋๋ค.
์ด๋ฌํ ์์ง์ ECMAScript ํ์ค์ ๋ฐ๋ฆ ๋๋ค. ECMAScript๋ ์คํฌ๋ฆฝํ ์ธ์ด์ ํ์ค์ ์ ์ํฉ๋๋ค.
JavaScript๋ ECMAScript ํ์ค์ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค. ์ด๋ฌํ ํ์ค์ ์ธ์ด๊ฐ ์ด๋ป๊ฒ ์๋ํ๊ณ ์ด๋ค ๊ธฐ๋ฅ์ ๊ฐ์ ธ์ผ ํ๋์ง๋ฅผ ์ ์ํฉ๋๋ค. ์ฌ๊ธฐ์์ ECMAScript์ ๋ํด ์์ธํ ์์๋ณผ ์ ์์ต๋๋ค.
Chrome V8 ์์ง์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- V8 ์์ง์ C++๋ก ์์ฑ๋๋ฉฐ, Chrome ๋ฐ Nodej์ ์ฌ์ฉ๋ฉ๋๋ค.
- ECMA-262์ ์ง์ ๋ ๋๋ก ECMAScript๋ฅผ ๊ตฌํํฉ๋๋ค.
- V8 ์์ง์ ๋ ๋ฆฝ ์คํํ์ผ๋ก ์คํํ ์ ์์ผ๋ฉฐ, C++ ํ๋ก๊ทธ๋จ์ ํตํด ๋ด์ฅํ ์ ์์ต๋๋ค.
๋ง์ง๋ง ๋ถ๋ถ์ ์กฐ๊ธ ๋ ์ ์ดํดํ๋๋ก ํด์ฃผ์ธ์.
V8์ ๋ ๋ฆฝ ์คํํ์ผ๋ก ์คํ๋ ์ ์์ผ๋ฉฐ, ๋์์ ์์ฒด ๊ธฐ๋ฅ ๊ตฌํ์ C+++์ ์ถ๊ฐํ์ฌ JavaScript์ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, print('Hello World')
๋ Node.js์ ์ฌ๋ฐ๋ฅธ ๋ฌธ์ฅ์ด ์๋๋๋ค. ๊ทธ ๋ถ๋ถ์ ํธ์งํ๋ฉด ์ค๋ฅ๊ฐ ์๊ธธ ๊ฒ์
๋๋ค.
๊ทธ๋ฌ๋, Gitub์ ์คํ ์์ค์ธ V8 ์์ C++์ ์ธ์ ๊ธฐ๋ฅ์ ์์ฒด์ ์ผ๋ก ๊ตฌํํ์ฌ ์ธ์ ๊ธฐ๋ฅ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด JavaScript๋ ECMAScript ํ์ค์์ JavaScript๊ฐ ์ดํดํด์ผ ํ ์ฌํญ ์ด์์ ์ดํดํ ์ ์์ต๋๋ค.
C++๋ ํ๋ ๋๋ผ์ด๋ธ์ ํ์ผ ๋ฐ ํด๋๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ๊ณผ ๊ฐ์ด ํ๋์จ์ด์ ํจ์ฌ ๊ฐ๊น๊ธฐ ๋๋ฌธ์ JavaScript์ ๋นํด ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก์์ ๊ธฐ๋ฅ์ด ๋ ๋ง๊ธฐ ๋๋ฌธ์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ๋๋ค. ์ฝ๋๋ฅผ C++๋ก ์์ฑํ๊ณ JavaScript์์ ์ฌ์ฉํ ์ ์๋๋ก ํจ์ผ๋ก์จ JavaScript์ ๋ ๋ง์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์์ต๋๋ค. Node.js ์์ฒด๋ ์๋ฒ์ธก ํ๋ก๊ทธ๋๋ฐ ๋ฐ ๋คํธ์ํน ์ ํ๋ฆฌ์ผ์ด์ ์ ์ง์ํ๋ V8 ์์ง์ C++ ๊ตฌํ์ ๋๋ค.
์ฌ๊ธฐ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก Node.js์์ ์ฌ์ฉํ ์ ์๋ Print
, Read
๊ฐ์ ๋ค์ํ ๊ธฐ๋ฅ์ ๊ตฌํ์ ๋ณผ ์ ์์ต๋๋ค. ์๋์์๋ print
๊ธฐ๋ฅ์ ๊ตฌํ์ ๋ณผ ์ ์์ต๋๋ค. Node.js์์ print()
๊ธฐ๋ฅ์ด ํธ์ถ๋ ๋๋ง๋ค ์ฝ๋ฐฑ์ด ์์ฑ๋๊ณ ๊ธฐ๋ฅ์ด ์คํ๋ฉ๋๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก, ๋ค์ํ ์๋ก์ด ๊ธฐ๋ฅ์ ๊ตฌํํ C++๋ฅผ V8์ ์ถ๊ฐํ์ฌ Node.js๊ฐ ์ดํดํ ์ ์๋๋ก ํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
V8์์ง์ ๋ํด์๋ ๊ฐ๋จํ ์ค๋ช ์ผ๋ก๋ ๋ฌด๋ฆฌ์ด๋ฉฐ V8 ์์ง์ด ํ๋ ์๋์์ ์ํํ๋ ์์ ์ ์์ ๋๋ค. Node.js์ ์๋ ๋ฐฉ์๊ณผ Chrome V8 ์์ง์ ์ค์ ์๋ ๋ฐฉ์์ ๋ช ํํ ์ดํดํด์ผ ํฉ๋๋ค.