1

컴파일 할 때 주소 바인딩이 불가능한 경우 실제/실제 주소로 상대 주소를 연결할 때로드/링크 또는 런타임에서 주소 할당을 수행합니다. 또한 CPU는 실제 주소에 바인딩하기 전에 이러한 상대 주소를 논리 주소로 변환합니다.컴파일러가 생성 한 상대 주소와 이들이 어떻게 (자바가 선호되는) 바이트 코드로 표현 되는가?

논리적에서 물리적으로 변환하는 것은 나에게 알려진 개념입니다. 그러나 나는 상대 주소 지정에 대해 혼란스러워했다. (AFAIK, 그들은 컴파일러에 의해 0에 상대적으로 주어 지거나 할당 되었기 때문에 상대 라 불렀다). 상대 주소가 (바이트 코드로) 어떤 용도로 사용되는지 또는 실제로 필요한지 또는 논리 주소와 동일한 지 여부는 확실하지 않습니다.

+1

RELOCATABLE을 소개하여 발에서 질문을 촬영했습니다. 이것은 지금 시점에서 당신의 이해를 초월하는 독립적 인 개념입니다. –

+0

@ BruceDavidWilner 내가 아는 한. 두 가지 유형의 주소 바인딩이있을 수 있습니다. 논리적이고 상대적이며 상대적입니다. 때로는 상대 주소와 변동 가능 주소 조건은 같은 의미로 사용됩니다. 그래서 그 용어를 사용했습니다. – zgulser

+0

@ BruceDavidWilner하지만 당신의 의견에 동의합니다. Relocatable more는 아직 해결되지 않은 주소를 의미합니다 (그렇게 말한 경우). – zgulser

답변

1

많은 개념을 혼합하고 있습니다. 상대 주소는 절대 주소로 변환 할 기본 주소가 필요한 주소입니다. 그 변환은 많은 방법으로 일어날 수 있습니다. 하나의 웨이는로드시로드를 변환하지만, 메모리 위치에 액세스해야 할 때 수학적으로 상대 주소 지정을 본질적으로 지원하는 CPU 명령어와 함께 사용할 수도 있습니다.

운영 체제가 가상 메모리를 지원하는 경우 일반 프로세스에서 사용되는 모든 주소는 상대 주소 또는 절대 주소를 기준으로 논리적 주소입니다. 논리 주소에서 실제 주소로의 변환은 응용 프로그램의 범위를 벗어나며 질문에서 언급 한 다른 개념과는 독립적입니다.

클래스 파일 형식은 메모리 위치와 관련하여 작동하지 않습니다.

상위 수준에서 "절대"및 "상대"용어를 적용하려는 경우 상수 풀 인덱스는 절대입니다. 실제 인덱스를 식별하는 데 기본 인덱스가 필요하지 않기 때문입니다. 로드 된 파일 내에서 메모리 위치를 찾으려면 클래스 파일이로드 된 주소를 사용해야 할뿐만 아니라 상수 풀이 원하는대로 전체 상수 풀을 원하는 항목까지 구문 분석해야합니다. 다른 바이트 크기. 이러한 이유로 항목은 일반적으로 전혀 조회되지 않습니다. 대신 전체 풀이 단일 패스에서 일정한 항목 크기를 갖는 JVM 특정 표현으로 변환 된 후 JVM은 클래스 파일의 메모리 위치와 별 개인 테이블의 항목을 조회 할 수 있습니다.

바이트 코드 명령어 내에서 상대 오프셋이 사용되므로 절대 위치를 얻으려면 현재 명령어의 위치를 ​​추가해야하지만이 방법이 질문에 지정된 개념에 맞지 않는 점에 유의하십시오. 절대 위치는 여전히 명령어 시퀀스 내의 위치이므로 주소에 대해 말할 때 코드의 메모리 위치에 상대적입니다. 또한 "컴파일 타임에 바인딩이 가능하지 않기"때문에 상대 오프셋은 사용되지 않으며 결과 절대 위치는 컴파일 타임에 알려집니다. Java 바이트 코드 명령 세트는 상대적 오프셋을 사용하여보다 간단한 코드를 허용하도록 정의되었습니다. 지시 집합의 관점에서 본질적으로 상대 주소 지정을 지원한다고 말할 수 있습니다. JVM이 실제로 실행을 구현하는 방법은 JVM에 달려 있습니다.

you mentioned the JVM’s native code generation 이후 JVM이 원시 코드를 생성 할 때 코드의 대상 주소를 알고 있으며 상대 주소 나 절대 주소를 자유롭게 사용할 수 있습니다.

