일반적으로 그렇지 않습니다. 그러나, 어느 쪽이든을 입력하고 최적화 할 수 있습니다. 세부 사항은 JIT의 종류에 따라 다릅니다.
소위 추적 JIT 컴파일러는 프로그램을 해석하고 관찰하며 단일 실행 (예 : 루프 반복)을 위해 유형, 분기 등을 기록합니다. 그들은이 관측치를 기록하고, 코드가 실행될 때 이러한 가정이 여전히 유효하다는 (매우 빠른) 확인을 삽입 한 다음, 이러한 결과에 따라 다음 코드를 최적화합니다. 예를 들어, 인수가 계속 true 인 루프에서 함수를 호출하면 JIT 컴파일러는 먼저 이와 같은 명령어를 기록합니다 (호출 프레임 관리, 메모리 할당, 변수 간접 참조 등은 무시합니다. 중요하지 않습니다,하지만 그들은 코드를 많이 가지고 너무 멀리 최적화) 때문에 :
가
; calculate arg
; may even be elided, arg may be constant without you realizing it
guard_true(arg)
; guard_is_boxed_int constant-folded away
; unbox_int constant-folded away
; add_int constant-folded away
int i3 = 7
가드도 이동할 수 있습니다 허용하려면 다음
; calculate arg
guard_true(arg)
boxed_object o1 = box_int(6)
guard_is_boxed_int(o1)
int i1 = unbox_int(o1)
int i2 = 1
i3 = add_int(res2, res3)
을 다음과 같이 그것을 최적화 이전 코드 최적화, 경비원 수를 줄이기 위해 결합, 중복되는 경우 생략, 강화 d는 더 많은 최적화를 허용합니다. 가드가 너무 자주 실패하거나 쓸모 없게 된 코드는 버려지거나 가드 실패시 다른 버전으로 건너 뛰도록 패치 할 수 있습니다.
다른 JIT는보다 정적 인 접근 방식을 취합니다. 예를 들어, 적어도 몇 가지 작업을 인식하기 위해 신속하고 부정확 한 형식 유추를 수행 할 수 있습니다. 일부 JIT 컴파일러는 함수 범위에서만 작동하므로 (일부에서는 메소드 JIT 컴파일러라고 함) 코드 조각을 많이 만들 수 없습니다 (JIT 컴파일러를 추적하는 한 가지 이유는 매우 인기가 있습니다). 그럼에도 불구하고 모질라의 자바 스크립트 엔진 최신 버전 인 Ion Monkey이 존재합니다. 물론 JIT 추적에서도 영감을 얻은 것 같습니다. 계속 유효하지 않은 추가 최적화 (예 : 나중에 변경할 수있는 함수 인라인)를 삽입하고 잘못되었을 때 제거 할 수도 있습니다.
그 밖의 모든 것이 실패하면 통역사가 수행하는 작업, 상자 개체, 포인터를 사용하여 데이터에 태그를 지정하고 태그를 기반으로 코드를 선택할 수 있습니다. 그러나 이것은 매우 비효율적이며, JIT 컴파일러의 모든 목적은 그 오버 헤드를 없애기 때문에 합리적인 대안이 없을 때 (또는 여전히 워밍업 상태 일 때)에만 수행 할 것입니다.