(자알쓰) JIT 컴파일

자알쓰란?

바스크립트 자. (잘 쓰자는 의미도 담겨있다.)
자바스크립트라는 언어 자체는 내 기준에서는 설계 상 미스가 참 많다.
함수 단위의 스코프, 호이스팅, 동적 타입 등등
자바와 같은 깐깐(?)한 언어를 배우고 바라본 자스는 허점 투성이처럼 보였다.
애초에 자바스크립트는 어떠한 프로그램을 만들기 위해서 탄생했다기 보다는
웹 페이지에 입력값에 대한 유효성 검사(데이터가 공란인지 아닌지 등등)와 같은
페이지의 동적 제어가 주된 목적 + 짧은 개발 기간(넷 스케이프 사의 새로운 브라우저에 탑재 예정) 때문에
설계 상에 미스가 있을 수 밖에 없다고 나는 생각된다.
일종의 안전 장치가 없어서 개발자가 일일이 구현해주고, 신경써야 하는 느낌이었다.
그렇다고 해서 자바스크립트를 극혐하거나 그런 것은 아니고 매우 사랑한다.
또한 그 허점을 아는 사람은 허점을 보완해서 요리조리 피해서 잘 쓰겠지만…
잘 모르는 부분들은 잘못 써도 동작이 잘 되기 마련이다.
이는 지금 당장에는 큰 문제가 안 될지 모르겠지만, 추후에 대규모 웹 어플리케이션을 만들거나
직면할 문제로부터 미리 해방시키기 위해 처음부터 좋은 습관을 들여가는 것이 좋다고 생각한다.
이번에는 쉬어가는 타임으로 번외편 격인 JIT 컴파일에 대해 간단히 다뤄보았다.

자바스크립트는 인터스크립트 언어이다?

책을 보면 위와 같이 말하는 경우가 존재한다.
인터스크립트가 뭔데?에서 부터 막힌다면 아래 내용을 봐보자.

컴퓨터는 우리의 소스코드를 어떻게 이해할까?

기본적으로 컴퓨터는 기계어(2진수(0과 1)로 이루어진 코드) 밖에 해석하지 못한다.
바보 녀석 ㅎㅎ
왜 10진수가 아닌 2진수를 사용하게 됐는지 궁금한 사람은 컴퓨터에서 2진수, 8진수, 16진수를 쓰게 된 이유를 참고하자.

따라서 우리가 작성한 var a = 'a'라는 코드를 기계어로 바꿔주는 행위를 해야한다.

이걸 사람이 직접 바꿔줘야할까…?
매우 비효율적이므로 당연히 이를 도와주는 도구가 있는데 그 중 하나가 인터프리터이다.

인터프리트란…?(Interpret)

코드를 실행하면서 한 줄 한 줄 기계어로 변환 후 실행하는 걸 인터프리트(Interpret)라고 한다.
이 인터프리트하는 녀석을 인터프리터라고 부른다.
자바스크립트는 이런 인터프리트 방식을 채택한 프로그래밍 언어였었다.

자바스크립트는 이런 인터프리트 방식을 채택한 프로그래밍 언어였었다라고…?
그럼 과거에는 그렇고 지금은 아니라는 말인가…?

모던 브라우저의 자바스크립트 엔진은 모두 JIT 컴파일 방식으로 Javascript 코드를 해석하고 있다.

  • 구글에서 개발한 V8(크롬, 오페라와 Node.js)
  • 모질라에서 개발한 TraceMonkey(파이어폭스 3.5+부터 탑재)
  • MS에서 개발한 Chakra(IE9+부터 탑재)
  • Webkit 엔진에 탑재된 JavascriptCore(Safari에 탑재)

컴파일이란…?(Compile)

이 JIT 컴파일에 대해 알아보기 이전에 컴파일에 대해 알아보도록 하자.
우리가 짠 코드 전체를 한 번에 기계어로 변환해주는 걸 말한다.
이러한 일을 컴파일러(Compiler)가 대신해준다.

JIT 컴파일이란…?(Just in Time Compile)

컴파일 방식과 인터프리트 방식의 장점을 짬뽕한 녀석이라고 보면 된다.
컴파일 방식은 기계어로 컴파일 된 코드를 바로 실행하므로 빠른 실행 속도를 보장 받는다.
인터프리트 방식은 소스가 수정돼도 귀찮게 매번 컴파일을 하지 않아도 된다는 장점이 존재한다.
이 JIT 컴파일 방식은 프로그램을 실행하는 시점에서 필요한 부분을 즉석에서 컴파일하는 방식이라 동적 컴파일(Dynamic Compile)이라고도 부른다.
당연히 과거 인터프리트 방식보다 성능 측면에서 향상이 있어서 사용한다고 보면 될 것 같다.
인터프리트는 한줄씩 해석 - 실행 - 해석 - 실행의 반복인데
JIT 컴파일은 실행할 때 한번에 해석 - 실행이기 때문이다.

결론적으로 자바스크립트가 인터프리트 언어라는 것은 과거에나 먹힐 법한 말이고 모던 브라우저(최신 브라우저)와 Node에서는 JIT 컴파일 언어라로 부르는 것이 맞다.