About Javscript

๊ฐœ์š”

๋ชจ๋‘ ์•Œ๋‹ค์‹œํ”ผ javascript๋Š” ์ธํ„ฐํ”„๋ฆฌํ„ฐ ์–ธ์–ด์ด๋‹ค. 1995๋…„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์œ ์ €์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ์œ„ํ•ด 10์ผ๋งŒ์— ํƒ„์ƒํ•œ ์–ธ์–ด์ด๊ณ , "HTML ํŽ˜์ด์ง€๋ฅผ ๋™์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ"์— ๋ชฉ์ ์ด ์žˆ์–ด ๊ฐ€๋ฒผ์šด ์ธํ„ฐํ”„๋ฆฌํ„ฐ ์–ธ์–ด๋กœ ๋งŒ๋“ค์–ด์กŒ๋‹ค.


Compile ์–ธ์–ด์™€ Interpreter ์–ธ์–ด

์ปดํŒŒ์ผ ์–ธ์–ด์™€ ์ธํ„ฐํ”„๋ฆฌ์–ด ์–ธ์–ด์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์€ pre-processing, ์ปดํŒŒ์ผ ์œ ๋ฌด๋‹ค.

์ปดํŒŒ์ผ์€ ๊ณ ๊ธ‰์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ๊ธฐ๊ณ„์–ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์„ ๋งํ•˜๋Š”๋ฐ, ๋‹น์—ฐํžˆ ๋ณ€ํ™˜๋œ ๊ธฐ๊ณ„์–ด๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋น ๋ฅผ ์ˆ˜ ๋ฐ–์— ์—†๋‹ค.

function sum () {
   let result = 0
   for (let i = 1 ; i <= 10 ; i++){
      result += i;
   }
   return result;
}
sum() // for loop.. -> 55
sum() // for loop.. -> 55
sum() // for loop.. -> 55
โ€‹
// compile ๊ฒฐ๊ณผ
sum() = 55
sum() = 55
sum() = 55

์ปดํŒŒ์ผ์„ ๋งˆ์นœ ๊ธฐ๊ณ„์–ด๋Š” ์‹คํ–‰๋งŒ ํ•˜๋ฉด ๋˜์ง€๋งŒ, ์ธํ„ฐํ”„๋ฆฌํ„ฐ ์–ธ์–ด๋Š” ๋งค๋ฒˆ sum ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜์—ฌ loop๋ฅผ ๋Œ๊ฒŒ ๋œ๋‹ค.

Javascript ์ƒํƒœ๊ณ„ ์—์„œ ์œ ๋ช…ํ•œ ์ปดํŒŒ์ผ๋กœ๋Š” Babel๊ณผ Typescript๊ฐ€ ์žˆ๋‹ค.

Babel์€ ES6๋“ฑ ์ตœ์‹  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ŠคํŽ™์„ ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์Šคํฌ๋ฆฝํŠธ๋กœ ์ปดํŒŒ์ผํ•œ๋‹ค.

Typescript๋Š” TS๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋ฅผ JS๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ฒฐ๊ตญ Javascript๋„ ์‹คํ–‰๋˜๊ธฐ ์œ„ํ•ด ์ปดํŒŒ์ผ ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค.

๋‹ค๋งŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„ ๋‚ด๋ถ€์—์„œ ์‹คํ–‰ ์ค‘ ์ปดํŒŒ์ผ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ๋‚ด๋ถ€์—์„œ ์ปดํŒŒ์ผ ํ•œ๋‹ค.


Javascript Engine

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ํ•ด์„ํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ์ธํ„ฐํ”„๋ฆฌํ„ฐ์ด๋‹ค.

V8์—”์ง„์ด ๊ฐ€์žฅ ๋Œ€์ค‘์ ์œผ๋กœ ์•Œ๋ ค์ ธ์žˆ๋‹ค. (Node.js์™€ Chrome์—์„œ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ)

Chrome : V8

Safari : Webkit

FireFox : SpiderMonkey

Edge : Chakra

์šฐ์„  V8์—”์ง„์ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์„ฑ๋Šฅ์„ ๋น„์•ฝ์ ์œผ๋กœ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์—ˆ๋˜ ์ด์œ ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.

์—”์ง„์ด ์ž‘๋™ํ•˜๋Š” ์›๋ฆฌ๋Š” ์ด๋ ‡๋‹ค. ๋จผ์ € ์—”์ง„์ด ์‹คํ–‰ํ•  JS ํŒŒ์ผ์„ ๋ฐ›๊ฒŒ ๋œ๋‹ค.

ํŒŒ์‹ฑ, AST(Abstract Syntax Tree)๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค.

๋‹ค์Œ์œผ๋กœ Interpreter๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ฝ์œผ๋ฉฐ ์‹คํ–‰ํ•œ๋‹ค.

