JVM - ExecutionEngine

유정현·2024년 3월 27일

개요

JVM 글을 작성하면서 쭉 타고와 ExecutionEngine까지 왔다. JVM구조, 클래스로더 등등 이제 ExecutionEngine과 GarbageCollector만 하고 마무리 해볼 생각이다. JVM을 공부하다보면, 알고있는 내용이 조금 더 깊어지는 느낌이 들어 기분이 좋다. ExecutionEngine은 다른 내용보다 조금 더 와닿는 느낌이 든다.

💻인터프리터 방식

JVM의 ExecutionEngine은 인터프리터 방식에서 시작되었다. 인터프리터는 프로그래밍 언어의 소스 코드를 바로 실행하는 컴퓨터 프로그램 또는 환경을 말한다. 원시 코드를 기계어로 번역하는 컴파일러가 아니다.

  1. 인터프리터는 고급 언어로 작성된 프로그램을 한 줄 단위로 받아들여 번역하고, 번역과 동시에 프로그램을 한 줄 단위로 즉시 실행시키는 프로그램이다.
  2. 프로그램이 직접 실행되므로 목적 프로그램은 생성되지 않는다.
  3. 줄 단위로 번역, 실행되기 때문에 원시 프로그램의 변화에 반응이 빠르다.
  4. 번역 속도는 빠르지만 프로그램 실행시 매버 번역해야 하므로 실행 속도가 느리다.
  5. 예시로 Python, Baic 등이 있다.

컴파일러와 다른 점은 소스 코드를 전체적으로 한 번에 번역하는 것이 아니라는 점이다. 인터프리터는 컴파일러와는 다르게 소스 코드를 전체적으로 한 번에 번역하는 것이 아니라, 코드를 한 줄씩 읽어들여 번역하고 실행하는 방식으로 한다.

💻JIT 컴파일러

JAVA는 인터프리터 방식에서 JIT 컴파일러 방식을 추가하는 방향으로 변화했다.
JIT 컴파일 또는 동적 번역은 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일 기법이다.
이는 인터프리트 방식과 정적 컴파일 방식 두 가지를 혼용한 것으로, 실행 시점에 인터프리트 방식으로 기계어 코드를 생성하면서 그 코드를 캐싱하여, 같은 함수가 여러 번 불릴때 매번 기계어 코드를 생성하는 것을 방지한다.

최근의 자바 가상 머신과 .NET, V8(node.js)에서는 JIT 컴파일을 지원한다. 즉, 자바 컴파일러가 자바 프로그램 코드를 바이트코드로 변환한 다음, 실제 바이트코드를 실행하는 시점에서 자바 가상 머신이 바이트코드를 JIT 컴파일을 통해 기계어로 변환한다.

JIT컴파일러는 전체 코드의 필요한 부분만 변환한다. 기계어로 변환된 코드는 캐시에 저장되기 때문에 재사용시 컴파일을 다시 할 필요가 없다.

정리하기

결국 JVM의 ExecutionEngine은 Interpreter와 JITCompiler로 이뤄져 있다. 그리고 두 방식을 혼용하여 사용하며, 각각의 특징점이 섞여 JVM에서 코드가 실행된다. ExecutionEngine의 경우 자바 코드로 볼 수도 없고, 아직 내가 알 수 없는 기계어단이라 깊은 내용을 다루지 못해 아쉽다. 그래도 다음 가비지 컬렉터만큼은 탄탄한 내용이니 더 열심히 정리해보겠다!

profile
코딩하는 감자입니다.

0개의 댓글