일전에 컴파일을 정리하며 "Java는 컴파일 기반 언어 중 하나다."라고 정리하였는데 최근 강의에서 Java는 컴파일러와 인터프리터를 모두 수행하는 '하이브리드 언어'이다.라는 말을 듣게 되어 정리를 해보았다.
그럼 우선 Java에 대해 알아보기 전에 인터프리터와 컴파일러를 간단히 알아보자.
컴파일러(compiler)
고급언어는 실행하기 전 기계가 이해할 수 있는 기계어로 번역하는 작업이 필요하다. 이것을 컴파일이라고 한다. 이런 컴파일을 해주는 도구 또는 논리적인 장치를 '컴파일러'라고 한다.
컴파일러는 프로그램 전체를 스캔하여 이를 모두 기계어로 번역한다. 전체를 스캔하기 때문에 초기 스캔 시간을 오래 걸린다. 하지만 전체 실행 시간 기준을 두고 비교해 보면 오히려 인터프리터보다 빠르다. 왜냐하면 컴파일러는 초기 스캔을 마치고 나면 실행파일을 만들어 놓고 다음 실행할 때 이전에 만들어놓은 실행파일을 실행시킨다.
인터프리터(interpreter)
인터프리터는 컴파일러와 다르게 프로그램 실행 시 한 번에 한 문장씩 번역한다. 한 번에 한 문장씩 번역 후 실행되는 구조이기 때문에 컴파일러보다 실행 시간이 느리다. 인터프리터에서는 번역과 실행이 동시에 이루어지므로 별도의 실행파일이 존재하지 않으며 이것은 빌드 시간이 없다는 의미와 동일하다.
인터프리터 처리 방식 때문에 컴파일러보다 통상적으로 메모리 효율이 좋다고 평가한다. 또한 오류 메시지 처리방식도 다르다. 컴파일러는 전체 코드를 검사 후 오류 메시지를 생성한다면 인터프리터는 한 문장씩 번역하다 오류가 발견되면 즉시 메시지를 생성한 후 프로그램을 중지하는 특징을 가지고 있다.
그럼 자바에서는 두 도구를 어떻게 활용할까?
자바는 우리가 알고 있는 것처럼 클래스 파일(.java)을 자바 컴파일러를 통해 바이트 코드(.class)로 변환하는 과정을 진행한다. 이후 런타임 시점이 되면 자바가상머신(JVM)을 통해 자바인터프리터와 JIT컴파일러가 이를 다시 기계어로 번역하여 컴퓨터로 전달한다.
그럼 자바는 한 번에 처리하지 않고 여러 단계를 거치는 걸까? 그것은 자바의 슬로건인 '한번 작성하면, 어디서든 돌아간다(write once, run anywhere)'하고 연관이 있다.
자바는 컴파일러를 통해 .class 파일을 만든다고 했는데 이 파일은 완벽한 실행파일이라고 볼 수 없다. 다시 말하면 운영체제에 맞는 완벽한 기계어가 아닌 중간 기계어이다. 자바는 운영체제 같은 플랫폼에 종속받지 않는다고 했으니 각 운영체제에 맞는 실행파일로 변환해 주는 작업이 필요하다. 이것을 하는 주체가 바로 '자바가상머신(JVM)'이다. 이 가상머신은 운영체제에 맞는 실행파일을 만들어 주며 그 과정은 인터프리터와 JIT컴파일러가 담당하게 된다.
그럼 JIT 컴파일러는 뭐야?
자바는 여러 단계를 거치는 바람에 초기에는 속도에 대한 이슈가 발생하였다. 그로 인해 나온 것이 JIT이다. JIT컴파일러는 인터프리터 언어의 단점을 보완하기 위해 매번 기계어코드를 새로 생성하지 않고 이전에 만든 기계어를 재사용한다. 그렇기 때문에 이전 자바 해석기(Java Interperter) 방식보다 성능적으로 10~20배 향상되었다고 평가한다.
Reference
[Do it! 자바 프로그래밍 입문]과 [개발자 상식] 책을 읽고 정리하였습니다.
https://rumor1993.tistory.com/90 글을 참고하였습니다,
'Language > Java' 카테고리의 다른 글
[스진초5기/Java] Overriding과 Overloading (0) | 2023.10.27 |
---|---|
[Java] String[]을 List , List를 String[]로 변환하는 방법 (0) | 2023.10.24 |
[스진초5기/Java] 오버라이딩을 구현할 때 꼭 @Override가 필요할까? [+어노테이션의 역할] (0) | 2023.10.23 |
[스친초5기/Java] 인터페이스와 객체지향 (0) | 2023.10.20 |
[스진초5기/Java] 객체지향의 4가지 특징 (0) | 2023.10.19 |