js의 컴파일 타임과 런타임을 찾아보던 도중 알게되어 정리해봤다.

먼저, 브라우저에서는 html,css,js를 조작하여 웹을 구성한다. 여기서 크롬브라우저는 Blink라는 Renderer엔진과 V8이라는 자바스크립트 엔진을 가진다.

V8

v8엔진은 c++로 작성되었고, ECMAScript와 WebAssembly를 처리 할 수 있다.

v8은 기본적으로 자바스크립트를 컴파일하고 실행하는 과정을 담당한다. 그 외에

등 과 같은 행동을 수행한다.

AJITC

보통 컴파일하는 과정에는 정적 컴파일러, 인터프리터, JITC 3가지 방법이 쓰인다.

자바스크립트는 보통 인터프리터 언어라고 하지만, 반은 맞고 반은 틀린 말이다. 컴파일러와 인터프리터를 혼합해서 사용하는 JITC 방법을 사용한다.

하지만 이 JITC 방법이 JSEngine에서는 안좋게 작용한다.

첫번째 이유는 자바스크립트가 동적 타입 의 언이이기 때문이다.

자바스크립트 엔진에서 JICT는 컴파일시 동적타입 경우를 모두 고려하여 컴파일을 한다. 예시를 한번 들어보자

function carculate(a,b){
  return a + b;
};

carculate(a,b);

여기서 JITC는 int + int, int + string, string + string 등 다양한 변수 타입에 대한 모든 네이티브 코드를 생성해야하는데, 이는 매우 비효율적인 작업이기 때문에 자바스크립트 엔진에서 JICT는 int + int일 경우를 제외하고는 slow case로 코드를 넘긴다.

slow case

slow case는 위와 같이 네이티브 코드(기계어)로 생성하기에 비효율적인 코드들을 엔진 내부에 구현 돼 있는 함수를 호출해 동작을 수행하는 기관이다. 쉽게 말하면 바이트 코드를 네이티브 코드로 컴파일 하지 않고, 바로 인터프리팅을 하는 곳이라고 보면 된다.

이렇게 비효율적인 코드를 slow case로 넘기게 되면, 네이티브코드로 컴파일 하는 비중보다 인터프리터의 비중이 더 많아 지게 된다. 따라서 인터프리터랑 별반 다를게 없어지게 된다는 문제점을 가지게 됐다.