[OS] Compiler vs Interpreter

Jay·2021년 3월 9일
4

Computer Science

목록 보기
29/50
post-thumbnail

자바 언어에서 인터프리터 방식과 컴파일 방식

1. 인터프리터 방식

  • 원래 인터프리터의 의미는 고급 언어로 작성된 프로그램을 한줄씩 번역해서 OS에서 인식하는 기계어로 변역하는 역할이다.
  • 자바 인터프리터는 JAVAC 명령으로 자바 프로그램을 중간 형태인 바이트 코드로 컴파일하고 이를 자바 인터프리터가 한 줄 씩 해석하면서 기계어로 번역을한다.
  • 자바 인터프리터와 Run-Time System이 이식된 모든 플랫폼에서 자바 바이트코드를 직접 실행 한다.
  • 번역속도는 빠르지만.. 실행속도는 느리다.

2. 컴파일 방식

  • 원래 컴파일러는 고급 언어로 작성된 프로그램을 목적 프로그램으로 번역 후 링킹 작업을 통해 실행 프로그램을 생성한다.
  • 자바는 javac로 컴파일 하고 java로 실행 시 중간언어(클래스 파일)을 한줄씩 자바 인터프리터가 번역하기에 컴파일 언어 이면서 인터프리터 언어이다.

다시 핵심!

컴파일러와 인터프리터의 차이!

둘 다 고레벨 언어로 작성된 프로그래밍 언어를 기계어로 번역하는 것은 동일하다!

둘의 차이는

🤚컴파일러전체 소스코드를 보고 명령어를 수집하고 재구성하지만
인터프리터는 소스코드의 각 행을 연속적으로 분석하며 실행한다.

🤚 위의 그림 같이
인터프리터는 고레벨 언어를 바로 기계어로 번역하지 않고 중간 형태로 변환시킨 후 실행한다.
반면 컴파일러는 고레벨 언어를 바로 기계어로 변환한다.

인터프리터의 특성 4가지

  1. 컴파일러는 소스코드 전체를 훑고 컴퓨터 프로세서가 실행 할 수 있도록 바로 기계어로 변환한다. 인터프리터는 고레벨 언어를 중간 코드로 변환하고 이를 각 행마다 실행한다. 이 중간 코드는 다른 프로그램에 의해 실행된다.
  2. 일반적으로 컴파일러가 각 행마다 실행하는 특성을 가진 인터프리터보다는 실행시간이 빠르다.
  3. 컴파일러는 전체 소스코드 변환 후 에러를 보고하지만 인터프리터는 각 행마다 실행하는 도중 에러가 보고되면 이후 작성된 코드를 보지 않는다. 보안적인 관점에서 도움이 된다.
  4. 파이썬은 인터프리터 언어, C,C++은 컴파일 언어, 자바는 컴파일러와 인터프리터 모두 사용한다.🙀

Compiler와 Interpreter가 하는 일을 생각해보자. (자바기준)

컴파일러가 하는 일?

helloworld를 작성하고 javac 명령어를 통해 helloworld.java 파일을 helloworld.class로 변환하는 것을 해볼 수 있다. -> 자바 컴파일러가 수행
java -> (javac) -> class

흠? 컴파일러는 기계어를 변환하는 프로그램이라고 하였는데 .class 파일 안의 바이트코드가 기계어인가..?

컴파일러가 소스코드를 오브젝트코드로, 고레벨 언어를 저레벨 언어인 기계어로 변환한다는 것을 안다.
여기서의 기계는 하드웨어가 아니다.
JVM을 위해 기계어로 변환한다는 것이다.

그럼 인터프리터가 하는 일?

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

위와 같은 프로세스로 동작하게 된다.
위에서 말했듯 Machine Language는 JVM을 가리킨다.


🤔 자바는 기본적으로 컴파일과 인터프리터를 왜 병행할까?

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

자바 인터프리팅은 자바 컴파일러를 통해 생성된 클래스 파일을 기계어로 변환한다.

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

2️⃣ 자바 바이트코드는 컴퓨터와 프로그램 사이에 별도의 버퍼 역할을 한다.

  • 이는 보안적인 장점이 될 수도 있다. 바이러스나 기타 악성 프로그램에 대응하는 가드 같은 보안 계층에 의해 보호 될 수 있다.

자바와 자바 바이트 코드 조합으로 플랫폼에 독립적이고 안전한 환경을 제공하면서 동시에 현대 프로그래밍 추상화를 완전 수용 할 수 있다.

컴파일러 - 바이트 코드 생산 (보안적인 장점)
인터프리터 - 플랫폼 독립적

Reference

profile
developer

0개의 댓글