Javascript


Javascript ๋ž€?


์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„ - V8


์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ณ  ์‹คํ–‰์„ ๋„์™€์ค๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์ธ ์—”์ง„์œผ๋กœ V8 Engine (Chrome, Node.js ์—์„œ ์‚ฌ์šฉ)์ด ์žˆ์œผ๋ฉฐ, ๊ฐ ๋ธŒ๋ผ์šฐ์ € ๋ณ„๋กœ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์—”์ง„๋“ค์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.


V8 ์—”์ง„์ด๋ž€?

  • Google์ด ์ฃผ๋„ํ•˜์—ฌ ๊ฐœ๋ฐœํ•œ ์˜คํ”ˆ์†Œ์Šค์ž„.
  • C++๋กœ ์ž‘์„ฑ๋œ ๊ณ ์„ฑ๋Šฅ์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ & ์›น ์–ด์…ˆ๋ธ”๋ฆฌ ์—”์ง„์ž„.
  • Call Stack ๊ณผ Memory Heap์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Œ.
  • ์›น ๋ธŒ๋ผ์šฐ์ €์˜ ์„ฑ๋Šฅ ํ–ฅ์ƒ ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ ๋„์ž…๋˜์—ˆ์œผ๋ฉฐ ๋‹ค๋ฅธ ์—”์ง„๋ณด๋‹ค ํ›จ์”ฌ ํ–ฅ์ƒ๋œ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ๋˜์—ˆ์Œ.

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

     - JIT ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋Ÿฐํƒ€์ž„์— ๋ชจ๋“  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ธฐ๊ณ„์–ด ์ฝ”๋“œ๋„ ์ปดํŒŒ์ผํ•˜๊ณ  ์ค‘๊ฐ„ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์Œ.

