JIT 컴파일: 두 판 사이의 차이

내용 삭제됨 내용 추가됨
잔글 JIT 컴파일은 실행속도를 빠르게 하는데 기여하지 않고 오히려 반대로 실행속도를 느리게 합니다. 프로그램이 실행되기 전 컴파일을 한 경우에 비해, JIT는 runtime에 사용자의 코드를 기계어로 번역하는 과정이 추가되고 (이전에 번역한 적이 없을 때) 이로 인한 지연으로 인하여 더 느린 성능을 보이게 됩니다.
Dleh428 (토론 | 기여)
JIT 컴파일 개요추가- 영어 위키 번역(링크 연결과 citation 연결 필요)
7번째 줄:
 
최근의 [[자바 가상 머신]]과 .NET, [[크롬 V8|V8]](node.js)에서는 JIT 컴파일을 지원한다. 즉, 자바 컴파일러가 [[자바 프로그래밍 언어|자바 프로그램 코드]]를 [[바이트코드]]로 변환한 다음, 실제 바이트코드를 실행하는 시점에서 자바 가상 머신이 바이트코드를 JIT 컴파일을 통해 기계어로 변환한다.
 
== 개요 ==
 
바이트코드 컴파일러는 소스 코드를 중간언어인 바이트코드로 변환한다. 바이트코드는 기계어는 아니지만 가상 머신에 의해 기계어로 손쉽게 변환할 수 있는 코드이다. JIT 컴파일러는 바이트코드를 읽어 빠른 속도로 기계어를 생성할 수 있다. 이런 기계어 변환은 코드가 실행되기 직전 실시간으로 일어나며(그래서 Just-In-Time이다), 전체 파일을 컴파일할 수 있지만 필요한 코드만 변환할 수 있다. 기계어로 변환된 코드는 캐시에 저장되어 컴파일을 하지않아도 재사용할 수 있다.
 
일반적인 인터프러터 언어(예시: cpython)는 바이트코드나 소스코드를 최적화 과정이 없기 때문에 성능이 낮다. 반면 정적으로 컴파일하는 언어(예시: c 언어)는 실행 전에 무조건 컴파일을 해야하고 이는 시간이 오래 걸린다. ''동적 컴파일 환경''은 실행 과정에서 컴파일을 할 수 있기 위해 만들어졌다. JIT는 정적 컴파일러 만큼 빠르면서 인터프러터 언어의 빠른 응답속도를 추구하기 위해 사용한다. 바이트코드 컴파일러가 시간이 많이 소요되는 최적화를 미리 해주기 때문에 바이트코드에서 기계어 번역은 훨씬 빠르게 진행될 수 있다. 또한 바이트코드는 이식성이 뛰어나 가상 머신이 설치되어 있으면 빠르게 실행할 수 있다. 플랫폼 별로 가상 머신을 개발하는 과정은 컴파일러를 만드는 간단한데, 그 이유는
 
# 복잡한 최적화 과정은 바이트코드 인터프러터가 대신 해준다.
# 바이트코드는 빠른 기계어 변환을 목적으로 설계되었기 때문에 컴파일러 과정이 훨씬 편하다.
 
JIT 코드는 일반적인 인터프러터 언어에 비해 훨씬 좋은 성능을 낸다. 심지어 경우에 따라 정적 컴파일러 언어보다 좋은 성능을 내곤 하는데, 이는 실행 과정에 컴파일을 할 수 있기 때문에 가지는 장점이라고 할 수 있다:
 
# 컴파일이 cpu나 운영체제에 따라 다르게 진행될 수 있다. 예를 들어 cpu가 SSE2 vector instruction을 지원한다면 cpu는 이를 활용하는 방법으로 최적화를 진행한다.
# 정적 컴파일러 언어로 Garbage Collection을 지원하게 만들 수 있지만, JIT 시스템을 이용하면 더 쉽게 GC를 사용할 수 있다.
 
== 역사 ==