일반적으로 컴파일 된 코드는 CPU가 프로그램을 "실행"하는 데 필요한 정확한 명령 집합입니다. Java에서 컴파일 된 코드는 모든 물리적 시스템에서 동일하게 작동하는 데 필요한 "가상 CPU"에 대한 정확한 명령 집합입니다.
그래서 어떤 의미에서 자바 언어의 설계자들은 언어와 컴파일 된 코드가 플랫폼 독립적이 될 것이라고 결정했지만 결국 코드는 물리적 플랫폼에서 실행되어야하기 때문에 모든 플랫폼 종속 코드를 JVM.
JVM에 대한이 요구 사항은 Turbo C 예제와 대조됩니다. Turbo C를 사용하면 컴파일러가 플랫폼 종속 코드를 생성하고 컴파일 된 Turbo C 프로그램이 CPU에 의해 직접 실행될 수 있기 때문에 JVM과 유사한 작업이 필요하지 않습니다.
Java를 사용하면 CPU는 플랫폼에 따라 JVM을 실행합니다. 이 실행중인 JVM은 실행 가능한 JVM이있는 경우 플랫폼 독립적 인 Java 바이트 코드를 실행합니다. Java 코드를 작성하고 실제 머신에서 실행할 코드를 프로그래밍하지 않고 Java 가상 머신에서 실행할 코드를 작성한다고 말할 수 있습니다.
이 모든 Java 바이트 코드가 모든 Java 가상 머신에서 작동하는 유일한 방법은 Java 가상 머신의 작동 방식에 대해 다소 엄격한 표준이 작성되었다는 것입니다. 즉, 어떤 물리적 플랫폼을 사용하든 Java 바이트 코드가 JVM과 인터페이스하는 부분은 단방향으로 만 작동합니다. 모든 JVM이 정확히 동일하게 작동하기 때문에 동일한 코드가 다시 컴파일하지 않고도 모든 곳에서 동일하게 작동합니다. 동일한 지 확인하기위한 테스트를 통과 할 수없는 경우 가상 머신을 "Java 가상 머신"이라고 부를 수 없습니다.
물론 자바 프로그램의 이식성을 깨는 방법이 있습니다. 하나의 운영 체제에서만 발견되는 파일을 찾는 프로그램을 작성할 수 있습니다 (예 : cmd.exe). JNI를 사용하면 컴파일 된 C 또는 C ++ 코드를 클래스에 효과적으로 넣을 수 있습니다. 특정 운영 체제에서만 작동하는 규칙을 사용할 수 있습니다 (예 : ":"가 디렉토리를 구분한다고 가정). 그러나 JNI와 같은 특별한 작업을 수행하지 않는 한 다른 컴퓨터에서 프로그램을 다시 컴파일 할 필요가 없습니다.