V8 ์—”์ง„์˜ ๋™์ž‘ ๊ณผ์ •


  1. ์†Œ์Šค์ฝ”๋“œ ํŒŒ์‹ฑ
  2. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์™€์„œ ๋จผ์ € ํŒŒ์„œ(Parser)์— ๋„˜๊ธฐ๋ฉด, ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•œ ํ›„ AST(Abstract Syctax Tree,์ถ”์ƒ ๊ตฌ๋ฌธ ํŠธ๋ฆฌ) ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  3. Ignition ๋ฐ”์ดํŠธ์ฝ”๋“œ(ByteCode)๋กœ ๋ณ€ํ™˜
  4. Ignition์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ธํ„ฐํ”„๋ฆฌํ„ฐ์ด๋‹ค. ์›๋ณธ ์†Œ์Šค ์ฝ”๋“œ๋ณด๋‹ค ์ปดํ“จํ„ฐ๊ฐ€ ํ•ด์„ํ•˜๊ธฐ ์‰ฌ์šด ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ, ์ˆ˜์‹œ๋กœ ์ฝ”๋“œ๋ฅผ ํŒŒ์‹ฑํ•˜๋Š” ์ž‘์—…์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ์ฝ”๋“œ์˜ ์–‘๋„ ์ค„์ž„์œผ๋กœ์จ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„๋„ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
  • ์ธํ„ฐํ”„๋ฆฌํ„ฐ(Interpreter)๋ž€?
  • ์ปดํŒŒ์ผ๋Ÿฌ์™€ ๋ฐ˜๋Œ€๋กœ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋Š” ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์‹œ ํ•œ ๋ฒˆ์— ํ•œ๋ฌธ์žฅ์”ฉ ๋ฒˆ์—ญํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ํ•œ๋ฒˆ์— ์ „์ฒด๋ฅผ ์Šค์บ”ํ•˜๊ณ  ์‹คํ–‰ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์„œ ์‹คํ–‰ํ•˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๋ณด๋‹ค ์‹คํ–‰์‹œ๊ฐ„์ด ๋” ๊ฑธ๋ฆฐ๋‹ค. ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋Š” ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์ด ์ข‹๋‹ค. ๋Œ€ํ‘œ์ ์ธ ์–ธ์–ด๋กœ Python,Ruby,Javascript ๋“ฑ์ด ์žˆ์Œ.
  • ์ปดํŒŒ์ผ๋Ÿฌ๋ž€(Compiler)?
  • ํ”„๋กœ๊ทธ๋žจ ์ „์ฒด๋ฅผ ์Šค์บ”ํ•˜์—ฌ ์ด๋ฅผ ๋ชจ๋‘ ๊ธฐ๊ณ„์–ด๋กœ ๋ฒˆ์—ญํ•œ๋‹ค. ์ „์ฒด๋ฅผ ์Šค์บ”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€๊ฐœ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ดˆ๊ธฐ ์Šค์บ” ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค. ํ•˜์ง€๋งŒ ์ „์ฒด ์‹คํ–‰ ์‹œ๊ฐ„๋งŒ ๋”ฐ์ง€๊ณ  ๋ณด๋ฉด ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋ณด๋‹ค ๋น ๋ฅด๋‹ค. ๋Œ€ํ‘œ์ ์ธ ์–ธ์–ด๋กœ C,C++,JAVA ๋“ฑ์ด ์žˆ์Œ.
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ •์  ํƒ€์ดํ•‘ ์–ธ์–ด๊ฐ€ ์•„๋‹Œ ๋™์  ํƒ€์ดํ•‘ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ์†Œ์Šค์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์—๋Š” ์•Œ ์ˆ˜ ์—†๋Š” ๊ฐ’๋“ค์ด ๋„ˆ๋ฌด ๋งŽ์•„ ์ตœ์ ํ™”๊ฐ€ ํž˜๋“ค๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋•Œ๋ฌธ์— ๋ชจ๋“  ์†Œ์Šค๋ฅผ ํ•œ ๋ฒˆ์— ํ•ด์„ํ•˜๋Š” ์ปดํŒŒ์ผ ๋ฐฉ์‹์ด ์•„๋‹Œ ์ฝ”๋“œ ํ•œ ์ค„์”ฉ ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค ํ•ด์„ํ•˜๋Š” ์ธํ„ฐํ”„๋ฆฌํŠธ ๋ฐฉ์‹์„ ์ฑ„ํƒํ•˜์—ฌ ์„ธ ๊ฐ€์ง€ ์ด์ ์„ ๊ฐ€์ ธ๊ฐ€๊ณ ์ž ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ๊ฐ์†Œ : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ์—์„œ ๊ธฐ๊ณ„์–ด๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผ ํ•˜๋Š” ๊ฒƒ์ด ๋” ํŽธํ•˜๋‹ค.
  • ํŒŒ์‹ฑ ์‹œ ์˜ค๋ฒ„ํ—ค๋“œ ๊ฐ์†Œ : ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋Š” ๊ฐ„๊ฒฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์‹œ ํŒŒ์‹ฑ ํ•˜๊ธฐ ํŽธํ•˜๋‹ค.
  • ์ปดํŒŒ์ผ ํŒŒ์ดํ”„๋ผ์ธ์˜ ๋ณต์žก์„ฑ ๊ฐ์†Œ : TurboFan์„ ํ†ตํ•œ Optimizing ํ˜น์€ Deoptimizing ์ฒ˜๋ฆฌ์‹œ์—๋„ ๋ฐ”์ดํŠธ์ฝ”๋“œ๊ฐ€ ํŽธํ•˜๋‹ค.
  1. TurboFan์œผ๋กœ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผ
  • TurboFan์ด๋ž€?
    • TurboFan์€ V8 v5.9 ๋ฒ„์ „ ์ด์ „์— ์‚ฌ์šฉ๋˜์—ˆ๋˜ Crankshaft ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์™„์ „ํžˆ ๋Œ€์ฒดํ•œ ์ตœ์ ํ™” ๋‹ด๋‹น ์ปดํŒŒ์ผ๋Ÿฌ์ž„.
    • TurboFan์€ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋กœ ์ˆ˜์‹œ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋จ.
    • V8 ๋Ÿฐํƒ€์ž„ ์ค‘์— Profiler์—๊ฒŒ ํ•จ์ˆ˜๋‚˜ ๋ณ€์ˆ˜๋“ค์˜ ํ˜ธ์ถœ ๋นˆ๋„์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ์œผ๋ผ๊ณ  ์‹œํ‚ค๋ฉฐ ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ TurboFan์ด ์ž๊ธฐ ๊ธฐ์ค€์— ๋งž๋Š” ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์™€์„œ ์ตœ์ ํ™”๋ฅผ ์‹œํ‚ด.

