결론부터 이야기하면 컴퓨터가 읽을 수 있도록 파일을 변환하는 과정이 필요하기 때문입니다. 컴퓨터는 프로세서는 오직 0과 1만 이해 할 수 있습니다. 그렇기 때문에 모든 컴퓨터 프로그램은 컴퓨터가 읽을 수 있는 머신 코드로 변환이 되어야 합니다. 그리고 이 과정은 컴파일과 인터프리터를 통해 수행됩니다.
요약하자면 다음과 같습니다.
컴파일러는 사람들이 읽기 쉽게 작성 된 고성능의 언어(high-level programming language)를 컴퓨터가 읽을 수 있도록 번역해주는 프로그램입니다. — 앞서 말한 바와 같이 컴퓨터는 0과 1만 읽을 수 있습니다. — 컴파일러는 사람이 작성한 코드를 머신 코드로 한번에 변환합니다. 그리고, 이 머신 코드들은 포터블 파일(portable file) 형태로 다시 쓰이게 됩니다. 포터블 파일이란 다른 컴퓨터에서도 실행시킬 수 있도록 만들어 둔 파일이라고 볼 수 있습니다. 대표적으로 자바의 class를 예제로 찾아 볼 수 있는데, 이 글에서는 JS 이야기를 주로 다루고자 관련 내용의 링크만 첨부해두었습니다.
여기서 두 단계가 발생하게 됩니다.
컴파일러에 의해 머신 코드가 빌드된다.
CPU에서 (즉 말하자면 프로세스)에서 실행된다.
→ 실행은 당연히 컴파일 이후이다.
만약 이 글을 보면서 컴퓨터에서 사용하고 있는 어플리케이션이 있다면, 그 어플리케이션은 이미 컴파일 된 것들입니다. 우리는 컴파일 된 것들을 어플리케이션들을 실행하여 사용하게 됩니다.
인터프리터 역시 고성능의 언어(high-level language)를 머신 코드로 전환해주는 같은 역할을 수행합니다. 하지만,컴파일러가 프로그램을 실행하기 전에 미리 머신 코드로 컨버팅하는 것과 달리 인터프리터는 실행 시점에 이를 수행합니다.
💡 코드가 읽히는 순간 실행 된다.인터프리터 언어의 문제가 있다면, 바로 컴파일되는 다른 언어들보다 매우 느리다는 것 입니다. 참고로 많은 사람들이 자바스립트는 인터프리터 언어(interpreted language)로 여기고 있는데 이는 더 이상 사실이 아닙니다. 모던 자바스크립트 엔진에서는 더 나은 퍼포먼스 지원을 위해 JIT컴파일(Just in time compilation)이 이용되고 있습니다.
출처 - 위키피디아
JIT는 왜 등장하게 되었을까요? 최근에 우리가 사용하고 있는 발달 된 웹 어플리케이션들 낮은 성능을 용인하고 있지 않습니다. 예를 들어 구글 맵 (혹은 네이버 지도, 카카오 지도 등등)을 이용하는데 드래그 할 때마다 성능이 느려진다면요? 아마 굉장히 답답해 할 것입니다.
모던 자바스크립트 엔진은 이를 보안하기 위해 컴파일(compilation)과 인터프리터(Interpretation)가 섞인 JIT컴파일(just-in-time compilation)을 사용합니다.
이 방식은 기본적으로 전체 코드를 머신 코드로 한번 컴파일 하고 나서 실행시키는 것입니다. 그래서 여기에서는 2 단계로 구성된 기본 컴파일(compilation) 방법을 사용합니다. 하지만, 동시에 포터블 파일(portable file)없이 실행시킨다는 특징을 가지고 있습니다.
그래서 실행을 컴파일 이후에 즉시 일어나게 됩니다. 머신 코드로 한번 컴파일하는 이 방식은 기존에 인터프리터를 통해서 한줄 씩 실행하던 것 보다 자바스크립트의 속도를 크게 향상 시켜줍니다.
JIT가 코드를 AST라고 불리는 구조로 분해하여 작동 시킵니다. 다음 글에서는 JIT가 어떻게 실행되는지 살펴보도록 하겠습니다.
AST In JavaScript
Abstract syntax trees on Javascript
V8에서 JS 코드가 실행되는 방법
V8 에서 Javascript 코드를 실행하는 방법 정리해보기
Compiler와 Interpretar
Compiler Vs. Interpreter: What's the Difference?
왜 자바는 portable한 언어인가?
Why is Java a portable language? - Marco Paroni Blog