์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ณผ์ •์—์„œ ํ”„๋กœํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ง€์ผœ๋ณด๋ฉฐ ์ตœ์ ํ™” ํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ์ „๋‹ฌํ•ด์ค€๋‹ค. ์ฃผ๋กœ ๋ฐ˜๋ณตํ•ด์„œ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ ๋ธ”๋ก์„ ์ปดํŒŒ์ผ(์ตœ์ ํ™”)ํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์›๋ž˜ ์žˆ๋˜ ์ฝ”๋“œ์™€ ์ตœ์ ํ™”๋œ ์ฝ”๋“œ๋ฅผ ๋ฐ”๊ฟ”์ค€๋‹ค.

์ฝ”๋“œ๋ฅผ ์šฐ์„  ์ธํ„ฐํ”„๋ฆฌํ„ฐ ๋ฐฉ์‹์œผ๋กœ ์‹คํ–‰ํ•˜๊ณ  ํ•„์š”ํ•  ๋•Œ ์ปดํŒŒ์ผ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ JIT(Just-In-Time) ์ปดํŒŒ์ผ๋Ÿฌ ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

ํฌ๋กฌ์˜ V8 ์—”์ง„์„ ํฌํ•จํ•ด Mozilla์˜ Rhino, Firefox์˜ SpiderMonkey๋„ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค.

๊ฒฐ๋ก ์€, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์‹คํ–‰๋˜๋Š” ํ”Œ๋žซํผ์— ๋”ฐ๋ผ ์ธํ„ฐํ”„๋ฆฌํŒ…๊ณผ ์ปดํŒŒ์ผ์ด ํ˜ผํ•ฉ๋˜์–ด ์‚ฌ์šฉ๋œ๋‹ค.

์ด ๋ฐฉ์‹์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์„ฑ๋Šฅ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œ์ผฐ๋‹ค.


Call Stack & Memory Heap

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ Memory Heap๊ณผ Call Stack์œผ๋กœ ์ด๋ฃจ์–ด์ ธ์žˆ๋‹ค.

Memory Heap : ๋ณ€์ˆ˜์™€ ๊ฐ์ฒด์˜ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ด ๋ฐœ์ƒํ•˜๋Š” ๊ณณ

Call Stack : ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ ์Šคํƒ์ด ์Œ“์ด๋Š” ๊ณณ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ํ˜„์žฌ ์ง„ํ–‰์ƒํ™ฉ์„ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด ์ฝœ์Šคํƒ์„ ์‚ฌ์šฉํ•œ๋‹ค.

์Šคํƒ์€ LIFO (ํ›„์ž…์„ ์ถœ) ํ˜•ํƒœ๋กœ ๋Œ€ํ‘œ์ ์ธ ์ž๋ฃŒ๊ตฌ์กฐ์˜ ํ•˜๋‚˜๋‹ค. ์•„๋ž˜ ์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉฐ ์ฝœ์Šคํƒ์˜ ๋™์ž‘๊ณผ์ •์„ ์ดํ•ดํ•ด๋ณด์ž.

ํ•œ๊ฐ€์ง€ ๋” ๊ธฐ์–ตํ•˜์ž. ์ฝœ์Šคํƒ์€ ์Šค์ฝ”ํ”„ ๋‚ด๋ถ€์˜ ์›์‹œํƒ€์ž… ๋ณ€์ˆ˜๋ฅผ ์ €์žฅํ•œ๋‹ค.

์›์‹œํƒ€์ž… ๋ณ€์ˆ˜๋Š” string, number ๋“ฑ ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ๊ฐ€ ๊ณ ์ •๋œ ๋ณ€์ˆ˜๋‹ค.

์›์‹œํƒ€์ž…๊ณผ ์ฐธ์กฐํƒ€์ž…์„ ์ž ๊น ์‚ดํŽด๋ณด์ž.

str ๋ณ€์ˆ˜๋Š” ๋Ÿฐํƒ€์ž„์—์„œ ๋ฉ”๋ชจ๋ฆฌ์˜ ํฌ๊ธฐ๊ฐ€ ๋ฐ”๋€Œ์ง€ ์•Š๋Š”๋‹ค. ๋ฐ˜๋ฉด์— arr ๋ณ€์ˆ˜๋Š” ๋Ÿฐํƒ€์ž„์— ํ•œ๊ฐœ์˜ element ๊ฐ€ ์ถ”๊ฐ€๋ ์ˆ˜๋„, 100๊ฐœ๊ฐ€ ์ถ”๊ฐ€๋ ์ˆ˜๋„ ์žˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ ์ง€์›Œ์งˆ ์ˆ˜๋„ ์žˆ๋‹ค.

์ค‘์š”ํ•œ ์ ์€ ํ•ด๋‹น arr ๋ณ€์ˆ˜์˜ ํฌ๊ธฐ๊ฐ€ ์œ ๋™์ ์œผ๋กœ ๋ณ€ํ™”ํ•œ๋‹ค๋Š” ์ ์ด๋‹ค.

