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
반응형