[Java] 컴파일 과정

[Java] 컴파일 과정

JVM(Java Virtual Machine) 즉 자바 가상머신 덕분에, 자바는 OS에 독립적이다. 이는 컴파일 과정을 통해 알 수 있다.

자바 컴파일 순서

개발자가 자바 소스코드 (.java)를 작성한다. 자바 컴파일러(Java Compiler)가 소스파일을 컴파일한다. 그 결과 자바 바이트 코드 (.class)파일이 나오는데, 이는 JVM이 이해할 수 있는 코드이며 아직 컴퓨터가 읽을 수 없는 코드이다. (바이트 코드의 각 명령어: 1바이트 Opcode와 추가 피연산자로 이루어짐) 컴파일된 자바 바이트 코드를 JVM의 클래스 로더(Class Loader)에게 전달한다. 클래스 로더는 동적 로딩(Dynamic Loading)을 통해 필요한 클래스들을 로딩&링크하여 JVM의 메모리에 올린다. (런타임 데이터 영역) 로드: 클래스 파일을 가져와서 JVM의 메모리에 로드 검증: 자바 언어 명세 및 JVM 명세에 부합하는지 검사 준비: 클래스가 필요로 하는 메모리 할당 분석: 클래스의 상수 풀 내 모든 심볼릭 레퍼런스 -> 다이렉트 레퍼런스로 변경 초기화: 클래스 변수들을 적절한 값으로 초기화 (static 필드) 실행엔진(Execution Engine)은 JVM 메모리에 올라온 바이트 코드들을 명령어 단위로 가져와서 실행한다. 이 때 두 가지 방식이 있다.

인터프리터: 바이트 코드 명령어를 하나씩 읽어 해석하고 실행한다. 하나하나의 실행은 빠르지만 전체 속도가 비교적 느리다. JIT 컴파일러 (Just-In-Time Compiler): 인터프리터의 단점을 보완하기 위해 도입된 방식으로, 바이트 코드 전체를 컴파일하여 바이너리 코드로 변경한다. 이후에는 해당 메서드를 더이상 해석하지 않고, 바이너리 코드로 직접 실행한다. 하나씩 해석하는 것이 아니라, 전체를 컴파일 한 후 실행하는 것이므로 전체 속도가 더 빠르다.

출처: https://gyoogle.dev/blog/computer-language/Java/%EC%BB%B4%ED%8C%8C%EC%9D%BC%20%EA%B3%BC%EC%A0%95.html

from http://gokong.tistory.com/23 by ccl(A) rewrite - 2021-10-10 13:27:39