2013-08-22 3 views
-1

예를 들어, 단순히 창을 여는 Java 프로그램이 있다고 가정 해 보겠습니다. 이것은 분명히 다른 운영 체제 (윈도우에서는 결국 CreateWindowEx를 호출해야합니다)에 대한 어셈블리 코드가 달라집니다. 그렇다면 Java 바이트 코드 (또는 다른 유사한 언어)가 이와 같은 특정 플랫폼을 어떻게 표현합니까?Java 바이트 코드는 여러 플랫폼을 어떻게 처리합니까?

+7

OS마다 다른 JRE를 다운로드해야합니다. – kosa

+0

JRE가 처리합니다. – Malwaregeek

답변

5

JVM은 OS에 따라 다르며 바이트 코드는 다릅니다.

이것은 바이트 코드가 JVM이 실행중인 시스템에 따라 end execute를 해석하는 일종의 "일반적인"언어라는 것을 의미합니다.

  1. 100 % 순수 자바 프로그램의 바이트 코드가 참으로 플랫폼 독립적 인

    :


    UPDATE는

    크리스 광대 - 영 말했듯이, 내 대답은 엄격하게 정확하지 않습니다 . 이러한 프로그램이 호출하는 기본 Java 플랫폼 클래스는 물론 아닙니다.

  2. 대부분의 경우 JVM은 해석하는 것만이 아니라 JIT 컴파일도 수행합니다.

    일반적으로 컴파일 된 코드는 CPU가 "실행하는 데 필요한 지침의 정확한 세트입니다 (! 당신은 순수 해석 모드를 활성화 할 수 있지만,이 느려질 수 있습니다)

+1

짧고 정확합니다. 잘 했어. +1 –

+2

정확하지는 않습니다. 1. 100 % 순수 자바 프로그램의 바이트 코드는 실제로 플랫폼 독립적입니다. 그런 프로그램들이 호출하는 자바 클래스 class_는 물론 존재하지 않습니다. 2. 대부분의 경우, JVM은 해석하는 것이 아니라 JIT 컴파일을 수행합니다. (당신은 순수한 해석 모드를 가능하게 할 수는 있지만 느려질 것입니다!) –

+0

아, 맞습니다. @BackSlash, Chris의 의견으로 답변을 개선하지 않으시겠습니까? –

1

세레이 말했다 " 프로그램. 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?

+1

미래에는 다른 대답의 텍스트를 복사 할 필요가 없습니다. [comment anywhere] (http://stackoverflow.com/help/privileges/comment) 권한이 있으므로 질문에 대한 설명에서 원래 답변에 링크하십시오. 많은 감사 :-) – andyb

+0

OK, 죄송합니다. 나는 앞으로도 그렇게 할 것입니다. – felixd

1

, 모든 소스 코드는 먼저 된 .java 확장자로 끝나는 일반 텍스트 파일로 작성되었습니다. 이러한 소스 파일은 javac 컴파일러에 의해 .class 파일로 컴파일됩니다. .class 파일에는 프로세서에 고유 한 코드가 없습니다. Java 가상 머신 1 (Java VM)의 머신 언어 인 바이트 코드를 대신 포함합니다. Java 시작 프로그램은 Java Virtual Machine의 인스턴스로 응용 프로그램을 실행합니다.

please read this doc by oracle

.class files (i.e byte code) enter image description here

는 동일 아니라 JVM, 그것은 OS 다르다.

0

각 운영 체제마다이 서로 다른 Java Virtual Machine 바이너리 입니다. 그것들은 같은 Java 바이트 코드 (클래스, jar)를 실행할 수 있지만 구현은 때로는 다릅니다.

예를 들어, 모든 윈도우 핸들링 코드는 Windows, Unix 및 Mac에서 다르게 구현됩니다. 각자 OS 기본 전화으로 전화하여 창을 열거 나 무언가를 그립니다. 가상 시스템이 자동으로 처리하므로 신경 쓸 필요가 없습니다.

관련 문제