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