Front-end/JavaScript

JS 동작원리 1편 - 자바스크립트 엔진, V8

파리외 개발자 2022. 11. 1. 16:58
JS는 고급언어의 일종으로
기계가 이해하기 위한 '번역'과정을 거침으로써
사람과 기계가 소통할 수 있다.

 

V8 - js 엔진

구글의 V8은 JS를 기계가 이해할 수 있는 기계어로 변환해주는 엔진이다.

위의 과정을 하나씩 이해해보도록 하겠다.

 

Parser,  AST

JS문서가 들어오면 파싱 과정을 거쳐 구문을 분석하고 문법 체크를 한다.

파싱은 말 그대로 js문서를 분해한다고 이해하면 된다.

파싱된 js 문서는 AST(추상 구문 트리)로 변환된다.

직접 입력해서 테스트해보고 싶다면 위 단어를 클릭해서 트리구조를 확인할 수 있다.

 

JIT Compiler - 인터프리터와 컴파일러를 한 번에

인터프리터는 한 줄씩 실행하여 순간 속도가 빠르고 메모리 사용량이 적다. ex) 파이썬
컴파일러는 통째로 기계어로 변환하여 전체적인 속도가 빠르다. ex) c, java

V8엔진의 JIT (just in time) 컴파일러는 코드의 최적화를 담당해서 실행 속도와 데이터 사용량의 효율을 증가시킨다.

AST로 변환된 코드는 우선 인터프리터(Ignition)에서 바이트 코드로 변환되고

프로파일러를 거쳐 최적화의 방법을 찾은 후 컴파일러가 다시 최적화 코드를 생성한다.

여기서 최적화라면서 왜 한 가지 방법만 쓸 것이지 헷갈리게 두 개의 방법을 병행하나 의문이 들 수 있다.

위 코드는 반복문에서 같은 값을 리턴하는 함수를 열 번이나 호출하고 있다.

     

  • 인터프리터는 한 줄씩 실행하다 보니 add실행을 열 번을 한다.
  • 컴파일러는 인터프리터가 읽어온 바이트 코드를 보고 같은 행동하는 대신 결괏값을 기억해 열 번 출력하는 최적화된 기계어를 생성한다.
JS는 기본적으로 인터프리터 언어라고 할 수 있다. 다만 인터프리팅 하는 동안 최적화하는 부분이 보이면 컴파일러가 그 부분을 최적화해서 결과적으로 두 방식의 장점을 모두 사용한다. V8엔진은 C++로 멀티스레드를 이용해 이 두 가지 동작을 동시에 처리해서 Just In Time, JIT 컴파일링을 할 수 있다.