문제

"바이트코드 프로그램은 일반적으로 한 번에 하나씩 명령어를 구문 분석하여 실행됩니다.이러한 종류의 바이트코드 해석기는 이식성이 매우 뛰어납니다.동적 변환기 또는 "JIT(Just-In-Time)" 컴파일러라고 하는 일부 시스템은 런타임 시 필요에 따라 바이트코드를 기계어로 변환합니다.이로 인해 가상 머신을 이식할 수 없게 됩니다."

이 단락에 대한 질문은 다음과 같습니다.바이트 코드가 처리 된 후에는 구문 분석 명령어와 기계 언어 (또는 기계 코드)의 차이점은 무엇입니까?

도움이 되었습니까?

해결책

JIT는 바이트 코드 통역사와 다릅니다.

다음 c 함수를 고려하십시오.

int sum() {
   return 5 + 6;
}

직접 기계 코드로 컴파일됩니다. x86 및 ARM 프로세서에 대한 정확한 지침은 다릅니다.

기본 바이트 코드 통역사를 작성하면 다음과 같은 것처럼 보일 수 있습니다.

for(;;) {
   switch(*currentInstruction++) {
   case OP_PUSHINT:
      *stack++ = nextInt(currentInstruction);
      break;
   case OP_ADD:
      --stack;
      stack[-1].add(*stack);
      break;
   case OP_RETURN:
      return stack[-1];
   }
}

그런 다음 다음 지침 세트를 해석 할 수 있습니다.

OP_PUSHINT (5)
OP_PUSHINT (6)
OP_ADD
OP_RETURN

X86 또는 ARM 모두에서 바이트 코드 인터프리터를 컴파일 한 경우 통역사를 더 이상 다시 쓰지 않고도 동일한 바이트 코드를 실행할 수 있습니다.

JIT 컴파일러를 작성한 경우 각 지원되는 프로세서에 대한 프로세서 별 지침 (기계 코드)을 방출 해야하는 반면, 바이트 코드 통역사는 프로세서 특정 지침을 방출하기 위해 C ++ 컴파일러에 의존하고 있습니다.

다른 팁

바이트코드 인터프리터에서 명령어 형식은 일반적으로 시프트 및 마스크 연산자를 사용하여 매우 빠른 "파싱"을 위해 설계되었습니다.인터프리터는 명령을 "파싱"(나는 "디코딩"을 선호함)한 후 즉시 가상 머신의 상태를 업데이트하고 다음 명령의 디코딩을 시작합니다.따라서 바이트코드가 처리된 후 통역사, 잔여물이 남지 않습니다.

JIT 컴파일러에서 바이트는 단일 명령어보다 큰 단위로 처리됩니다.최소 단위는 기본 블록이지만 최신 JIT는 더 큰 경로를 기계어 코드로 변환합니다.이것은 번역 단계 및 번역 단계의 출력 ~이다 기계어 코드.원본 바이트코드는 메모리에 남아 있을 수 있지만 구현에 사용되지 않으므로 실제 차이는 없습니다.(JIT된 가상 머신의 기계어 코드가 네이티브 코드 컴파일러에서 생성된 기계어 코드와 다른 작업을 수행하는 것이 여전히 일반적이지만)

차이가 없습니다. JIT 컴파일러는 정확히 수행됩니다. 하드웨어에서 실행되는 기계 코드를 생성합니다.

궁극적으로 모든 것이 기계 지침으로 귀결됩니다.

  1. 기본 앱 - 직접 실행되는 기계 지침이 포함되어 있습니다.
  2. JIT 앱 - 바이트 코드는 기계 지침으로 컴파일되어 실행됩니다.
  3. 번역 된 앱 - 바이트 코드는 기본 앱인 가상 머신으로 번역됩니다.

당신이 알 수 있듯이, #1에서는 #3을 사용하는 동안 오버 헤드가 가장 적습니다. 오버 헤드가 가장 많습니다. 따라서 최초 컴파일 오버 헤드 후 #1에서 성능이 가장 빠르며 #2에서 가장 빠릅니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top