V8 Engine

개발(공부) 자국·2021년 9월 6일
1

chrome 브라우저는 V8 엔진을 사용하여 자바스크립트를 해석하고 실행한다.
V8 엔진에 대해서 알아보고자 한다.

V8 엔진은 무엇인가

V8 엔진은 C++로 만들어진 오픈소스로 ECMAScript, WebAssembly를 표준에 맞게 구현하였다. JavaScript와 Web Assembly를 실행할 수 있는 환경이다. google chrome과 node.js 에서 사용하고 있다.

WebAssembly는 최신 웹 브라우저에서 실행할 수 있는 새로운 유형의 코드다. 네이티브에 가까운 성능으로 동작하며 컴팩트한 바이너리 포맷을 제공하는 저수준 어셈블리 언어로, C/C++, Rust 등과 같은 언어의 컴파일 타겟으로써 그런 언어로 작성된 프로그램을 웹에서 사용할 수 있게 해준다. 이로인해 이전에는 웹에서 돌려볼 수 없었던 클라이언트 앱을 돌릴 수 있도록 만들어주었다. 또한 JavaScript와 함께 실행되며 서로를 보완할 수 있도록 설계되었다.

V8 엔진의 역할

  1. JS, WASM 코드 컴파일, 실행
  2. 콜 스택 처리( 함수 실행 )
  3. 메모리 할당
  4. 가비지 컬렉션

주로 이 4가지에 집중된 역할을 한다.

V8 엔진의 구성요소

  • Ignition - Interpreter
  • TurboFan - 최적화 Compiler

V8 엔진의 작동 원리

간략한 과정을 이러하다.

V8은 소스코드를 parser에게 넘긴다. parser는 소스코드를 분석한 후에 AST(Abstract Syntax Tree) 로 변환하게 된다. 만들어진 추상 구문 트리를 Ignition에게 넘기게 된다. Ignition은 자바스크립트를 바이트 코드로 변환하는 Interpreter이다. 컴퓨터는 원본 소스코드 보다 바이트코드를 해석하기 쉽기 때문에 바이트 코드로 변환하면 속도와 메모리 공간의 이점이 있다.

바이트 코드를 실행하게 되면 소스 코드가 작동하게 되고 자주 사용되는 코드는 TurboFan Compiler로 보내져서 Optimized Machine Code 최적화된 코드로 다시 컴파일 된다. 사용이 덜 되면 다시 Deoptimizing 한다.

Parsing

파싱이란 소스코드를 불러온후에 AST로 변환하는 과정이다. AST는 컴파일러에서 널리 사용되는 자료구조다. 소스코드를 컴퓨터가 알기 쉽게 구조화 하는 과정이다.

function hello(name) {
	return 'Hello,' + name;
}

--> 구조화

{
	type: 'FunctionDeclaration',
	name: 'hello',
	arguments: [
		{
			type: 'Variable',
			name: 'name'
		}
	}
	...
}

파싱은 컴퓨터가 분석하기 쉬운 형태인 추상 구문 트리로 변경하는 점이 중요한 것이다. V8 엔진은 자바스크립트로 표현했던 것을 C++를 사용하여 그대로 하는 것이다.

Ignition으로 바이트 코드 (Byte code) 생성하기

바이트 코드는 고급언어로 작성된 코드를 편하게 이해할 수 있도록 한번 컴파일 한 것을 의미한다. Ignition이 하는 역할이다

Ignition?

이전에는 Full-codeGen으로 전체코드를 한번에 컴파일 했는데 이런 방법으로 최적화 하기는 어렵다는 판단을 하고 한번에 해석하는 컴파일 방식이 아닌 한줄한줄 실행될 때마다 해석하는 인터프리터 방식을 채택하여 최적화하였다.

Ignition은 코드가 한줄 한줄 실행될 때마다 코드를 바이트 코드로 바꿔주는 역할을 한다.

TurboFan으로 컴파일하기

TruboFan은 최적화 컴파일러다. V8은 런타임 중에 profiler에게 함수나 변수들의 호출 빈도와 같은 데이터를 모으게 명령한다. profiler는 이렇게 모은 데이터를 TurboFan을 가져가면 기준에 맞는 코드를 가져와 최적화한다.

잘짜여진 자바스크립트는 C++에 근접하는 성능을 낼 수도 있다고 한다. V8 엔진은 많은 최적화로 많은 성능이 향상되었다.

참고링크
Evans Library
양재동 코드랩
링크텍스트

profile
기록을 중요하게 생각하는 사람입니다. 학습한 내용을 정리한 것이라 잘못된 정보가 있을 수 있습니다. 잘못된 정보는 언제든 말씀해 주시기 바랍니다.

0개의 댓글