Node.js Under The Hood #5 - 숨겨진 클래스 및 변수 할당

3962 단어 v8javascriptcppnode
(Unsplash의 Jose Gabriel Ortega Castro의 표지 사진)

이 시리즈의 마지막 부분에서 추상 구문 트리와 V8이 코드를 컴파일하는 방법에 대해 조금 논의했습니다. V8이 JavaScript를 다룰 때 하는 또 다른 멋진 점은 C++와 같은 정적으로 유형이 지정된 언어가 JS와 같이 동적으로 유형이 지정된 코드를 실행할 수 있도록 한다는 것입니다. 동적 타이핑의 가장 간단한 예 중 하나는 객체 선언입니다.

const myObj = {}
console.log(myObj) // {}

myObj.x = 1
console.log(myObj) // { x: 1 }

myObj.y = 2 // Dynamically changing the type
console.log(myObj) // { x: 1, y: 2 }


JavaScript는 동적 언어이므로 개체의 속성을 우리가 했던 것처럼 즉석에서 추가하고 제거할 수 있습니다. 이러한 작업에는 값을 다시 가져올 수 있도록 이 속성의 위치가 메모리에 있는 위치를 확인하기 위한 동적 조회가 필요합니다. 동적 조회는 프로세서에 비용이 많이 드는 작업입니다. 그렇다면 V8은 이것을 어떻게 처리하여 JS를 그렇게 빠르게 만들까요? 답은 숨겨진 클래스입니다. 그리고 그것은 V8이 매우 유명한 최적화 트릭 중 하나입니다.

We'll talk about other compiler optimisation techniques later



일반적으로 정적으로 유형이 지정된 언어가 있는 경우 속성이 메모리에 있는 위치를 쉽게 확인할 수 있습니다. 모든 개체와 변수는 해당 유형으로 정의할 고정된 개체 레이아웃에 의해 결정되고 런타임 중에 새 속성을 추가할 수 없기 때문입니다. 각 개체 사이에 고정offset이 있는 연속 버퍼로 저장할 수 있으므로 컴파일러가 메모리에서 이 속성의 값(또는 포인터)을 쉽게 찾을 수 있습니다. 그리고 이offset는 모든 유형이 고정된 메모리 값을 가지므로 객체 유형에 따라 쉽게 결정할 수 있습니다. V8은 숨겨진 클래스의 접근 방식을 사용하기 위해 이러한 고정 레이아웃 개체 개념을 활용합니다. 작동 방식을 살펴보겠습니다.

각 객체 유형에 대해 V8은 숨겨진 클래스를 생성하므로 const myObj = {}의 첫 번째 선언은 다음과 같은 클래스를 생성합니다.



이제 myObj 에 새 키를 추가하면 V8은 C1이라는 C0(복사)을 기반으로 새로운 숨겨진 클래스를 만들고 C0을 업데이트하여 C1에 전환을 추가합니다.



이제 우리가 추가하는 마지막 명령문y으로 이전과 똑같은 단계를 수행합니다. C1을 기반으로 새 클래스 C2를 만들고 C2를 가리키는 C1에 새 전환을 추가합니다.



이 작은 트릭은 V8이 새 객체에 대해 숨겨진 클래스를 재사용할 수 있도록 합니다. {} 와 같은 새 객체를 생성하면 새 클래스가 생성되지 않고 대신 V8이 새 객체를 C0으로 가리킵니다. 새 속성 xy 를 추가하면 새 개체는 해당 클래스가 지정하는 오프셋에 값을 쓰는 클래스 C1 및 C2를 가리킵니다. 이 개념을 통해 컴파일러는 속성에 액세스할 때 사전 조회를 우회할 수 있습니다. 개체가 가리키는 클래스와 해당 속성에 대한 오프셋이 어디에 있는지 이미 알고 있으므로 바로 갈 수 있습니다. 이것은 또한 V8이 클래스 기반 최적화 및 인라인 캐싱을 사용할 수 있도록 합니다. 이에 대해서는 나중에 살펴보겠습니다.

그러나 숨겨진 클래스는 매우 휘발성이며 특정 유형의 객체에만 해당됩니다. 따라서 속성의 순서를 반대 대신 yx로 바꾸면 C1은 위치 0의 x에 대한 오프셋만 있고 C2는 y에 대한 오프셋만 있기 때문에 V8은 새로운 히든 클래스를 생성해야 합니다. 첫 번째 위치에서.

그러나 JavaScript는 프로토타입 기반 언어이므로 클래스가 없기 때문에 C++에서 수행된다는 점을 명심하십시오.

결론



이것은 V8이 내부 JavaScript 구조를 처리하는 방법에 대한 간단한 설명이었습니다. 내부 변수 할당 및 내부 개체 생성을 이해하면 더 우수하고 성능이 뛰어난 코드를 작성하는 방법을 이해할 수 있습니다.

좋은 웹페이지 즐겨찾기