강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

츄르보단캣닢님의 프로필 이미지
츄르보단캣닢

작성한 질문수

진짜! 자바스크립트(Javascript) - 기초부터 고급까지

V8은 undefined, null 그리고 string 을 어떻게 관리할까?

V8에서 undefined를 관리하는 방법에 대한 질문입니다

해결된 질문

작성

·

23

·

수정됨

0

안녕하세요 좋은 강의 재밌게 잘 시청하고 있습니다

V8에서 undefined, null 그리고 string을 어떻게 관리할까? 강의를 보다가 V8 문서를 찾아보게 되었습니다

영어로 된 문서를 번역을 해서 질문하는 글 이기에 번역이 어색하거나 틀릴 수 있으며, 전체 내용을 담지는 않았습니다!


강의 4분 26초에 LOAD_ROOT 함수 부분을 설명하시면서 힙 상수를 찾고 있다고 설명해주셨습니다

그 후 다음 단계에서 캐시를 하고 힙 상수를 찾고, 만약 해당 위치가 존재한다면 해당 위치를 반환하고, 그 위치가 없다면 새로운 힙 상수를 생성하고 캐싱을 한다고 해주셨습니다

그래서 실제로 저희가 자바스크립트에서 undefined를 사용할 때마다 캐싱해두었던 그 값을 찾기 때문에 해당 위치에 접근하여 사용할 수 있다 라고 이해를 했습니다

여기서 추가적으로 궁금했던것이 V8 문서를 보면, undefined , true 등 자바스크립트의 핵심 객체들은 반드시 먼저 존재해야 하고, read-only heap에 존재한다고 합니다

V8은 이들을 immovable immutable roots 라고 부른다고 합니다

정의되지 않은 객체의 주소를 참조하기 위해 찾아볼 필요 없이, 포인터가 0x61 이런식으로 끝나는지만 확인한다면, 정의가 되었는지, 되지 않았는지 알 수 있다면 좋을 것 같다 이것이 V8의 static root 를 달성하는 것이다 라고 설명되어 있습니다

지속적으로 사용되는 것들이기에 빠른 접근이 필수적이며, V8은 컴파일 시점에 이들을 생성한다고 나와있습니다

읽기 전용 힙을 모든 포인터 compression cage의 시작 부분에 배치하여 알려진 위치를 제공하며, 예를 들어 V8의 힙에 있는 모든 객체 중에서 undefined는 항상 가장 작은 압축 주소를 가지며, 0x61 바이트에서 시작한다고 합니다

V8을 컴파일 하기 위해서는 먼저 mksnapshot 이라는 V8 바이너리를 컴파일을 진행을 하고, 결과물로는 read-only heap 내의 모든 객체의 cage base 주소를 포함한다고 합니다

두 번째 단계로 libv8을 다시 컴파일하여, 플래그를 통해서 undefined를 참조할 때마다 문자 그대로 cage_base + StaticRoot::kUndefined 을 사용하도록 보장한다고 나와있습니다

d8이 실행되면 모든 read-only 객체는 메모리에서 고정된 위치를 가지며, 절대 이동하지 않는다고 합니다

이를 통해 d8 바이너리에서 undefined의 압축 주소가 0x61로 하드코딩되도록 만든다고 합니다

 

이 글을 읽으면서 들었던 생각은 위 과정을 통해 "undefined 같은 기본 객체들의 cage base로부터의 오프셋이 컴파일 시점에 결정되어 있어서, 런타임에 배열에서 찾아볼 필요 없이 cage_base + 0x61 같은 계산식으로 바로 접근할 수 있다"

라고 이해를 했습니다

여기서 컴파일 시점에 결정된 주소 라는 것이 4분 26초부터 말씀해주신 캐시 과정이 포함되는 것이 맞을까요? 아니면 강의 내용과는 상관이 없는 내용일까요?

 

참고한 글 링크는 아래에 걸어두겠습니다!

https://v8.dev/blog/static-roots

답변 2

0

코딩맥스 CodingMax님의 프로필 이미지
코딩맥스 CodingMax
지식공유자

안녕하세요! 질문 주셔서 감사합니다. 답변을 영상으로 드리는게 좋을 것 같아서, 아래 영상을 올렸습니다.

참고로 진짜! 자바스크립트가 입문 강의여서 약간 overview 로 v8 을 설명한 점 양해 부탁드립니다 🙂

와.. 감사합니다

보통 질문에는 답글만 달아주시는 경우를 많이 보았는데, 영상까지 제작을 해주시니 너무 보기 편했습니다

그만큼 코딩맥스님께서 이 강의를 얼마나 진심으로 제작하시고 강의를 시청하는 사람들에게 더 많은 정보를 알려주시려고 하는지 느껴집니다!

궁금증까지 잘 해결해주셔서 너무 감사합니다!

코딩맥스 CodingMax님의 프로필 이미지
코딩맥스 CodingMax
지식공유자

츄르보단캣닢님 감사합니다! 앞으로 답변 드린 영상 형식으로 진짜! 자바스크립트 강의에 JS 소식이나 추가 내용들을 업데이트 해 드릴 예정입니다. 항상 애용해 주세요 🙂

0

안녕하세요, 인프런 AI 인턴입니다. 츄르보단캣닢님!

V8 엔진에서 undefined, true와 같은 자바스크립트의 핵심 객체를 어떻게 관리하는지에 대한 질문을 주셨습니다. V8에서는 이러한 상수 값을 효율적으로 처리하기 위해 여러 최적화 기법을 사용합니다.

V8에서의 핵심 객체 관리 방식:

  1. Read-Only Heap:

    • V8은 이러한 기본 객체들을 “읽기 전용 힙”에 배치하며, 이는 말 그대로 변경이 불가능한 메모리 영역입니다. 이런 책정으로 인해 객체들이 이동될 필요 없이 고정된 위치에 있죠.
    • 따라서 실행 시간에 이런 객체들을 찾기 위해 별도로 검색할 필요 없이, 사전 정의된 메모리 위치를 참조하게 됩니다.
  2. Static Roots:

    • 이 개념은 V8에서 undefined 등과 같은 객체가 컴파일 시점에 특정 위치에 고정되는 것을 의미합니다. 기본적으로는 “Static Root”라고 불리며, 이러한 객체의 바로미터는 컴파일 타임에 정해집니다.
  3. 포인터 압축 및 고정 주소:

    • V8은 포인터 압축을 사용하여 메모리 사용 효율성을 높입니다. 이를 통해, undefined 같은 값들은 힙 메모리 내의 고정된 작은 주소를 가지고, 이 주소를 통해 빠르게 접근할 수 있습니다.

귀하가 읽으신 블로그에서 설명한 내용을 근거로, 컴파일 시점에서 이미 이러한 주소가 정해져 있다는 점에서, 런타임에 별도로 캐싱 과정을 거치지 않고도 정해진 주소로 직접 접근 가능합니다. 따라서, 블로그에서 설명된 cage base + offset 계산식은 대단히 빠른 접근 방법을 제공합니다. 강의에서 말하는 “캐시” 과정은 이러한 설계를 더 보완하는 기법으로 볼 수 있습니다. 실제로, 런타임 최적화의 다양한 형태 중 하나입니다.

이 부분에 대한 자세한 내용이나, V8 엔진의 작동 방식을 더 알고 싶다면, V8의 공식 블로그나 관련 강좌를 더 탐색해 보시면 큰 도움이 될 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

츄르보단캣닢님의 프로필 이미지
츄르보단캣닢

작성한 질문수

질문하기