본문 바로가기

컴퓨터/JAVA

자바 고급 스터디 4. 자바 컴파일 되는 과정

반응형

자바 고급 스터디 목록

공부 시간 : 2021/04/04 14:00 ~ 15:15

4주차. 자바가 컴파일 되는 과정에 대해서 설명해보세요.

자바 컴파일 이란?

  • 자바로 작성된 코드를 어셈블리어 -> 기계어(binary code형식)으로 변환해주는 과정이다.

바이너리 코드, 어셈블리 언어, 고급언어

  • binary code :

    • 10001011101101 과 같이 0과 1로 이루어진 코드
    • 한국어, 영어, 프랑스어 등과 같이 운영체제에 따라 다르다.
  • assembly language :

    • add 3, 5, result 와 같이 이루어진 코드
    • 기계어와 1:1로 매칭됨.
    • binary code로 변환하는 과정이 필요함.
  • 고급언어

    • 어셈블리언어 보다 사람이 이해하기 쉬운 방식으로 개선된 언어
    • 인터프리터, 컴파일러를 사용하는 언어로 나뉨.
    • 고급언어 -> binary code로 변환하는 과정이 필요함.

인터프리터와 컴파일러

  • 인터프리터

    • 한줄씩 기계어로 변환하는 과정을 거침.
    • 컴파일러에 비해 상대적으로 프로그램 실행 속도가 느림.
  • 컴파일러

    • 모든 코드를 한번에 기계어로 변환함.
    • 인터프리터에 비해 상대적으로 프로그램 실행 속도가 빠름.

자바 컴파일

  1. 사용자가 자바코드(.java)를 작성 후 빌드를 함.
  2. 자바컴파일러(javac)는 자바파일(.java) -> 바이트코드(.class) 파일로 변환함.
    (바이트코드는 어셈블리언어 형식임.)
  3. Class Loader에서 2번에서 생성된 바이트코드를 JVM 메모리에 로드함.

    이 과정은 모든 파일이 한꺼번에 되지않고, 프로그램 실행과정에서 .class파일이 필요할때 실행됨 (lazy loading)

    • 세부 작동
      • Loading(로딩) : 로드된 클래스 및 부모 클래스 정보, class interface enum 관련 여부
        , 변수 메서드 정보를 jvm 메모리(Heap 메모리, MetaSpace)에 올림
      • Verification(증명) : .class 파일이 자바 언어 명세, JVM 명세에 맞게 작성되었는지 검증한다. 실패시 런타임에러 (java.lang.VerifyError)
      • Preparation(준비) : load된 메모리를 기본 값으로 초기화 하고, 클래스 변수를 위한 메모리에 할당함.
      • resolution(해결) : 클래스의 constant pool 내의 symbolic reference를 direct reference로 변경함.
      • Initialization(초기화) : static 변수들이 정의된 값으로 초기화됨.
  4. Runtime Engine에서 (.class)파일 -> 기계어로 변환함.

    Runtime Engine 파트 분류

    • 인터프리터 : (.class) 파일을 한줄씩 읽어 기계어로 변환함. 여러번 실행 할 경우 비효율적임.
    • Just-In-Time(JIT) :
      • 인터프리터의 비효율을 개선하기 위해 사용되는 컴파일 방식의 파트임.
      • JIT에서 해석된 코드는 메모리 Code Cache에 저장하여 사용함.
      • 인터프리터보다 실행시간이 길고, 캐싱되는데 자원이 사용되므로 반복되지 않는 코드는 인터프리터를 사용하는게 유리하다.

참고한 사이트

반응형