컴퓨터는 0과1로 이루어진 값만 이해할 수 있다. 그리고 이 기계어를 인간이 해석하기 쉽게 만든 언어를 고급언어라 하며 우리가 자주 사용하는 c, python, java, javascript 등이 고급언어에 해당한다.
그러면 Javascript로 작성한 소스코드를 컴퓨터가 읽을 수 있도록 하려면?
Javascript Engine이 필요하다. 오늘은 여러 Javascript Engine 중에서 구글에서 개발한 V8을 학습해보려고 한다.
내가 작성한 코드가 어떻게 실행되는지 정도는 알아둬야 할 것 같았다.
V8 Engine
구글에서 만든 Javascript Engine이다.
V8 Engine은 C++로 개발 되었다.
현재 Chrome과 Node.js에서 사용되고 있다.
JIT (Just-In-Time) Compiler를 사용한다.
V8 Engine 구조
- Parser
V8이 소스코드를 가져오면 가장먼저 Parser가 소스코드를 분석후 토큰을 생성한다. (Lexical Analysis 과정)
이 토큰을 Parser가 AST로 변환한다. - AST (Abstract Syntax Tree)
파싱 되어 만들어진 AST는 Ignition Interpreter로 넘어간다. - Ignition Interpreter
Ignition Interpreter가 AST를 ByteCode로 변환 한다.
(처음에는 바이트 코드로 전부 변환하는 작업이 있어서 시간이 걸리지만 이후부터는 컴파일 언어에 가까운 성능을 보인다.) - TruboFan JIT Compiler
- 바이트 코드를 실행하면서 Profiler는 최적화(Optimizes)가 가능한 부분을 찾아서 기록해둔다. (자주 쓰이는 변수나 함수)
- Profiler가 최적화 가능한 부분을 TurboFan에 전달하고, TurboFan은 필요한 부분을 기계어(Optimized Machine Code)로 변환하여 최적화를 진행한다.
- 코드가 자주 사용되지 않으면 Deoptimize 될수도 있다. (다시 Bytecode로)
- 최적화 방법으로는 히든 클래스, 인라인 캐싱이 있다.
JIT (Just-in-time) Compiler
Just-in-time Compiler: 프로그램을 실제 실행하는 시점에 (실시간) 기계어로 번역하는 컴파일 기법
JIT Compiler는 바이트 코드를 읽어 빠른 속도로 기계어를 생성할 수 있다. 이런 기계어 변환은 코드가 실행되는 과정에서 실시간으로 일어난다.
전체 코드의 필요한 부분만 변환하며, 기계어로 변환된 코드는 캐시에 저장되기 때문에 재사용시 컴파일을 다시할 필요가 없다.
인터프리터 (동적 컴파일)
우리가 작성한 소스코드를 각 행 마다 기계어로 컴파일 한다.
개발 편의성이 높지만, 실행 속도가 떨어짐
- 장점: 소스코드가 한 줄 한 줄 기계어로 변환되어 실행되기 때문에 바로바로 동작을 확인하면서 실행할 수 있다. (디버깅에 유리)
- 단점:
- 반복문 등으로 코드가 복잡해지면 속도가 느려진다. for문과 같은 반복문을 사용하는 경우 억 단위를 반복한다고 가정하면 억단위를 한 줄 한 줄 반복해서 변환하게 된다.
- 실행할 때마다 한 줄씩 번역하고 실행하게 된다.
컴파일러 (정적 컴파일)
코드를 실행하기 전에 소스코드 전체를 컴파일 한다.
개발 편의성은 떨어지지만, 실행 속도는 높다.
- 장점 : 컴파일이 되고 난 후 번역할 필요가 없어서 인터프리터보다 전체 소스코드의 실행이 빠르다.
- 단점 : 코드 전체를 컴파일 하기 때문에 초기에 속도가 느리다.
참고 자료
https://helloinyong.tistory.com/290
https://evan-moon.github.io/2019/06/28/v8-analysis/
'JavaSctipt' 카테고리의 다른 글
[Javascript] Object, Map 순서를 보장 하는 순회 (0) | 2022.05.25 |
---|---|
[Javascript] 호이스팅(Hoisting) (1) | 2022.01.25 |
[Javascript] 이터레이션, 이터레이터 / 이터러블 (0) | 2021.07.31 |
[Javascript] 클로저 (Closure) (1) | 2021.07.06 |
[Javascript] 함수 선언식, 함수 표현식 (0) | 2021.07.06 |