다른 Java 컴파일러에서 동일한 Java 파일을 컴파일하는 경우 바이트 코드가 동일합니까? 소스 Java 파일은 변경되지 않습니다.다른 JDK를 사용하여 동일한 코드를 컴파일하면 동일한 바이트 코드가 생성됩니까?
답변
예 : 그렇지만 : com.sun
등의 패키지를 독점적으로 사용하면 문제가 발생할 수 있습니다.
더구나, 얼마 전에 나는 Sun JDK와 IBM JDK에서 ObjectStream (In | Out) putStream이 다르게 작동하는 것을 발견했습니다. 그러나 어쩌면 뭔가 잘못했기 때문에 이것에 대해 확신하지 못했습니다.
증명 : http://docs.oracle.com/javase/specs/ - Java 가상 머신 사양, Java SE 7 버전
업데이트 : 죄송합니다. 실제로 똑같은 바이트 코드는 아니지만 모든 인증 된 JVM은이를 이해하고 동일한 결과를 제공합니다.
당신은 소스 코드 이식성에 대해 이야기합니다. 이것은 요점이 아닙니다. – gd1
아니요. 바이트 코드는 사용하는 컴파일러에 따라 약간 다르지만 스펙 내에서 다릅니다. 내가 틀릴 수도 있지만 내가 아는 한 변경 사항은 대부분 다른 JDK의 javac가 최적화되는 방식과 관련이 있습니다. 어쨌든 바이트 코드는 JVM 상호 운용 가능합니다.
바이트 코드가 항상 JVM과 상호 운용되는 것은 아닙니다. 클래스 파일 버전 번호의 문제를 고려하십시오. 구형 JVM은 새로운 버전 번호의 바이트 코드를 실행하지 않습니다. –
1.6 JDK 코드를 실행하려고하는 1.5 JVM과 같은 시나리오가 아닙니까? – Thihara
전혀 없습니다.
추신 : 아마 당신은 "JDK"가 아닌 "JVM"
그것은뿐만 아니라 JVM이되는 플랫폼 (OS)에 상주으로 JVM의 특정을 의미한다. 각각의 경우에 다소 차이가 있습니다. 동일한 jvm에서 동일한 javac를 사용하여 동일한 소스를 두 번 컴파일하는 것에 대해 알지 못합니다. 누구든지 아이디어가 있습니까?
동일한 Java 파일이 다른 JVM에서 컴파일되는 경우 바이트 코드가 동일합니까? 소스 Java 파일은 변경되지 않습니다.
의미가 명확하지 않지만 대답은 "아니오"일 가능성이 큽니다.
다른 JDK에는 동일한 소스 코드에 대해 다른 바이트 코드를 방출 할 수있는 다른 Java 컴파일러가 있습니다. javac 컴파일러는 시간이 지남에 따라 발전해 왔습니다.
Java의 다른 주요 버전은 종종 클래스 파일 사양의 다른 버전을 준수하는 클래스 파일을 방출합니다.
하나의 JDK 설치로 제한하더라도 동일한 소스 파일에서 두 번의 컴파일러 실행으로 동일하지 않은 .class 파일이 생성됩니다. 대답은 당신이 비교 컴파일 타임 스탬프와 (아마도) 다른 메타 데이터를 무시하고 "예"일 것이다 될 수 있다고
이 유일한 방법 (클래스 파일은 ... 컴파일 타임 스탬프를 포함)를 동일한 타겟 버전에 대한 바이트 코드를 방출하고 있으며 JDK 버전은 Java 컴파일러 바이트 코드 생성이 버전간에 변경되지 않았을만큼 충분히 근접했습니다.
예를 들어, IBM의 javac와 Sun/Oracle의 javac에는 'serialVersionUID'를 계산하는 여러 가지 방법이 있습니다. 동일한 코드를 두 개의 다른 컴파일러로 컴파일하면 직렬화 문제가 발생할 수 있습니다. –
아니요, 새로운 JDK가있을 때마다. 일반적으로 Java 컴파일러는 컴파일하는 동안 일부 최적화를 수행하도록 업데이트됩니다. 다른 Java 버전으로 컴파일 할 때 바이트 코드가 달라집니다.
바이트 코드 가 특정 JVM 구현의 일부가 아닌 자바 컴파일러에 의해 생성된다.바이트 코드는 JVM의 실행 엔진이 실행하는 중간 언어의 이름이므로 JVM은이 코드를 생성하지 않고 실행합니다. JVM이 할 수있는 일은, 다를 수있는 기계 코드로 바이트 코드를 컴파일하는 것입니다. 이 컴파일러는 Just-In-Time (JIT) 컴파일러라고합니다.
그러나, 서로 다른 자바 컴파일러 다른 바이트 코드로 이어질 수있는 일입니다 - 중요한 사람이 나열되어 있습니다 : http://en.wikipedia.org/wiki/Java_compiler
- 1. 동일한 코드를 다시 컴파일하면 VC++에서 다른 실행 파일이 생성됩니다.
- 2. 컴파일러는 항상 동일한 JDK를 사용하여 각 컴퓨터에서 다른 오류를 얻습니다.
- 3. 바이트 코드는 언제 생성됩니까?
- 4. 동일한 코드가 다른 페이지에 같은 장소에 -이 코드를 index.php에 하단
- 5. 동일한 Golang 코드가 다른 출력, 왜?
- 6. 동일한 소스를 두 번째로 컴파일하면 다른 gwt.rpc 파일 집합이 생성됩니다.
- 7. 다른 암호화 된 텍스트가 동일한 AES 알고리즘에 의해 생성됩니까?
- 8. -g로 컴파일하면 코드가 느려 집니까?
- 9. SegFault와 동일한 코드가 하나 있습니까?
- 10. Jquery는 * 동일한 * 코드를 사용하여 하나의 도메인에서만 작동합니다.
- 11. 두 시스템의 동일한 소스 코드가 다른 실행 가능 동작을 산출합니다.
- 12. 동일한 C# 코드가 Visio Professional 및 Premium에서 다른 출력을 생성합니다.
- 13. 동일한 쿼리, 동일한 시스템, 다른 실행 시간
- 14. 다른 구성으로 동일한 테스트 실행
- 15. 동일한 패키지에 부호가있는 부호없는 코드를 혼합하는 문제
- 16. 다른 시스템에 동일한 빌드
- 17. 동일한 어셈블리의 다른 버전로드
- 18. IE가 동일한 페이지에 동일한 코드를 두 번 올바르게 표시하지 않습니다.
- 19. 동일한 파이썬 바이트 문자열에서 파생 된 다른 정수
- 20. 순환 참조없이 동일한 코드를 공유하는 여러 프로젝트
- 21. 동일한 클라이언트를 사용하여 동일한 웹 서비스에 액세스
- 22. 다른 minsdkversion과 동일한 코드
- 23. 동일한 프로세스에서 AppDomains간에 큰 바이트 배열 보내기
- 24. Iframe이 생성되지 않고 경고가있는 동일한 코드가 작동합니다.
- 25. 왜 Java에서 동일한 코드가 다르게 작동합니까?
- 26. MonoTouch와 MonoDroid는 두 플랫폼 모두에서 동일한 ARM6/7 코드를 생성합니까?
- 27. 동일한 소스 코드가 다른 플랫폼 용 바이너리를 어떻게 생성합니까?
- 28. 동일한 코드가 80 이외의 다른 포트에서 작동하지 않습니다.
- 29. JVM 내부 - 다른 시점에서 동일한 코드가 실행되는 이유는 무엇입니까?
- 30. 은 모두 다른 바이너리에서 동일한 레지스터로 등록됩니까?
가 바이트 코드는 동일합니다 - – Ved
자바 컴파일러는 바이트 코드하지 JVM – Maddy
자바를 생성합니다 호 컴파일러는 Java 소스 코드를 가져 와서 기계 코드로 변환하거나 Java 바이트 코드로 변환합니다. 대개는 바이트 코드로 변환합니다. JVM은 Java 바이트 코드를 입력으로 사용합니다. JVM에게 무엇을 할 것인지를 알려주는 바이트 코드. – Maddy