예를 들어, 단순히 창을 여는 Java 프로그램이 있다고 가정 해 보겠습니다. 이것은 분명히 다른 운영 체제 (윈도우에서는 결국 CreateWindowEx를 호출해야합니다)에 대한 어셈블리 코드가 달라집니다. 그렇다면 Java 바이트 코드 (또는 다른 유사한 언어)가 이와 같은 특정 플랫폼을 어떻게 표현합니까?Java 바이트 코드는 여러 플랫폼을 어떻게 처리합니까?
답변
JVM은 OS에 따라 다르며 바이트 코드는 다릅니다.
이것은 바이트 코드가 JVM이 실행중인 시스템에 따라 end execute를 해석하는 일종의 "일반적인"언어라는 것을 의미합니다.
- 100 % 순수 자바 프로그램의 바이트 코드가 참으로 플랫폼 독립적 인 :
UPDATE는
크리스 광대 - 영 말했듯이, 내 대답은 엄격하게 정확하지 않습니다 . 이러한 프로그램이 호출하는 기본 Java 플랫폼 클래스는 물론 아닙니다.
- 대부분의 경우 JVM은 해석하는 것만이 아니라 JIT 컴파일도 수행합니다.
일반적으로 컴파일 된 코드는 CPU가 "실행하는 데 필요한 지침의 정확한 세트입니다 (! 당신은 순수 해석 모드를 활성화 할 수 있지만,이 느려질 수 있습니다)
짧고 정확합니다. 잘 했어. +1 –
정확하지는 않습니다. 1. 100 % 순수 자바 프로그램의 바이트 코드는 실제로 플랫폼 독립적입니다. 그런 프로그램들이 호출하는 자바 클래스 class_는 물론 존재하지 않습니다. 2. 대부분의 경우, JVM은 해석하는 것이 아니라 JIT 컴파일을 수행합니다. (당신은 순수한 해석 모드를 가능하게 할 수는 있지만 느려질 것입니다!) –
아, 맞습니다. @BackSlash, Chris의 의견으로 답변을 개선하지 않으시겠습니까? –
세레이 말했다 " 프로그램. Java에서 컴파일 된 코드는 모든 실제 컴퓨터에서 동일하게 작동하는 데 필요한 "가상 CPU"에 대한 정확한 명령 집합입니다.
Java 언어 설계자는 언어와 컴파일 된 코드가 플랫폼에 독립적이라고 결정했기 때문에 결국 코드가 실제 플랫폼에서 실행되어야하므로 모든 JVM에서 플랫폼 의존적 인 코드.
이 JVM 요구 사항은 터보 C 예제와 대조됩니다. Turbo C를 사용하면 컴파일러가 플랫폼 종속 코드를 생성하므로 컴파일 된 Turbo C 프로그램을 CPU에서 직접 실행할 수 있기 때문에 JVM을 사용할 필요가 없습니다.
Java의 경우 CPU는 플랫폼에 따라 JVM을 실행합니다. 이 실행중인 JVM은 플랫폼 독립적 인 Java 바이트 코드를 실행합니다. 제공되는 JVM은 실행 가능해야합니다. Java 코드 작성, 실제 머신에서 실행될 코드에 대한 프로그램 작성, Java Virtual Machine에서 실행될 코드 작성 등을 할 수 있습니다.
이 Java 바이트 코드가 모든 Java 가상 머신에서 작동하는 유일한 방법은 Java 가상 시스템의 작동 방식에 대해 다소 엄격한 표준이 작성된 것입니다. 즉, 어떤 물리적 플랫폼을 사용하든 관계없이 Java 바이트 코드가 JVM과 인터페이스하는 부분은 한 가지 방법으로 만 작동한다는 것을 의미합니다. 모든 JVM이 똑같이 작동하기 때문에 같은 코드가 다시 컴파일하지 않고도 어디서나 동일하게 작동합니다. 테스트가 합격하지 못하면 가상 컴퓨터를 "Java 가상 컴퓨터"라고 부를 수 없습니다.
물론 Java 프로그램의 이식성을 깨뜨릴 수있는 방법이 있습니다. 하나의 운영 체제 (예 : cmd.exe)에서만 발견 된 파일을 찾는 프로그램을 작성할 수 있습니다. JNI를 사용하면 컴파일 된 C 또는 C++ 코드를 효과적으로 클래스에 넣을 수 있습니다.특정 운영 체제에서만 작동하는 규칙을 사용할 수 있습니다 (예 : ":"는 디렉토리를 구분합니다). 그러나 JNI와 같이 정말로 특별한 것을하지 않는 한, 다른 컴퓨터에 프로그램을 다시 컴파일하지 않아도된다는 보장이 있습니다.
출처 : Java 프로그램 언어의 How is Java platform-independent when it needs a JVM to run?
는 동일 아니라, 모든 소스 코드는 먼저 된 .java 확장자로 끝나는 일반 텍스트 파일로 작성되었습니다. 이러한 소스 파일은 javac 컴파일러에 의해 .class 파일로 컴파일됩니다. .class 파일에는 프로세서에 고유 한 코드가 없습니다. Java 가상 머신 1 (Java VM)의 머신 언어 인 바이트 코드를 대신 포함합니다. Java 시작 프로그램은 Java Virtual Machine의 인스턴스로 응용 프로그램을 실행합니다.
please read this doc by oracle
.class files
(i.e byte code
)
JVM
, 그것은 OS 다르다.
각 운영 체제마다이 서로 다른 Java Virtual Machine 바이너리 입니다. 그것들은 같은 Java 바이트 코드 (클래스, jar)를 실행할 수 있지만 구현은 때로는 다릅니다.
예를 들어, 모든 윈도우 핸들링 코드는 Windows, Unix 및 Mac에서 다르게 구현됩니다. 각자 OS 기본 전화으로 전화하여 창을 열거 나 무언가를 그립니다. 가상 시스템이 자동으로 처리하므로 신경 쓸 필요가 없습니다.
- 1. 비동기 스파게티 코드는 어떻게 처리합니까?
- 2. Java 프로그램에서 런타임에 실행되는 바이트 코드는 어떻게 얻을 수 있습니까?
- 3. 레일즈에서 validates_length_of는 멀티 바이트 문자를 어떻게 처리합니까?
- 4. Java : ThreadFactory는 어떻게 스레드를 처리합니까?
- 5. 여러 유형의 사용자를 어떻게 처리합니까?
- 6. 여러 데이터 소스를 어떻게 처리합니까?
- 7. DMA가 여러 동시 전송을 어떻게 처리합니까?
- 8. 이 Java 코드는 어떻게 작동합니까?
- 9. Java가 여러 개의 UDP 패킷을 어떻게 처리합니까?
- 10. Android는 어떻게 번역 텍스트에서 여러 대체를 처리합니까?
- 11. PHP는 tripledes 암호화를 위해 32 바이트 키를 어떻게 처리합니까?
- 12. 바이트 코드는 언제 생성됩니까?
- 13. ColdFusion에서 UTF-8 (다중 바이트)을 어떻게 처리합니까?
- 14. GTK의 그래픽 화면에서 여러 이미지를 어떻게 처리합니까?
- 15. 자바 바이트 코드는 CPU와 독립적이며 OS와 독립적입니까?
- 16. Java FX 자체 포함 응용 프로그램 패키지에서 Java 바이트 코드는 어떻게 실행됩니까?
- 17. Java :이 특정 상황에서 ConcurrentModificationException을 어떻게 처리합니까?
- 18. Java Persistance API는 바이너리 데이터를 어떻게 처리합니까?
- 19. 디자인 타임에 여러 TPanel을 어떻게 처리합니까?
- 20. 동일한 응답에 매핑되는 여러 요청을 어떻게 처리합니까?
- 21. trac에서 여러 개의 (겹치는) 프로젝트를 어떻게 처리합니까?
- 22. PHP에서 여러 AJAX 요청을 어떻게 처리합니까?
- 23. 어떻게 여러 패치 중 하나를 처리합니까?
- 24. 하나의 서버에서 실행되는 여러 앱을 어떻게 처리합니까?
- 25. 여러 차원의 녹은 데이터 프레임을 어떻게 처리합니까?
- 26. 안드로이드에서 여러 데이터베이스 테이블을 어떻게 처리합니까?
- 27. 브라우저가 여러 자바 스크립트 태그를 어떻게 처리합니까?
- 28. TFS의 동일한 파일에서 여러 작업을 어떻게 처리합니까?
- 29. VisualStudio에서 같은 이름의 여러 파일을 어떻게 처리합니까?
- 30. PostgreSQL은 여러 WHERE 절을 어떻게 처리합니까?
OS마다 다른 JRE를 다운로드해야합니다. – kosa
JRE가 처리합니다. – Malwaregeek