2016-06-12 1 views
0

런타임시 IL 또는 바이트 코드를 실행 가능 명령어로 변환하는 JIT 인터프리터를 설계한다고 가정 해 보겠습니다. 코드에서 변수 이름이 발견 될 때마다 JIT 인터프리터는이를 해당 메모리 주소로 변환해야합니다. 맞습니까?JIT 인터프리터는 변수 이름을 어떻게 처리합니까?

Performant에서 변수 참조를 해결하기 위해 JIT 해석기가 사용하는 기법은 무엇입니까? 그들은 해싱을 사용합니까, 변수가 미리 주소로 컴파일되어 있습니까? 아니면 완전히 누락 된 것입니까?

+0

프로그램의 개념 설계에 더 적합한 [Programmers Exchange] (http://programmers.stackexchange.com/)에서 더 궁금한 점이있을 것입니다. – Singular1ty

+0

감사합니다. –

+1

Nit : "JIT 해석기"는 모순입니다. JIT 컴파일러와 인터프리터는 종종 함께 패키지되지만 용어는 상호 배타적입니다. –

답변

2

일반적으로 JIT를 디자인하는 방법에 대한 다양한 답변이있는 것과 마찬가지로이 질문에 대한 가능한 답변은 매우 다양합니다.

그러나 한 가지 예를 들자면 JVM을 고려해보십시오. 자바 바이트 코드는 실제로 디버깅/리플렉션 메타 데이터를 제외하고는 변수 이름을 전혀 포함하지 않습니다. 대신 컴파일러는 각 변수에 0에서 65535까지의 "인덱스"를 할당하고 바이트 코드 명령어는 해당 인덱스를 사용합니다. 그러나 VM은 원하는 경우 추가 최적화를 자유롭게 할 수 있습니다. 예를 들어 모든 것을 SSA 형식으로 변환 한 다음 기계 코드로 컴파일 할 수 있습니다.이 경우 변수는 결국 스택 프레임의 기계 레지스터 또는 고정 오프셋으로 변환되거나 완전히 최적화됩니다.

다른 예로 CPython을 생각해보십시오. 파이썬은 실제로 높은 수준의 유연한 특성 때문에 런타임에 변수 이름을 유지합니다. 그러나 인터 퍼터는 여전히 몇 가지 최적화를 수행합니다. 예를 들어, __slots__ 속성이있는 클래스는 필드에 고정 크기 배열을 할당하고 동적 조회를 위해 name -> index hashmap을 사용합니다. 구현에 익숙하지는 않지만 로컬 변수와 비슷한 것을 수행한다고 생각합니다. 정상 로컬 변수 액세스 (리플렉션을 사용하지 않음)는 "컴파일"시간에 고정 오프셋으로 변환 될 수 있습니다. 그래서 짧은

,

에 대한 대답들이 미리 주소로 컴파일 된 변수는, 해시를 사용하거나 내가 완전히 뭔가를 놓치고 있습니까?

입니다.

+0

흥미 롭다면, SSA 양식 해싱과 이름 해싱이 가장 가능성이 큰 후보로 보인다. AOT 세대와 혼합 된 것들은 사용 된 기술이라고 생각합니다. –

관련 문제