본문 바로가기
Java

Java 컴파일 과정을 알아보기

by 차가운개발 2024. 2. 25.

컴파일의 과정을 이야기하기 전에 컴파일이란 무엇인지 알아보자!

 

 

컴파일이란

  컴퓨터는 0과 1로만 모든 명령을 이해하고 실행한다. 우리가 사용하는 문자를 입력하여도 컴퓨터는 이를 0과 1로 이루어진 이진코드로 해석한다. 인간이 사용하는 문자를 컴퓨터가 읽을 수 있게 0과 1로 된 이진코드로 변환해 주는 것을 컴파일이라고 한다


컴파일의 과정

  1.   소스코드 작성
      컴파일은 우선 개발자의 소스코드 작성으로 시작된다
      개발자가 작성한 소스코드는 확장자.java 파일로 저장된다

  2.  컴파일
      
    자바 컴파일러가 .java로 저장된 소스코드를 읽어들여 JVM(자바가상머신)에서 실행될 수 있는 바이트 코드로 컴파일을 진행한    다. 이 때 .java 파일은 .class 파일로 확장자가 변경됩니다 바이트 코드는 특정 플랫폼에 의존하지 않기 때문에 어느 플랫폼에        서 든 실행이 가능합니다

  3.  로드
      
    컴파일된 바이트 코드 .class 를 JVM(자바가상머신)의 클래스 로더에게 전달합니다. 클래스 로더는 동적 로딩을 통해 로딩 및        링크하여 런타임 데이터 영역 즉 메모리에 바이트 코드를 로드합니다.

      클래스 로더의 세부 동작
      ㅇ 로드: 클래스 파일을 가져와 JVM 메모리에 로드합니다
      ㅇ 검증: 자바 언어 명세와 JVM 명세에 명시된 대로 코드가 구성되어 있는지 검사합니다
      ㅇ 준비: 클래스가 필요로 하는 메모리를 할당합니다(필드, 메서드, 인터페이스 등)
      ㅇ 분석: 클래스의 상수 풀 내 모든 심볼릭 레퍼런스를 다이렉트 레퍼런스로 변경합니다
      ㅇ 초기화: 클래스 변수들을 적절한 값으로 초기화 합니다(static 필드)
      
      
  4.  실행엔진
     실행엔진은 클래스 로더를 통해 런타임 데이터 영역에 배치된 바이트 코드를 명령어 단위로 읽어서 실행합니다.
     실행엔진은 두 가지 방식으로 실행 됩니다.

     ㅇ 인터 프리터 방식: 바이트 코드의 명령어를 한 줄씩 읽어 해석하고 실행합니다

     ㅇ JIT 컴파일러: 인터 프리터의 단점을 보완하기 위해 도입된 방식으로 바이트 코드 전체를 컴파일 하여 바이너리 코드로
                                    변경하고 이후에 해당 메서드를 더 이상 인터프리팅하지 않고 바이너리 코드로 직접 실행하는 방식입니다.
      

      JVM은 기본적으로 인터프리터 방식을 사용하고 내부적으로 특정 메서드가 얼마나 자주 수행되는지를 체크하여 일정 정도를 넘
      을 때만 JIT 컴파일러 방식을 사용합니다. 실행엔진이 어떻게 동작하는 지는 JVM 명세에 규정되어 있지 않기 때문에 JVM을 
      만들어 내는 곳에서는 다양한 방식으로 실행엔진을 최적화합니다.

 

 

 

'Java' 카테고리의 다른 글

JAVA Array(배열)  (2) 2024.10.02
JAVA 변수  (1) 2024.09.19
JAVA 메모리 구조  (0) 2024.09.19
JAVA 캡슐화(Encapsulation)  (1) 2024.09.18
Java 인터페이스와 추상 클래스의 차이점  (0) 2024.02.28