Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 동기화
- 호스팅이란?
- 세마포어란?
- Dijkstra Algorithm
- 뮤텍스란?
- 싸피
- 프록시
- 세마포어
- 최단 경로
- 다익스트라 알고리즘
- 싸피 면접 후기
- 뮤텍스
- 호스팅
- 삼성 청년 SW 아카데미
- 세마포어와 뮤텍스의 차이
- 싸피 합격
- 서버 호스팅
- 플로이드 워셜
- floyd-warshall
- 세마포어와 뮤텍스
- 플로이드 와샬
- Synchronization
- Proxy
- 프록시서버
- 웹 호스팅
- 클라우드 서버
- SSAFY
- Proxy Server
- 다익스트라
Archives
- Today
- Total
어제의 나보다 성장한 오늘의 나
JavaScript 엔진 작동원리 본문
자바스크립트 엔진이란?
- JS 코드를 실행하는 프로그램 또는 인터프리터를 말한다.
자바스크립트 엔진 파이프라인
- 자바스크립트 엔진(V8, SpiderMonkey 등)들이 소스 코드를 기계어로 만들까까지 공통적으로 수행하는 과정이다.
- 먼저 자바스크립트 소스 코드부터 시작한다.
- 소스 코드를 파싱해서 Abstract Syntax Tree(AST)로 만든다.
- 그리고 AST를 바탕으로, 인터프리터는 바이트 코드를 생성한다.
- 인터프리터가 바이트코드를 실행할 때, 자주 사용되는 함수 및 타입 정보 등이 있는 프로파일링 데이터(Profiling data)와 같이 최적화 컴파일러(Optimizing compiler)에게 보낸다.
- 최적화 컴파일러는 프로파일링 데이터를 기반으로 최적화 코드(Optimized code)를 생성한다.
- 하지만, 프로파일링 데이터 중에 잘못된 부분이 있다면 최적화 해체(Deoptimize)를 하고 다시 바이트코드를 실행해서 이전 동작을 반복한다.
인터프리터/ 컴파일러 파이프 라인
인터프리터가 코드를 해석하고, 최적화할 때 주요 자바스크립트 엔진들은 다음과 같은 공통된 파이프라인을 가진다.
- 인터프리터 : 최적화되지 않은 바이트코드(bytecode)를 빠르게 생성한다.
- 최적화 컴파일러 : 매우 최적화된 기계어 코드(machine code)를 약간 시간을 들여서 생성한다.
이 과정에서 바이트코드는 중간 언어(IR, intermediate representation)입니다. 만약 interpreter 모드라면 바이트코드를 하나씩 읽어서 실행하고, JIT 모드라면 바이트 코드를 기반으로 컴파일하여 수행한다.
▶ 바이트코드(Bytecode, portable code, p-code)는 특정 하드웨어가 아닌 가상 컴퓨터에서 돌아가는 실행 프로그램을 위한 이진 표현법이다. 하드웨어가 아닌 소프트웨어에 의해 처리되기 때문에, 보통 기계어보다 더 추상적이다.
▶ JIT 컴파일(just-in-time compilation) 또는 동적 번역(dynamic translation)은 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일 기법이다. 이 기법은 프로그램의 실행 속도를 빠르게 하기 위해 사용된다.
그렇다면 이제 크롬에서 쓰이는 V8엔진에 대해 알아보자
V8에서 처리하는 방법
- V8의 세부 파트는 이름 그대로 8기 통 자동차 엔진이 떠오르는 네이밍을 하고 있다.
- 과정은 위에서 설명한 공통 파이프라인과 거의 흡사하다.
- 여기서 인터프리터는 Ignition이라고 부르며, 코드를 점화하여 바이트 코드를 생성 및 실행한다.
- Ignition을 개발할 때는 모든 소스를 한 번에 해석하는 컴파일 방식이 아닌 코드 한 줄 한 줄이 실행될 때마다 해석하는 인터프리트 방식을 채택하여 다음 세 가지 이점을 가져가고자 하였다.
- 메모리 사용량 감소, 자바스크립트 코드에서 기계어로 컴파일하는 것보다 바이트코드로 컴파일하는 것이 더 편하다.
- 파싱 시 오버 레드 감소, 바이트 코드는 간결하기 때문에 다시 파싱 하기도 편하다.
- 컴파일 파이프 라인의 복잡성 감소, Optimizing이든 Deoptimizing이든 바이트 코드 하나만 생각하면 되기 때문에 편하다.
- 바이트코드가 실행될 때 인터프리터는 프로파일링 데이터를 수집하여 나중에 실행 속도를 빠르게 할 때 사용한다.
- 가령! 특정 함수를 자주 사용한다고 해보자, 이대 이 함수가 뜨거워지게 되면, 바이트 코드와 프로파일링 데이터를 TurboFan이라고 부르는 최적화 컴파일러로 보내서 식혀준다.
- 그리고 이 곳에서 프로파일링 된 데이터를 기반으로 매우 최적화된 기계어 코드를 만들어낸다.
함수가 뜨거워진다?
- 자주 반복돼서 수행된다는 뜻이다.
- 최근의 JS 엔진들은 일괄적으로 최적화를 적용하는 JITC가 아닌 Adaptive Compiliation 방식을 택하고 있다.
- 이는 반복 수행되는 정도에 따라 서로 다른 최적화를 적용하는 것이다.
- 처음에 모든 코드는 인터프리터에 의해 바이트 코드를 변환되지만, 자주 반복되는 부분이 발견되면 여기에 대해서만 JITC를 적용하는 방식이다.
출처
'공부 > JavaScript && jquery' 카테고리의 다른 글
[자바스크립트] ES6에서의 this 바인딩 (0) | 2021.04.26 |
---|---|
[자바스크립트][ES6] 함수 스코프, 블록 스코프 (0) | 2021.04.26 |
[자바스크립트] 클로저 (0) | 2021.04.24 |
[자바스크립트] 스코프 체인 (0) | 2021.04.20 |
[자바스크립트] 실행 컨텍스트 개념 (0) | 2021.04.20 |
Comments