V8 JavaScript engine์ด๋ž€?

C++๋กœ ์ž‘์„ฑ๋œ Google์˜ ์˜คํ”ˆ ์†Œ์Šค ๊ณ ์„ฑ๋Šฅ JavaScript ๋ฐ WebAssembly ์—”์ง„์ด๋‹ค.

Chrome ๋ฐ Node.js ๋“ฑ์—์„œ ์‚ฌ์šฉ๋œ๋‹ค.

V8๊ณผ ๋‹ค๋ฅธ ์—”์ง„์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์€ V8 ์—”์ง„์˜ JIT(Just In Time) ์ปดํŒŒ์ผ๋Ÿฌ๋‹ค.


JIT-C(Just In Time Compiler)

JIT ์ด๋ฏธ์ง€

์ผ๋ฐ˜์ ์ธ Compiler ๋ฐฉ์‹์—๋Š” ๋™์  ์ปดํŒŒ์ผ(interpreter)๊ณผ ์ •์  ์ปดํŒŒ์ผ(Compiler)์ด ์žˆ๋‹ค.

JIT(Just In Time)์€ ์ด ๋‘๊ฐœ์˜ ์ปดํŒŒ์ผ ๋ฐฉ์‹์„ ํ•ฉ์นœ ๊ฒƒ์œผ๋กœ ์‹คํ–‰์‹œ์ ์—์„œ ์ธํ„ฐํ”„๋ฆฌํ„ฐ ๋ฐฉ์‹์œผ๋กœ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

๊ทธ ํ›„ V8 Engine์€ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ๊ธฐ๊ณ„์–ด ์ฝ”๋“œ๋กœ ๋งŒ๋“ค๊ณ , ๊ทธ ์ฝ”๋“œ๋ฅผ ์บ์‹ฑํ•˜์—ฌ, ๊ฐ™์€ ํ•จ์ˆ˜๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ถˆ๋ฆด ๋•Œ ๋งค๋ฒˆ ๊ธฐ๊ณ„์–ด ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•œ๋‹ค.


V8์˜ ์ปดํŒŒ์ผ ๊ณผ์ •

V8์˜ ์ปดํŒŒ์ผ ๊ณผ์ • ์ด๋ฏธ์ง€

  1. Blink์—์„œ script ํƒœ๊ทธ๋ฅผ ๋งŒ๋‚˜๋ฉด, Javascript ์ŠคํŠธ๋ฆฌ๋ฐ์„ ์‹œ์ž‘ํ•œ๋‹ค.
  2. ์ŠคํŠธ๋ฆฌ๋ฐ์œผ๋กœ ์ „๋‹ฌ ๋ฐ›์€ UTF-16 ๋ฌธ์ž์—ด์€ Scanner๋ฅผ ์ด์šฉํ•ด Token(let, for)์„ ์ƒ์„ฑํ•œ๋‹ค.
  3. ์ƒ์„ฑ๋œ Token์„ ๊ฐ€์ง€๊ณ , Parser๊ฐ€ ์ถ”์ƒ ๊ตฌ๋ฌธ ํŠธ๋ฆฌ (AST)๋ฅผ ๋งŒ๋“ ๋‹ค.
  4. ๋งŒ๋“ค์–ด์ง„ AST๋Š” Ignition(Compiler)์—์„œ Byte Code๋กœ ์ปดํŒŒ์ผํ•œ๋‹ค.
  5. ์ปดํŒŒ์ผ๋œ Byte Code๋ฅผ ์‹คํ–‰ํ•จ์œผ๋กœ์จ ์›ํ•˜๋Š” Javascript ๋™์ž‘์ด ์‹คํ–‰๋œ๋‹ค.

์šฉ์–ด์‚ฌ์ „

