본문 바로가기

TIL

[JavaScript] V8 엔진

V8 엔진

  • V8 엔진은 웹 브라우저를 만드는데 기반을 제공하는 오픈소스 자바스크립트 엔진이다.
  • ECMAScript 규격의 C++로 작성되었으며, 자바스크립트 코드를 바이트코드로 컴파일하고 실행하는 방식을 사용한다.

자바스크립트 엔진

  • 자바스크립트 엔진은 자바스크립트 코드를 실행하는 프로그램 혹은 인터프리터를 말한다.
  • 자바스크립트 엔진은 표준적인 인터프리터 또는 JIT( Just - In - Time ) 컴파일러로 구현할 수 있다.

V8 등장배경

  • 자바스크립트 엔진은 웹 특성상 유저와 상호작용을 위해서 즉시성이 있는 인터프리터 방식을 사용하는데, 코드가 많아질 수록 속도가 느려지는 단점이 존재한다.
  • V8은 속도 향상을 위해 자바스크립트 코드를 인터프리터를 통해 바이트 코드로 변환하며, 동시에 JIT 컴파일러를 통해 최적화를 진행한다.

V8 엔진 동작과정

  1. Parser를 통해 JavaScript Source Code를 토큰으로 분해한다.
  2. Parser를 통해 분해한 토큰을 사용하여 AST(Abstact Syntax Tree) 를 생성한다.
  3. AST에서 나온 코드를 인터프리터(Ignition)에 전달하고 인터프리터는 해당 코드를 가상머신이 이해할 수 있도록 ByteCode로 변환한다.
  4. 인터프리터가 코드를 실시간으로 변환하는 동안 프로파일러(Profiler)는 최적화가 가능한 부분을 찾는다.
  5. 최적화가 가능한 부분을 찾았다면, 프로파일러는 이를 컴파일러(Turbo Fan)에게 전달하고, 컴파일러는 실시간으로 필요한 부분을 Optimized Code로 변환하며 최적화를 진행한다.
    - 최적화 기법으로 히든 클래스(Hidden Class)나 인라인 캐싱(Inline Caching) 등 여러 방법을 사용한다.
  6. 최적화한 코드를 수행할 차례가 다가오면, 인터프리터를 통한 바이트 코드 대신 컴파일러가 변환한 최적화 코드가 실행된다.

이미지 출처 :https://mathiasbynens.be/notes/shapes-ics

히든 클래스(Hidden Class)

  • 자바스크립트 엔진들이 프로퍼티 저장을 위해 사전식 데이터 구조를 사용하지만, V8은 히든 클래스를 사용한다.
  • V8은 객체에 새로운 프로퍼티를 추가할 때 히든 클래스를 생성하고, 프로퍼티의 정적인 위치를 저장하여 실제 데이터가 저장된 위치에 대한 포인터를 제공한다.
  • 포인터는 런타임 시 직접적인 데이터 접근이 필요하지 않아 위치 정보를 해석할 필요가 없다.
  • 객체를 생성할 때 이전에 생성했던 객체와 같은 것이 존재하면, 이미 저장한 히든 클래스를 재사용하여 객체 생성 비용을 줄인다.

인라인 캐싱(Inline Caching)

  • 자바스크립트 엔진은 인라인 캐싱을 사용해 객체에서 프로퍼티를 찾을 수 있는 위치 정보를 제공함으로 조회 횟수를 감소시킨다. 이를 통해 객체 접근이 반복적으로 일어나는 경우 V8이 불필요한 메모리 접근을 최소화하여 최적화한다.
잘못된 내용은 알려주시면 감사하겠습니다.

'TIL' 카테고리의 다른 글

[Database] 데이터 모델과 성능  (0) 2023.08.02
[Database] SQL 활용  (0) 2023.08.02
[Database] 데이터 모델링의 이해  (0) 2023.08.02
[Database] SQL 기본  (1) 2023.08.02
[Database] DB  (0) 2023.08.02