V8 Engine
Last updated
Last updated
V8 ์์ง์ ๊ตฌ๊ธ์์ ๊ฐ๋ฐํ ๊ณ ์ฑ๋ฅ ์คํ์์ค C++๋ก ์์ฑ๋ JavaScript ๋ฐ WebAssembly ์์ง์ด๋ค.
Chrome ๋ฐ Node.js์์ ์ฌ์ฉ๋๊ณ ์๋ค.
ECMAScript์ WebAssembly๋ฅผ ๊ตฌํํ๋ค.
์ฌ๋ฐ๋ ์ ์ V8์ ์๋ 8๊ธฐํต ์์ง์ ์ข ๋ฅ๋ฅผ ์๋ฏธํ๋ ๋จ์ด์ด๊ธฐ๋ ํ๋ค. ๋ํ, ๋ด๋ถ์ ์ผ๋ก ์์ง ๊ด๋ จ ์ฉ์ด๋ค(Ignition ๋ฑ)์ด ์ฌ์ฉ๋๋ค.
์ฐ๋ฆฌ๊ฐ ์์ฑํ JavaScript ์ฝ๋๋ก๋ถํฐ ํ์(Parser)๋ฅผ ํตํด ์ถ์ ๊ตฌ๋ฌธ ํธ๋ฆฌ(AST; Abstract Syntax Tree)๊ฐ ๋ง๋ค์ด์ง๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๋ฐ์ดํธ์ฝ๋๋ก ๋ณํํ๋ ์ธํฐํ๋ฆฌํฐ์ธ Ignition์ AST๋ฅผ ๋๊ธฐ๊ฒ ๋๋ค.
์ปดํจํฐ๊ฐ ํด์ํ๊ธฐ ์ฌ์ด ๋ฐ์ดํธ ์ฝ๋๋ก ๋ณํํจ์ผ๋ก์จ ์๋ณธ ์ฝ๋๋ฅผ ๋ค์ ํ์ฑ(Parsing)ํด์ผ๋๋ ์๊ณ ๋ฅผ ๋๊ณ , ์ฝ๋์ ์๋ ์ค์ด๋ฉด์ ์ฝ๋ ์คํ ๋ ์ฐจ์งํ๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์๋ ์ ์๋ค.
์ดํ ์ด ๋ฐ์ดํธ์ฝ๋๋ฅผ V8 ์์ง์ด ์คํํ๋ฉด์ ์ฐ๋ฆฌ๊ฐ ์์ฑํ ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ค. ๊ทธ ์ค์์ ์์ฃผ ์ฌ์ฉ๋๋ ์ฝ๋๋ TurboFan์ผ๋ก ๋ณด๋ด์ ธ์ ์ต์ ํ๋ ์ฝ๋(Optimized Machine Code)๋ก ๋ค์ ์ปดํ์ผ๋๋ค. ๊ทธ๋ฌ๋ค๊ฐ ์ฌ์ฉ์ด ๋ ๋๋ค ์ถ์ผ๋ฉด ๋ค์ Deoptimizingํ๊ฒ ๋๋ค.
์์์ ๋งํ๋ค์ํผ ํ์ฑ(Parsing)์ด๋ ์์ค์ฝ๋๋ก๋ถํฐ ์ถ์ ๊ตฌ๋ฌธ ํธ๋ฆฌ(AST; Abstract Syntax Tree)๋ก ๋ณํํ๋ ๊ณผ์ ์ด๋ค.
ํํ์ ๋ฑ์์ ํ ํฐ์ ์ถ์ถํด +
์ฐ์ฐ์ ๊ฐ์ ๊ฒ์ ๋ง๋๋ฉด Token::ADD
๋ฑ์ผ๋ก ๊ฒ์ฌํด ์กฐ๊ฑด์ ๋ง๊ฒ ํ์ฑํ๋ค.
์ด ๊ณผ์ ์์ ๋ณ์, ํจ์, ์กฐ๊ฑด๋ฌธ ๋ฑ๊ณผ ๊ฐ์ ์ฝ๋์ ์๋ฏธ๋ฅผ ํ์ ํ๊ณ , ๋ฒ์(Scope)๋ฅผ ์ค์ ํ๋ค.
์ด ๊ณผ์ ์ C++๋ก ์ํํ๋ค.
๋ฐ์ดํธ ์ฝ๋๋ ๊ธฐ๊ณ์ด(0101010...)์ด ์๋๋ผ, ๊ณ ๊ธ ์ธ์ด(JavaScript)๋ก ์์ฑ๋ ์์ค์ฝ๋๋ฅผ ๊ธฐ๊ณ์ด๋ก ๋ฐ๊พธ๊ธฐ ์ ์ ์ค๊ฐ ์ฝ๋๋ก ํ๋ฒ ์ปดํ์ผํ ๊ฒฐ๊ณผ๋ฌผ์ด๋ค.
V8 ์์ง์์๋ Ignition์ ํตํด JavaScript ์ฝ๋๊ฐ ๋ฐ์ดํธ์ฝ๋๋ก ๋ณํ๋๋ค.
Ignition์ด๋ ๊ธฐ์กด V8 ์์ง์ Full-codegen์ ๋์ฒดํ๋ ์ธํฐํ๋ฆฌํฐ์ด๋ค.
Full-codegen์ ์ ์ฒด ์์ค ์ฝ๋๋ฅผ ํ๋ฒ์ ์ปดํ์ผํด์ ๋ฉ๋ชจ๋ฆฌ ์ ์ ์จ์ด ๋์๋ค. ๋ํ JavaScript๋ C++๊ณผ ๊ฐ์ ์ ์ ํ์ดํ ์ธ์ด๊ฐ ์๋ ๋์ ํ์ดํ ์ธ์ด๋ผ์ ์์ค ์ฝ๋๊ฐ ์คํ๋๊ธฐ ์ ๊น์ง ์ ์ ์๋ ๊ฐ๋ค์ด ๋๋ฌด ๋ง์์ ์ต์ ํํ๊ธฐ๊ฐ ์ด๋ ค์ ๋ค๊ณ ํ๋ค.
Ignition์ ์ฝ๋ ํ์ค ํ์ค์ด ์คํ๋ ๋๋ง๋ค ํด์ํ๋ "์ธํฐํ๋ฆฌํฐ" ๋ฐฉ์์ ์ฑํํ์ฌ ์ธ ๊ฐ์ง ์ด์ ์ ๊ฐ์ ธ๊ฐ๊ณ ์ ํ๋ค.
๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๊ฐ์ - JS -> ๊ธฐ๊ณ์ด๋ณด๋ค ๋ฐ์ดํธ์ฝ๋๋ก ์ปดํ์ผํ๋ ๊ฒ์ด ๋ ํธํ๋ค.
Parsing ๊ฐ ์ค๋ฒํค๋ ๊ฐ์ - ๋ฐ์ดํธ์ฝ๋๋ ๊ฐ๊ฒฐํ๋ฏ๋ก ๋ค์ ํ์ฑํ๊ธฐ ํธํ๋ค.
์ปดํ์ผ Pipeline ๋ณต์ก์ฑ ๊ฐ์ - Optimizing / Deoptimizing ๋ ๋ค ๋ฐ์ดํธ์ฝ๋๋ง ์ ๊ฒฝ์ฐ๋ฉด ๋๋ฏ๋ก ํธํ๋ค.
node
๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ ๋ --print-bytecode
์ต์
์ ๋๊ฒจ์ฃผ๋ฉด ์์ค ์ฝ๋๊ฐ ์ด๋ป๊ฒ ๋ฐ์ดํธ์ฝ๋๋ก ์ธํฐํ๋ฆฌํ
๋์๋์ง ํ์ธํ ์ ์๋ค.
V8 ์์ง์ ์ฐ๋ฆฌ๊ฐ ์์ฑํ JavaScript ์ฝ๋๋ฅผ ๋ฐ์ดํธ์ฝ๋๋ก ์ ๋ถ ๋ณํํด ๋๊ธฐ ๋๋ฌธ์, ์ฒ์์๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋๋ผ๋ ๊ทธ ์ดํ์๋ ์ปดํ์ผ ์ธ์ด์ ๊ฐ๊น์ด ์ฑ๋ฅ์ ๋ณด์ผ ์ ์๋ค.
TurboFan์ V8 ์์ง v5.9๋ถํฐ ๊ธฐ์กด์ ์ฌ์ฉ๋๋ CrankShaft ์ปดํ์ผ๋ฌ๋ฅผ ๋์ฒดํ๋ ์ต์ ํ ๋ด๋น ์ปดํ์ผ๋ฌ์ด๋ค.
์ฒ์ V8์ด ๋์จ ๋ค๋ก ์๋ก์ด ์ปดํจํฐ ์ํคํ ์ฒ๋ ๋ฑ์ฅํ๊ณ JavaScript๋ ์ง์์ ์ผ๋ก ๋ฐ์ ํด์ V8๋ ์ง์์ ๊ณ์ํ๋ค. V8 ํ์ ์๋ก์ด ์ฌ์์ ๋ง์ถฐ V8์ ์ง์์ ์ผ๋ก ์ ๋ฐ์ดํธํด์ค์ผ ํ๋๋ฐ, ๊ฒฐ๊ตญ Crankshaft์ ๊ตฌ์กฐ๋ก๋ ์ง์์ ํ์ฅ์ด ์ด๋ ต๋ค๊ณ ํ๋จํ์๊ณ , ์ฌ๋ฌ ๋ ์ด์ด๋ก ๊ณ์ธตํํ์ฌ ์ข ๋ ํ์ฅ์ ์ฉ์ดํ TurboFan์ ๋ง๋ค์ด ์ฌ์ฉํ๊ณ ์๋ค.
Crankshaft๋ก๋ 13,000~16,000์ค์ ์ฝ๋๋ก ์์ฑํ๋ ๊ฑธ TurboFan์ผ๋ก ์ฎ๊ฒผ๋๋ 3,000์ค ๋ฏธ๋ง์ ์ฝ๋๋ก ์ปค๋ฒ๊ฐ ๊ฐ๋ฅํ๋ค๊ณ ํ๋ค.
V8 ์์ง์ ๋ฐํ์์์ Profiler์๊ฒ ํจ์๋ ๋ณ์์ ํธ์ถ ๋น๋ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ชจ์ผ๊ฒ ํ๊ณ , ์ด๋ ๊ฒ ๋ชจ์ธ ๋ฐ์ดํฐ๋ฅผ TurboFan์๊ฒ ๊ฐ์ ธ๊ฐ๋ฉด TurboFan์ด ์ต์ ํํ๋๋ก ํ๋ค.
์ต์ ํ ๊ธฐ๋ฒ์ผ๋ก๋ ๋น์ทํ ๊ฒ๋ผ๋ฆฌ ๋ถ๋ฅํด ๊ฐ์ ธ๋ค ์ฐ๋ ํ๋ ํด๋์ค(Hidden Class), ์์ฃผ ์ฌ์ฉ๋๋ ์ฝ๋๋ฅผ ํจ์์ ๋ด์ฉ์ผ๋ก ๋ฐ๊ฟ๋ฒ๋ฆฌ๋ ์ธ๋ผ์ธ ์บ์ฑ(IC; Inline Caching) ๋ฑ์ด ์๋ค.
์ต์ ํ ๊ธฐ์ค์ ์ฝ๋๊ฐ ๋จ๊ฒ๊ณ (์์ฃผ ํธ์ถ๋๊ณ ) ์์ ์ (์ฝ๋๊ฐ ์ ๋ณํจ)์ด๊ฑฐ๋(kHotAndStable
), ์ธํฐํ๋ฆฌํ
๋ ๋ฐ์ดํฌ ์ฝ๋์ ๊ธธ์ด๊ฐ ํน์ ์๊ณ์ ์ ๋์ง ์์ผ๋ฉด ์์ ํจ์(kSmallFunction
)๋ก ํ๋จํด ์ต์ ํ๋ฅผ ์งํํ๋ค.
์ด ๋ถ๋ถ์ v8/src/execution/runtime-profiler.cc
์ ์ ์๋์ด ์์๋๋ฐ ์ง๊ธ์ ํฉ์ด์ง ๋ฏ ํ๋ค.
node๋ฅผ ์คํํ ๋ --trace-opt
์ต์
์ ์ฃผ๋ฉด TurboFan์ด ์ต์ ํ ์์
๋ฑ์ ์ํํ๋ ๋ชจ์ต์ ๋ณผ ์ ์๋ค.
Evans Library - V8 ์์ง์ ์ด๋ป๊ฒ ๋ด ์ฝ๋๋ฅผ ์คํํ๋ ๊ฑธ๊น? - ๋ชจ๋ ๋ด์ฉ์ ์ฌ๊ธฐ์์ ๊ฐ์ ธ์๋ค. ๋ณธ ๋ด์ฉ๋ณด๋ค ํจ์ฌ ์์ธํ๊ฒ ๋ค๋ฃจ๊ณ ์์ผ๋ ์ฝ๋ ๊ฒ์ ์ถ์ฒ.