์ธํ„ฐํ”„๋ฆฌํ„ฐ(interpreter) : ํ•œ์ค„์ฝ๊ณ  ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ, ๋™์ผํ•œ ๋™์ž‘์„ ํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์—ฌ๋Ÿฌ๋ฒˆ ๋‚˜์˜ค๋”๋ผ๋„ ์ด๋ฅผ ์ปดํŒŒ์ผ ํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์น˜๊ฒŒ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Š” ๋งค์šฐ ๋น„ํšจ์œจ์ ์ด๋‹ค. ํ•˜์ง€๋งŒ ๋””๋ฒ„๊น…์— ์œ ๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. V8์€ JIT Compiler์„ ์ง€์›ํ•˜๋Š”๋ฐ ์ธํ„ฐํ”„๋ฆฌํ„ฐ ๋ฐฉ์‹์˜ ๋น„ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์„ ๋ฐฉ์ง€ํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค.

์ปดํŒŒ์ผ๋Ÿฌ(compiler) : ํŠน์ • ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ์“ฐ์—ฌ ์žˆ๋Š” ๋ฌธ์„œ๋ฅผ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ์˜ฎ๊ธฐ๋Š” ์–ธ์–ด ๋ฒˆ์—ญ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ์†Œ์Šค์ฝ”๋“œ ์ „์ฒด๋ฅผ ์ปดํŒŒ์ผ ํ•œ๋‹ค. ์ด๋Š” ๊ฐœ๋ฐœ ํŽธ์˜์„ฑ์€ ๋–จ์–ด์ง€์ง€๋งŒ, ์‹คํ–‰ ์†๋„๋Š” ๋†’์„ ์ˆ˜ ์žˆ๋‹ค.

JIT ์ปดํŒŒ์ผ(just in time compilation) ๋˜๋Š” ๋™์  ๋ฒˆ์—ญ(dynamic translation) : ํ”„๋กœ๊ทธ๋žจ์„ ์‹ค์ œ ์‹คํ–‰ํ•˜๋Š” ์‹œ์ ์— ๊ธฐ๊ณ„์–ด๋กœ ๋ฒˆ์—ญํ•˜๋Š” ์ปดํŒŒ์ผ ๊ธฐ๋ฒ•์ด๋ฉฐ, V8 ์—”์ง„์—์„œ ๊ธฐ์šฉํ•˜๋Š” ๊ธฐ๋ฒ•

AST(Abstract Syntax Tree) : ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ์†Œ์Šค ์ฝ”๋“œ์˜ ์ถ”์ƒ ๊ตฌ๋ฌธ ๊ตฌ์กฐ์˜ ํŠธ๋ฆฌ๋กœ, ๊ฐ ๋…ธ๋“œ๋Š” ์†Œ์Šค ์ฝ”๋“œ์—์„œ ๋ฐœ์ƒ๋˜๋Š” ๊ตฌ์กฐ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

TurboFan JIT Compiler : ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด์„œ Profiler๋Š” ์ตœ์ ํ™”(Optimizes)๊ฐ€ ๊ฐ€๋Šฅํ•œ ๋ถ€๋ถ„์„ ์ฐพ์•„์„œ ๊ธฐ๋กํ•ด๋‘”๋‹ค. (์ž์ฃผ ์“ฐ์ด๋Š” ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜, ์ตœ์ ํ™” ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ํžˆ๋“  ํด๋ž˜์Šค, ์ธ๋ผ์ธ ์บ์‹ฑ์ด ์žˆ๋‹ค.)


์ฐธ๊ณ ๋งํฌ

V8

Firing up the Ignition interpreter

V8 Engine์— ๋Œ€ํ•ด์„œโ€ฆ(๋ฉ”๋ชจ๋ฆฌ๊ตฌ์กฐ, ์ปดํŒŒ์ผ๋ฐฉ์‹)

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์„ฑ๋Šฅ์˜ ๋น„๋ฐ€ (V8๊ณผ ํžˆ๋“  ํด๋ž˜์Šค)

BlinkOn 6 Day 1 Talk 2: Ignition - an interpreter for V8

V8 ์—์„œ Javascript ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ• ์ •๋ฆฌํ•ด๋ณด๊ธฐ

๐Ÿš€ Visualizing memory management in V8 Engine (JavaScript, NodeJS, Deno, WebAssembly)

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ - ๋ชจ๋˜ JavaScript ํŠœํ† ๋ฆฌ์–ผ