Node.js 뿐만 아니라 자바스크립트에서 가장 중요한 개념 중 JS 엔진이 있다.
JS 엔진 중 가장 유명하고 자주 사용되는 것이 V8 엔진이다.
V8 엔진과 Node.js의 관계, 그리고 ECMAScript와 JavaScript의 관계가 어떻게 되는 것일까?
ECMAScript vs JavaScript
우리는 일반적으로 JavaScript를 사용해서 프로그래밍 한다고 표현한다.
JavaScript를 다루다 보면 ES6, ES2024와 같은 것을 볼 수 있다.
대표적으로 ES6의 경우 일반적으로 JavaScript에서 많이 사용되는 const, let 등이 추가된 버전이다.
그렇다면 ECMAScript와 JavaScript의 관계는 어떻게 될까?
ECMAScript의 경우 JavaScript의 표준이다.
ES6의 경우 2015년에 도입된 JavaScript의 6번째 표준안이라 ES6라는 이름을 갖는다.
ECMAScript와 JavaScript는 같은 것일까?
둘의 관계는 "표준어"와 "방언"의 관계로 볼 수 있다.
ECMAScript는 표준을 제시하고 JavaScript는 이를 따르고 있다. (ECMA-262)
즉, JavaScript는 ECMAScript의 표준을 따르는 대표적인 언어로 볼 수 있다.
스크립트 언어들의 표준을 제시하기에 이 표준을 따르는 새로운 언어를 만들 수 있으며 JavaScript는 그 중 대표적인 것이다.
일종의 레시피로 볼 수 있으며 JavaScript는 이 레시피를 기반으로 만든 음식에 비유할 수 있다.
https://stackoverflow.com/questions/912479/what-is-the-difference-between-javascript-and-ecmascript
사람들이 레시피를 보고 음식을 만들 때 자신만의 재료를 추가하거나 조리 방식을 달리 하는 등 자신의 입맛에 맞게 이를 변형하곤 한다.
하지만, 레시피를 따르며 음식을 한다면 음식의 본질이 바뀌지는 않을 것이다.
(새우튀김이 오징어튀김이 되어 버린다거나)
결론적으로 JavaScript는 ECMAScript를 준수하는 가장 대표적인 스크립트 언어로 볼 수 있으며 ECMAScript의 표준을 따르면서 다양한 환경에서 사용될 수 있는 기능들을 담고 있는 언어인 셈이다.
JavaScript는 ECMAScript라는 뼈대를 갖고 있으며 클라이언트 사이트 Web API (DOM, fetch 등)을 포함하고 있는 개념이다.
V8
그렇다면 V8을 설명하기 위해 왜 ECMAScript가 필요한 것인가?
위의 v8 공식 문서를 보면 아래와 같은 내용이 있다.
V8은 C++로 작성된 Google의 오픈 소스 고성능 자바스크립트 및 웹어셈블리 엔진입니다. Chrome과 Node.js 등에서 사용됩니다. ECMAScript 및 WebAssembly를 구현하며 x64, IA-32 또는 ARM 프로세서를 사용하는 Windows, macOS 및 Linux 시스템에서 실행됩니다. V8은 모든 C++ 애플리케이션에 임베드할 수 있습니다.
V8 엔진의 경우 자바스크립트 엔진이면서 ECMAScript를 구현하고 있다고 한다.
https://v8.dev/blog/modern-javascript#measuring-conformance
위의 문서를 보면 V8은 2016년 기준 ES2015의 98%, ES2016의 100%를 지원한다고 한다.
V8 supports compliance with the “continually maintained draft future ECMAScript standard”!
또한, 위와 같이 V8은 향후 ECMAScript 표준도 준수할 것이라 작성되어 있다.
우리는 V8 엔진을 JavaScript 엔진 중 하나로 알고 있는데 V8은 스스로를 ECMAScript 표준을 준수한 엔진이라 설명하고 있다.
ECMAScript와 JavaScript의 관계를 본다면 왜 V8은 JavaScript 엔진인데 스스로는 ECMAScript를 준수한다고 작성했는지 알 수 있다.
V8은 JavaScript 엔진이며 ECMAScript 표준을 준수한다.
JavaScript는 ECMAScript를 준수하는 스크립트 언어다.
결과적으로 V8은 ECMAScript 표준을 준수하는 JavaScript 엔진이다라고 생각해도 이상한 것이 아니다.
브라우저
Node.js는 JavaScript 런타임이다.
이는 브라우저에서 사용하던 JavaScript를 실행하기 위한 또 다른 런타임으로 볼 수 있다.
즉, 브라우저에서만 사용하던 JavaScript를 사용해 서버를 구축하는 등의 작업을 수행할 수 있게 한다.
V8을 포함한 브라우저와 Node.js의 차이점은 무엇일까?
앞서 JavaScript는 ECMAScript 표준을 준수하는 스크립트 언어라고 했다.
결국 브라우저도 ECMAScript 표준을 준수하고 있고 Node.js는 내부적으로 v8을 포함하고 있으며 v8 또한 ECMAScript를 준수하고 있다.
둘의 관계를 확인해보면 아래와 같은 모습이다.
브라우저와 Node.js는 모두 ECMAScript 표준을 준수하고 있으며 각 환경에 맞는 API들을 추가로 제공하고 있음을 볼 수 있다.
예를 들어 path 모듈의 경우 브라우저에서는 지원하지 않는 Node.js의 모듈이다.
예전 Node.js 기여 과정에서 볼 수 있듯이 path 모듈의 내부는 JavaScript로 작성되어 있다.
결국 순수 JavaScript로 작성된 path 모듈의 구현체는 Node.js에서 제공하는 여러 모듈 중 하나이며 이는 개발 과정의 편의를 위한 모듈 중 하나인 것이다.
순수한 JavaScript로 작성되어 있기에 ECMAScript를 준수하고 있다고 볼 수 있으며 이는 V8에서 실행하는데 문제가 없다고 볼 수 있다.
V8
V8은 결국 JavaScript를 실행하기 위한 엔진이다.
이 과정을 위해 구문 분석을 통해 AST를 생성하는 등 일련의 과정을 거친다.
만약, 새로운 문법이 ECMAScript에 새롭게 추가된다면 V8 엔진은 이 문법을 읽을 수 있도록 업데이트 되어야 하며 이것이 결국 V8이 ECMAScript 표준을 따른다고 볼 수 있는 것이다.
const a = new Class()와 같이 작성한다면 a에 할당되는 Class의 인스턴스는 힙에 할당되어야 한다.
이때 힙 영역에 해당 데이터를 저장하는 것을 V8에서 담당한다고 보면 된다.
결론적으로 Node.js는 V8과 동일하다고 할 수는 없지만 (Node.js는 V8엔진을 포함한 다른 여러 라이브러리를 포함하고 있는 런타임 환경이므로) Node.js가 지원하는 ECMAScript 버전은 V8에 종속적이라 할 수 있다.
Node.js는 JavaScript를 위한 하나의 런타임을 제공하고 있는 것이며 내부적으로 다양한 라이브러리를 포함하고 있지만 결국 Node.js의 JavaScript를 실행하는 것은 V8엔진이기 때문이다.
Node.js 내부 코드를 보면 C++로 작성된 부분도 있다.
이렇게 C++로 작성된 코드들은 바인딩 되어 JS에서 사용할 수 있다.
V8 엔진은 JavaScript를 실행하는 과정에서 C++로 작성된 코드가 포함된 경우 해당 C++ 모듈도 호출하여 실행한다.
실행한 C++ 코드의 결과는 다시 JavaScript 환경으로 반환되어 JavaScript 환경에서 사용할 수 있게 되는 것이다.
결론
결론적으로 Node.js와 V8엔진은 ECMAScript라는 표준에 의해 연결되어있다.
또한 V8의 역할을 이해한다면 Node.js의 코드에 왜 C++ 코드들이 포함되어 있는지 알 수 있다.
V8의 경우 강력한 JavaScript 엔진이며 ECMAScript 표준을 준수하고 있다.
우리가 사용하는 JavaScript는 ECMAScript 표준을 준수하는 스크립트 언어다.
Node.js에서 V8의 역할은 우리가 ECMAScript를 준수하는 JavaScript를 사용할 수 있음을 보장하는 것이며 Node.js는 브라우저 밖에서 JavaScript를 실행할 수 있는 런타임이자 서버사이드 개발에 필요한 다양한 모듈을 제공하고 있다.
우리가 Node.js에서 사용하는 다양한 모듈들은 JavaScript (또는, C++)로 구성되어 있으며 이는 순수한 ECMAScript를 준수하기 때문에 V8 엔진에서 실행할 수 있는 것이다.
이는 웹 표준과 관련이 있을 수도 있지만 Node.js에서 제공하는 여러 유틸리티로 보는 것이 적절하다.
즉, Node.js가 준수하는 웹 표준 이외의 다른 사용자 친화적인 모듈이 있을 수 있다는 것이다.
'개발 > 개념' 카테고리의 다른 글
추상 구문 트리 (AST)란? (0) | 2024.06.13 |
---|---|
선언형 프로그래밍과 명령형 프로그래밍 (feat. React 18 Concurrent Mode) (0) | 2024.05.04 |
WebRTC란 무엇이며 어떤 과정을 갖는가? (0) | 2023.11.12 |
Vite는 왜 빠를까? (0) | 2023.10.21 |
[객체지향] SOLID 예제(5) - 인터페이스 분리의 원칙(ISP) (0) | 2023.10.03 |