자바스크립트 엔진과 자바스크립트 런타임의 차이점 에 대한 글을 번역했습니다.
자바스크립트 엔진
과 자바스크립트 런타임
이라는 용어가 "자바스크립트를 실행하는 프로그램" 이라는 의미로 혼용되어 사용되는 것을 들어본 적이 있을 것입니다.
이들은 종종 V8, Node.js 또는 기타 관련 프로그램의 조합을 참조하여 혼용되기도 합니다.
하지만 자바스크립트 엔진과 자바스크립트 런타임에는 범위와 기능 면에서 상당한 차이가 있습니다.
이 차이를 이해하는 것은 자바스크립트 언어 전체를 잘 이해하는 데 중요합니다.
엔진
과 런타임
이 무엇인지 논의하기 전에 엔진과 런타임을 함께 자주 사용하는 몇가지 용어를 정의하는 것이 좋을 것입니다. 바로ECMAScript
와 Javascript
입니다.
1996년, Netscape(넷스케이프)와 Sun Microsystems(썬 마이크로시스템즈)는 비영리 표준 단체인 ECMA 인터내셔널에 자바스크립트 표준화에 대해 문의했습니다.
그 노력의 결과로 1997년에 발표된 ECMA-262는 Javascript 구현 방식을 정의하는 사양입니다.
Sun이 Javascript 상표를 기부하지 않기로 하면서 이 사양은 다른 이름을 가져야 했고, ECMA-262는 ECMAScript 언어 사양이 되었습니다. 따라서 ECMAScript
는 ECMA-262에 명시된 언어의 이름
입니다.
ECMAScript는 어디에 내장되어 있든 상관없이(구현을 내장한 프로그램을 호스트라고 합니다.) 구현 방식을 준수해야하는 자바스크립트의 핵심 기능을 정의합니다.
심지어 초기에 넷스케이프는 브라우저 뿐만 아니라 서버에서도 자바스크립트를 사용하고자 했으며, ECMAScript는 두 구현의 핵심 역할을 했습니다. 따라서 ECMAScript에는 웹 관련 기능이나 데이터를 입/출력하는 방법이 포함되어 있지 않습니다.(이런 기능들은 호스트에 의해 제공되어야 합니다.)
즉 ECMAScript에는 Object, Array, Promise와 같은 표준 전역 클래스는 포함되어 있지만 HTMLElement, setTimeout, fetch()는 포함되어 있지 않습니다.
자바스크립트는 공식적인 정의는 없지만 ECMAScript 언어의 상위 집합으로 널리 이해되고 있습니다.
즉, 자바스크립트는 다른 사양 및 기타 기능을 더해 ECMAScript를 구현합니다.
초기 형태에서 자바스크립트는 ECMAScript와 DOM과 같은 웹 기반 API, 히스토리 API와 같은 브라우저 기반 API를 더한 것으로 간주되었습니다.
오늘날 자바스크립트는 ECMAScript와 기타 호스트 제공 API의 모든 조합으로 간주됩니다.
여기에는 브라우저용 웹 전용 API와 Node.js 와 같은 호스트용 서버 전용 API가 포함됩니다.
일반적으로 자바스크립트 엔진이라고 불리는 것은 추가 기능 없이(또는 그다지 많지 않게) ECMA-262를 구현하기 때문에 ECMAScript 엔진이라고 부르는 것이 더 정확할 수 있습니다.
자바스크립트 엔진은 호스트에 내장되어 입/출력을 위한 추가 기능을 정의합니다.
가장 잘 알려진 Javascript 엔진은 다음과 같습니다.
V8: Chromium 프로젝트의 자바스크립트 엔진으로 만들어졌으며 현재 Node.js와 Deno에서도 사용되고 있습니다. Edge와 Opera는 Chromium을 기반으로 하기 때문에 V8은 가장 자주 사용되는 자바스크립트 엔진입니다.
SpiderMonkey: Firefox를 위한 자바스크립트 엔진입니다.
JavaScriptCore: MacOS와 iOS에서 Safari용 자바스크립트 엔진으로 만들어졌으며, Bun에서도 사용됩니다.
자바스크립트 엔진은 ECMAScript만 구현하고 호스트에 의해 확장되도록 되어 있기 때문에 다양한 런타임 환경에서 사용할 수 있습니다.
자바스크립트 런타임은 자바스크립트 엔진을 내장한 프로그램이라는 뜻의 ECMAScript 호스트입니다.
chrome, firefox, edge, safari, Node.js, Deno, Bun은 모두 자바스크립트 엔진을 내장하고 자바스크립트를 통해 액세스할 수 있는 추가 기능을 정의하기 때문에 자바스크립트 런타임입니다.
웹 브라우저는 DOM 및 기타 웹 API를 구현하는 반면 서버 측 런타임은 파일 시스템 액세스를 구현합니다.
자바스크립트 런타임에 추가할 수 있는 추가 기능에 대한 규칙은 없으며, 런타임 개발자가 스스로 결정할 수 있습니다. 이것이 바로 Node.js, Deno, Bun이 모두 다른 방식으로 파일 시스템을 구현하는 이유이며, Deno가 처음에는 자체 HTTP 클라이언트를 구현하기로 결정한 반면 Node.js는 fetch()와 같은 웹 API를 선호하기로 한 이유입니다.(이후 Node.js도 fetch()를 채택했습니다.)
하지만 자바스크립트 런타임을 독특하게 만드는 것은 자바스크립트 API 뿐만이 아닙니다. 자바스크립트 엔진을 사용하는 방식도 마찬가지입니다.
예를 들어 런타임이 자바스크립트 실행과 다른 작업 수행 사이를 전환할 수 있도록 하는 프로세스인 이벤트 루프는 ECMA-262에 정의되어 있지 않으므로 어떤 자바스크립트 엔진에서도 구현되어 있지 않습니다. 자체 이벤트 루프를 구현하는 것은 각 자바스크립트 런타임에 달려 있습니다. 웹 브라우저에는 HTML사양에 정의된 이벤트 루프 버전이 있지만 Node.js와 같은 서버 측 런타임은 자체적으로 정의합니다. 이벤트 루프는 자바스크립트 런타임에는 필요하지 않지만 범용 자바스크립트 런타임에서 찾을 수 있습니다.
자바스크립트 엔진과 자바스크립트 런타임은 서로 관련이 있지만 동일하지는 않습니다.
자바스크립트 엔진은 ECMA-262 표준에 정의된 대로 ECMAScript를 구현합니다.
ECMA-262는 입력 또는 출력에 대한 유도없이 자바스크립트의 핵심 기능을 정의합니다.
자바스크립트 런타임은 자바스크립트 엔진을 내장하고 입력 및 출력을 위한 추가 기능과 함께 런타임에 필요한 다른 모든 기능을 보강하는 ECMAScript 호스트입니다.
추가 기능에는 웹 브라우저의 DOM 또는 서버 측 런타임의 파일 시스템 액세스가 포함될 수 있습니다.
런타임은 다른 표준을 따라야 할 의무가 없으며 필요에 따라 자체 API를 정의할 수 있기 때문에 Node.js, Deno, Bun은 모두 서로 다른 파일 시스템 API를 가지고 있습니다.