JavaScript Engine에 대해서(2)- 컴파일러, 인터프리터, JIT는 무엇인가

dahye·2022년 3월 8일
0
post-thumbnail
post-custom-banner

우리에게는 왜 컴파일과 인터프리터가 필요한 것일까?

결론부터 이야기하면 컴퓨터가 읽을 수 있도록 파일을 변환하는 과정이 필요하기 때문입니다. 컴퓨터는 프로세서는 오직 0과 1만 이해 할 수 있습니다. 그렇기 때문에 모든 컴퓨터 프로그램은 컴퓨터가 읽을 수 있는 머신 코드로 변환이 되어야 합니다. 그리고 이 과정은 컴파일과 인터프리터를 통해 수행됩니다.

요약하자면 다음과 같습니다.

  • 컴퓨터 프로세서는 오직 0과 1만 이해할 수 있습니다.
  • 모든 컴퓨터 프로그램은 컴퓨터가 읽을 수 있는 머신 코드로 변환 되어야 합니다.
  • 변환 과정은 컴파일과 인터프리터를 통해 일어납니다.

컴파일과 인터프리터의 동작 방식

컴파일(compilation)

컴파일러는 사람들이 읽기 쉽게 작성 된 고성능의 언어(high-level programming language)를 컴퓨터가 읽을 수 있도록 번역해주는 프로그램입니다. — 앞서 말한 바와 같이 컴퓨터는 0과 1만 읽을 수 있습니다. — 컴파일러는 사람이 작성한 코드를 머신 코드로 한번에 변환합니다. 그리고, 이 머신 코드들은 포터블 파일(portable file) 형태로 다시 쓰이게 됩니다. 포터블 파일이란 다른 컴퓨터에서도 실행시킬 수 있도록 만들어 둔 파일이라고 볼 수 있습니다. 대표적으로 자바의 class를 예제로 찾아 볼 수 있는데, 이 글에서는 JS 이야기를 주로 다루고자 관련 내용의 링크만 첨부해두었습니다.

여기서 두 단계가 발생하게 됩니다.

  1. 컴파일러에 의해 머신 코드가 빌드된다.

  2. CPU에서 (즉 말하자면 프로세스)에서 실행된다.

    → 실행은 당연히 컴파일 이후이다.

만약 이 글을 보면서 컴퓨터에서 사용하고 있는 어플리케이션이 있다면, 그 어플리케이션은 이미 컴파일 된 것들입니다. 우리는 컴파일 된 것들을 어플리케이션들을 실행하여 사용하게 됩니다.

인터프리터(Interpretation)

인터프리터 역시 고성능의 언어(high-level language)를 머신 코드로 전환해주는 같은 역할을 수행합니다. 하지만,컴파일러가 프로그램을 실행하기 전에 미리 머신 코드로 컨버팅하는 것과 달리 인터프리터는 실행 시점에 이를 수행합니다.

💡 코드가 읽히는 순간 실행 된다.

인터프리터 언어의 문제가 있다면, 바로 컴파일되는 다른 언어들보다 매우 느리다는 것 입니다. 참고로 많은 사람들이 자바스립트는 인터프리터 언어(interpreted language)로 여기고 있는데 이는 더 이상 사실이 아닙니다. 모던 자바스크립트 엔진에서는 더 나은 퍼포먼스 지원을 위해 JIT컴파일(Just in time compilation)이 이용되고 있습니다.

wikipedia출처

출처 - 위키피디아

JIT 컴파일(Just in time compilation)

JIT는 왜 등장하게 되었을까요? 최근에 우리가 사용하고 있는 발달 된 웹 어플리케이션들 낮은 성능을 용인하고 있지 않습니다. 예를 들어 구글 맵 (혹은 네이버 지도, 카카오 지도 등등)을 이용하는데 드래그 할 때마다 성능이 느려진다면요? 아마 굉장히 답답해 할 것입니다.

모던 자바스크립트 엔진은 이를 보안하기 위해 컴파일(compilation)과 인터프리터(Interpretation)가 섞인 JIT컴파일(just-in-time compilation)을 사용합니다.

이 방식은 기본적으로 전체 코드를 머신 코드로 한번 컴파일 하고 나서 실행시키는 것입니다. 그래서 여기에서는 2 단계로 구성된 기본 컴파일(compilation) 방법을 사용합니다. 하지만, 동시에 포터블 파일(portable file)없이 실행시킨다는 특징을 가지고 있습니다.

그래서 실행을 컴파일 이후에 즉시 일어나게 됩니다. 머신 코드로 한번 컴파일하는 이 방식은 기존에 인터프리터를 통해서 한줄 씩 실행하던 것 보다 자바스크립트의 속도를 크게 향상 시켜줍니다.

JIT가 코드를 AST라고 불리는 구조로 분해하여 작동 시킵니다. 다음 글에서는 JIT가 어떻게 실행되는지 살펴보도록 하겠습니다.


profile
Junior Developer
post-custom-banner

0개의 댓글