2012-05-04 14 views
5

다른 Java 컴파일러에서 동일한 Java 파일을 컴파일하는 경우 바이트 코드가 동일합니까? 소스 Java 파일은 변경되지 않습니다.다른 JDK를 사용하여 동일한 코드를 컴파일하면 동일한 바이트 코드가 생성됩니까?

+1

가 바이트 코드는 동일합니다 - – Ved

+0

자바 컴파일러는 바이트 코드하지 JVM – Maddy

+1

자바를 생성합니다 호 컴파일러는 Java 소스 코드를 가져 와서 기계 코드로 변환하거나 Java 바이트 코드로 변환합니다. 대개는 바이트 코드로 변환합니다. JVM은 Java 바이트 코드를 입력으로 사용합니다. JVM에게 무엇을 할 것인지를 알려주는 바이트 코드. – Maddy

답변

-1

예 : 그렇지만 : com.sun 등의 패키지를 독점적으로 사용하면 문제가 발생할 수 있습니다.
더구나, 얼마 전에 나는 Sun JDK와 IBM JDK에서 ObjectStream (In | Out) putStream이 다르게 작동하는 것을 발견했습니다. 그러나 어쩌면 뭔가 잘못했기 때문에 이것에 대해 확신하지 못했습니다.
증명 : http://docs.oracle.com/javase/specs/ - Java 가상 머신 사양, Java SE 7 버전
업데이트 : 죄송합니다. 실제로 똑같은 바이트 코드는 아니지만 모든 인증 된 JVM은이를 이해하고 동일한 결과를 제공합니다.

+1

당신은 소스 코드 이식성에 대해 이야기합니다. 이것은 요점이 아닙니다. – gd1

1

아니요. 바이트 코드는 사용하는 컴파일러에 따라 약간 다르지만 스펙 내에서 다릅니다. 내가 틀릴 수도 있지만 내가 아는 한 변경 사항은 대부분 다른 JDK의 javac가 최적화되는 방식과 관련이 있습니다. 어쨌든 바이트 코드는 JVM 상호 운용 가능합니다.

+0

바이트 코드가 항상 JVM과 상호 운용되는 것은 아닙니다. 클래스 파일 버전 번호의 문제를 고려하십시오. 구형 JVM은 새로운 버전 번호의 바이트 코드를 실행하지 않습니다. –

+0

1.6 JDK 코드를 실행하려고하는 1.5 JVM과 같은 시나리오가 아닙니까? – Thihara

2

전혀 없습니다.

추신 : 아마 당신은 "JDK"가 아닌 "JVM"

0

그것은뿐만 아니라 JVM이되는 플랫폼 (OS)에 상주으로 JVM의 특정을 의미한다. 각각의 경우에 다소 차이가 있습니다. 동일한 jvm에서 동일한 javac를 사용하여 동일한 소스를 두 번 컴파일하는 것에 대해 알지 못합니다. 누구든지 아이디어가 있습니까?

5

동일한 Java 파일이 다른 JVM에서 컴파일되는 경우 바이트 코드가 동일합니까? 소스 Java 파일은 변경되지 않습니다.

의미가 명확하지 않지만 대답은 "아니오"일 가능성이 큽니다.

  • 다른 JDK에는 동일한 소스 코드에 대해 다른 바이트 코드를 방출 할 수있는 다른 Java 컴파일러가 있습니다. javac 컴파일러는 시간이 지남에 따라 발전해 왔습니다.

  • Java의 다른 주요 버전은 종종 클래스 파일 사양의 다른 버전을 준수하는 클래스 파일을 방출합니다.

  • 하나의 JDK 설치로 제한하더라도 동일한 소스 파일에서 두 번의 컴파일러 실행으로 동일하지 않은 .class 파일이 생성됩니다. 대답은 당신이 비교 컴파일 타임 스탬프와 (아마도) 다른 메타 데이터를 무시하고 "예"일 것이다 될 수 있다고

이 유일한 방법 (클래스 파일은 ... 컴파일 타임 스탬프를 포함)를 동일한 타겟 버전에 대한 바이트 코드를 방출하고 있으며 JDK 버전은 Java 컴파일러 바이트 코드 생성이 버전간에 변경되지 않았을만큼 충분히 근접했습니다.

+0

예를 들어, IBM의 javac와 Sun/Oracle의 javac에는 'serialVersionUID'를 계산하는 여러 가지 방법이 있습니다. 동일한 코드를 두 개의 다른 컴파일러로 컴파일하면 직렬화 문제가 발생할 수 있습니다. –

0

아니요, 새로운 JDK가있을 때마다. 일반적으로 Java 컴파일러는 컴파일하는 동안 일부 최적화를 수행하도록 업데이트됩니다. 다른 Java 버전으로 컴파일 할 때 바이트 코드가 달라집니다.

2

바이트 코드 가 특정 JVM 구현의 일부가 아닌 자바 컴파일러에 의해 생성된다.바이트 코드는 JVM의 실행 엔진이 실행하는 중간 언어의 이름이므로 JVM은이 코드를 생성하지 않고 실행합니다. JVM이 할 수있는 일은, 다를 수있는 기계 코드로 바이트 코드를 컴파일하는 것입니다. 이 컴파일러는 Just-In-Time (JIT) 컴파일러라고합니다.

그러나, 서로 다른 자바 컴파일러 다른 바이트 코드로 이어질 수있는 일

입니다 - 중요한 사람이 나열되어 있습니다 : http://en.wikipedia.org/wiki/Java_compiler

관련 문제