front-v8

V8 엔진

JIT(just-in-time)

자바스크립트 엔진은 자바스크립트 코드를 실행하는 인터프리터 입니다.
자바스크립트 엔진은 표준 인터프리터로 구현될 수 있으며, 혹은 바이트코드로 컴파일 하는 just-in-time 컴파일러입니다.

다음은 인기있는 자바스크립트 엔진 목록입니다.

  • V8 — open source, developed by Google, written in C++
  • Rhino — managed by the Mozilla Foundation, open source, developed entirely in Java
  • SpiderMonkey — the first JavaScript engine, which back in the days powered Netscape Navigator, and today powers Firefox
  • JavaScriptCore — open source, marketed as Nitro and developed by Apple for Safari
  • KJS — KDE’s engine originally developed by Harri Porten for the KDE project’s Konqueror web browser
  • Chakra (JScript9) — Internet Explorer
  • Chakra (JavaScript) — Microsoft Edge
  • Nashorn, open source as part of OpenJDK, written by Oracle Java Languages and Tool Group
  • JerryScript — is a lightweight engine for the Internet of Things

V8 엔진이 만들어진 이유는 무엇일까요?

구글이 만든 V8엔진은 오픈소스이며 C++로 작성되었습니다.
이 엔진은 구글 크롬 브라우저에서 사용됩니다. 나머지 엔진들과 달리 노드 JS 런타입으로도 사용됩니다.
최초 v8 엔진은 웹 브라우저안에서 자바스크립트 실행 속도를 향상 시키기 위해 만들어 졌습니다.
속도를 얻기 위해서 V8 엔진은 인터프리터를 쓰는 대신 자바스크립트 코드를 보다 효율적인 기계어로 변환합니다.
SpiderMonkey 나 Rhino (모질라)와 같은 많은 최신 자바 스크립트 엔진처럼 JIT (Just-In-Time) 컴파일러를 구현하여 실행시 JavaScript 코드를 기계 코드로 컴파일합니다.
주된 차이점은 V8이 바이트 코드 또는 중간 코드를 생성하지 않는다는 것입니다.

Hidden class

V8은 런타임에 객체를 처리하기 위해 내부적으로 hidden class를 만들어서 가지고 있고,
같은 hidden class를 가지고 있는 객체는 다음 번에도 동일한 최적화된 코드를 사용할 수 있다.

1
2
3
4
5
6
7
8
9
10
function Point(x, y) {
this.x = x;
this.y = y;
}

var p1 = new Point(11, 22);
var p2 = new Point(33, 44);
// 여기에서 p1과 p2는 hidden class를 공유합니다.
p2.z = 55;
// 경고! p1과 p2는 이제 다른 hidden class를 갖습니다.

객체 인스턴스 p2에 멤버 “.z”를 추가하기 전까지, p1과 p2는 내부적으로 같은 hidden class를 갖습니다. 이로써 V8은 p1이나 p2를 다루는 JavaScript 코드에 대한 단일 버전의 최적화된 어셈블리어를 만들 수 있습니다. 같은 JavaSript 코드의 hidden class가 서로 달라지는 원인을 찾아서 막을 수 있다면, 더 좋은 성능을 얻을 수 있습니다.

모든 객체 멤버를 생성자 함수 안에서 초기화하세요(그래야 나중에 인스턴스가 멤버의 데이터 타입을 변경하지 않습니다).
항상 같은 순서로 객체 멤버를 초기화합니다.

Numbers

일반적으로 적합하다면, 31비트 부호있는 정수를 사용하는 것이 최적입니다.

1
2
var i = 42;  // 31비트 부호있는 정수입니다.
var j = 4.2; // 이 값은 double 타입의 부동 소수점 숫자 데이터입니다.

Arrays

large 과 sparse 배열 처리를 위한 두 가지 유형의 배열 저장소가 내부에 있습니다.

  • Fast Elements: linear storage for compact key sets
  • Dictionary Elements: hash table storage otherwise

배열 저장소가 한 유형에서 다른 유형으로 변경되지 않게 하는 것이 가장 좋습니다.

배열의 경우 0부터 시작하는 연속 키 사용
대규모 배열 (예 :> 64K 요소)을 최대 크기로 사전 할당
배열 삭제
초기화된지 않거나 삭제된 요소를 로드

Rreference