자바의 컴파일 과정을 이해해보자

MinKeun Kim·2021년 5월 31일
0

JAVA

목록 보기
1/3
post-thumbnail

자바의 호환성

자바의 컴파일 과정을 알기 전에,
우선 자바의 장점 한가지를 다루고 시작하겠습니다.
자바는 C언어와 다르게 각 OS별 컴파일러 없이 하나의 컴파일러로 모든 OS를 지원하는 특징을 가지고 있습니다.

예를 들어, C언어로 소스를 짜고 맥OS에 실행시키려면 맥용 C컴파일러가 필요하고 윈도우OS에 실행시키려면 윈도우용 C컴파일러가 필요한거죠.

물론, 이전 기종 마다 소스 파일을 짜야했던 어셈블리어와 기계어에 비하면 C언어는 소스 파일 하나만 짜면 되는 편리함을 가지고 있습니다.
C언어는 One Source Multi Object Use Anywhere의 모토를 가지고 있죠.

하나의 소스로 각 기기에 맞는 목적 파일을 만들어 어디든 사용 가능하다.

하지만, 자바는 Write Once Use Anywhere 의 모토를 가지고 있습니다.

소스 코드 하나만 짜면 어디든 사용 가능하다.

결국, 하나의 목적 파일로 어디든 실행 가능하냐, 다수의 목적 파일을 만들어 각 기기에 맞게 사용하냐의 차이입니다.

이 목적파일! (Bytecode로 이루어진 파일 = .class)인 반기계어를 만드는 역할을 하는 녀석이 바로 자바 컴파일러 입니다.


여기서, 반 기계어는 아직 컴퓨터가 읽을 수 없는 바이트 코드를 말하며, JVM이라는 애가 완전 기계 코드로 바꿔줍니다. JVM은 자바가상머신으로서, 자바 프로그램을 실행시켜주는 가상 컴퓨터라고 생각하면 됩니다. JVM의 자세한 내용은 추후에 올리도록 할게요!

위에서 언급한 것과 같이,
자바를 사용하게 되면 컴파일러를 기종별로 따로 구매해두지 않아도 됩니다.
심지어 자바 컴파일러는 무료입니다!

C컴파일러는 비싼건 1000만원대입니다.
최강 멀티 컴파일러 플랫폼인 gcc가 있다고는 워낙 느려서 잘 안 쓴다고 합니다..(2012년 기준)
이래서 기업에서 자바를 더 선호하게 된 것인지 모르겠습니다.


그렇다면, 자바 컴파일 과정을 그림으로 먼저 이해해 봅시다.

자, 그림을 토대로 자바 컴파일 순서를 정리해보겠습니다.

자바 컴파일 순서

  1. 개발자가 자바 소스파일(.java)를 작성합니다. (콘솔, 커맨드 창, 터미널, IDE툴 등 안에서)

  2. javac 명령어 또는 Build(또는 Run)를 사용하여 소스파일을 컴파일합니다.

  3. 이때 생성된, 자바 바이트 코드(.class)파일은 아직 컴퓨터가 읽을 수 없습니다.

  4. 해당 바이트 코드를 JVM의 클래스로더(Class Loader)에게 전달합니다.

  5. 클래스 로더는 동적 로딩을 통해 필요한 클래스들을 로딩 및 링크하여 JVM내로 로드합니다.

  6. JVM내에 있는 실행 엔진에 의해 기계어로 해석되어 메모리 상(Runtime Data Area)에 배치됩니다.

  7. 어떠한 OS든 Java가 설치 되어 있다면 JVM에 의해서 .java 코드가 기계어로 해석될 수 있는 것입니다.


여기서, 짚고 넘어가야 할 개념이 클래스 로더와 JVM 실행 엔진 인데요,
그 세부 동작을 한 번 읽어보면서,
JVM 메모리가 어떻게 생성되고 바이트 코드가 기계어로 어떻게 해석되는지 이해해 봅시다.

JVM내의 공간을 할당해주는 클래스 로더 세부 동작 과정

  1. 로드 : 클래스 파일을 가져와서 JVM의 메모리에 로드합니다.

  2. 검증 : 자바 언어 명세(Java Language Specification) 및 JVM 명세에 명시된 대로 구성되어 있는지 검사합니다.

  3. 준비 : 클래스가 필요로 하는 메모리를 할당합니다. (필드, 메서드, 인터페이스 등등)

  4. 분석 : 클래스의 상수 풀 내 모든 심볼릭 레퍼런스를 다이렉트 레퍼런스로 변경합니다.

  5. 초기화 : 클래스 변수들을 적절한 값으로 초기화합니다. (static 필드)


기계어로 해석해주는 실행 엔진 : Interpreter & JIT Compiler

Interpreter는 바이트 코드를 한 줄씩 읽기 때문에 실행이 느린 단점이 있었습니다.
이러한 단점을 보완하기 위해 나온 것이 JIT(Just-In-Time) Compiler 입니다.

JIT Compiler는 인터프리터 방식으로 실행을 하다가
적절한 시점에 바이트 코드 전체를 컴파일 하고 더 이상 인터프리팅 하지 않고 해당 코드를 직접 실행합니다.

JIT Compiler에 의해 해석된 코드는 캐시에 보관하기 때문에
한 번 컴파일 된 후에는 빠르게 수행하는 장점 있습니다.

반면, 처음 시작할 때에는 변환 단계를 거쳐야 하므로 성능이 느리다는 단점이 존재합니다.

하지만, CPU 성능이 점점 좋아지고 JDK의 성능 개선도 많이 이루어졌기 때문에 단점도 많이 개선되었습니다.



마무리

자바에서 빠져서는 안될 JVM의 내용은 추후에 다시 자세히 알아보기로 하고,
지금까지의 내용을 다룬 그림을 보면서 자바 컴파일 과정을 다시 한번 상기시키도록 하겠습니다.
끝!

출처
링크1
링크2

profile
자바 백엔드 개발자 입니다

0개의 댓글