How JavaScript works: inside the V8 engine + 5 tips on how to write optimized code
JavaScript 엔진은 JavaScript 코드를 실행하는 프로그램 또는 인터프리터이다. JavaScript 엔진은 표준 인터프리터 또는 JavaScript를 특정 형식의 바이트 코드로 컴파일하는 JIT(Just-In-Time) 컴파일러로 구현될 수 있다.
Google에서 만든 V8 엔진은 오픈 소스이며 C++로 작성되었다. 이 엔진은 Google 크롬 내부에서 사용된다. 그러나 나머지 엔진과 달리 V8은 널리 사용되는 Node.js 런타임에도 사용된다.
V8은 처음에 웹 브라우저 내에서 JavaScript 실행 성능을 향상시키도록 설계되었다. 속도를 얻기 위해 V8은 인터프리더를 사용하는 대신 JavaScript 코드를 보다 효율적인 기계 코드로 변환한다. JIT 컴파일러를 구현하여 실행 시 JavaScript 코드를 기계 코드로 컴파일한다. 여기서 주요 차이점은 V8이 바이트코드나 중간 코드를 생성하지 않는다는 것이다.
5.9 버전이 나오기 전에 엔진은 두 개의 컴파일러를 사용했다.
V8 엔진은 또한 내부적으로 여러 스레드를 사용한다.
JavaScript 코드를 처음 실행할 때 V8은 변환 없이 구문 분석된 JavaScript를 기계 코드로 직접 변환하는 full-codegen을 활용한다. 이를 통해 기계 코드 실행을 매우 빠르게 시작할 수 있다. V8은 중간 바이트코드 표현을 사용하지 않으므로 인터프리터가 필요하지 않다.
코드가 일정 시간동안 실행되면 프로파일러 스레드는 어떤 메서드를 최적화 해야 하는지 알려주기에 충분한 데이터를 수집한다.
다음으로 Crankshaft 최적화는 다른 스레드에서 시작된다. JavaScript 추상 구문 트리를 Hydrogen이라는 상위 수준의 정적 단일 할당(SSA) 표현으로 변환하고 Hydrogen 그래프를 최적화하려고 시도한다. 대부분의 최적화는 이 수준에서 수행한다.