자바 컴파일러(Java Compiler)
자바 소스 코드를 실행시키려면 먼저 기계가 잘 알아들을 수 있는 bytecode로 변환을 시켜야 한다.
변환하기 전의 원본 코드인 source code를, 기계에서 실행할 수 있도록 bytecode로 변환하는 일을 하는 프로그램이 바로 자바 컴파일러다.
- 이렇게 특정 프로그램에서 실행할 수 있도록 변환한 코드를 'target code'라고 부름. 특정 기계가 없으면 실행할 수 없다.
- Native code를 실행하는 것에 비해 실행 속도가 느린 대신, OS 독립적이라서 어떤 OS 에서라도 VM 만 설치되어 있으면 실행할 수 있다.
JVM(Java Virtual Machine)
자바 컴파일러가 변환한 bytecode를 실행시키는 프로그램 이다. (bytecode는 p-code라고도 부름)
이 프로그램은 bytecode를 읽어서 OS의 코드를 호출하는 일을 한다.
실행되는 과정을 설명하면 이렇다.
- JVM이 target code를 로딩한다.
- 필요한 기능을 OS에게 호출라면,
- OS가 HW를 제어함
한마디로, 자바 컴파일러가 컴파일한 target code를 OS에게 바로 접근할 수 없다.
반드시 JVM을 거쳐야 한다.
JVM의 기능을 호출하는 target code를 JVM이 로딩하면, JVM은 다시 OS의 기능을 호출하고, 다시 OS는 HW를 제어하는 것이다.
우리가 잘 알고있는 OS 프로그램인 메모장과 비교해보면 이해가 빠르다.
메모장은 윈도우 운영체제의 native app이므로, native code로 되어 있다.
- native code는 특정 OS의 기능을 바로 호출하는 코드로 '기계어 코드'라고 부름
- 프로그램은 곧장 OS기능을 호출하고, OS는 HW를 제어한다.
- 즉, JVM을 거칠 필요가 없다.
Target code(=bytecode)와 그것을 실행시켜주는 프로그램(VM)의 관계를 잘 이해하면 JVM에 대한 이해가 쉽다.
좋은 예로, Adobe Flash Player가 있다.
종종 어떤 웹 사이트에서 동영상을 보려고 하는데, 컴퓨터에 Flash Player가 설치되어 있지 않으면 동영상을 볼 수 없는 일을 경험해본 적이 있을 것이다.
해당 동영상은 Flash Player라는 실행 프로그램만 읽어들일 수 있는 targetcode로 되어 있기 때문에, Flash Player가 없이는 실행되지 않는 것임.
<코드 종류 별 특징 정리>
- source code(소스 코드)
- 원본 소스 코드
- 인간이 작성한 것
- byte code
- 특정 프로그램이 이해하도록 소스코드가 변환된 현태의 코드. 가상 기계를 위한 코드라고도 부른다.
- 해당 프로그램(VM)이 없이는 실행할 수 없는 대신, VM만 있으면 어느 OS에서도 실행시킬 수 있다.
- native code
- 기계어 코드 OS에 종속되는, 특정 OS에서만 실행할 수 있는 코드를 말한다.
- 다른 OS에서 실행하려면 일부 코드를 다시 짜고나서 컴파일을 다시 해야 한다.
참고 블로그
'JAVA > 지식' 카테고리의 다른 글
[ModelMapper] DTO to Entity, DTO to Entity로 변환하는 방법 (0) | 2021.03.09 |
---|---|
[Java] JRE, JDK, Server-JRE 차이 (0) | 2021.03.08 |
[Java] i++, i+=1, i=i+1 의 차이 (0) | 2021.03.05 |
[Spring] @Transactional 트랜잭션의 전파 설정에 따른 동작 (0) | 2021.03.04 |
[자바 예외 구분] Checked Exception, Unchecked Exception (0) | 2021.03.04 |