Jaeilit

자바스크립트 V8 엔진 본문

TIL

자바스크립트 V8 엔진

Jaeilit 2023. 10. 26. 11:48
728x90

자바스크립트 엔진은 자바스크립트 코드를 실행하는 프로그램 또는 인터프리터입니다.

자바스크립트 엔진은 전통적인 인터프리터일 수도 있고, 특정한 방식으로 바이트코드로 JIT 컴파일을 할 수 있습니다.

 

먼저,

인터프리터란 사람이 이해할수있는 고수준의 언어를 기계어(저수준언어)로의 컴파일을 하지않고 한줄씩 명령어를 읽으면서 바로 실행하는 프로그램 또는 환경을 이야기 합니다. 파이썬, JS 등이 대표적인 언어입니다.

 

인터프리터는 단점으로 최적화 과정없이 변환하기 때문에 컴파일러보다 성능이 느리다는 점입니다.

흔히들 JS 엔진은 브라우저에서 인터프리터로 처리된다고 알고있지만 V8 엔진에서는 순수 인터프리터만 사용하여 구동하지 않습니다.

 

인터프리터일 경우 항상 같은 코드를 반복해서 실행합니다.

웹이란 특성상 새로고침이나 페이지 이동이 잦은데, 항상 같은 코드를 반복해서 실행하는 경우가 많을 겁니다.

인터프리터의 단점을 상쇄시키고자 앞서 말씀드린 JIT 컴파일 기법을 같이 사용합니다.

 

아래는 V8 엔진의 파이프라인 입니다.

JS 에서는 먼저 파서에서 토큰으로 분해하고 분해한 토큰을 바탕으로 AST 추상구문트리로 변환합니다.  이 AST 기반으로 ignition 인터프리터는 바이트 코드를 생성해냅니다. 다시 이 바이트 코드들 중 자주 사용되는 함수, 타입 등 정보들을 수집하여 profiling 데이터와 바이트 코드를 TurboFan 로 넘겨 최적화 된 기계어 코드를 생성합니다.

 

TurboFan 이 사용하는 최적화 기법에는 대표적으로 Hidden Class 와 Inline caching 등이 있습니다.

히든 클래스는 비슷하게 생긴 객체들을 그룹화 하는것이고, 인라인 캐싱은 말 그대로 캐시입니다.

 

그리고 TurboFan 에 의해 최적화 된 바이트 코드가 다시 자주 사용되지 않는다면 다시 de-optimized 하여 바이트 코드로 변환됩니다.

 

여기서 왜 애초에 ignition 과 TurboFan 으로 나눠져있는지 살펴볼 필요가 있습니다.

ignition 은 빠르게 바이트 코드를 생성할순 있지만 바이트 코드는 그다지 효율적이지 않습니다. 반대로 컴파일러는 기계어 코드를 생성하는데 시간이 좀 걸리지만 훨씬 효율적이라는 장점이 있습니다. ignition 과 TurboFan 은 각각 가지고 있는 단점들을 서로 상쇄시킬수 있습니다.

 

 

 

 

 

728x90

'TIL' 카테고리의 다른 글

스토리북 chromatic action error  (0) 2024.03.08
자바스크립트의 비동기 프로그래밍 Promise  (0) 2023.11.16
번들러 웹팩  (0) 2023.09.07
함수형 프로그래밍 - 고차함수 HOF ( 일급객체 )  (0) 2023.08.21
JS - Module System  (0) 2023.08.20