컴파일러 vs 인터프리터 feat. V8

404·2022년 7월 26일
0

Node 💚 Express

목록 보기
8/8
post-thumbnail

노드js에서 에러 처리가 왜 중요한지 알려면 먼저 노드js를 동작하게 하는 V8 엔진의 특성부터 파악하는 것이 순서이다.

먼저 일반적인 코드의 실행 과정을 살펴보자.

코드의 실행 과정 : 파싱(parsing) 👉 컴파일링(compiling) 👉 실행 (executing)

  1. 파싱(parsing)

    코드를 토큰 단위로 분할해서 AST(Abstract Syntax Tree)구조로 만든다.

  2. 컴파일링(compiling)

    인간의 코드(고수준 언어)를 기계가 이해할 수 있는 코드(저수준 언어)로 변환한다. 컴파일을 하는 방법은 두 가지가 있다.

  • 컴파일러 사용
    👉 전체 코드를 스캔하여 최적화된 바이트 코드로 변환한다. (optimized byte code)
    👉 실행할 최적화 코드를 만드는 과정에서 코드 에러를 미리 발견할 수 있다.
    👉 초기 컴파일 과정에서 시간이 많이 걸리고 메모리 사용률이 높아지지만 이후에는 최적화된 코드로 실행하기 때문에 처리 속도가 빠르다.

  • 인터프리터 사용
    👉 코드를 한 줄씩 스캔하여 바이트 코드로 변환한다.
    👉 코드를 한 줄씩 변환하며 바로 실행하기 때문에 error를 만나면 프로그램이 종료된다.
    👉 최적화된 코드 실행에 비해 속도가 느리다.

V8 엔진은 컴파일 과정에서 다른 언어들의 실행 과정과 조금 다른 방식으로 작동한다.

V8 엔진은 처음에 인터프리터 방식으로 코드를 변환하지만 반복되는 코드, 함수 등의 패턴을 파악하여 컴파일하여 성능을 향상시킨다.

인터프리터 (코드 패턴 파악) 👉 프로파일러 (최적화 방법 도출) 👉 컴파일러 (최적화)

설명만 들었을 때는 장점들만 모아둔 최적의 해석 방식 같지만 코드의 작동 패턴이 바뀌거나, 성능이 오히려 저하된다고 판단될 때는 이 모든 과정이 역순으로 진행되면서 디컴파일링이 발생하고 이를 다시 인터프리터로 넘기기 때문에 개발자가 코드를 작성하는 단계부터 최적화를 고려한 코딩이 필요해진다.

참고자료
https://www.geeksforgeeks.org/how-v8-compiles-javascript-code/
https://velog.io/@colki/Udemy-Interpreter-Compiler
https://dkwjdi.tistory.com/194

profile
T.T

0개의 댓글