[JAVA] 자바 코드가 컴파일되고 실행되는 과정

Jifrozen·2022년 10월 1일
1

기초 다지기

목록 보기
1/29
post-thumbnail
post-custom-banner

자바 코드가 컴파일되고 실행되는 과정

JVM 이란? '자바를 실행하기 위한 가상 기계(컴퓨터)’

Java가 운영체제에 독립적이라는 말을 얼핏 들은적이 있을거다! 그렇다면 java가 왜 os에 독립적인걸까?

바로 JVM 덕분이다.

프로그램을 실행하는 것은 결국 컴퓨터이다. 다시 말해 인간이 짠 코드를 컴퓨터가 알아들을 수 있어야 한다.

자바의 경우 JVM이 이해할 수 있는 형태가 바이트 코드, (.class)파일 이다.

저희가 처음 짠 코드는 .java의 파일이다. .java코드는 인간이 이해할 수 있는 파일이지만 컴퓨터는 이해할 수 없다. 따라서 컴퓨터가 이해할 수 있는 형태로 바꿔줘야한다. java compiler가 .java파일을 .class 라는 java bytecode로 변환해준다.

💡 여기서 Java compiler는 JDK를 설치하면 bin 에 존재하는 javac.exe를 말한다. (즉, JDK에 Java compiler가 포함되어 있다는 소리임) javac 명령어를 통해 .java를 .class로 컴파일 할 수 있다.

변환된 bytecode는 기계어가 아니기 때문에 OS에서 바로 실행되지 못한다.

이 때, JVM이 OS가 bytecode를 이해할 수 있도록 해석해준다. 따라서 Byte Code는 JVM 위에서 OS 상관없이 실행될 수 있는 것이다.

OS에 종속적이지 않고, Java 파일 하나만 만들면 어느 디바이스든 JVM 위에서 실행할 수 있다.

컴파일 하는 과정 java compiler

그렇다면 java compiler에 의해 .java 파일이 .class라는 java bytecode로 만드는 과정을 살펴보자.

java를 사용하기 위해서는 JDK설치가 필수이다. JDK를 설치하면 javac.exe 실행 파일 형태로 java complier가 설치된다. 따라서 javac 명령어를 사용하면 class파일을 생성할 수 있다.

해당 .java 파일이 있는 폴더로 이동해 javac [이름.java](http://이름.java) 이용하면 이름.class파일이 생성되는 걸 확인할 수 있다.

실행하는 과정 jre 자바 인터프리터

JDK 디렉토리의 /bin 폴더에 존재하는 java.exe 는 JVM을 구동시키기 위한 명령 프로그램 + 자바 인터프리터, 컴파일러가 생성한 바이트 코드를 해석 실행한다. (.JRE) java 명령어로 JVM을 실행시킬 수 있다.

바이트 코드

그렇다면 JVM이 알아들을 수 있는 컴파일러를 통해 만들어진 java bytecode는 무엇일까?

자바 바이트 코드(Java bytecode)는 JVM이 이해할 수 있는 언어로 변환된 자바 소스코드를 의미한다.

자바 컴파일러에 의헤 변환된 코드의 명령어 크기가 1바이트라서 자바 바이트 코드라고 불린다.

이 바이트 코드는 다시 실시간 번역기 또는 JIT컴파일러에 의해 바이너리 코드로 변환된다.

즉, CPU가 이해하는 언어는 바이너리 코드, 가상 머신이 이해하는 코드는 바이트 코드이다.

꼬리에 꼬리를 문다,,,

JIT 컴파일러(동적 번역(dynamic translation))란?

컴퓨터를 실행하는 방식은 크게 두가지로 나뉜다.

1) 인터프리터 방식

2) static 컴파일 방식 => JIT 컴파일러

인터프리터 방식은 프로그램을 실행할 때마다 컴퓨터가 알아들을 수 있는 언어(기계어)로 한줄씩 한줄씩 변환하는 작업을 말한다. 따라서 간편하기는 하지만 성능이 매우 느리다.

정적 컴파일 방식은 실행하기 전에 미리 기계어로 변환하는 작업을 말한다. 따라서 변환작업은 딱 한번만수행된다.

JIT는 static 컴파일 방식으로 되있는 것이다.

JVM은 인터프리터 방식만 이용하여 한줄 한줄 읽기 때문에 실행속도가 느린 단점이 있었다.

JIT 컴파일(just-in-time compliation)는 인터프리터 방식의 단점을 보완하기 위해 도입되었다.

JIT 컴파일러는 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일러이다.

정리해보자면 인터프리터 방식으로 실행하다가 적절한 시점에 바이트 코드 전체를 컴파일하여 기계어로 변경하고, 이후에는 해당 더 이상 인터프리팅 하지 않고 기계어로 직접 실행하는 방식이다.

