[TIL] ECMA-262 Realm

여는글

최근, 실행컨텍스트 내용을 포스팅하기 위해 공부를 하면서 Realm라는 용어를 발견했습니다.
이게 뭔지 몰라서 찾아보니 정보가 많이 없고 죄다 동의어인 Realm(DBMS)만 나오길래

ECMA-262 13th edition에 나와있는 내용에서 배운 내용을 정리해보려고 합니다
(TIL이기에 많이 짧습니다...)


Realm

Before it is evaluated, all ECMAScript code must be associated with a realm. Conceptually, a realm consists of a set of intrinsic objects, an ECMAScript global environment, all of the ECMAScript code that is loaded within the scope of that global environment, and other associated state and resources.

 

ECMAscript사양을 따르는 코드들은 모두 평가과정과 실행과정을 거칩니다.

이 Realm은 ECMAscript 코드가 평가과정을 거치기 전에 연결되어져야하는 고유 객체의 집합입니다.
Realm에 대한 설명이 꽤 추상적이기에 우리와 근접한 부분에서 Realm을 찾자면 아래와 같습니다.

  • 브라우저 탭
  • 브라우저 window
  • `window.open()`으로 생성한 팝업
  • web worker
  • service workers
  • iframe
  • 기타 등등...

위 모든것들이 각자 다른 속성의 Realm입니다.

그럼 이 Realm은 각자의 고유 영역이 있기에 Realm들끼리는 컨트롤을 못하느냐 그건 또 아닙니다.
왜냐하면 `window.open()`으로 팝업을 생성해도 `window.opener`를 이용해 통신이 가능하고,

iframe또한 `window.parent`로 컨트롤이 가능하기 떄문입니다.

다만, 위에서 말씀드렸듯이 위 예시는 같은 속성의 Realm일 때 가능한 이야기이며,

다른 속성의 Realm들 끼리는 컨트롤할 수 없습니다.


Realm Record 구성 요소

Realm Record의 내부에 구성요소는 아래와 같습니다.

  • [[Intrinsics]]
    • Realm과 연결된 ECMAScript 코드들이 사용하는 Value가 저장되는 레코드입니다.
    • Intrinsics에 저장되는 Value는 고유한 이름을 가지는 객체의 레코드값입니다.
  • [[GlobalObject]]
    • Realm내에서 사용되어지는 전역 객체가 저장되는 레코드
    • 기본적으로 객체(Object) 값이 저장되며, 전역으로 사용되어지는 값이 없다면 null이 저장됩니다.
  • [[GlobalEnv]]
    • 실행 컨텍스트(Excution Context)내부 구성요소에 존재하는 전역 환경 레코드(Global Environment Record)
    • 가장 바깥 스코프를 나타내는데 사용됩니다.
  • [[TemplateMap]]
    • Template objects are canonicalized separately for each realm using its Realm Record's [[TemplateMap]]. Each [[Site]] value is a Parse Node that is a TemplateLiteral. The associated [[Array]] value is the corresponding template object that is passed to a tag function.
      (가장 이해가 안되는 부분이기에, 원문으로 적어놓았습니다... 이해가 되시는 분은 댓글에 설명해주시면 감사하겠습니다 ㅠㅠ)
  • [[HostDefined]]
    • Real Record에서 사용하기 위해 예약된 필드입니다.
    • 모든 타입의 값이 들어갈 수 있으며 디폴트 값은 undefined입니다.
    • 추가적으로 호스트(D Host Layering Points 외부 소스)에서 추가 정보를 연결하기 위해 해당 필드를 사용하기도 합니다.

만약 내용이 잘못된 부분이 존재한다면 댓글로 알려주시면 빠르게 수정하겠습니다

이 글을 공유하기

댓글