인터프리터 & 혼합 기법

언어이론

2020. 4. 14. 12:20

1. Compiler(번역기) vs Interpreter(해석기)

1) 컴파일러

  • 소스코드 전체를 보고 프로세서가 실행할 수 있게 기계어로 변환
  • 한번에 전부 변환 -> 한번에 전부 실행이기 때문에 실행속도가 빠름
  • 소스코드 전부를 입력으로 넣기 때문에 코드를 모두 보고 컴파일타임 에러를 잡아냄
  • 코드를 목적프로그램으로 변환하며, 메모리에 저장되어 다시 컴파일 안해도 됨
  • 예 : C, FORTAN

 

2) 인터프리터

  • 고레벨 언어를 중간 코드로 변환하고 이를 각 행마다 실행한다.
  • 기계어변환 -> 1줄 실행 -> 기계어변환 -> 1줄 실행의 과정을 거쳐서 느림
  • 소스코드의 일부를 입력으로 넣기 때문에 컴파일타임 에러를 못잡아냄 
  • 주로 스크립트 언어들이 인터프리터 기법으로 만들어진게 많음
  • 목적프로그램으로 안만듬. 코드로만 되어있어서 다시 실행하면 다시 인터프리팅함
  • 예 : BASIC, Javascript, HTML, PHP, Python

 

2. Hybrid (혼합기법)

가장 대표적인 Hybrid 언어인 Java를 보고 Hybrid 방식의 특징과 장점등에 대해 알아보자.

 

1) 컴파일러 ($javac HelloWorld.java)

  • 컴파일러의 경우 프로그램이 작성된 것과 동일한 ABI에서 실행할 때 매우 효율적이다.
  • Java의 경우는 C와 C컴파일러를 사용해 만들어진 언어이고, 이는 기계종속적이라는 것이다.
  • 그러나 Java는 기계독립적인 언어로 매우 유명하다. Java의 경우 ABI에 종속된 것이 아니라
  • 바로 JVM (Java Virtual Machine)에 종속적이다. 따라서 가상 기계를 위한 컴파일이 진행된다
  • 이 것이 java -> javac(컴파일러) -> class 변환의 과정이다 (.class파일은 VM을 위한 기계어이다)

 

2) 인터프리터 ($java HelloWorld)

  • 인터프리터의 경우 class파일을 입력받아 특정기계의 환경에서 실행될 수 있는 형태의 기계어로 변환한다
  • 예를 들어 IBM PC에서 만들어진 java코드가 Mac에서 실행될 수 있다는 의미이다.

 

3) 왜 컴파일러와 인터프리터를 모두 사용할까?

  • 기본적으로 ABI에 종속되지 않는 언어를 만들기 위해서는 인터프리터 기법으로 만들면 된다.
  • 그러나 인터프리터 기법은 기본적으로 느리다. 때문에 일부 과정을 컴파일로 대체하여 빨라진다.
  • 또한 먼저 컴파일 과정을 거치기 때문에 컴파일타임에 에러를 완벽하게 잡아낼 수 있다.
  • 또한 인터프리터 방식의 단점인 소스코드 공개 컴파일러 방식의 단점인 ABI 종속성을 해결함