현재 Java와 유사한 언어 용 컴파일러를 작성하는 코드 생성 단계에 있습니다. 가상 메서드에 대한 동적 디스패치를 구현하는 방법을 이해하려고합니다.동적 디스패치 구현 - 가상 함수 테이블 오프셋
모든 클래스에 가상 함수 테이블을 작성하고 모든 개체에 포인터를 저장하는 방법을 알게되었습니다. 내가 얻지 못하는 것은 함수 호출을위한 코드를 생성 할 때 테이블에서 그 함수의 오프셋이 무엇인지를 어떻게 알 수 있는가?
감사합니다.
현재 Java와 유사한 언어 용 컴파일러를 작성하는 코드 생성 단계에 있습니다. 가상 메서드에 대한 동적 디스패치를 구현하는 방법을 이해하려고합니다.동적 디스패치 구현 - 가상 함수 테이블 오프셋
모든 클래스에 가상 함수 테이블을 작성하고 모든 개체에 포인터를 저장하는 방법을 알게되었습니다. 내가 얻지 못하는 것은 함수 호출을위한 코드를 생성 할 때 테이블에서 그 함수의 오프셋이 무엇인지를 어떻게 알 수 있는가?
감사합니다.
한국어로 무엇이 있는지 어떻게 알 수 있습니까? 파싱하는 동안 어딘가에 적어 둡니다.
내가 장난감 언어 중 하나에서 한 것은 각 클래스에 대해 "vtable 크기"를 유지하는 것이었고 클래스에 새 메서드를 추가하면 vtable 크기를 메서드의 오프셋으로 어딘가에 적습니다 즉, 메서드 이름을 vtable의 매개 변수 유형 및 오프셋과 같은 정보에 매핑하는 조회 테이블을 만든 다음 새로 추가 된 메서드를 설명하기 위해 크기에 추가합니다.
물론 이것은 사용자 언어가 실제로 C++와 같은 vtable을 사용한다고 가정합니다. Smalltalk 또는 Objective-C 스타일로 메시징을 사용하는 경우 빌드 한이 테이블은 실제로 컴파일 된 제품에 저장되어 바로 사용됩니다. 이제 테이블 조회는 오프셋에 직접 액세스하는 것보다 느리지 만 호출자가 메서드를 호출하기 위해 객체의 유형을 알 필요가없고 메서드를 호출하지 않고 객체에 메서드를 쉽게 추가 할 수 있다는 이점이 있습니다 전체 프로그램을 다시 컴파일하십시오.
이것은 언어, 컴파일러 및 2 진 표현에 대한 디자인 질문입니다. JLS 및 JVM 사양을 연구하여 Java가 (Java에 대해 언급 한 이후로) Java가 수행하는 방법에 대한 통찰력을 얻을 수 있지만 변형 및 전체 대안을 고려할 수 있습니다. 전반적으로이 질문은 여기에 답변하기에는 너무 광범위합니다. –
데이터 멤버의 오프셋을 어떻게 알 수 있습니까? 이 두 가지 문제는 어떻게 다른가요? – rici