컴퓨터가 이해할 프로그래밍하기 vs 브라우저가 이해할 프로그래밍하기
운영체제 위에서 실행될 프로그램 프로그래밍하기 vs 브라우저 위에서 실행될 프로그래밍 하기
운영체제의 관리를 받게 되는 프로그램을 만들기 vs 브라우저의 관리를 받게 되는 코드블록을 작성하기
C코드를 실행하기 위한 컴파일러와 실행될 운영체제가 있듯이, JavaScript코드를 실행하기 위한 V8, Webkit, Rhino같은 엔진과 브라우저가 있다. 지금부터 JavaScript가 실행될 환경인 브라우저. 그중 크롬 브라우저의 코어 V8과 메모리 관리에 대해서 알아보자.
먼저 V8 엔진 사이트를 살펴보면
V8은 구글의 오픈소스 엔진이고, C++으로 만들어진 프로그램이며 ECMAScript를 실행하기 위한 엔진이라는 설명이다. V8은 Windows 7 or later, macOS 10.12+, and Linux systems that use x64, IA-32, ARM, or MIPS processors에서 실행 가능하다고 한다. 플랫폼별로 프로그래밍을 하지 않아도 되고, 브라우저가 실행할 수 있는 프로그래밍만 하면 되는 장점이 있다. V8엔진을 통해서 나열된 플랫폼에서 적절히 실행될 머신코드가 만들어진다고 볼 수 있다.
이하 문서에서 나오는 내용들은 엔진을 이용한 프로그램을 만드는 수준에서 다루기 위한 내용들 같고, 나는 V8을 사용하는 수준에서 특징에 대해서만 간단히 살펴볼거니깐 스킵하고 블로그를 살펴보자.
크롬 브라우저가 배포된 시기의 게시물들은 Chromium blog를 가보라고 한다. 초기 V8에 대한 내용을 Chromium blog에서 찾아보자.
https://blog.chromium.org/2008/09/
첫 게시물에서 오픈소스 프로젝트 이름을 Chromium 프로젝트라고 부른다는 것을 확인했고, 블로그 2008/9 포스트들을 살펴보자.
Need for Speed 라는 게시물에서 V8 설계의 초석이 되는 내용이 잠깐 나온다.
The cornerstones of the V8 design are:
- Compilation of JavaScript source code directly into native machine code.
- An efficient memory management system resulting in fast object allocation and small garbage collection pauses.
- Introduction of hidden classes and inline caches that speed up property access and function calls.
그리고 설계 세부사항 링크( http://code.google.com/apis/v8/design.html)가 현재(24.03.04)는 v8.dev 로 redirect 되어 있다.
V8 doc를 뒤지면 코드가 실행되기까지의 과정과 메모리를 관리하는 방식에 대한 정보를 한 눈에 찾아볼 수 있을거라 기대했다. 원하는 게시글은 찾아볼 수 없었지만, 관련 내용을 정리해놓은 블로그를 찾았다.
https://cabulous.medium.com/how-v8-javascript-engine-works-5393832d80a7
그니깐 브라우저가 실행되면 V8엔진과 Host 환경 초기화가 일어났을 때, Host 환경에서는 call stack, heap, callback queue 같은 V8엔진이 이용해야하는 요소들이 준비되고, V8엔진에는 JavaScript core, Garbage Collection, coroutine 과 같은 요소들이 준비된다고 한다.
V8엔진이 JS 코드를 bytecodes로 컴파일한 후, bytecodes를 해석하고 실행. 그리고 자주 사용되는 bytecodes는 machinecodes로 최적화한 후, 캐싱해서 사용한다고 한다. 흥미로웠던점은 초기 V8엔진은 bytecodes를 만드는 과정 없이 machinecodes를 만들었다고 한다. 초기 모델은 메모리 사용량이 많았고, 컴파일되는 시간이 느렸다. 이를 개선하고자 bytecodes를 만드는 과정을 추가했다는 내용이다. 이와 관련된 자료는 V8 doc에 있다. (참조에 참조를 따라가다보니 관련 공식 문서가 있었다)
https://v8.dev/blog/ignition-interpreter?ref=hackernoon.com
그래도 V8엔진의 특징과 성능을 개선하기 위한 과정을 살펴볼 수 있는 자료들이 잘 정리되어 있어서 좋았다.