기계어(컴파일된 코드)는 캐시에 보관하기 때문에 한 번 컴파일된 코드는 빠르게 수행하게 된다.물론 JIT 컴파일러가 컴파일하는 과정은 바이트 코드를 인터프리팅하는 것보다 훨씬 오래걸리므로 한 번만 실행되는 코드라면 컴파일 하지 않고 인터프리팅하는 것이 유리하다.

따라서 JIT 컴파일러를 사용하는 JVM들은 내부적으로 해당 메서드가 얼마나 자주 수행되는지 체크하고 일정 정도를 넣을때에만 컴파일을 수행한다.

자바에선 자바 컴파일러가 자바 프로그램 코드를 바이트 코드로 변환한 다음,실제 바이트 코드를 실행하는 시점에서 자바 가상 머신(JVM, 정확히는 JRE)이 바이트 코드를 JIT 컴파일을 통해 기계어로 변환한다.

아니 그럼 java complier는 뭐고 JIT 컴파일러는 뭐야?

javac 컴파일러가 하는 일은 java파일을 class파일(바이트코드)로 변환하는 것일 뿐이다.

JAVA의 모토 중 하나가 Complice once, Run anywhere이다. 한번 컴파일한 이 바이트 코드로 모든 OS에 사용할 수 있게 한 것이다.

즉, 기본적으로 보면, javac 컴파일러는 어떤 OS에서도 수행할수 있도록 바이트 코드라는 파일로 만들고, 컴퓨터가 제대로 이해하기 위한 언어(기계어)로 다시 변환작업을 하는 데 이역할을 JVM안의 JIT 컴파일러가 하는 것이다.

JVM 구성요소

JVM에 대해 깊게 들어가면 끝이 없기 때문에 이번 글에서는 소스코드를 가져와서 컴파일 하는 과정에서의 JVM만 간단하게 살펴 보겠습니다.

JVM은 크게 네가지 구성 요소를 가집니다.

  1. Class Loader

  2. GC (Garbage Collector)

  3. Execution Engine

  4. Runtime Data Area

  1. 컴파일된 바이트 코드(.class)를 JVM의 클래스로더(Class Loader)에게 전달합니다.

  2. 클래스 로더는 동적로딩(Dynamic Loading)을 통해 필요한 클래스들을 로딩 및 링크하여 런타임 데이터 영역(Runtime Data area), 즉 JVM의 메모리에 올립니다.

  • 클래스 로더 세부 동작
    - 로드 : 클래스 파일을 가져와서 JVM의 메모리에 로드합니다.
    • 검증 : 자바 언어 명세(Java Language Specification) 및 JVM 명세에 명시된 대로 구성되어 있는지 검사합니다.
    • 준비 : 클래스가 필요로 하는 메모리를 할당합니다. (필드, 메서드, 인터페이스 등등)
    • 분석 : 클래스의 상수 풀 내 모든 심볼릭 레퍼런스를 다이렉트 레퍼런스로 변경합니다.
    • 초기화 : 클래스 변수들을 적절한 값으로 초기화합니다. (static 필드)
  1. 실행엔진(Execution Engine)은 JVM 메모리에 올라온 바이트 코드들을 명령어 단위로 하나씩 가져와서 실행합니다. 이때, 실행 엔진은 두가지 방식을 가진다. 인터프리터, JIT방식

그럼 우리가 자바 하기전에 필수로 깔아야하는 jdk 는 뭐야?

JDK

Java Development Kit (자바 개발 키트)

Java 를 사용하기 위해 필요한 모든 기능을 갖춘 Java용 SDK (Software Development Kit)이다.

JDK 는 JRE를 포함하고 있다.JRE에 있는 모든 것 뿐만 아니라 컴파일러(javac)와 jdb, javadoc 과 같은 도구도 있다. 즉, JDK는 프로그램을 생성, 실행, 컴파일할 수 있다.

JRE

Java Runtime Environment (자바 런타임 환경)

JVM + 자바 클래스 라이브러리(Java Class Library) 등으로 구성되어 있다.컴파일 된 Java 프로그램을 실행하는데 필요한 패키지이다.

요약
JDK는 자바 프로그램을 실행, 컴파일, 개발용 도구.
JRE, JVM를 모두 포함하는 포괄적이 키트이다.
JRE는 자바 프로그램을 실행할 수 있게 하는 도구이다. JVM을 포함하고 있다.

출처

https://velog.io/@mooh2jj/JIT-컴파일러란

https://doozi0316.tistory.com/entry/1주차-JVM은-무엇이며-자바-코드는-어떻게-실행하는-것인가

post-custom-banner

0개의 댓글