자바의 철학
Write Once, Run Anywhre ⇒ WORA 한 번 쓰고 모든 곳에서 실행한다.
자바 가상 머신(JVM, Java Virtual Machine)
- 자바 프로그램이 어느 기기, 어느 운영체제 상에서도 실행 가능하게 만들어 줌
- 자바 프로그램의 메모리를 효율적으로 관리 & 최적화
자바 런타임 환경(JRE, Java Runtime Environmnet)
JRE = 자바 클래스 라이브러리, 자바 가상 머신(JVM) + 자바 클래스 로더
클래스 로더, 클래스 라이브러리를 통해 작성한 자바 코드를 라이브러리와 결합한 후 JVM에 넘겨 실행시킨다. JRE는 그 자체로 특별한 기능을 한다기보다는 JVM이 원활하게 잘 작동할 수 있도록 환경을 맞춰주는 역할을 한다.
자바 개발 키드(JDK, Java Development Kit)
자바로 개발을 하지 않는 일반 사용자들은 자바로 만든 프로그램을 실행만 하게 되기 때문에 JRE만 설치해도 된다. 그러나 자바로 뭔가를 만들어 보고 싶은 사람은 JDK를 설치해야 한다. JDK를 설치하면 JRE가 자동으로 설치된다. 그리고 JRE는 JVM을 포함하고 있다.
JDK에는 JRE에는 없는 “자바 컴파일러"를 포함하고 있다. 컴파일러란 작성한 자바 문법을 컴퓨터가 이해할 수 있게 바꿔주는 해석기 같은 존재이다. 실제로 java 파일을 만들어서 실행하면 컴파일 작업을 거쳐 class파일이 자동으로 생성된다.
JIT 컴파일(Just-In-Time Compilation)
JIT 컴파일 또는 동적 번역은 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일 기법이다.
전통적인 입장에서 컴퓨터 프로그램을 만드는 방법으로는 두 가지가 있는데 인터프리트 방식과 정적 컴파일 방식으로 나눌 수 있다. 이 중 인터프리터 방식은 실행 중 프로그래밍 언어를 읽어가면서 해당 기능에 대응하는 기계어 코드를 실행하며, 반면 컴파일은 실행하기 전에 프로그램 코드를 기계어로 번역한다.
JIT 컴파일러는 두 가지 방식을 혼합한 방식으로 생각할 수 있는데 실행 시점에서 인터프리터 방식으로 기계어 코드를 생성하면서 그 코드를 캐싱하여 같은 함수가 여러 번 불릴 때 매번 기계어 코드를 생성하는 것을 방지한다.
JVM은 JIT 컴파일을 지원한다. 즉 자바 컴파일러가 자바 프로그램 코드를 바이트코드로 변환한 다음 실제 바이트 코드를 실행하는 시점에서 자바 가상 머신이 바이트 코드를 JIT 컴파일을 통해 기계어로 변환한다.
바이트 코드
자바 바이트 코드는 자바 가상 머신이 이해할 수 있는 언어로 변환된 자바 소스 코드를 의미한다. 바이트코드는 기계어는 아니지만 가상 머신에 의해 기계어로 손쉽게 변환할 수 있는 코드이다. JIT 컴파일러는 바이트 코드를 읽어 빠른 속도로 기계어를 생성할 수 있다. 이 런 기계어 변환은 코드가 실행되는 과정에서 실시간으로 일어나며(Just-In-Time) 전체 코드의 필요한 부분만 변환한다. 기계어로 변환된 코드는 캐시에 저장되기 때문에 재사용시 컴파일을 다시 할 필요가 없다.
기계어
기계어는 0과 1로 이루어진 바이너리 코드이다. 컴퓨터(CPU)는 일종의 계산기로서, 0과 1로 이루어진 바이너리 코드를 해석하여 프로그램을 실행한다. 따라서 컴퓨터에게 일을 시키기 위해서는 기계가 이해할 수 있는 기계어로 명령을 내려야 한다.
프로그래밍 언어
기계어는 실제 인간이 사용하는 언어와 거리가 멀기 때문에 기계어로 프로그래밍을 하는 것은 매우 비효율적이다. 이러한 문제를 해결하기 위해 등장한 것이 고급언어이다. 컴퓨터가 이해하기 쉽도록 쓰여진 저급언어와 달리 고급언어는 사용자가 이해하기 쉽도록 만들어졌다. 그 중 하나가 자바이다.
참고
https://m.blog.naver.com/ki630808/221844888233?view=img_3
https://ko.wikipedia.org/wiki/JIT_컴파일
'자바' 카테고리의 다른 글
Call by Value와 Call by Reference (0) | 2022.07.14 |
---|---|
String의 특징 (0) | 2022.07.14 |
equals()와 hashCode() (0) | 2022.07.14 |