Java

[Language : Java] 컴파일(Compile)

굼벵욤 2024. 2. 19. 09:00

컴파일(Compile)

Java, OS 독립적JVM(Java Virtual Machine) - OS, 프로그램의 사이에서 기계어로 해석해주는 역할

 


📌 실행 순서

1️⃣ Sample.java, 자바 컴파일러(javac.exe)를 통해 컴파일 진행

2️⃣ Sample.class 생성(== byte code)

  • byte code, 반기계어 상태(컴퓨터 읽을 수 없음.) → 변환과정 필요
  • byte code, 각 명령어 1바이트 크기 Opcode + 추가 피연산자로 구성

3️⃣ Sample.class, java.exe로 실행

4️⃣ JVM의 Class Loader를 통해 Sample.calss → JVM 이동

더보기

※ JVM : 현재 진행을 시도하는 OS에 맞게 변환시킴.
    Class Loader : 동적 로딩을 통해 필요한 클래스들을 로딩 및 링크하여 런타임 데이터 영역인 JVM 메모리에 올림.

💡 JVM 동적 클래스 로딩
  • 클래스 로더는 '.class' 바이트 코드를 읽어 class 객체를 생성하는 역할 담당
  • 클래스 로딩은 세부적으로 로딩, 링크 초기화라는 3단계의 과정을 거친다.
  • 로딩 : 클래스 파일을 바이트 코드로 읽어 메모리로 가져오는 과정
  • 링크 : 읽어온 바이트 코드의 자바 규칙 검증과 클래스에 정의된 필드, 메소드, 인터페이스들을 나타내는 데이터 구조를 준비하며, 그 클래스가 참조하는 다른 클래스를 로딩하는 과정
  • 초기화 : 슈퍼 클래스 및 정적 필드를 초기화하는 과정

5️⃣ Byte Code Verifier에 의해 byte code 검증

6️⃣ 실행 엔진에 의해 기계어로 해석(byte code → binary code)

  • 변환된 binary code, JVM의 클래스 영역에 저장
💡 Java 인터프리터
  • 바이트 코드 명령어를 하나씩 읽어서 해석하고 실행함.
  • 명령어 각각의 실행은 빠르나, 전체적인 실행 속도가 느림.
💡 JIT 컴파일러
  • Just-In-Time 컴파일러
  • 바이트코드를 CPU로 직접 보낼 수 있는 바이너리 코드로 바꾸는 역할
  • 성능 최적화를 위해 애플리케이션 런타임을 향상시킬 수 있음.
  • 다른 컴파일러 유형과는 달리, 프로그램이 시작되고 코드를 컴파일 진행
  • 기계어로 변환된 코드를 캐시에 저장해서 재사용시 컴파일을 다시 하지 않아도 되기 때문에 동적 컴파일을 하는 다른 언어보다 훨씬 좋은 성능을 냄.

 

7️⃣ Runtime 실행

 

 

📌 참고 블로그

https://velog.io/@tablemin_park/CS-Java-%EC%BB%B4%ED%8C%8C%EC%9D%BC-%EA%B3%BC%EC%A0%95

 

[CS] Java 컴파일 과정

Java 컴파일 과정

velog.io

 

반응형