[Java] compiler V.S. interpreter
python 은 interpreter에 의해 소스코드가 machine code로 변환된 후 바로 CPU로 전달되는 반면,
C와 C++은 compiler에 의해 소스코드가 단번에 binary로 이뤄진 전체 machine- code file로 바뀐뒤, executor를 거쳐 CPU로 전달되는 것으로 알려져있다.
python 자체의 속도가 느린 이유도 여기에 있는데, 소스코드를 한 줄씩 읽어 실행하는 방식으로 동작하기 때문이다. 인터프리터는 소스 코드를 실행하는 동안에도 번역을 수행하기 때문에 컴파일러에 비해 실행 속도가 느릴 수 밖에 없다.

반면 자바는 컴파일러와 인터프리터를 모두 사용하지만, 컴파일러를 사용하는 경우가 더 많다.
자바 소스 코드는 .java 파일로 작성되며, 이 파일은 자바 컴파일러에 의해 바이트 코드(bytecode - 또는 Java Virtual Machine Code 라고 불린다.) 로 번역된다. 바이트 코드는 .class 파일에 저장되며, 이 파일은 JVM(Java Virtual Machine)에서 실행된다.
자바가 인터프리터를 사용하는 경우는 어떤 경우일까? 그건 자바의 REPL(Read-Eval-Print Loop)인 JShell이 소스 코드를 실행하는 경우다. 그 때 자바는 인터프리터 방식으로 실행한다. 또한 자바에서 동적으로 클래스를 생성하고 로드하는 경우에도 인터프리터를 사용하여 동적으로 생성된 코드를 실행한다.
뿐만 아니라 자바 11부터는 소스 코드를 인터프리터 방식으로 실행하는 기능을 제공하는 JEP 330: Launch Single-File Source-Code Programs이 추가되었다. 이 기능을 사용하면 단일 소스 파일로 구성된 자바 애플리케이션을 컴파일하지 않고 바로 실행할 수 있다.
JVM의 역할
- JVM은 자바의 platform independent를 위한 핵심 장치다. 다시 말해 servers, desktop, computers, and samll hand-held devices 등 어떤 장치에서든 applications를 develop하고 deploy하게 한다.
- 바이트 코드 실행: JVM은 컴파일된 자바 코드(바이트 코드)를 실행한다. 이를 위해 JVM은 바이트 코드를 기계어로 번역하여 실행한다.
- 메모리 관리: JVM은 자바 애플리케이션에서 사용하는 메모리를 관리한다. 이를 위해 JVM은 힙(heap)과 스택(stack) 메모리를 사용하며, 가비지 컬렉션(garbage collection) 기능을 제공하여 더 이상 사용되지 않는 객체를 자동으로 제거한다.(물론 코더가 explicit하게 제거해달라고 명령해 공간을 확보할 수 있다. )
- 보안 관리: JVM은 자바 애플리케이션의 보안을 관리한다. JVM은 애플리케이션의 코드를 검증하고, 악성 코드 실행을 방지하는 보안 기능을 제공한다.
- 클래스 로딩: JVM은 자바 애플리케이션에서 사용하는 클래스를 로딩한다. 이를 위해 JVM은 클래스 로더(class loader)를 사용하며, 필요한 클래스를 동적으로 로딩한다.
- 멀티 스레드 관리: JVM은 자바 애플리케이션에서 동시에 실행되는 스레드를 관리한다. 이를 위해 JVM은 스레드 스케줄링, 스레드 동기화 등의 기능을 제공한다.