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