위에서 언급 한 것처럼 위에서 설명한 모든 것은 하나의 프로세스 내에서 발생하므로 운영 체제가 가상 메모리를 사용하는 경우 운영 체제에서 적응할 수있는 논리적 주소로 표시됩니다. MMU를 통해. 이러한 개념은 서로 관련이 없습니다.

+0

이전에 프로세스와 논리적 및 물리적 주소 공간 간의 관계에 대해 읽었습니다. 알림 주셔서 감사. 좀 더 구체적으로, 나는 디 컴파일 된 클래스 파일 (컴파일러에 의해 생성 된)을 읽고 상수 풀, 지역 변수 배열, 바이트 코드 배열 등을 참조하는 많은 숫자를 보려고 노력하고있다. 필연적으로, 나는 그 숫자들을 연관 짓기 위해 노력하고있다. (상대 오프셋, 원한다면) 컴파일러에 아직 묶이지 않았다고 가정 할 때 논리적 인 카운터 파트와 비교합니다. 그리고 위의 관점에서, 그리고 다른 사람들이 말했듯이, 그것은 JVM에 의해 수행됩니다. – zgulser

+0

게다가 실제 주소로 절대 주소를 언급하고 있었고 "이 질문은 귀하의 질문에 지정된 개념에 맞지 않습니다"라는 말의 요지를 얻었습니다. – zgulser

+0

클래스 파일의 숫자를 참조 할 때 "컴파일러에서 아직 바인딩되지 않았습니다."라는 말의 의미가 명확하지 않습니다. 그것들은 실제로 그것들에 의미를 부여한 컴파일러이기 때문에 컴파일러에 의해 모두 바인딩되었습니다.그때와 같이 * 디코딩 된 * 클래스 파일을보고 있다고 말할 때 디코더가 실제 항목 대신 숫자를 표시하기로 결정한 경우 (예 : 상수도 풀 항목). 클래스 파일은 [그냥 파일] (https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html)로, JVM에서 무엇을 할 것인지 알지 못하고 파싱 할 수 있습니다. – Holger

1

자바 바이트 코드는 기본 기계 코드보다 훨씬 높은 추상화 수준에서 작동합니다. 메모리 주소에 대한 개념은 전혀 없습니다. 메소드는 기호 적으로 참조됩니다.

Java 바이트 코드를 생각하는 가장 쉬운 방법은 Java 언어의 초기 버전을 사용하는 것이 실제로는 1 : 1이라는 것입니다. 컴파일러는 지역 변수를 숫자 인덱스로 변환하고 제어 흐름을 수표로 변환하는 것과 같은 일을하지만 대부분은 원래 코드와 매우 비슷합니다.

JVM은 런타임시 바이트 코드를 원시 코드로 해석하거나 컴파일해야합니다.

+0

감사. 실제로 JVM 추상화 및 기호 참조 개념이 있어요. 하지만 좀 더 깊게하려고 노력 중입니다. 우선, 바이트 코드의 상대 주소는 정확히 무엇입니까? 예를 들어 상수 풀 참조 (# 3, # 20 등) 또는 바이트 코드 배열 인덱스 (명령어 0 :, 2 : 4의 왼쪽에있는 것)를 예로들 수 있습니까? 둘째, JVM 실행 엔진은 바이트 코드를 네이티브/머신 코드로 미리 변환하고있다. 이 원시 코드는 직접 실행 가능하거나 실제 물리적 주소에 바인딩하기 위해 MMU를 필터링해야합니까? – zgulser

1

오브젝트의 메모리 주소를 얻는 것은 실제로 자바에서 무의미합니다. JVM이 모든 것을 관리하기 때문입니다.

다른 말로하면 JVM은 어디에 있든지 객체를 "넣습니다". 그리고 그들은 심지어 "움직일"수 있습니다; 예 : 가비지 수집 중.

다른 말로하면, Java 프로그래머로서, 당신은 상관하지 않습니다. 그리고 당신이 신경 쓰면; 당신이 이것에 관해서 할 수있는 것은 아무것도 없습니다.

+0

예, 저는 그것에 대해 관심이 있습니다. :) 그리고 나는 여분의 일을하고 싶지 않습니다. 후드 아래에 무슨 일이 일어나는지 이해하려고 노력합니다. – zgulser

+1

그러면 JVM 구현의 구현 세부 사항을 자세히 살펴 봐야 할 것입니다. – GhostCat

+0

나는주의했다. :) – zgulser