Java

[Java] JIT 컴파일러란? (Just in time compiler)

Razelo 2022. 10. 28. 10:54

Java에서 JIT 컴파일러라는 단어를 들어보았을 것이다.

 

들어보긴 했는데 시간이 지나면서 기억하고 있던 개념이 맞는지 희미해져서 이참에 내용 정리를 해보려고 한다. 

 

기존 컴퓨터 프로그램을 만드는 방법은 두 가지가 있는데 그게 바로 인터프리트 방식과 정적 컴파일 방식이다. 인터프리트 방식은 실행 중에 언어를 읽으면서 대응되는 기계어 코드를 실행하는 것이고 정적 컴파일은 실행하기 전에 이미 프로그램 코드를 기계어로 번역을 마쳐놓는 방식이다. 

 

우선 Just in time Compiler 라는 뜻이고 위에서 언급한 두 가지 방식을 혼합한 방식이라고 생각하면 된다. 

 

실행 시점에 인터프리트 방식으로 기계어 코드를 생성하는데 그 코드를 캐싱해서 같은 함수가 여러 번 불릴 때 매번 기계어 코드를 생성하는 것을 방지한다고 볼 수 있다. 

 

복잡하게 설명했지만 간단하게 보자면 JIT 컴파일러는 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일 기법을 말한다. 

 

예를 들어 test.java 라는 소스코드가 있다고 가정하자. 

이것을 javac.exe 인 자바 컴파일러가 바이트 코드인 test.class 로 변환해준다. 

그리고 이어서 JVM에서는 각 운영체제에 맞게끔 기계어로 번역되어 실행된다. 

 

그렇다면 사용하는 목적은 무엇일까? 

 

JIT 컴파일러는 같은 코드를 매번 해석하지 않고 실행할 때 컴파일을 하면서 그 코드를 캐싱해버린다. 이후에 바뀐 부분이 있으면 그 부분만 컴파일하고 나머지는 캐싱된 코드를 사용한다고 한다. 그래서 이 점 때문에 인터프리터의 속도를 개선할 수 있는 것이다. 

 

정적 컴파일러의 장점을 그대로 가지고 있으면서도 인터프리터의 장점 또한 가져갈 수 있는 방식인 것이다.

 

(개인적인 생각으로는 굳이 어느 쪽에 더 가깝냐를 따져보자면 인터프리터에 좀 더 가까운 형태라고 생각한다. 인터프리터 + 캐싱이기 때문에 그런 생각이 든다.)

 

아래 블로그에서 많은 도움을 받았습니다. 감사합니다. 

https://medium.com/@ahn428/java-jit-%EC%BB%B4%ED%8C%8C%EC%9D%BC%EB%9F%AC-c7d068e29f45

 

추가적으로 위키에도 꽤나 간단명료한 설명이 있어서 첨부한다. 

https://ko.wikipedia.org/wiki/JIT_%EC%BB%B4%ED%8C%8C%EC%9D%BC

 

반응형