- JVM, JRE, JDK 개념
[Java] 기본(JVM, JRE, JDK) -1
Java
에서는 JDK에 포함된 컴파일러(javac)에 의해 소스파일(*.java)이 목적파일(*.class)로 변환될 때 컴퓨터가 바로 인식가능한 바이너리 코드가 아닌 바이트 코드
로 변환된다. 이 바이트 코드는 JVM에 의해 기계어로 해석된다.
반면, C언어
는 컴파일러에 의해 소스파일(*.c)이 목적파일(*.obj)로 변환될 때 바이너리 파일
로 변환된다. 즉, 컴파일 후에 이미 컴퓨터가 이해할 수 있는 이진코드로 변환된 것이다.
이처럼 C언어와는 다른 동작원리를 가진 Java는 OS에 종속적이지 않는 특징을 갖는다. 즉, JVM을 사용하여 원도우와 리눅스/맥 등 다양한 환경에서 언제나 동일하게 실행할 수 있다는 장점이 있다. 이는 반대로 바이트 코드는 모든 JVM에서 동일한 실행 결과를 보장하지만, JVM은 운영체제에 종속적이다라는 말과 상통한다. 즉, JVM을 운영체제에 맞게 설치하여야 한다.
위와 같이 동작원리를 알면, JVM
, JRE
, JDK
각각이 하는 역할이 확실하게 구분된다.
JVM
은 컴파일된 코드를 직접 실행하며, JRE
는 컴파일된 .class 파일이 동작할수 있도록 하는 환경을 제공한다. JRE는 JVM 위에서 프로그램이 원할하게 실행되기 위한 필수적인 요소들을 제공해준다. 그러나 JRE만으로는 실제 Java 코드가 주어져도 이를 분석하거나 클래스 파일로 변환하는 일을 할 수 없다. Java Compiler를 비롯한 개발에 필요한 요소들이 없기 때문에 이러한 경우에는 JDK
를 설치하여 사용한다.
즉, 자바로 뭘 개발하는 것이 아니라 실행에만 초점을 맞춘 경우라면 JRE를 설치하여 사용하고 개발을 한다면 JDK를 설치한다. 기존에는 개별적으로 설치가 가능했지만 오라클 JDK-11 버전부터는 따로 제공하지 않는다고 한다.
프로그래밍 언어: 사람이 작성하는 문자로 이루어진 읽기 좋은 코드 ex) C, C++, Java, Python...
인터프리터(interpreter
): 프로그래밍 언어의 소스 코드를 한 줄씩 읽어 바로 실행하는 컴퓨터 프로그램 또는 환경으로 원시코드를 기계어로 번역하는 컴파일러와 대비됨
원시코드(Source Code
): 프로그래밍 언어로 작성된 텍스트로 원시코드로 작성된 파일은 컴파일러에 의해 파일이 컴파일 됨
목적코드(Object Code
) 또는 목적파일(Object File): 소스코드 컴파일의 결과물, 즉 컴파일된 파일
컴파일(Compile
): 프로그래밍 언어를 기계어 혹은 기계어와 유사한 Low Level까지 해석해 주는 과정
컴파일러(Compiler
): 프로그래밍 언어를 기계어로 빠르게 컴파일 할 수 있도록 미리 번역해둔 프로그램
바이트 코드(Byte code
): JVM 등 VM에서 사용되는 코드 개념으로, 가상 머신이 이해할 수 있는 중간 레벨로 컴파일 한 것을 말함. 이는 어셈블리어와 유사한 형태를 띄고 있으며, javac, csc.exe 등의 컴파일러에 의해 바이트 코드로 변환되고, 이 바이트 코드는 다시 기계어로 해석되는데 이 과정은 인터프리터 방식으로 작동함
바이너리 코드(Binary code
): 컴파일러에 의해 생성된 목적 파일이 Binary code라 이해하면 쉽다. 단, 바이너리 코드는 컴퓨터가 이해할 수 있는 언어지만 '링커'에 의해 메모리 주소 값을 반영하고 CPU가 직접 해독하고 실행할 수 있도록 수정되어야 기계어가 되는 것이기 때문에 가장 기계어와 유사한 레벨의 코드이지만 완전한 기계어는 아님
어셈블리어(Assembly languange
): 니모닉 기호를 정해 사람이 쉽게 제어할 수 있도록 한 것으로 기계어에 1:1로 대응됨
기계어(Machine code
): CPU가 직접 해독하고 설명할 수 있는 비트 단위(0과 1)로 쓰인 컴퓨터 언어로 가장 Low Level Language다. CPU 종류에 따라 서로 다른 코드를 갖게 된다.
Ref.
공부하는 개발자 YouTube
성실하게 준비한 하루 이야기
좋은 개발자가 되자 - 컴파일러, 목적 파일, 바이트 코드....
두리랑 여차저차 개발