Language/Java

[Java] JVM 가상머신과 Java Language의 이식성, 호환성 관계

ooeunz 2019. 11. 10. 21:21
반응형

흔히 우리나라는 java 공화국이라고 불릴 정도로 java가 널리 사용되고 있다. 최근에 와서는 kotlin과 javascript와 같은 언어에 어느 정도 점유율을 빼앗겼지만, 여전히 java는 가장 널리 사용되고 있는 언어라는 것에 있어서는 이견이 없다. 이에 관한 이유에는 여러가지가 있지만, 그중 가장 대표적인 이유는 Java의 호환성 때문이다.

 

 


Java의 호환성을 이해하기 위해서는 먼저, 조금의 운영체제에 관한 지식이 요구된다. 이 포스팅에서는 이러한 부분을 간략히 예를 들어서 설명하도록 하겠다.

 

Hardware OS Application

예를들어,

 

A + B라고 하는 명령을 Intel cpu에서 machine code로 0101, 모토롤라 cpu에서는 0000이라고 하겠다.

 

 

Assembly language vs High level language

우리가 익히 알고 있다시피 Assembly Language는 Machine Code와 1:1로 맵핑된다. 때문에 우리가 intel cpu에서 assembly language로 A + B라고 코딩을 하게 된다면 0101이라는 값이, 모토롤라 cpu에서 코딩을 하게 되면 0000이라는 다른 machine code로 번역된다. 때문에 machin code는 같은 hardware에 한해서만 이식성과 호환성을 제공한다.

 

반면, C++과 같은 high level language는 컴파일을 하는 순간 해당 hardware에 맞는 machine code로 번역된다. 때문에 코드만 동일하다면, 다른 하드웨어 환경이라도 이식성과 호환성을 제공한다. 즉, OS단의 호환성이 제공되는 것이다. 하지만 이러한 C++과 같은 언어 역시 모든 호환성의 문제를 해결한 것은 아니다. 대표적인 예로, window 환경에서 컴파일된 코드는 Mac OS 환경에서 다르게 번역이 된다. 즉, application 단에서 호환성이 제공되지 않는다.

 

C++ vs JAVA

그렇다면 Java는 어떨까? java는 컴파일을 하게되면 machine code로 번역이 되는 것이 아니라 .class라는 Byte Code로 변환된다. 여기서 byte code는 반기계어로써 클래스 로더를 통해 JVM(java virtual machine)내로 로드되고 실행 엔진에 의해 machine code로 번역되어 runtime data area(메모리 상)에 배치된다. 이렇게 java코드는 byte code라는 하나의 단계를 더 거침으로 인해서, 어디에서 컴파일되었든 JVM만 있다면 실행될 수 있는 application단의 이식성과 호환성을 제공한다. 또한 실행되는 환경에서는 byte code만을 받기 때문에 컴파일되기 전의 코드를 알 수 없기 때문에 보안적으로 우위에 있다. 다만 c++과 같은 언어와 다르게 JVM이라는 가상 머신 단계를 하나 더 거치기 때문에 속도가 상대적으로 느리다는 단점이 있다.

반응형