학부과정/프로그래밍언어론

Just in Time(JIT)컴파일러는 무엇인가?

khao 2017. 3. 7. 12:14

JIT컴파일러는 프로그램이 실행될 때 기계어로 컴파일 하는 방식입니다.

사용하게 될 경우 CPU에 직접 관여하는 네이티브 코드(=기계어)를 작성하여 프로그램을 구동시키며 프로그램의 동적(dynamic)인 실행환경(runtime)에 작동하기 때문에 한번에 모든 내용을 컴파일하는 일반적인 컴파일러보다 빈번하게 컴파일이 발생합니다. 만약 이미 컴파일된 내용이라면 JIT이 다시 컴파일하지 않고 해당 컴파일된 코드를 사용합니다.


JIT은 실행할 때 컴파일을 한다는 점이 중요합니다. 기존의 컴파일된 프로그램은 실행하려는 플랫폼(대표적으로 운영체제)에게 강한 종속을 받습니다. 만약 윈도우에서 컴파일을 했다면 이 프로그램을 단순히 Ctrl-C, Ctrl-V하는 식으로는 리눅스에서 쓸 수 없습니다. 프로그램이 리눅스에 필요하다면 리눅스에서 컴파일을 해야 합니다. (하지만 대부분의 경우 코드를 다시 짜는 일이 발생하는데, 이는 시스템 콜이 다르기 때문입니다. 간단한 콘솔 프로그램이라면 큰 변화가 필요없지만, UI가 들어가고 시스템에 관련되는 활동이 생기는 경우에는 프로그램이 절대 호환되지 않습니다.)


JIT은 기존의 컴파일 방식의 문제점을 중간에서 플랫폼에 맞게 변경해주는 방식으로 해결했습니다. 컴파일이라는 이름답게 속도 역시 기존 방식으로 컴파일된 프로그램들과 크게 차이나지 않습니다. JIT을 인터프리터 언어에 적용할 경우, 인터프리터 언어가 가진 유연한 플랫폼 특성과 컴파일 방식 특유의 빠른 속도를 모두 가질 수 있습니다.



하지만 JIT이 만능은 아닙니다. JIT을 사용하게 될 경우 컴파일을 실행시간에 하기 때문에 프로그램과 컴파일이 동시에 이뤄집니다. 다르게 생각해보면 컴파일할 때 필요한 자원을 실행시간에 공유하게 된다는 의미인데, 심각하리만큼 큰 단점은 아니지만 프로그램의 작업 환경에 따라 중요한 문제로 다가올 수 있습니다. (제 3국가에서 쓰는 저가형 컴퓨터, 또는 임베디드 시스템. 근데 임베디드에서 이런 걸 쓸 리 없어보이는데 임베디드 자바를 생각하면 아닌 것 같기도 하고.)