자바스크립트에 대해 심도 있게 공부해보자.
자바스크립트는 런타임에 컴파일하는 동적 약형 언어 다.
하나씩 의미를 파악해보자.
런타임에 컴파일
자바스크립트 엔진은 코드 파싱 -> 바이트 코드 변환 -> 실행 과정을 런타임에 반복한다.
코드를 파싱하면 AST가 생성되고, AST를 기반으로 바이트 코드를 만든다.
그리고 이 바이트 코드를 JIT 컴파일러가 실행한다.
뒤에서 자세히 설명하겠다.
동적
변수의 타입 변경이 가능하다는 의미다.
C와 같은 정적 타입 언어는 한 번 선언한 변수 타입을 변경할 수 없지만, JS는 가능하다.

약형
변수 타입을 선언할 필요가 없다는 의미다.
C는 정수는 int, 문자는 char과 같이 선언해야 하지만 JS는 var, const, let으로 전부 처리한다.

(지금부터의 설명은 V8을 기준으로 한다.)
Just In Time 컴파일러의 줄임말로, 이름은 컴파일러지만 인터프리터도 같이 사용한다.
컴파일러가 AST를 기반으로 바이트 코드를 만들면, 인터프리터가 바이트 코드를 실행하는 형식이다.
바이트 코드는 인터프리터나 컴파일러가 이해할 수 있는 언어 라고 생각하면 된다.
자바스크립트는 런타임에 컴파일한다.
근데 컴파일 결과물인 실행 파일(.exe)이 따로 존재하지 않는다.
그럼 어떻게 실행하는 걸까?
엔진이 처음에는 컴파일하지 않은 코드를 실행한다.
그와 동시에 컴파일도 같이 진행된다.
컴파일이 완료되면 컴파일된 코드로 동적 전환한다.

보통의 컴파일러는 런타임 이전에 컴파일 작업을 끝낸다.
그러나 JIT 컴파일러는 런타임 도중에 컴파일 작업을 진행한다.
아래 그림을 참고하자.

이미 컴파일한 코드가 또 나오면 또 컴파일 하는가?
JIT 컴파일러는 이전 실행과 달라진 부분이 없는 코드는 재컴파일하지 않는다.
이미 컴파일된 코드를 재사용한다. (캐싱)
참고로 브라우저가 제공하는 Web API도 동일한 컴파일 과정을 거친다.
달라진 부분이 없는 코드는 이미 컴파일한 코드를 재사용한다.
코드 파싱 -> 바이트 코드 변환 -> 실행 을 계속 반복하면 비효율적이지 않은가?
이론적으로는 한 줄씩 코드를 파싱해서 실행해야 한다.
하지만, 이 방법은 너무 느리다.
그래서 V8의 parser는 소스 코드를 한 번에 파싱하여 AST를 생성한다.