programing

JDK는 "상향"또는 "역방향"과 호환됩니까?

nasanasas 2020. 12. 4. 08:24
반응형

JDK는 "상향"또는 "역방향"과 호환됩니까?


이전 버전과의 바이너리 호환성 (또는 하향 호환성) - 새 (에서 실행되도록 라이브러리 API의 이전 버전에 내장 된 클라이언트의 능력 위키 ).

상향 이진 호환성 (또는 순방향 호환성)-새 버전의 라이브러리 API로 빌드 된 클라이언트가 이전 버전에서 실행되는 기능 ( wiki ).

1.4.2 이후 J2SE 5.0의 JDK 비 호환성에 대한 일반적인 Sun 문서 (및 J2SE 5.0 과의 Java SE 6 호환성 도 있음)에서는 JDK의 호환성을 다음과 같이 설명합니다.

JDK 5.0은 아래 나열된 비 호환성을 제외하고 Java 2 SDK, v1.4.2와 상위 바이너리 호환됩니다. 즉, 언급 된 비 호환성을 제외하고 버전 1.4.2 컴파일러로 빌드 된 클래스 파일은 JDK 5.0에서 올바르게 실행됩니다 .

문서 작성자 가이 문장에서 "위쪽"과 "역방향"호환성이라는 용어를 혼동 했다고 생각합니다 . "역방향"호환성을 설명하지만이 기능을 "상위"호환성이라고합니다.

오타, 실수 또는 의도 된 용어입니까? JDK는 "상향"또는 "역방향"과 호환됩니까?


어떤 것이 이전 버전과 호환 되려면 이전 버전과 호환되는 상대가 있어야합니다 (의도적 으로든 의도하지 않았 든). 예를 들어 : DVD 리더는 CD와 역 호환이 가능한가요? 아니면 CD가 DVD 리더와 역 호환이 가능한가요?

이 경우 컴파일러 (또는 생성하는 바이트 코드) 또는 가상 머신을 보는지 여부에 따라 다릅니다.

Java5 JDK로 생성 된 바이트 코드는 Java 1.4 jvm에서 실행되지 않기 때문에 컴파일러는 이전 버전과 호환되지 않습니다 ( -target 1.4플래그로 컴파일되지 않은 경우 ). 그러나 JVM은 이전 바이트 코드를 실행할 수 있으므로 이전 버전과 호환됩니다.

그래서 나는 그들이 javac의 관점에서 호환성을 고려하기로 결정했다고 생각합니다 (JDK에 특정한 부분이기 때문에), 생성 된 바이트 코드가 jvm의 향후 릴리스에서 실행될 수 있음을 의미합니다 (JRE와 더 관련이 있습니다) , JDK에도 번들로 제공됨).

간단히 말해 다음과 같이 말할 수 있습니다.

  • JDK는 (일반적으로) 포워드 호환됩니다.
  • JRE는 (일반적으로) 이전 버전과 호환됩니다.

(그리고 그것은 또한 오래 전에 배워야 할 교훈 역할을합니다. 컴파일러를 작성하는 사람들은 보통 옳고, 우리는 그것들을 잘못된 xD를 사용하는 사람들입니다)

그건 그렇고, 그것들을 섞는 것보다 뒤로 / 앞으로 및 아래로 / 위로 쌍을 이루는 것이 더 합리적이지 않습니까?


최신 Java를 포함하도록 답변 확장…

Java SE 7 및 JDK 7 호환성

오라클의 날짜가 표기되지 않은 페이지의 인용문 :

호환성은 복잡한 문제입니다. 이 문서에서는 Java 플랫폼 릴리스와 관련된 세 가지 유형의 잠재적 인 비 호환성에 대해 설명합니다.

  1. 소스 : 소스 호환성은 코드가 여전히 컴파일되는지 여부를 포함하여 Java 소스 코드를 클래스 파일로 변환하는 것과 관련이 있습니다.
  2. 바이너리 : 바이너리 호환성은 오류없이 링크 할 수있는 능력을 유지하는 것으로 Java 언어 사양에 정의되어 있습니다.
  3. 동작 : 동작 호환성에는 런타임에 실행되는 코드의 의미가 포함됩니다.

… 그리고

Java SE 7과 Java SE 6 간의 비 호환성 Java SE 7은 이전 버전의 Java 플랫폼과 강력하게 호환됩니다. 거의 모든 기존 프로그램은 수정없이 Java SE 7에서 실행되어야합니다. 그러나 JRE 및 JDK에는 드문 상황과 완전성을 위해 여기에 문서화 된 "코너 케이스"를 포함하는 몇 가지 사소한 잠재적 소스 및 바이너리 비 호환성이 있습니다.

언어, JVM 또는 Java SE API의 Java SE 7 비 호환성

… 그리고

JDK 7과 JDK 6 간의 비 호환성

javac, HotSpot 또는 Java SE API의 JDK 7 비 호환성

(프리앰블은 없습니다 – 단지 비 호환성 목록입니다.)


뒤로 만. 순방향 호환성 ( "그 자체의 이후 버전을위한 입력을 정상적으로 수락")하려면 1.5 JVM이 1.6 컴파일 된 코드를 실행할 수 있어야합니다.

Backward는 1.6 JVM이 1.5 컴파일 된 코드를 실행할 수 있으므로 "이전 장치에서 생성 된 입력으로 작동 할 수있는 경우"가 필요합니다.

JDK / JRE의 각 릴리스는 Java 바이트 코드 버전과 일치합니다. 각 컴파일러는 특정 바이트 코드 버전의 코드를 생성합니다. 각 JVM은 특정 바이트 코드 버전의 버전과 모든 이전 버전을 이해합니다.

JVM이 클래스를로드 할 때 바이트 코드 버전을 확인하고 JVM의 최신 이해 버전보다 크면 오류가 발생합니다. (ClassVersionError 또는 무언가).


Java (VM)는 이전 버전과 호환됩니다. Java 1.4.2로 빌드 된 코드는 1.5 및 6 개의 VM에서 실행됩니다. JDK 컴파일러는 이전 버전과 호환되지 않습니다. 따라서 예를 들어 1.4.2에서 실행되도록 Java 1.5로 코드를 컴파일 할 수 없습니다.


JDK는 이전 버전과 호환됩니다. 즉, 1.4.2 사양을 준수하는 바이트 코드는 Java 5 JVM에서 실행됩니다.


JDK는 위키의 정의에 따라 하위 호환됩니다.


이전 버전과 호환되어야합니다.


jdk는 상향 호환 가능-새 버전은 이전 버전에서 실행할 수 있습니다.

참고 URL : https://stackoverflow.com/questions/4692626/is-jdk-upward-or-backward-compatible

반응형