[번역] Understanding How the Chrome V8 Engine Translates JavaScript into Machine Code

원문 : https://www.freecodecamp.org/news/understanding-the-core-of-nodejs-the-powerful-chrome-v8-engine-79e7eb8af964/

by Mayank Tripathi

Chrome V8의 핵심을 자세히 알아보기 전에 먼저 기본적인 사항을 살펴보겠습니다. 모든 시스템은 마이크로 프로세서로 구성되어 있습니다. 마이크로 프로세서는 지금 컴퓨터 내부에 있으며, 읽을 수 있습니다.

마이크로프로세서는 전기 신호를 이용해 작업을 수행하는 작은 머신입니다. 마이크로프로세서에 명령을 줄 수 있습니다. 해당 명령은 마이크로프로세서가 해석할 수 있는 언어로 되어 있습니다. 각각의 마이크로프로세서는 다른 언어를 사용합니다. IA-32, x86-64, MIPS 그리고 ARM이 일반적인 머신 언어입니다. 이 언어들은 하드웨어와 직접 상호 작용하므로 이러한 언어를 통해 작성된 코드를 머신 코드라고 합니다. 개발자가 컴퓨터에서 쓰는 코드는 머신 코드로 변환되거나 컴파일 됩니다.

머신 코드는 다음과 같습니다 :

시스템의 특정 메모리 부분에서 low level로 수행되는 명령으로 구성됩니다. 프로그램을 사용하는데 있어 이런 명령을 직접 사용하지 않아도 되는 것은 행운입니다!

머신 언어를 추상화한 언어가 high level 언어 입니다. 아래 추상화 수준 그림을 보면, JavaScript가 시스템 수준에서 얼마나 멀리 추상화되어 있는지 확인할 수 있습니다. C / C++는 하드웨어 상대적으로 가깝기 때문에 다른 high level 언어보다 훨씬 빠릅니다.

다시 V8 엔진으로 돌아가겠습니다: V8은 구글에서 오픈소스로 제공하는 강력한 JavaScript 엔진입니다. ㄱ그럼 JavaScript 엔진은 무엇일까요? JavaScript 코드를 마이크로 프로세서가 이해할 수 있는 low level 또는 머신 코드로 변환하는 프로그램입니다.

JavaScript 엔진에는 Rhino, JavaScriptCore 및 SpiderMonkey 등이 있습니다. 이 엔진은 ECMAScript 표준을 따릅니다. ECMAScript는 스크립트 언어의 표준을 정의합니다. JavaScript는 ECMAScript 표준을 기반으로 합니다. 이 표준은 언어의 작동 방식과 기능을 정의합니다. ECMAScript에 대한 자세한 내용은 ECMA-262 를 확인하세요.

Chrome V8 엔진:

  • V8 엔진은 C++로 작성되어 있으며 Chrome 및 Nodejs에서 사용됩니다.

  • ECMA-262에 지정된 ECMAScript를 구현합니다.

  • V8 엔진은 독립으로 실행할 수 있으며 C++ 프로그램을 포함할 수 있습니다.

마지막 포인트를 조금 더 자세히 설명하겠습니다. V8은 독립으로 실행할 수 있으며, 동시에 C++에서 자체 기능 구현을 추가하여 JavaScript에 새로운 기능을 추가할 수 있습니다.

예를 들면 print('hello world') 는 Node.js에서 유효한 명령이 아닙니다. 컴파일을 하면 오류가 발생합니다. 하지만 Github에 있는 오픈소스인 V8 위에 C++로 print 기능을 구현하여 print 함수를 기본적으로 사용할 수 있습니다. 이를 통해 JavaScript는 ECMAScript 표준이 JavaScript가 이해하도록 지정된 것 이상을 이해할 수 있습니다.

C++은 JavaScript 보다 하드 드라이브의 폴더 및 파일을 다루는 일처럼 하드웨어에 훨씬 가깝기 때문에 프로그래밍 언어로서 더 많은 기능을 갖고 있어 엔진을 커스텀할 수 있는 기능은 강력합니다.

C++ 코드를 JavaScript에서 사용할 수 있다면 JavaScript에 더 많은 기능을 추가할 수 있습니다.

Node.js 자체는 서버 사이드 프로그래밍과 네트워크 애플리케이션을 가능하게 하는 V8 엔진의 C++ 구현입니다.

이제 엔진 내부의 일부 오픈소스 코드를 살펴보겠습니다. v8/samples/shell.cc 폴더를 확인하세요.

여기서는 Node.js에서 기본적으로 사용할 수 없는 PrintRead 같은 다양한 함수의 구현을 볼 수 있습니다.

아래에서 Print 함수 구현을 볼 수 있습니다. Node.js에서 print() 함수가 호출 될 때마다 콜백이 생성되고 함수가 실행됩니다.

마찬가지로 V8 내부의 C++에서 새 함수의 구현을 Node.js가 이해하도록 추가할 수 있습니다.

이 작업은 간단히 설명하기엔 양이 너무 많으며 V8 엔진이 수행하는 작업량입니다.

이제 Node.js의 작동 방식과 실제로로 Chrome V8 엔진이 무엇인지 명확하게 이해해야 합니다.

이 글을 읽어주셔서 감사합니다.

Last updated