바이트 코드와 머신 코드

YaaaPyoung·2022년 4월 12일
1

머신 코드는 CPU가 직접 실행할 수 있는 이진 코드이고, 바이트 코드는 컴파일러에 의해서 생성된 중간 단계의 코드라고 할 수 있다. Java에서 바이트 코드JVM에서 실행되고 JVMJIT 컴파일러바이트 코드머신 코드로 변환하는 역할을 담당한다.


1. 머신 코드 (Machine Code)

  • 머신 코드CPU에 의해서 바로 수행될 수 있는 즉, 컴퓨터가 이해하고 실행할 수 있는 코드를 말한다.
  • 우리는 사람에게 친숙한 High-Level 프로그래밍 언어(C언어, Java 등)로 작성한 코드를 소스 코드라고 하는데 이것은 컴퓨터가 실행할 수 없는 코드이다.
  • 이러한 High-Level의 코드들은 컴파일러인터프리터에 의해서 머신 코드로 변환되고 CPU에 의해서 실행된다. 즉, 머신 코드는 컴퓨터가 즉시 해석하고 실행할 수 있는 이진 명령의 집합이다.

2. 바이트 코드 (Byte Code)

  • 소스 코드가 컴파일된 후 생성되는 중간 단계의 코드를 바이트 코드라고 한다.
  • Java의 경우, .java 파일을 컴파일하면 JVM에서 실행될 수 있는 바이트 코드를 생성하는데 CPU에 의해서 실행되기 위해서는 머신 코드로 변환하는 단계를 다시 거쳐야 한다. 즉, 바이트 코드JVM과 같은 소프트웨어 해석할 수 있도록 고안된 명령 집합이다.

3. 인터프리터 vs 컴파일러

  • 인터프리터컴파일러 모두 High-Level 프로그래밍 언어를 머신 코드로 변환한다는 공통점이 있다.
  • 차이점은 아래와 같다. 컴파일러는 프로그램이 실행되기 전에 변환하고 인터프리터는 소스 코드를 한줄씩 번역하면서 실행한다. (즉, 프로그램의 실행과 소스 코드의 변환이 동시에 발생한다.)

1) 인터프리터

  • 인터프리터는 프로그램이 실행되는 동안 소스 코드를 한줄씩 읽어가며 머신 코드로 변환한다.
  • 소스 코드를 한 줄씩 분석하며 머신 코드로 변환하기 때문에 전체를 변환하는 컴파일러에 비해 변환하는 시간이 적게 걸린다.

2) 컴파일러

  • 컴파일러는 프로그램이 실행되기 전에 소스 코드 전체를 머신 코드로 변환한다. 이 과정은 한 번만 수행된다.
  • 소스 코드 전체를 분석하여 error가 없는 경우 머신 코드로 변환하기 때문에 변환하는 시간이 오래 걸린다.
  • 하지만 소스 코드error가 없어 머신 코드로 변환되고 나면 추가적인 변환 작업이 없기 때문에 실행 속도가 빠르다.

컴파일러가 인터프리터보다 무조건 실행 속도가 빠르다고 할 수 있을까? (Feedback 반영)

  • 컴파일러소스 코드를 최초에 한 번만 변환하는 반면에 인터프리터는 프로그램이 실행될 때마다 소스 코드를 변환하는 작업이 동반되기 때문에 프로그램을 여러 번 실행하는 상황에서는 컴파일러의 실행 시간이 짧은 것이 일반적이다.

  • 하지만, 소스 코드딱 한번!!! 실행한다고 가정했을 때, 인터프리터컴파일러의 실행 시간은 어떤 차이가 있을까?

    • 우선 고려할 사항으로는 인터프리터 실행 + 인터프리터가 프로그램을 실행 하는 시간과 Java 환경일 경우,컴파일 + JVM 기동 + 프로그램 실행 하는 시간을 비교해봐야 할 것이다.
    • 또한, 소스 코드의 크기가 매우 크지만 사용자 입력에 따라 실행되는 부분은 아주 적다면 인터프리터의 실행 시간이 더 작을 수 있을 것이다.

4. JIT 컴파일러

  • JIT 컴파일러는 빈번하게 수행되는 코드는 실행될 때마다 불필요하게 머신 코드로 변환되지 않도록 한 번에 변환하고 이후에 호출될 때마다 미리 변환된 오브젝트 코드를 실행한다.

[출처]

1. 바이트코드 vs 머신코드

2. JIT 컴파일러

3. 인터프리터 vs 컴파일러

0개의 댓글