
js에서 바이트코드를 생성하는 웹어셈블리 엔진
| 엔진 | 사용된 환경 | 코드 변환 방식 |
|---|---|---|
| 스파이더몽키 | 과거 파이어폭스 | js를 중간 언어인 바이트코드로 변환 후 기계어로 변환 |
| V8 | 구글 크롬, Node.js | js를 직접 기계어로 변환 |
Node.js와 크롬이 기능을 C++로 구현 + V8을 사용해 js 함수로 바인딩
-> 낮은 수준의 언어일수록 시스템에 대한 더 많은 접근 권한과 제어 능력을 가진다!
-> C/C++은 네트워크 카드와 같은 저수준 리소스에 직접 접근 가능.
-> 자바스크립트는 이러한 C++의 기능을 활용해 원하는 작업을 수행
왜 기계어를 직접 사용하지 않을까?
- 기계어에는 많은 양의 메모리가 필요하다!!
- 기계어가 항상 바이트코드보다 빠른 것은 아니다!
- 기계어는 실행 속도는 매우 빠르지만 컴파일이 느림
- 바이트코드는 컴파일 시간은 짧지만 실행 단계가 느림
V8은 js 코드를 직접 이해하지 못한다!
-> 이 과정에서 스코프도 함께 생성
엔진은 코드를 실행하고 타입 피드백을 수집
-> 실행 단계에서 이 타입 피드백을 제공
Ignition
- 빠른 저수준 레지스터 기반 인터프리터
- 백그라운드에서 추상구문트리(AST)를 기계 코드(바이트 코드)로 컴파일
- 최적화X
바이트 코드로 최적화된 기계어 생성
-> 2번과 과정과 병렬로 처리
-> V8은 자주 사용되는 바이트코드를 핫코드로 표시하여 더 효율적인 기계어로 변환
Turbofan
- 최적화 코드 컴파일러