Java 는 컴파일 언어인가, 인터프리터 언어인가?

윤화둥둥·2023년 3월 26일
1
post-thumbnail

Java로 작성된 프로그램은 컴파일, 인터프리터 두번의 과정을 통해 실행된다.

Java로 작성된 프로그램은 javac 명령을 통해, .class(=자바 바이트코드) 파일을 생성할 수 있다. 이 파일은 Java 파일을 JVM 이 보다 쉽게 이해할 수 있도록 만든 중간 파일이다. 이 파일을 만드는 과정을 컴파일이라 한다.

이 프로그램이 실행될 때는, 만들어진 .class 파일을 메모리에 올리고, 실시간으로 기계어로 변환하여 동작한다. 이 과정을 인터프리터라 한다.

JVM의 구성요소인 Class Loader 에 의해 .class 파일들이 메모리에 적재되고, Execution Engine 에 의해 기계어로 변환되어 실행된다.

이와 다르게 C언어로 작성된 프로그램은 컴파일 시에, .class 같은 중간 파일이 아닌 기계어로 변환된 파일을 바로 도출한다. 따라서 인터프리터 작업 없이 바로 실행이 가능하다.

Java는 왜 바로 기계어로 변환하지 않고, 중간파일을 둔 것일까? 그 이유는 Java가 멀티 플랫폼을 지원하기 때문이다.

Java로 작성된 프로그램은 멀티 플랫폼을 지원한다.

기계어라는 것은 프로세서가 이해할 수 있는 언어이다. 그러나 프로세서는 많은 종류가 있고, 이들이 모두 같은 기계어를 사용하지 않는다. 즉 사용하는 프로세서의 동작 방식에 따라서 기계어도 달라진다.

C언어로 작성된 프로그램은 각 프로세서의 동작 방식에 맞추기 위해, 각 프로세서에 맞는 컴파일러를 사용한다. 이에 반해, Java로 만들어진 프로그램은 실행 시에 각 프로세서에 맞추어 기계어로 변환해주기 때문에, 프로세서를 고려하지 않아도 된다.

이러한 특성 때문에, Java는 .class 라는 중간파일을 가지고 있으며, 컴파일과 인터프리터를 병행하는 방식을 채택하였다.

캐싱기법을 통해 성능을 개선하다.

인터프리터 작업은 실시간으로 기계어로 번역을 하기 때문에 미리 기계어를 만들어 두는 C언어와 같은 기법에 비해 상대적으로 성능이 떨어진다. 이를 개선하기 위해서 JVM 내 Execution Engine 에서 JIT Compiler를 제공한다.

JIT Compiler는 자바 인터프리터와 유사하게 동작하지만 번역한 기계어에 대해서 캐싱 작업을 한다. 그래서 이 후에 동일한 번역 작업이 발생하게 되면 캐싱된 공간에서 이미 작업된 기계어를 가져오기 때문에 보다 좋은 성능을 발휘할 수 있다.

0개의 댓글