[study] js 복습 1

유재민·2023년 3월 12일
0

# js 복습 1

# 어셈블리어

기계어와 일대일 대응이 되는 컴퓨터 프로그래밍의 저급 언어이다. 기계어는 사람이 이해하기 어렵기 때문에 기계어를 사람이 이해할 수 있게 하기 위해 어셈블리어가 등장했다. 하지만 컴퓨터 구조에 따라 사용하는 기계어가 다르고 그로 인해 기계어에 대응되어 만들어지는 어셈블리어도 각각 다르다는 문제가 발생했다. 이 때문에 통일된 언어체계로 작성한 코드의 필요성이 대두되고, 여기서 고급 프로그래밍 언어가 나오게 된다. 고급 프로그래밍 언어를 OS가 인식하는 기계어로 번역해주는 방식 중 2가지가 인터프리터 방식과 컴파일러 방식이다.

# 컴파일러 인터프리터 차이

특징컴파일러인터프리터
번역 단위전체문장
실행 속도빠름느림
실행 파일생성미생성, 한줄 씩 해석 후 바로 실행
메모리 할당할당미할당
에러 발생전체 코드 변환 후 에러 보고에러가 나면 그 이후 코드 실행 안함
대표 언어C, C++, Java 등Python, Ruby, Javascript 등

# 자바스크립트는 컴파일러일까 인터프리터일까?

결론은 인터프리터 언어이다. 개발자 도구에서 콘솔을 열어 스크립트를 작성해보면 컴파일이 필요없이 실행이 된다. 자바스크립트의 목적은 웹 문서 구조를 동적으로 나타내기 위함이기 때문에 목적에 맞게 빌드 과정이 필요없이 바로 실행되고, 수정 및 디버깅이 더 편한 인터프리터 언어로 만들어졌다고 한다. 하지만 유저 인터렉션이 점점 늘어나고 애플리케이션의 구조가 커지게 되며 실행 속도를 빠르게 개선하기 위해 V8엔진이 나오게 되었고 최근 V8엔진은 AJITC(Adaptive Just In Time Compiler)로 구동되어 반복 수행 정도에 따라 유동적으로(adaptive) 서로 다른 최적화 수준을 적용하는 방식을 사용한다. AJITC의 동작 방식은 V8엔진이 JS 소스코드를 받아 파싱 후 추상 구문 트리(abstract syntax tree)를 생성한다. 그 후 기본적으로 인터프리터로 동작을 하며 코드를 해석(중간 번역)하고 실행하게 된다. 프로파일러가 실행하는 과정을 지켜보며 반복되어 사용되는 코드 등 과열 지점을 찾은 후 과열 지점을 찾게 되면 해당 코드를 컴파일러에게 전달해주어 컴파일러가 최적화를 진행하게 된다. 그리고 기존에 있던 코드와 최적화된 코드를 바꿔준다. 즉 결론은 인터프리터는 중복되는 코드도 동일하게 컴파일 과정을 거쳐 실행 속도를 늦춘다는 단점이 있었는데 이를 해결하기 위해 유동적으로 최적화 방식을 변경하는 AJITC를 사용하여 인터프리터 + 컴파일러 방식으로 동작해 실행 속도를 높여준 것이다.

# V8엔진의 AJITC(Adaptive Just In Time Compiler) 동작 원리

(1) 자바스크립트 엔진에 자바스크립트 파일을 넘긴다.
(2) 파서가 소스 코드 분석 후 추상 구문 트리(AST) 생성
(3) 이그니션 인터프리터(Ignition)가 추상 구문 트리(AST)를 컴파일하여 바이트 코드(중간 코드)로 변환 후 실행한다.
(4) 실행 과정 중 프로파일러가 프로파일링을 통해 반복되어 사용되는 코드와 같이 과열 지점을 찾는다.
(5) 과열 지점을 찾게 되면 해당 코드를 터보팬 컴파일러(TurboFan)를 통해 최적화하여 최적화 된 기계어(Optimized Machine Code)로 다시 컴파일 된다.

profile
프론트엔드 개발자

0개의 댓글