Home Java 컴파일 과정
Post
Cancel

Java 컴파일 과정

Intro

Java는 JVM(Java Vitual Machine) 덕분에 OS에 독립적이라는 특징을 갖고 있다.

다시말해 어느 하드웨어(CPU)던, 운영체제(OS)이던 상관없이 컴파일 된 코드(바이트코드)가 플랫폼 독립적이라는 것이고, 이 점이 웹 어플리케이션의 특성과 맞아 떨어져 이 분야에서 가장 많이 사용되는 언어 중 하나가 되었다.


JVM의 동작원리를 살펴보며 Java의 컴파일 과정을 알아가보려 한다.





1. JVM(Java Virtual Machine)이란 ?

자바 프로그램 실행환경을 만들어 주는 소프트웨어

(= 컴파일 된 바이트코드를 실행시켜주는 가상의 컴퓨터)

  • C언어의 경우, 플랫폼별로 컴파일러가 따로 필요하기에 여러 플랫폼에서 실행할 경우 바이트 코드도 여러개가 된다. image
  • JVM은 H/W와 OS 위에서 실행되기 때문에, 플랫폼에 따라 호횐되는 JVM을 실행시켜줘야 한다. 위 예시처럼, 윈도우와 리눅스의 JVM이 다른 것이다.

결국, JVM으로 인해 하나의 바이트 코드(.class)로 모든 플랫폼에서 동작 가능하기에 Java가 플랫폼 독립적이라는 큰 장점을 가질 수 있게 된 것이다.

단, 위에서 언급했듯이 , Java는 플랫폼에 독립적이지만 JVM은 플랫폼에 종속적임에 유의하자.


다음으로 이 JVM이 java 소스코드를 실행시키는 동작원리를 알아보자.




2. Java 프로그램 동작 원리

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

개발자가 코드를 작성하면, 작성된 코드는 컴파일과 런타임 과정을 거쳐 실행된다.

코드 작성부터 실행까지 순차적인 과정은 다음과 같다.


컴파일 타임 환경

  1. 자바 소스코드(.java) 작성
  2. 자바 컴파일러(Java Compiler)가 자바 소스파일을 컴파일

    → 바이트코드(.class)파일이 생성됨

  3. 컴파일 된 바이트 코드를 JVM의 클래스 로더(Class Loader)에게 전달 (런타임 시작)


런타임 환경

image 출처

  1. 클래스 로더는 동적로딩(Dynamic Loading)을 통해 필요한 클래스들을 로딩 및 링크하여 런타임 데이터 영역(Runtime Data area, JVM의 메모리)에 올린다.


  1. 실행엔진(Execution Engine)은 JVM 메모리에 올라온 바이트 코드들을 명령어 단위로 하나씩 가져와서 실행한다.



3. 번외) Java는 왜 컴파일러와 인터프리터를 모두 사용할까 ?

참고 : Java는 왜 컴파일러와 인터프리터 둘 다 가지는가?

결론적으로, 컴파일러의 장점짧은 실행시간인터프리터의 장점플랫폼 독립적 + 보안성 강화를 모두 수용하기 위함이 아니었을까.

JVM을 위한 컴파일을 수행하고, JVM 내에서는 인터프리터를 통해 다양한 플랫폼에 적용가능하도록 코드 작성을 위한게 아닐까 생각한다.





Outro

[Java] 컴파일 과정

[JAVA] JVM 동작원리 및 기본개념

[Java] 자바 가상머신 JVM(Java Virtual Machine) 총정리

This post is licensed under CC BY 4.0 by the author.