전반적으로 동일한 컴파일러가 다른 플랫폼에서 컴파일 할 때 동일한 소스가 동일한 바이트 코드를 생성 할 것이라는 보장은 없습니다.
예를 들어 일본어를 지원하는 Windows와 같은 다른 언어 (코드 페이지)와 관련된 시나리오를 살펴 보겠습니다. 다중 바이트 문자를 생각하십시오. 컴파일러가 항상 모든 언어를 지원해야한다고 가정하지 않는 한 8 비트 ASCII에 대해 최적화 할 수 있습니다.
SOM (Forman, Conner, Danforth 및 Raper, Proceedings of OOPSLA '95)의 Release-to-Release 바이너리 호환성 프레임 워크 내에서 Java 프로그래밍 언어 바이너리는 작성자가 식별하는 모든 관련 변환에서 바이너리 호환이 가능합니다 (일부 경고 포함). 인스턴스 변수 추가 관련). 이 체계를 사용하여 다음은 Java 프로그래밍 언어가 지원하는 몇 가지 중요한 바이너리 호환 변경 목록입니다.
• 성능 향상을 위해 기존 메서드, 생성자 및 이니셜 라이저를 다시 구현합니다.
• 이전에 일반적으로 발생해서는 안되는 예외를 던 졌거나 무한 루프에 들어가거나 교착 상태를 유발하여 실패한 입력에 대한 값을 반환하도록 메서드 또는 생성자를 변경합니다.
• 기존 클래스 또는 인터페이스에 새 필드, 메서드 또는 생성자를 추가합니다.
• 클래스의 개인 필드, 메서드 또는 생성자를 삭제합니다.
• 전체 패키지가 업데이트되면 기본 (패키지 전용) 액세스 필드, 메서드 또는 패키지의 클래스 및 인터페이스 생성자를 삭제합니다.
• 기존 유형 선언에서 필드, 메서드 또는 생성자를 재정렬합니다.
• 클래스 계층 구조에서 메서드를 위로 이동.
• 클래스 또는 인터페이스의 직접 수퍼 인터페이스 목록 재정렬.
• 유형 계층 구조에 새 클래스 또는 인터페이스 유형을 삽입합니다.
이 장에서는 모든 구현에서 보장되는 바이너리 호환성에 대한 최소 표준을 지정합니다. Java 프로그래밍 언어는 호환 가능한 소스에서 가져온 것으로 알려지지 않았지만 여기에 설명 된 호환 가능한 방식으로 소스가 수정 된 클래스 및 인터페이스의 바이너리가 혼합 될 때 호환성을 보장합니다. 응용 프로그램 릴리스 간의 호환성에 대해 논의하고 있습니다. Java SE 플랫폼 릴리스 간의 호환성에 대한 논의는이 장의 범위를 벗어납니다.