본문 바로가기
Software Engineering

[Compile] JIT 컴파일 (Just In Time)

by IsBerry 2021. 6. 17.
반응형

JIT

프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일 기법.

 

  • 컴퓨터 프로그램을 만드는 방법
  1. 인터프리트 방식
  2. 정적 컴파일 방식

인터프리트 방식

실행 중 프로그래밍 언어를 읽어가면서 해당 기능에 대응하는 기계어 코드를 실행


단점: 바이트코드나 소스코드를 최적화 과정이 없이 번역하기 때문에 성능이 낮다.


정적 컴파일

실행 하기 전, 프로그램 코드를 기계어로 번역

단점 : 무조건 컴파일을 해야하기 때문에 다양한 플랫폼에 맞게 컴파일을 하려면 시간이 오래 걸린다.

 

JIT 컴파일러이 두가지 방식 혼합한 방식이다.

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

최근 JVM, .NET, V8(node.js)에서는 JIT 컴파일을 지원함.


자바 프로그램 코드를 바이트 코드로 변환한 다음, 실제 바이트코드를 실행하는 시점에서
JVM이 바이트 코드를 JIT 컴파일을 통해 기계어로 변환함.


JIT 컴파일러는 기계어 변환을 코드가 실행되는 과정에서 실시간으로 일어나며,
전체 코드의 필요한 부분만 변환한다. 기계어로 변환된 코드는 캐시에 저장되기 때문에 재사용시 컴파일을 다시 할 필요가 없다.


JIT는 실행 과정에서 컴파일을 할 수 있기 위해 만들어졌다.
정적 컴파일러 만큼 빠르면서 인터프리터 언어의 빠른 응답속도를 추구하기 위해 사용한다.
바이트 코드 컴파일러가 시간이 많이 소요되는 최적화를 미리 해주기 때문에, 바이트코드에서 기계어 번역은 훨씬 빠르게 진행될 수 있다.

바이트 코드는 이식성이 뛰어나 가상 머신이 설치되어 있으면 빠르게 실행할 수 있다.

단점 : 실행 시 프로그램 분석과 컴파일을 함께 수행하는데 추가 메모리 및 CPU 사이클이 필요함.

         -> 리소스가 많이 소모됨.

정리

JIT는 실행 시점에 인터프리트 방식으로 기계어 코드를 생성하면서 캐싱을 한다.
기계어로 변환된 코드는 캐시에 저장되어 재사용 시 컴파일을 다시 할 필요가 없다.

일반적인 인터프러터 언어에 비해 훨씬 좋은 성능을 낸다.

참고문헌

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

반응형