컴파일러

  • 전체 소스코드를 보고 명령어 수집하고 재구성
  • 고레벨 언어를 바로 기계어로 변환

 

인터프리터

  • 소스코드의 각 행을 연속적으로 분석하며 실행
  • 고레벨 언어를 바로 기계어로 번역하지 않고 중간 코드(바이트 코드)로 변환시킨 후 기계어로 변환

 

인터프리터의 특징 4가지

  1. 인터프리터는 고레벨 언어를 중간 코드로 변환하고 이를 각 행마다 실행한다.

  2. 컴파일러가 각 행마다 실행하는 특성을 가진 인터프리터보다 실행시간이 더 빠르다.

  3. 컴파일러는 전체 소스코드 변환 후 에러를 보고하지만 인터프리터는 각 행마다 실행하는 도중
    에러가 보고되면 이후 작성된 코드를 보지 않는다. => 보안적인 관점에서 도움이 된다.

  4. 파이썬은 인터프리터 언어, C,C++은 컴파일 언어, 자바는 컴파일러와 인터프리터 모두 사용한다.

 

Compiler와 Interpreter가 하는 일 ( 자바 기준 )

컴파일러가 하는 일은?

 

helloworld를 작성하고 javac 명령어를 통해 helloworld.java 파일을 helloworld.class로 변환하는 것을 수행한다.

helloworld.java -> (javac) -> helloworld.class

 

응? 컴파일러는 기계어로 변환하는 프로그램이라고 했는데 .class 파일은 바이트 코드인데 이게 기계어인가...?
컴파일러는 소스코드 -> 오브젝트코드, 고레벨 언어 -> 저레벨 언어인 기계어로 변환한다. 
여기서의 기계는 하드웨어가 아닌 JVM을 위한 기계어로 변환한다는 뜻이다.

 

 

인터프리터가 하는 일은?

자바 컴파일러에 의해 변환된 .class 파일 내의 바이트 코드를 특정 환경의 기계에서 실행될 수 있도록 변환한다.

 

 

여기서 Machine language는 JVM을 말한다.

 

 

자바는 왜 컴파일과 인터프리터를 병행할까?

바로 기계어로 변환시키는 컴파일러는 프로그램이 작성된 기계상에서 실행할 때 매우 효율적이다. 대부분의 하드웨어
제어 시스템의 프로그래밍 언어가 C언어인 이유이다. 하지만 그렇기 때문에 기계의 종류에 종속될 수밖에 없다.

 

C언어와 달리 자바는 인터프리팅과 컴파일을 둘 다 사용한다.

인터프리팅은 플랫폼에 종속되지 않는다.

자바 바이트 코드는 컴퓨터와 프로그램 사이에 별도의 버퍼 역할을 한다.
    ☞ 이는 보안적인 장점이 될 수 있다.

 

이로 인해 자바는 플랫폼에 독립적이고 안전한 환경을 제공하면서 동시에 현대 프로그래밍 추상화를 완벽히 
수용할 수 있다.

 

즉, 자바는 컴파일러로 바이트 코드를 생성해 보안적인 장점을 얻음와 동시에 인터프리터를 사용해 플랫폼에
독립적이다.

 

+ Recent posts