2015-01-10 1 views
1

거의 모든 바이트 코드는 런타임시 스택에서 찾을 피연산자 유형을 알고 있습니다. 바이트 코드 검증자는 이러한 유형 만 실제로 발견된다는 것을 확인합니다 (모든 경로에 대해) 런타임에서 해석기가 예상 한 값을 올리면 모든 것이 잘되어야합니다.스택 엔트리가 int인지 long인지를 JVM이 어떻게 결정할 수 있습니까?

그러나 피연산자 유형을 알아야하는 몇 가지 지침이 있습니다. 일부 피연산자가 범주 2 인 경우 다른 양식을 갖는 'dup'바이트 코드 (long & double). 확인 중에는 이전 푸시 지침에서 long을 'long'유형과 'top'유형으로 푸시하여 long이 있음을 확인하는 의사 확인 유형을 사용하므로 쉽습니다 ('상단'도 찾음). .

하지만 런타임에서 어떻게 이것을 결정합니까?

모두 안녕하세요, 원래 질문에 "일부 'dup'바이트 코드"는 좀 더 구체적이어야합니다. 즉, 더 복잡한 'dup_x2', 'dup_2', 'dup2_x1'및 'dup2_x2' 스택에 무엇이 있는지에 따라 달라지며, long이나 double을 만나면 다른 일을 할 것입니다.

제 질문은 값이 1 항목 int 또는 2 값 long/double인지 여부에 따라 런타임에서 결정할 수있는 방법입니다. 덕분에

+0

아마도 유형이 스택으로 푸시 되나요? 나는 여기서 추측하고있다. – ShellFish

+0

"런타임에서 어떻게 이것을 결정합니까?" 그것은 int와 longs를 가진 작업을위한 별도의 명령어가있는 이유입니다. – yole

+0

'DUP'는'long' 또는'double' 타입 ('DUP2' is)과 함께 사용되지 않습니다. – August

답변

1

dup 명령은 유형을 신경 쓰지 않습니다. 그들은 x 개의 스택 슬롯을 맹목적으로 복제하여 적절하게 배치합니다. dup2은 하나의 long뿐만 아니라 2 개의 int (또는 float과 reference 등)를 복제합니다.

한 가지주의 사항은 검증자가 여전히 긴/이중 중 하나의 단어가 분리되어 있지 않은지 확인해야한다는 것입니다. 하지만 이것은 dup 지침에만 적용되는 것은 아닙니다.

바이트 코드의 모든 지점에있는 모든 스택 또는 로컬 슬롯에는 검증 자의 데이터 흐름 분석에 의해 정의 된 암시 적 유형이 있습니다. (이후의 바이트 코드 버전에서는 검증자를보다 효율적으로 만들기 위해 클래스 파일에 유형 주석 (Java 레벨 주석과 혼동하지 말아야 함)이 있습니다.

+0

예, 1 단어/2 단어 스택 구성표는 절반 JVM 아키텍처에서 주요한 실수를 범하지는 않지만 검증자가이를 보장하고 런타임은 세부 사항을 알 필요가 없습니다. –

+1

("유형 주석"을 사용하면 이론적으로 검증자가 더 빠르지 만 나사못이 많으므로 더 효율적입니다.) –

+0

설명을 주셔서 감사합니다. 설명이 단지 맹목적으로 말하면서 다른 일이 발생하는 것처럼 보일뿐입니다. 슬롯을 셔플하고 검증자는 이미 롱/더블이 쪼개지 않음을 확인했습니다. –

관련 문제