2021. 11. 20. 12:11ㆍ공부내용 공유하기
v8 엔진에서 사용중인 컴파일 방식.
JIT + interpreter 의 장점을 합친 방식이다.
현재 v8엔진에서는 소스코드 파싱 -> AST생성 -> Ignition 컴파일러로 byte code(중간언어) 컴파일 이후 실행한다.
실행 중 런타임 프로파일러를 통해 사용 빈도(반복횟수 등)를 측정한다.
이에 따라 최적화가 필요한 코드(자주 반복 사용되는)를 TurboFan으로 보낸다.
TurboFan에서는 컴파일을 통해 최적화 작업을 진행한다.
(실제 엔진에서 터보팬이 추력을 더해주면서 동시에 배출공기를 통해 냉각 효과를 가져온다는 점을 생각하면 네이밍이 기가막히다)
상황에 따라 런타임에서 타입이 바뀌거나 하는 경우에는 deoptimize를 통해 터보팬에 들어간 코드가 다시 나오기도 하고, 또 다른 코드들이 터보팬에 들어가기도 한다.
•Hotspot이 별로 없는 고전적인 JavaScript 프로그램들에는 interpreter가 JITC보다 효율이 좋다.
•최근 많이 사용되는 compute-intensive한 JavaScript 프로그램들에는 JITC가 좋다.
•두 가지 성향의 코드에 대한 성능을 모두 만족하기 위해 최근 엔진들은 adaptive JITC를 채용한다.
•Adaptive JITC는 type profiling을 수행하므로, 변수의 type이 변하지 않는다면 높은 성능을 얻을 수 있다.
히든클래스 -> 인라인 캐싱의 효과를 보려면 반복문에서의 타입 일관성이 중요한데, 그런 면에서 개발자로 하여금 정적 타이핑을 습관화 해주는 typescript의 이점이 또 보이는 것 같다.