2012-08-28 14 views
4

동적 언어에서 동적 형식의 코드 JIT가 컴퓨터 코드로 컴파일되는 이유는 무엇입니까? 좀 더 구체적으로 말하면 : 컴파일러가 어느 시점에서 유형을 추론합니까? 아니면 이러한 경우에 엄격하게 해석됩니까?동적 언어는 어떻게 JIT 된가요?

예를 들어

, 내가

def func(arg) 
    if (arg) 
     return 6 
    else 
     return "Hi" 

어떻게 실행 플랫폼은 함수의 반환 형식이 무엇인지 코드를 실행하기 전에 알 수있는 다음과 같은 pseuocode 같은이 있다면?

답변

2

일반적으로 그렇지 않습니다. 그러나, 어느 쪽이든을 입력하고 최적화 할 수 있습니다. 세부 사항은 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 컴파일러의 모든 목적은 그 오버 헤드를 없애기 때문에 합리적인 대안이 없을 때 (또는 여전히 워밍업 상태 일 때)에만 수행 할 것입니다.