개발

자바스크립트 엔진과 런타임 차이

동고킴 2024. 4. 6. 23:00
반응형

자바스크립트 엔진과 자바스크립트 런타임은 어떻게 다를까?

자바스크립트 엔진과 런타임과 엔진은 동일한 것으로 잘못 언급되는 경우가 많다.
아마도 "자바스크립트 엔진"과 "자바스크립트 런타임"이라는 용어가 "자바스크립트를 실행하는 프로그램"을 의미하는 것으로 같은 의미로 사용되는 것을 들어봤을 것이다. V8, Node.js 또는 기타 관련 프로그램에서 종종 혼합하여 참조되기도 한다.
그러나 범위와 기능 측면에서 자바스크립트 엔진과 자바스크립트 런타임 간에는 상당한 차이가 있다. 이 차이점을 이해하는 것은 자바스크립트 언어를 잘 이해하는데 있어 중요하다.
자바스크립트 엔진과 런타임이 각각 무엇인지 이야기하기 전에 엔진과 런타임 모두와 함께 사용되는 몇 가지 용어(ECMAScript 및 자바스크립트)를 알아보자
 

ECMAScript란

1996년 Netscape와 Sun Microsystems는 자바스크립트 표준화에 관해 비영리 표준 조직인 ECMA International에 접근했다. 이러한 노력의 결과로 1997년에 출시된 ECMA-262가 탄생했다. ECMA-262는 자바스크립트 구현의 작동 방식을 정의하는 사양이다.
Sun이 자바스크립트 상표를 기부하기를 원하지 않았기 때문에, ECMA-262 사양은 다른 이름을 가져야 했다. 그래서 ECMA-262는 "ECMAcript Language Specification"이라고 제목이 붙여졌다. 즉, ECMAcript는 ECMA-262에 명시된 언어의 이름이다.
 

자바스크립트란

"자바스크립트"라는 용어는 공식적인 정의가 없지만 ECMAScript 언어의 상위 집합으로 널리 이해되고 있다. 이는 자바스크립트가 다른 사양 및 기타 기능 외에도 ECMAScript를 구현한다는 것을 의미한다. 초기 형태의 자바스크립트는 ECMAScript와 DOM(문서 개체 모델)과 같은 웹 기반 API 및 History API와 같은 브라우저 기반 API로 간주되었다. 그리고 하지만 오늘날 자바스크립트는 ECMAScript와 기타 호스트 제공 API의 조합으로 간주된다. 여기에는 브라우저용 web API와 Node.js와 같은 호스트용 서버별 API가 포함된다.
 

자바스크립트 엔진이란

일반적으로 자바스크립트 엔진이라고 불리는 것은 추가 기능 없이 ECMA-262를 구현하기 때문에 더 정확하게는 ECMAScript 엔진이라고 할 수 있다. 자바스크립트 엔진은 호스트에 내장되어 입력 및 출력에 대한 추가 기능을 정의한다. 가장 잘 알려진 자바스크립트 엔진은 아래 3가지이다.

  • V8 : Chromium 프로젝트를 위한 자바스크립트 엔진으로 생성되었으며 이제 Node.js 및 Deno에서도 사용된다. Edge와 Opera는 Chromium을 기반으로 하기 때문에 V8이 가장 자주 사용되는 자바스크립트 엔진이다.
  • SpiderMonkey : Firefox용 자바스크립트 엔진
  • JavaScriptCore : MacOS와 iOS 모두에서 Safari용 자바스크립트 엔진으로 생성되었으며 Bun에서도 사용된다.

 

자바스크립트 런타임이란

자바스크립트 런타임은 ECMAScript 호스트이다. 즉, 자바스크립트 엔진이 내장된 프로그램이다. Chrome, Firefox, Edge, Safari, Node.js, Deno 및 Bun은 자바스크립트 엔진을 내장하고 자바스크립트를 통해 접근할 수 있는 추가 기능을 정의하므로 모두 자바스크립트 런타임이다. 웹 브라우저는 DOM 및 기타 웹 API를 구현하는 반면 서버 측 런타임은 파일 시스템 액세스를 구현한다.

그러나 자바스크립트 런타임을 고유하게 만드는 것은 자바스크립트 API만이 아니다. 이는 또한 그들이 자바스크립트 엔진을 사용하는 방식이기도 하다.

예를 들어 런타임이 자바스크립트 실행과 다른 작업 수행 사이를 전환할 수 있도록 하는 프로세스인 Event Loop는 ECMA-262에 정의되어 있지 않으므로 어떤 자바스크립트 엔진에서도 구현되지 않는다. 자체 Event Loop를 구현하는 것은 각 자바스크립트 런타임에 달려있다. 웹 브라우저에는 HTML에 정의된 Event Loop 버전이 있지만 Node.js와 같은 서버 측 런타임은 자체적으로 정의한다. 자바스크립트 런타임에는 Event Loop가 필요하지 않지만 범용 자바스크립트 런타임에는 Event Loop가 있다.

정리

자바스크립트 엔진과 자바스크립트 런타임은 서로 관련되어 있지만 같은 건 아니다. 자바스크립트 엔진은 ECMA-262 표준에 정의된 대로 ECMAScript를 구현한다. ECMA-262는 입력 또는 출력에 대한 어포던스 없이 자바스크립트의 핵심 기능을 정의한다. 자바스크립트 런타임은 자바스크립트 엔진을 내장하고 런타임에 필요한 다른 모든 것과 함께 입력 및 출력을 위한 추가 기능으로 이를 강화하는 ECMAScript 호스트이다. 추가 기능에는 웹 브라우저의 DOM 또는 서버 측 런타임의 파일 시스템 액세스가 포함될 수 있다. 런타임은 다른 표준을 따를 의무가 없으며 필요에 따라 자체 API를 정의할 수 있다. 이것이 바로 Node.js, Deno 및 Bun이 모두 다른 파일 시스템 API를 갖는 이유이다.
 

원문 및 참고

https://humanwhocodes.com/blog/2024/03/javascript-engines-runtimes/

HTML Living Standard - Event Loops
Node.js - Event Loop, Timers, and process.nextTick()

반응형