-
(1) JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가24년 11월 이전/백기선의 Study Halle 2020. 11. 19. 22:05반응형
백기선님의 온라인 스터디 "스터디 할래" 1주차 정리 문서입니다.
목표
자바 소스 파일(.java)을 JVM으로 실행하는 과정 이해하기.
학습할 것
- JVM이란 무엇인가
- 컴파일 하는 방법
- 실행하는 방법
- 바이트코드란 무엇인가
- JIT 컴파일러란 무엇이며 어떻게 동작하는지
- JVM 구성 요소
- JDK와 JRE의 차이
JVM이란 무엇인가
JVM이란 Java Virtual Machine의 약자로써, 어떤 OS 환경에서라도 Java 코드를 컴파일하고 실행할 수 있는 도구이다. 이 JVM 덕분에, OS가 다를지라도 같은 자바 코드는 같은 동작이 실행됨이 보장된다.(정말 특별한 경우 제외하고는...) 이를 "Write once. Run anyware"라고 말하곤 한다.
출처: 도우출판 "남궁 성 - Java의 정석"
한 가지 알아둘 점은 위의 그림에서 알 수 있듯이 자바 코드는 OS에 독립적이지만, JVM은 OS에 종속적이라는 것이다.
컴파일 하는 방법
일단 컴파일이 무엇인지 알아보자. 컴퓨터는 "기계어"라고 해서 0, 1밖에 인식하지 못한다. 여러 명령어를 동작시키려면 무수히 많은 동작에 해당하는 0,1 조합을 컴퓨터에게 알려주어야 한다. 하지만 사람이 이 조합들을 다 외우기엔 무리가 있다.
그래서 "프로그래밍 언어"라고 사람이 이해하기 쉬운 언어를 사용하여, 명령어들을 작성한다. 이를 "소스 코드"라고 한다. 그 후 "컴파일러"라는 녀석이 "소스 코드"를 기계어로 번역하여 컴퓨터가 실행할 수 있게 한다. 이 번역하는 작업을 "컴파일"이라고 한다. 그림으로 보면 다음과 같다.
출처: 한빛미디어 "신용권 - 이것이 자바다"
먼저 자바 코드(.java 파일)를 컴파일하려면, JVM이 설치되어 있는 JDK 혹은 JRE가 설치되어 있어야 한다. 먼저 터미널에 다음을 입력해보자.
$ java --version openjdk 13.0.2 2020-01-14 OpenJDK Runtime Environment AdoptOpenJDK (build 13.0.2+8) OpenJDK 64-Bit Server VM AdoptOpenJDK (build 13.0.2+8, mixed mode, sharing)
나는 운영체제인 MacOS에 OpenJDK 13.0.2를 설치해두었다. 이번에는 다음 명령어를 입력해보자.
$ javac --version javac 13.0.2
바로 이 javac가 자바로 작성된 소스 코드를 번역하는 컴파일러이다. 만약 소스 코드인 Hello.java를 컴파일하고 싶으면 다음과 같이 명령어를 작성하면 된다. (이 때, Hello.java는 터미널을 연 위치에 존재한다고 가정한다.)
# javac <컴파일 하고 싶은 자바 파일 경로> $ javac Hello.java
그럼, 위 명령어를 실행한 위치에서 Hello.class 라는 녀석이 생긴다.
실행하는 방법
자바 프로그램을 실행하기 위해서는 위에 컴파일을 통해 생성된 *.class 파일을 java라는 도구에 넘겨주어야 한다. 터미널에 다음을 입력하면 된다.
# java <.class 파일 명> $ java Hello # 프로그램 실행 결과 Hello
바이트코드란 무엇인가
이 때 *.class 파일들을 "바이트 코드"라고 한다. Java를 "중간 언어"라고 부르기도 하는데, 다 이 녀석 때문이다. 이런 식으로 소스 코드를 컴파일러가 컴파일하면, 바로 컴퓨터가 실행할 수 있는 "기계어"로 번역되는 것이 아니라 "바이트 코드"가 생성된다. 이 "바이트 코드"를 운영체제에 맞게 설치된 JVM이 읽고 실행시키는 것이다.
다음 그림을 보면 확실하게 더 이해할 수 있을 것이다.
출처: 한빛미디어 "신용권 - 이것이 자바다"
JIT 컴파일러란 무엇이며 어떻게 동작하는지
전통적으로, 자바 코드는 바이트 코드로 컴파일 되어 JVM이 이를 기계어로 번역하여 실행하기 때문에, C/C++이 컴파일 된 기계어보다 실행 속도가 느리다.
이 실행 속도의 격차를 줄이기 위해서, 자바 코드를 실제 실행하는 시점에 기계어로 번역하는 컴파일하는 JIT(Just in Time) 컴파일러를 사용한다. 동작 과정은 먼저, 자바 코드를 javac가 바이트 코드로 만든다. JVM이 이 바이트 코드를 실행하는 시점에서, JIT 컴파일러가 이 바이트 코드를 기계어로 번역한다.
JVM 구성 요소
JVM 구성 요소는 다음과 같다.
크게 3가지가 있는데, Class Loader, Runtime Data Areas, Execution Engine이 바로 그들이다. 아주 간단하게 알아보자면, Class Loader가 바이트 코드를 Runtime Data Areas에 로드시키고 이 로드된 정보를 토대로 Execution Engine이 실행시키는 것이다.
JDK와 JRE의 차이
JRE는 Java Runtime Environment의 약자로 JVM, 라이브러리 API만 포함되어 있다. JDK란 Java Development Kit의 약자로 JVM, 라이브러리 API, 컴파일러 등의 개발 도구가 포함되어 있다. 즉, JRE + 컴파일러 등의 개발 도구가 JDK이다.
- JRE = JVM + 표준 클래스 라이브러리
- JDK = JRE + 개발에 필요한 도구
요약하자면, 개발을 위한 것은 JDK 실행을 위한 것은 JRE이다.
728x90'레거시 > 백기선의 Study Halle' 카테고리의 다른 글
(5) 클래스 (0) 2020.12.19 (4) 제어문 (0) 2020.12.05 (3) 연산자 (0) 2020.11.25 (2) 자바 데이터 타입, 변수 그리고 배열 (0) 2020.11.25