자바스크립트 엔진

자바스크립트 엔진은 대표적으로 Google V8 엔진이 있다. Chrome과 Node.js 에서 사용하고 있다.

자바스크립트 엔진은 가능한 빠르게 최적화된 코드를 생성하기 위해 전통적으로는 *인터프리터 방식으로 구현되지만, 특정한 방식으로 바이트코드로 *JIT(Just-In-Time) 컴파일을 할 수도 있다.

JIT (Just-In-Time) 란? 번역한 기계어를 저장해놨다가 필요할 때 다시 꺼내 쓰는 방식

인터프리터 란? 고급 언어로 작성된 프로그램을 한 줄 단위로 번역하고, 동시에 즉시 실행시키는 프로그램

Untitled

Memory Heap

메모리 할당이 일어나는 곳, 자바스크립트는 자동으로 메모리를 할당하고 불필요하다고 판단되면 메모리를 해제한다. 이를 가비지 컬렉션이라고 한다.

Call stack

코드 실행에 따라 호출 스택이 쌓이는 곳.

Call Stack(호출 스택)

자바스크립트는 싱글 스레드 기반 언어이기때문에, 하나의 Call Stack만을 가지고 있다. 따라서, 한 번에 하나의 Task만 수행할 수 있다. 즉, 하나의 함수가 실행되면 이 함수의 실행이 끝날 때 까지 다른 Task가 중간에 끼어들지 못한다.

Call Stack은 LIFO(Last In First Out) 구조로, 스택에 쌓인 함수를 가장 마지막에 들어온 것부터 처리하며, 해당 함수의 실행이 끝나면 Call Stack에서 제거한다. 예제와 표를 보면 더 이해하기 쉽다.

const bar = () => {
	console.log('bar');
}

const foo = () => {
	bar();
	console.log('foo');
}

foo();

// 결과
// bar
// foo

위의 코드가 실행되면 호출 스택의 단계는 다음과 같이 변한다.

Step 1 Step 2 Step 3 Step 4 Step 5 Step 6
console.log(’bar’)
bar() bar() bar() console.log(’foo’)
foo() foo() foo() foo() foo() foo()