java compile & 실행 과정을 정말 잘 설명해주는 그림이라고 생각해서 가져왔다.
위를 토대로 설명을 해보자.
누군가 물어볼 수 있지만 대답이 술술 나오지 않아 답답해서 정리한다.
1️⃣ 우선, 개발자는 개발 툴을 이용해서 .java 확장자가 붙은 파일을 생성하게 된다.
Build를 통해 java compiler의 javac 명령어를 사용해서 .class파일로 변환하게 된다.
이는 컴퓨터가 아직은 읽을 수 없는 자바 바이트 코드(반기계어) 이다.
2️⃣ 생성된 자바 바이트 코드 = .class파일은 클래스 로더에 의해 JVM으로 로드가 된다.
3️⃣ Byte Code Verifier에서 바이트 코드를 검증하게 된다.
4️⃣ 실행 엔진(Execution Engine)에 의해 기계어로 해석된다.
5️⃣ 실행 엔진에는 Interpreter & JIT Compiler가 있다. 선택적으로 실행을 할 수 있다.
(이 과정에서 인터프리터가 바이트 코드를 바이너리 코드로 변환 시켜준다.)
6️⃣ 변환된 바이너리 코드는 JVM의 Runtime Data Areas 영역에 저장되어 실질적인 수행이 이루어진다.
7️⃣ 실행 과정 속 JVM은 필요에 따라 Thread Synchronization과 Garbage Collection과 같은 관리 작업을 수행하게 된다.
Interpreter& JIT Compiler
- 인터프리터는 바이트 코드를 한줄씩 읽기에 실행이 느리다.
- 런타임에 바이트 코드를 실행시키는 JIT Compiler가 나오게 된 이유이기도 하다.
- JIT Compiler에 의해 해석된 코드는 캐시에 보관하기에 한 번 컴파일 된 후엔 빠르게 수행한다.
- 그러니, 한번만 실행할 코드는 Interpreter가 훨씬 효율적이다.
전체 컴파일 프로세스에 대해서 이해가 쉬운 그림이 있길래 또 가져왔다.💯
자바가 컴파일 되는 과정에서 다시 생각하게 되는 자바의 특징이 있다.
한번 작성하면 JVM이 설치된 어느 기계에서든 동작이 가능하다는 것이다.
그러나, 자바는 컴파일러로 바이트 코드를 만들고 바이트 코드를 JVM을 통해 기계어로 번역하기에 JVM만 있으면 어떤 OS에서든 같은 기계어로 번역이 된다.
바이트 코드와 JVM만 있다면 어디서든 동작 가능하고 이런 특성을 Portability라고 한다고 한다.