์ด๋ ‡๊ฒŒ ์›์‹œํƒ€์ž… ๋ฐ์ดํ„ฐ๋Š” ์ฝœ์Šคํƒ์— ์ €์žฅ๋œ๋‹ค. ์•„๋‹ˆ๋ผ๋ฉด, ๋ฉ”๋ชจ๋ฆฌ ํž™์— ์ €์žฅ๋œ๋‹ค.

C์–ธ์–ด๋ฅผ ์˜ˆ์‹œ๋กœ ๋“ค์ž๋ฉด malloc์„ ํ•ด์„œ ํ• ๋‹นํ•ด์ฃผ๋˜, ๋™์ ์œผ๋กœ ํฌ๊ธฐ๊ฐ€ ๊ฒฐ์ •๋˜๋Š” ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๋ฉ”๋ชจ๋ฆฌ ํž™์— ์ €์žฅํ•œ๋‹ค๋Š” ์–˜๊ธฐ์ด๋‹ค.

๋ฌผ๋ก  C์—์„œ๋Š” free๋ฅผ ํ†ตํ•ด Memory Leak์„ ๋ฐฉ์ง€ํ–ˆ์ง€๋งŒ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์˜ Garbage Collector๊ฐ€ ์ด ์ผ์„ ๋Œ€์‹ ํ•  ๊ฒƒ์ด๋‹ค.


Runtime

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์—์„œ ์ œ๊ณตํ•ด์ฃผ์ง€๋Š” ์•Š์ง€๋งŒ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐœ๋ฐœ์ž๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” setTimeout ๊ณผ ๊ฐ™์€ ํ•จ์ˆ˜๋“ค์ด ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ ํ•จ์ˆ˜๋“ค์€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ œ๊ณตํ•˜๋Š” Web API์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฐ Web API์˜ ํ˜ธ์ถœ์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•œ Callback Queue์™€ Event Loop๊ฐ€ ์žˆ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ์–ธ์–ด์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•œ ๋ฒˆ์— ํ•œ ๊ฐ€์ง€ ์ž‘์—…๋งŒ ์‹คํ–‰ํ•œ๋‹ค. ์ฝœ ์Šคํƒ์ด๋ž€ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์šฐ๋ฆฌ๊ฐ€ ์–ด๋”” ์žˆ๋Š”์ง€๋ฅผ ๊ธฐ๋กํ•˜๋Š” ์ž๋ฃŒ ๊ตฌ์กฐ์ด๋‹ค.

ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋ฉด, ๊ทธ ํ•จ์ˆ˜๊ฐ€ ์ฝœ ์Šคํƒ์˜ ๊ฐ€์žฅ ์ƒ๋‹จ์— ์œ„์น˜ํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•จ์ˆ˜์˜ ์‹คํ–‰์ด ์ข…๋ฃŒ๋˜๋ฉด ๊ทธ ํ•จ์ˆ˜๋Š” ์Šคํƒ์—์„œ ์ œ๊ฑฐ๋œ๋‹ค.

๋ฐ”๋กœ ์—ฌ๊ธฐ์„œ ํ˜ธ์ถœ ์Šคํƒ์˜ ๊ฐ ํ•ญ๋ชฉ์„ ์Šคํƒ ํ”„๋ ˆ์ž„์ด๋ผ๊ณ  ํ•œ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ํ˜ธ์ถœ ์Šคํƒ์— ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์ด ๊ต‰์žฅํžˆ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ํ•จ์ˆ˜๊ฐ€ ์žˆ์œผ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋‹ค๋ฅธ ์ž‘์—…๋“ค์ด ๋ชจ๋‘ ๋Œ€๊ธฐ ์ƒํƒœ๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.

์ด๋Ÿฌํ•œ ์ƒํ™ฉ์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋น„๋™๊ธฐ ์ฝœ๋ฐฑ(Asynchronous Callback)์ด๋‹ค.

์ฆ‰, ์ฝ”๋“œ ์ผ๋ถ€๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋‚˜์ค‘์— ์‹คํ–‰๋  ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋น„๋™๊ธฐ ์ฝœ๋ฐฑ์€ ์ฆ‰์‹œ ์ฝœ์Šคํƒ์— ์˜ฌ๋ผ๊ฐ€๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ํŠน์ˆ˜ํ•œ ์‹œ์ ์— ์‹คํ–‰์ด ๋˜๋ฏ€๋กœ ์Šคํƒ์•ˆ์— ๋ฐ”๋กœ ์˜ฌ๋ผ๊ฐ€์ง€ ์•Š๋Š”๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋“ค์˜ ์Šค์ผ€์ค„์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด Event Loop์ด๋‹ค. ์ด๋ฒคํŠธ ๋ฃจํ”„๋Š” ์ฝœ ์Šคํƒ์ด ๋น„์–ด์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜๋ฉด ์ฝœ๋ฐฑ ํ์— ๋Œ€๊ธฐ์ค‘์ธ ํ•ญ๋ชฉ์„ ์Šคํƒ์— ์˜ฌ๋ฆฐ๋‹ค.


Sources โ€ฆ

Last updated