TurboFan ์ตœ์ ํ™” ๊ธฐ๋ฒ•

  • Hidden Class
    • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํด๋ž˜์Šค๊ฐ€ ์—†๊ณ  ๋Œ€์‹  Prototype์ด๋ผ๋Š” ๊ฐœ๋…์ด ์žˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋‚ด์—์„œ ์‚ฌ์šฉ๋˜๋Š” Number,Boolean ๋“ฑ๊ณผ ๊ฐ™์€ ์ •์  ํƒ€์ž… ๋ฐ์ดํ„ฐ ์™ธ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์ฒด๋กœ ์ทจ๊ธ‰๋จ.
    • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„ ๋‚ด๋ถ€์˜ Hidden Class๋ผ๋Š” ๊ฐœ๋…์„ ์ด์šฉํ•˜์—ฌ ๊ฐ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์†์„ฑ ๊ฐ’์˜ ํฌ์ธํ„ฐ๋งŒ ๊ฐ€์ง€๊ณ , ํ•ด๋‹น๋˜๋Š” ๊ตฌ์กฐ๋ฅผ ์ฐธ์กฐํ•จ.
  • Inline Caching

Javascript ์—”์ง„ ๊ตฌ์กฐ๋„

V8 ์—”์ง„์˜ ๊ตฌ์กฐ๋„๋ฅผ ๊ฐ„๋‹จํžˆ ๋‚˜ํƒ€๋‚ธ ๊ทธ๋ฆผ

์ถœ์ฒ˜ : https://joshua1988.github.io/web-development/translation/javascript/how-js-works-inside-engine/

 

์—”์ง„์˜ ์ฃผ์š” ๋‘ ๊ตฌ์„ฑ์š”์†Œ๋Š”

  • Memory Heap : ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ด ์ผ์–ด๋‚˜๋Š” ๊ณณ
  • Call Stack : ์ฝ”๋“œ ์‹คํ–‰์— ๋”ฐ๋ผ ํ˜ธ์ถœ ์Šคํƒ์ด ์Œ“์ด๋Š” ๊ณณ

์ถœ์ฒ˜ : https://joshua1988.github.io/web-development/translation/javascript/how-js-works-inside-engine/

 

์ฐธ๊ณ  ์ž๋ฃŒ: ์ฐธ๊ณ  ์ž๋ฃŒ:

์ปดํŒŒ์ผ๋Ÿฌ(compiler)์™€ ์ธํ„ฐํ”„๋ฆฌํ„ฐ(interpreter)์˜ ์ฐจ์ด

[2020.10.16] Google Chrome V8 ์—”์ง„์„ ํŒŒํ—ค์ณ๋ณด์ž

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋™์ž‘์›๋ฆฌ: ์—”์ง„, ๋Ÿฐํƒ€์ž„, ํ˜ธ์ถœ ์Šคํƒ

'Web > JavaScript' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Node.js] ์ด๋ฒคํŠธ ๋””๋ฉ€ํ‹ฐํ”Œ๋ ‰์‹ฑ  (0) 2024.03.05
Node.js ๋ž€?  (0) 2024.03.05
[Javascript] ์–•์€ ๋ณต์‚ฌ์™€ ๊นŠ์€ ๋ณต์‚ฌ  (0) 2024.02.05

+ Recent posts