[Java] How is a Java Program executed [1] — JVM, JRE, and JDK
자바로 작성된 프로그램은 어떻게 실행될까? JVM
을 중심으로 앞 질문에 대한 답을 알아가보자.
| JVM (Java Virtual Machine)
JVM(Java Virtual Machine)
는 자바로 작성된 프로그램이 돌아가도록 하는 프로그램이다. 개발자가 이해할 수 있는 수준의 .java
파일을 컴파일 하면 .class
가 생성되는데, 컴파일 이후부터는 이를 바이트 코드라고 한다. 이 바이트 코드는 JVM 위에서 동작 한다.
[ 그림 1 ] 에서 볼 수 있듯이 자바는 다른 컴파일 언어와 달리 컴파일 단계를 거쳐서 바로 CPU
가 이해할 수 있는 수준의 기계어가 생성되는 것이 아니라 바이트 코드가 생성된다. 이는 OS
가 자바로 작성된 프로그램을 직접적으로 제어해 실행 시킬 수 없다는 것을 의미하기도 한다.
결국 자바로 작성된 프로그램도 결과적으로 OS
에 의해서 실행되기 위해서는 기계어로 변환되어야 한다. JVM
은 자바로 작성된 프로그램이 실행되도록 하는 프로그램이고, 바이트 코드가 JVM
위에서 동작한다는 점에서 JVM
이 어떤 역할을 할 것인지를 짐작할 수 있다. (JVM 의 구성 요소는 따로 자세히 다룰 예정이다.)
그런데 이렇게 자바로 작성된 프로그램을 컴파일해 기계어로 만들지 않고 바이트 코드로 두는 배경에는 어떤 것이 있을까? 동일한 코드로 작성된 프로그램일지라도 OS
에 따라서 서로 다른 실행 파일 형식을 갖는다. 이는 OS
별로 가지는 고유한 아키텍처의 영향을 받기 때문이다. 예를 들어, 각 OS
는 각각 고유한 시스템 콜(System Call) 명령어 집합을 제공하고, 따라서 프로그램이 실행 환경 중 하나인 OS
에 종속될 수 밖에 없다.
하지만 자바와 같이 컴파일러를 통해 기계어로 번역하지 않고 바이트 코드를 생성하게 되면, 결과적으로 OS
가 바이트 코드를 이해할 수 없으므로 해당 프로그램을 실행 시키기 위해 JVM
이라는 중간 매개를 거쳐야 한다. 따라서 구조적으로 JVM
을 통해 자바로 작성된 프로그램이 OS
에 직접적으로 의존하지 않게 되는 특징을 가진다. 이를 WORA(Write Once, Run Anywhere)
이름이 갖는 의미 그대로 동일한 소스 코드가 OS 와 관계 없이 실행될 수 있음을 의미한다. 그리고 이를 `이식성이 높다` 는 표현을 쓰기도 한다.
자바로 작성된 애플리케이션은 각 OS
에 설치된 JVM
을 통해 OS
종류와 관계 없이 동일한 바이트 코드를 가지고 실행이 가능하다.
| JRE (Java Runtime Environment)
JRE
는 [ 그림 4 ] 에서 볼 수 있듯이 JVM
+ 라이브러리로 구성되어 있다. JRE
는 이름이 갖는 의미에서 쉽게 알 수 있듯이 자바로 작성된 프로그램의 실행 환경을 의미한다.
앞서 JVM
부분에서, 결국 OS 가 이해할 수 있도록 바이트 코드가 기계어로 번역되어야 한다고 했었는데, 이러한 작업을 하기 위해서 필요한 것들이 라이브러리에 포함되어 있다고 이해할 수 있다. 대표적으로 이후 자세히 다룰 Class Loader
, Interpreter
등이 JRE 에 포함되어 있다. 이외에도 프로그래머가 자주 사용하는 Collections Framework
역시 JRE 의 라이브러리에 포함되어 있다.
| JDK (Java Development Kit)
JDK
는 바로 위에서 다룬 JRE
+ 개발 도구로 구성되어 있다. JRE
에는 JVM
이 자바로 작성된 프로그램의 실행 환경을 위한 것이라면, JDK
는 컴파일 도구인 javac
, 디버깅 툴인 jdb
등 개발 활동과 관련한 여러 도구들이 포함되어 있다.
JDK
는 제공하는 API 에 따라 표준형 Java SE(Standard Edition)
과 웹 개발 관련 기능 등이 추가된 Java EE(Enterprise Edition)
가 있고, 버전 별로 관리되는 특징이 있다. 또한 LTS(Long Term Support)
로 지정된 버전은 상대적으로 다른 버전 보다 안정적으로 관리된다는 점에서 사용자가 많다.
이번 글에서는 JVM, JRE, JDK
각각이 어떤 것을 의미하는지 알아봤고, 특히 바이트 코드가 JVM
위에서 동작해 결국 기계어로 번역된다는 결과를 확인했다. 다음 글에서는 JVM
의 구성 요소를 살펴보고 각 구성 요소의 역할에 대해서 다룰 예정이다.
| Reference
더 자바, 코드를 조작하는 다양한 방법 — 인프런 | 강의
What is the JRE (Java Runtime Environment)? | IBM
https://tecoble.techcourse.co.kr/post/2021-07-12-jvm-jre-jdk/
Difference between Byte Code and Machine Code — GeeksforGeeks
https://xlffm3.github.io/java/jvm/
JVM(Java Virtual Machine) | Chasing Yesterday
1주차 JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가