script - V8

Javascript Engine

자바스크립트 엔진은 자바스크립트 코드를 실행하는 프로그램 / 인터프리터 이다.
자바스크립트의 엔진은 브라우저 뿐만 아니라, 다양한 곳에서 동작할 수 있는데,
대표적으로 Google의 V8엔진 MS의 Chakra엔진 Mozilla의 SpiderMonkey 등이 있다.
그중 Chrome, Node.js, Electron 등으로 유명한 V8엔진이 대표적이며,
이하 등장하는 모든 자바스크립트 엔진은 V8엔진을 기반으로 한 얘기가 될것이다.

V8

V8엔진은 Google이 개발한 오픈소스 엔진이며, C++언어로 작성 되었다.
Just in time 컴파일러로써, 코드를 실행 시에 바이트코드와 같은 중간 코드를 생산하지 않고
컴퓨터의 언어인 머신코드로 컴파일 해 준다.

hidden class

자바스크립트의 객체는 프로퍼티 및 메서드의 수가 정해져 있지 않으며, 동적으로 추가되고 삭제되며
변형될 수 있다. 객체는 복합적인 자료 구조로써, 객체를 관리하는 방식이 원시값(number, string...)
과 비교해 복잡해 각 브라우저마다 다른데, Java, C++과 같은 class 기반 객체지향 언어에서는
미리 정의된 class를 기반으로 객체(즉 인스턴스)를 생성하며, 생성된 이후에는 class에 미리 정의된 내용과 다르게 변형할 수 없다.
그러나 자바스크립트는 클래스없이 객체를 생성할 수 있으며

const 객체 = {a: 1, b: 2 c: 'c'};

생성된 이후, 어느 때라도 프로퍼티와 메서드를 생성하거나 변형할 수 있다. 사용하기 편리하지만,
class기반 언어의 객체에 접근하는것 보다 비용이 많이 든다.
이때문에 V8엔진은 hidden class라는 방식을 사용해 C++의 객체 접근 정도의 성능을 보장하는데,
비효율적인 객체의 탐색을 피하기 위해, 객체를 생성할 때 hidden class라는 객체를 만들어
각각의 객체에 대한 오프셋 정보를 저장한다. 히든 클래스는 다음과 같은 특징을 갖고 있다.

  • 하나의 객체마다 부여된다
  • 각각의 property에 대한 오프셋정보를 가진다
  • property가 추가및 수정,삭제 될 때 새로운 hidden class가 만들어 지며, 기존 hidden class는
    참조해야하는 hidden class 정보가 추가된다.
let goyangyi = {};

다음과 같은 객체를 생성하는 순간 V8은 goyangyi에 대한 hidden class [A1]이 생겨난다.
이 때, [A1]은 아무런 정보도 가지고 있지 않다.

let goyangyi = {};
goyangyi.food = 'fish';

위와 같이 property를 생성하는 순간, hidden class[A2]가 생겨나며
goyangyi는 [A2]를 가르키게 된다. 이때 [A1]에는 food property를 추가하여 참조하는
hidden class가 A1에서 A2로 변경되었다는 정보가 추가 되는데
이를 transition이라 한다.


이러한 과정이 연쇄적으로 일어나면, 하나의 객체에 대한 hidden class cycle이 만들어지고
인스턴스가 새로 생성될 때 마다, 미리 정의된 hidden class cycle을 타고 올라가, 동일한 오프셋을 찾아 내 사용하게 된다.

Inline caching

좋은 웹페이지 즐겨찾기