🥞 BE
home

1. 자바 코드의 컴파일과 실행원리

Date
2023/09/09
Category
Programming Language
Tag
Java
Detail
Java Basic

자바 코드의 컴파일

우리가 코드로 짠 자바 파일(.java 확장자)은 컴퓨터가 이해할 수 없는 언어이다. 자바파일은 자바 컴파일러(javac)에 의해서 자바 바이트 코드(.class 확장자)로 변환되며 이 자바 바이트 코드는 JVM(Java Virtual Machine)이 이해할 수 있는 언어이다.
자바 바이트 코드는 JVM이 이해할 수 있는 machine instruction으로 구성되어있다. JVM은 자바 바이트 코드를 각 운영체제나 하드웨어에 마다 수행할 수 있는 기계어로 바꾸어서 실행한다.
즉, 하드웨어 또는 운영체제마다 달라지는 기계어 코드는 JVM이 호환해준다고 이해하면 된다. Java의 목적인 “Write Once, Run Everywhere” 가 이런 원리에 의해서 가능해진다.

JVM이 자바 바이트 코드를 실행하는 원리

자바의 클래스로더(class loader)는 자바의 클래스를 런타임(Run Time, 프로그램 실행 후 프로세스로 실행된 상태)에 메모리에 로드한다. 이때, bytecode verifier가 바이트코드가 실행가능한 바이트 코드인지 검사한다.
유효한 바이트코드라면 JIT(Just-In Time)Compiler를 통해서 기계어로 변환해서 실행한다. 여기서 JIT Compiler는 로드되는 자바 바이트 코드를 바로바로 컴파일해서 실행가능한 기계어로 변환해준다. 즉, 최초에 Java Compiler로 변환한 자바 바이트 코드의 전체를 기계어로 바꾼 다음에 실행하는 것이 아니라, 클래스가 로딩될 때 마다 JIT Compiler로 기계어가 생성되고 그 기계어를 실행하는 것.
JIT Compiler가 JVM에서 런타임에 동작하기 때문에 Java 코드 개발자는 컴파일할 때, 기계별로 컴파일 하고 검증할 필요가 없는 장점이 있다. 런타임에 JIT Compiler가 동작하므로, 기계어자체를 구동하는 것보다는 시간이 조금 더 소모되는 단점이 있다. 다만, JIT Compiler가 속도가 빠르기 때문에 큰 문제가 되는 경우는 적다.
JIT Compiler가 소모하는 시간까지도 중요하다면, 사전에 기계어를 생성하는 C, C++같은 언어로 프로그래밍을 하고 구동되는 환경에 맞추어 각각 바이너리를 생성하는 것이 좋다.
Bytecod verifier 단계에서 문제가 되는 경우는 구동하는 JVM의 버전이 이해할 수 없는 버전의 자바 바이트 코드가 로드 되었을 때가 가장 대표적이다.