[JS] 자바스크립트 엔진

임승민·2023년 3월 15일
0

JavaScript

목록 보기
6/6

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

자바스크립트 엔진의 파이프라인

공통적으로 자바스크립트 엔진들이 소스 코드를 기계어로 만들기까지 수행하는 과정은 아래와 같다.

자바스크립트 엔진은 소스 코드를 의미를 갖는 최소 단위인 토큰으로 분해한다.
ex) 'var a = 5' -> ['var' , 'a' , '=' , '5']

토큰을 파싱(구문분석)해서 AST(추상 구문 트리)를 생성하고 인터프리터가 AST를 기반으로 중간 언어인 바이트 코드를 생성함과 동시에 프로파일러는 최적화 할 수 있는 부분을 찾아 기록한다.

그 후 더 빠른 코드 실행을 위해 프로파일링 된 데이터와 바이트 코드를 최적화 컴파일러(optimizing compiler)에게 보내고 프로파일링 데이터를 기반으로 최적화된 기계어를 생성한다.

하지만 자주 사용되지 않는다면 deoptimizes(최적화 해제)해서 바이트 코드로 다시 변환한다.

바이트 코드
특정 하드웨어가 아닌 가상 컴퓨터에서 돌아가는 실행 프로그램을 위한 이진 표현법이다

프로파일링 (성능 분석)
프로그램의 시간 복잡도 및 공간(메모리), 특정 명령어 이용, 함수 호출의 주기와 빈도 등을 측정하는 동적 프로그램 분석의 한 형태이다. 프로파일링 정보는 대개가 프로그램 최적화를 보조하기 위해 사용된다

컴파일러 최적화
컴파일러에서 출력되는 실행 프로그램의 효율성을 최적화하는 과정을 말한다.
일반적으로 프로그램의 실행 속도를 최대화하거나 프로그램이 차지하는 메모리의 양을 최소화하기 위해 많이 이용된다.


V8 엔진

여러가지의 자바스크립트 엔진이 있지만 그중 가장 유명한 Google의 V8을 설명할 예정이다.

브라우저 별 엔진 종류

브라우저엔진
ChromeV8
FireFoxSpiderMonkey
SafariJavaScript Core
EdgeChakra

JIT 컴파일 (just-in-time compilation)

JIT 컴파일 또는 동적 번역은 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일 기법으로 V8엔진에서 중요한 역할을 한다.

JIT 컴파일러는 인터프리터와 컴파일러를 혼합한 방식으로 바이트 코드를 생성하고 실행 시 기계어로 변환하고 캐싱하여 자주 사용되는 코드를 매번 기계어로 생성하는 것을 방지한다.

V8 파이프라인

V8의 파이프라인은 공통 파이프라인과 유사하다.

  1. Ignition(인터프리터)에서 AST를 바이트 코드로 변환한다.
  2. Ignition이 바이트 코드를 생성하는 동안 프로파일러는 프로파일링 데이터를 수집한다.
  3. 자주 사용되는 코드가 있다면 TurboFan(최적화 컴파일러)으로 프로파일링 데이터, 바이트 코드를 전달한다.
  4. TurboFan은 프로파일링 데이터를 기반으로 최적화된 기계어 코드를 생성한다.
  5. 자주 사용되지 않는다면 deoptimizing하여 바이트 코드로 변환한다.

References

[Mathias Bynens] JavaScript engine fundamentals: Shapes and Inline Caches
[위키피디아] 프로파일링, 컴파일러 최적화, JIT 컴파일
[하루에 한 문제] V8 작동 원리
[soldonii] 자바스크립트의 작동 원리는?(크롬 V8 엔진)
[godori] JavaScript 엔진 톺아보기 (1)

0개의 댓글