머신 코드
는 CPU가 직접 실행할 수 있는 이진 코드
이고, 바이트 코드
는 컴파일러에 의해서 생성된 중간 단계의 코드라고 할 수 있다. Java에서 바이트 코드
는 JVM
에서 실행되고 JVM
의 JIT 컴파일러
는 바이트 코드
를 머신 코드
로 변환하는 역할을 담당한다.
머신 코드
는 CPU에 의해서 바로 수행될 수 있는 즉, 컴퓨터가 이해하고 실행할 수 있는 코드를 말한다.High-Level
프로그래밍 언어(C언어, Java 등)로 작성한 코드를 소스 코드
라고 하는데 이것은 컴퓨터가 실행할 수 없는 코드이다.High-Level
의 코드들은 컴파일러
나 인터프리터
에 의해서 머신 코드
로 변환되고 CPU에 의해서 실행된다. 즉, 머신 코드
는 컴퓨터가 즉시 해석하고 실행할 수 있는 이진 명령
의 집합이다.소스 코드
가 컴파일된 후 생성되는 중간 단계의 코드를 바이트 코드
라고 한다. .java
파일을 컴파일하면 JVM
에서 실행될 수 있는 바이트 코드
를 생성하는데 CPU에 의해서 실행되기 위해서는 머신 코드
로 변환하는 단계를 다시 거쳐야 한다. 즉, 바이트 코드
는 JVM
과 같은 소프트웨어 해석할 수 있도록 고안된 명령 집합이다.인터프리터
와 컴파일러
모두 High-Level
프로그래밍 언어를 머신 코드
로 변환한다는 공통점이 있다. 컴파일러
는 프로그램이 실행되기 전에 변환하고 인터프리터
는 소스 코드를 한줄씩 번역하면서 실행한다. (즉, 프로그램의 실행과 소스 코드의 변환이 동시에 발생한다.)인터프리터
는 프로그램이 실행되는 동안 소스 코드
를 한줄씩 읽어가며 머신 코드
로 변환한다.소스 코드
를 한 줄씩 분석하며 머신 코드
로 변환하기 때문에 전체를 변환하는 컴파일러
에 비해 변환하는 시간이 적게 걸린다.소스 코드
전체를 머신 코드
로 변환한다. 이 과정은 한 번만 수행된다.소스 코드
전체를 분석하여 error
가 없는 경우 머신 코드
로 변환하기 때문에 변환하는 시간이 오래 걸린다.소스 코드
에 error
가 없어 머신 코드
로 변환되고 나면 추가적인 변환 작업이 없기 때문에 실행 속도가 빠르다.컴파일러
는 소스 코드
를 최초에 한 번만 변환하는 반면에 인터프리터
는 프로그램이 실행될 때마다 소스 코드
를 변환하는 작업이 동반되기 때문에 프로그램을 여러 번 실행하는 상황에서는 컴파일러
의 실행 시간이 짧은 것이 일반적이다.
하지만, 소스 코드
를 딱 한번!!! 실행한다고 가정했을 때, 인터프리터
와 컴파일러
의 실행 시간은 어떤 차이가 있을까?
인터프리터 실행 + 인터프리터가 프로그램을 실행
하는 시간과 Java 환경일 경우,컴파일 + JVM 기동 + 프로그램 실행
하는 시간을 비교해봐야 할 것이다.소스 코드
의 크기가 매우 크지만 사용자 입력에 따라 실행되는 부분은 아주 적다면 인터프리터
의 실행 시간이 더 작을 수 있을 것이다.JIT 컴파일러
는 빈번하게 수행되는 코드는 실행될 때마다 불필요하게 머신 코드
로 변환되지 않도록 한 번에 변환하고 이후에 호출될 때마다 미리 변환된 오브젝트 코드
를 실행한다.
감사합니다. 잘 봤습니다.