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 ์—”์ง„์˜ ์‹ค์ œ ์ž‘๋™ ๋ฐฉ์‹์„ ๋ช…ํ™•ํžˆ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.