SOIEU.TAGSABOUT

자바는 인터프리터 언어일까, 컴파일 언어일까?

자바 실행 과정

javac의 역할

  • javac는 보통 "자바 컴파일러"라고 부르지만, 엄밀히 말하면 바이트코드 생성기에 가깝다.
  • .java 파일을 바이트코드로 변환.class 파일을 생성하는 역할을 한다.
  • 하지만 컴파일의 일반적인 정의(고수준 언어를 다른 형태로 변환)로 볼 때, javac를 컴파일러라 부르는 것도 틀리지는 않다.

JIT 컴파일러의 역할

  • JIT(Just-In-Time) 컴파일러는 자바 실행 과정에서 런타임 시 동작하는 컴파일러로, 바이트코드를 네이티브 기계어로 변환한다.
  • 이는 런타임 중에 수행되며, 프로그램의 성능을 최적화하기 위해 반복 실행되는 바이트코드를 기계어로 캐싱하여 이후 실행 속도를 높인다.

클래스 로더의 동작

  • 클래스 로더는 JVM에서 클래스 파일을 적재하고, 필요한 클래스를 메모리에 로드한다.
  • 이 과정에서 동적 동작이 발생하며, 대표적으로 다음과 같은 작업이 수행된다.
    • 인스트루먼테이션(Instrumentation): 런타임 시 클래스의 바이트코드를 변경하거나 수정할 수 있다.
    • 모듈 식별: 자바 모듈 시스템을 활용해 필요한 모듈을 로드하고 관리한다.
    • 클래스 탐색: 사용자가 정의한 클래스 및 라이브러리 클래스 경로를 검색하여 로드한다.

인터프리터의 역할

  • 클래스 로더에 의해 적재된 바이트코드는 인터프리터를 통해 한 줄씩 읽혀 실행된다.
  • JIT 컴파일러가 기계어로 변환한 코드는 인터프리터 없이 바로 실행되지만, 초기 실행 시에는 인터프리터가 주로 사용된다.

결론

  • 자바는 인터프리터 언어이자 컴파일러 언어다.
    • 컴파일러 언어의 측면: JIT 컴파일러가 실행 시 기계어로 변환한다.
    • 인터프리터 언어의 측면: 바이트코드를 인터프리터로 해석하며 실행한다.
  • 이 두 가지 방식의 조합으로 플랫폼 독립성과 높은 성능을 모두 달성한다.