인터프리터와 컴파일러의 차이
컴파일러 & 인터프리터
◎ 컴파일러
일반 프로그래밍 언어를 기계어로 번역하는 프로그램을 말하는데 그 과정은 렉시칼분석단계, 구문분석단계, 씨만틱분석단계 중간코드 생산단계 코드 효율화 단계와 코드생산단계로 나누고 있는데, 원시 프로그램은 이러한 단계를 거쳐서 기계코드로 번역이 되는데 이러한 단계를 구성하는 소프트웨어가 컴파일러가 되는 셈이다.
렉시칼 분석단계에서는 각 토큰을 생산하는 자동(automata)을 구성해야 하며, 구문분석단계에서는 파싱나무를 구성하는 프로그램과 씨만틱 분석단계에서는 파싱나무로부터 자료구조나 코드를 생산하는 프로그램 그리고 코드의 효율화, 코드의 생산단계에서는 효율을 올리기 위한 알고리즘과 목적기계에 맞는 코드를 생산하는 프로그램을 준비해야 한다.
프로그래밍 언어에서 구문이 어떤 수학적인 허점을 가지면 바로 구문분석에서 그 허점이 드러나며 구문이 얼마나 효율적으로 구성되였는가는 이 구문분석 단계에서 쉽게 평가가 될 수 있다.
또한 씨만틱스 분석단계에서는 기계의 필요한 개념이나 기능을 삽입할 수 있는 기회를 만드는 등 이 컴파일링 과정은 프로그래밍 언어를 구성할 때 얼마나 효율적으로 했느냐에 달려있다.
컴파일러의 경우 Fortran에서 Pascal, Ada에 이르기까지 시대별로 살펴보면 Fortran의 컴파일러는 Fortran이 구문이 없기 때문에 언어의 구조가 단순하고 간단하여 그 컴파일러의 구조도 가장 간단하며 단순하고 또한 그 효율도 매우 우수하다.
그러나 Pascal의 블록구조의 성격이라든가 구문이 수학적으로 구성되어 있기 때문에 컴파일하는 방법이 수학적이므로 컴파일러의 구조는 간단치 않으나 컴파일러를 만드는데는 Pascal이 Fortran에 비하여 10배가량 소요기간이 짧고 자동화로 인하여 매우 기술적인 점이 특이하다.
Fortran에서 Pascal로 발전 방향이 정해진 것은 말할 것도 없이 파서의 힘으로 보며 소프트웨어가 훨씬 과학적으로 취급되고 있는 것은 씨만틱 분석의 결과라고 말할 수 있다. 이와같이 파서나 씨만틱 분석의 장점도 더욱 복잡한 Ada에 가서는 다시 모든 문제가 복잡하게 출현됨은 새로운 소프트웨어 기구라든가 소프트웨어 기술을 요구하고 있다고 할 수 있다.
◎ 인터프리터
프로그래밍 언어에 따라서는 컴파일러를 쓰지 않고 인터프리터(interpreter)라는 번역기를 사용하여 프로그램을 처리하기도 하는데 일반적으로 인터프리터를 쓰는 경우는 프로그램이 복잡하지 않고 짧으며 질문에 응답하는 상응식(interactive)프로그램에서 많이 쓰는데 인터프리터는 원시프로그램을 번역하지 않고 바로 처리하도록 되어 있다.
인터프리터는 어떤 명령어를 기억장소에서 불러서 이 명령어를 검사한 다음 실행하고 다시 명령어를 부르기 위하여 주소를 증가하고 이 증가된 주소 위치에 있는 명령어를 불러내어서 바로 실행하는데 그 방식이 마치 어셈블리 언어 프로그램 처리하는 것과 비슷하다.
인터프리터는 원시프로그램을 직접실행하기 때문에 이 실행에 필요한 소프트웨어가 항상 기계안에 상주하면서 원시 프로그램의 명령들을 받아서 처리하게 된다. 그러나 만일 반복을 하게 되면 그때마다 원시 프로그램을 해석하여 처리하기 때문에 많은 시간이 걸리기도 한다.
그러나 컴파일러는 컴파일하는 과정이 복잡하고 그 시간이 많이 걸리게 되는데 한번 컴파일하면 그대로 사용이 가능하여 반복하는 경우에 기계코드가 반복을 하기 때문에 처리시간이 매우 빠르게 된다.
기억장소에 대해서는 컴파일러는 컴파일하는 단계별로 주기억장치안에 들어 올 수 있기 때문에 기억장소의 크기는 조정이 될 수 있는 점이 장점이기도 하다.
가장 대표적인 인터프리터로 APL을 들 수가 있는데 이것은 원시 프로그램을 앞에서 야기한 순서대로 처리하는 것을 볼 수 있으며 LISP나 Prolog과 같은 언어에서는 리크존이 많이 생기는데 이때는 우선 리크존이 프로그램을 크게 확장하게 하는데 확장이 완료된 후부터 인터프리터의 순서로 원시프로그램을 실행하게 된다.
이들의 인터프리터의 크기는 대개 필요한 기능을 얼마나 많이 갖고 있느냐 하는 것과 비례하는데 이들은 프로그램 자체가 상당히 크기 때문에 상당한 기억용량을 필요로 하기도 한다.
일반 프로그래밍 언어를 기계어로 번역하는 프로그램을 말하는데 그 과정은 렉시칼분석단계, 구문분석단계, 씨만틱분석단계 중간코드 생산단계 코드 효율화 단계와 코드생산단계로 나누고 있는데, 원시 프로그램은 이러한 단계를 거쳐서 기계코드로 번역이 되는데 이러한 단계를 구성하는 소프트웨어가 컴파일러가 되는 셈이다.
렉시칼 분석단계에서는 각 토큰을 생산하는 자동(automata)을 구성해야 하며, 구문분석단계에서는 파싱나무를 구성하는 프로그램과 씨만틱 분석단계에서는 파싱나무로부터 자료구조나 코드를 생산하는 프로그램 그리고 코드의 효율화, 코드의 생산단계에서는 효율을 올리기 위한 알고리즘과 목적기계에 맞는 코드를 생산하는 프로그램을 준비해야 한다.
프로그래밍 언어에서 구문이 어떤 수학적인 허점을 가지면 바로 구문분석에서 그 허점이 드러나며 구문이 얼마나 효율적으로 구성되였는가는 이 구문분석 단계에서 쉽게 평가가 될 수 있다.
또한 씨만틱스 분석단계에서는 기계의 필요한 개념이나 기능을 삽입할 수 있는 기회를 만드는 등 이 컴파일링 과정은 프로그래밍 언어를 구성할 때 얼마나 효율적으로 했느냐에 달려있다.
컴파일러의 경우 Fortran에서 Pascal, Ada에 이르기까지 시대별로 살펴보면 Fortran의 컴파일러는 Fortran이 구문이 없기 때문에 언어의 구조가 단순하고 간단하여 그 컴파일러의 구조도 가장 간단하며 단순하고 또한 그 효율도 매우 우수하다.
그러나 Pascal의 블록구조의 성격이라든가 구문이 수학적으로 구성되어 있기 때문에 컴파일하는 방법이 수학적이므로 컴파일러의 구조는 간단치 않으나 컴파일러를 만드는데는 Pascal이 Fortran에 비하여 10배가량 소요기간이 짧고 자동화로 인하여 매우 기술적인 점이 특이하다.
Fortran에서 Pascal로 발전 방향이 정해진 것은 말할 것도 없이 파서의 힘으로 보며 소프트웨어가 훨씬 과학적으로 취급되고 있는 것은 씨만틱 분석의 결과라고 말할 수 있다. 이와같이 파서나 씨만틱 분석의 장점도 더욱 복잡한 Ada에 가서는 다시 모든 문제가 복잡하게 출현됨은 새로운 소프트웨어 기구라든가 소프트웨어 기술을 요구하고 있다고 할 수 있다.
◎ 인터프리터
프로그래밍 언어에 따라서는 컴파일러를 쓰지 않고 인터프리터(interpreter)라는 번역기를 사용하여 프로그램을 처리하기도 하는데 일반적으로 인터프리터를 쓰는 경우는 프로그램이 복잡하지 않고 짧으며 질문에 응답하는 상응식(interactive)프로그램에서 많이 쓰는데 인터프리터는 원시프로그램을 번역하지 않고 바로 처리하도록 되어 있다.
인터프리터는 어떤 명령어를 기억장소에서 불러서 이 명령어를 검사한 다음 실행하고 다시 명령어를 부르기 위하여 주소를 증가하고 이 증가된 주소 위치에 있는 명령어를 불러내어서 바로 실행하는데 그 방식이 마치 어셈블리 언어 프로그램 처리하는 것과 비슷하다.
인터프리터는 원시프로그램을 직접실행하기 때문에 이 실행에 필요한 소프트웨어가 항상 기계안에 상주하면서 원시 프로그램의 명령들을 받아서 처리하게 된다. 그러나 만일 반복을 하게 되면 그때마다 원시 프로그램을 해석하여 처리하기 때문에 많은 시간이 걸리기도 한다.
그러나 컴파일러는 컴파일하는 과정이 복잡하고 그 시간이 많이 걸리게 되는데 한번 컴파일하면 그대로 사용이 가능하여 반복하는 경우에 기계코드가 반복을 하기 때문에 처리시간이 매우 빠르게 된다.
기억장소에 대해서는 컴파일러는 컴파일하는 단계별로 주기억장치안에 들어 올 수 있기 때문에 기억장소의 크기는 조정이 될 수 있는 점이 장점이기도 하다.
가장 대표적인 인터프리터로 APL을 들 수가 있는데 이것은 원시 프로그램을 앞에서 야기한 순서대로 처리하는 것을 볼 수 있으며 LISP나 Prolog과 같은 언어에서는 리크존이 많이 생기는데 이때는 우선 리크존이 프로그램을 크게 확장하게 하는데 확장이 완료된 후부터 인터프리터의 순서로 원시프로그램을 실행하게 된다.
이들의 인터프리터의 크기는 대개 필요한 기능을 얼마나 많이 갖고 있느냐 하는 것과 비례하는데 이들은 프로그램 자체가 상당히 크기 때문에 상당한 기억용량을 필요로 하기도 한다.
◎ 컴파일러와 인터프리터의 비교
1. 컴파일러 : 원시 언어가 고급언어이고 목적 언어가 실제 기계 언어에 가까운 저급 언어인 번역기이다.
인터프리터 : 고급언어를 기계어로 취하는 컴퓨터를 가상하여 주어진 컴퓨터상에서 시뮬레이션하는 기법
2. 번역기와 인터프리터는 고급 언어로 된 프로그램을 입력 자료로 읽어 들이는데, 번역기는 단지 그 입력 프로그램과 동일한 목적언어로 된 프로그램을 출력만 하는데 반하여, 인터프리터는 직접 그 입력 프로그램을 실행시킨다.
3. 번역 기법의 가장 큰 장점은 전체 실행 시간면에서 매우 효율적이라는 것이다. 반면 단점은 번역된 프로그램이 큰 기억 장치를 요구한다는 것이다.
4. 인터프리터 기법은 번역 기법의 장단점과 거의 반대의 경우가 된다. 실행 시간의 효율을 중시하는 프로그래밍 언어에서는 주로 번역 기법을 적용하고, 사용자의 융통성을 중시하는 언어에서는 주로 인터프리터 기법을 적용하게 된다.
1. 컴파일러 : 원시 언어가 고급언어이고 목적 언어가 실제 기계 언어에 가까운 저급 언어인 번역기이다.
인터프리터 : 고급언어를 기계어로 취하는 컴퓨터를 가상하여 주어진 컴퓨터상에서 시뮬레이션하는 기법
2. 번역기와 인터프리터는 고급 언어로 된 프로그램을 입력 자료로 읽어 들이는데, 번역기는 단지 그 입력 프로그램과 동일한 목적언어로 된 프로그램을 출력만 하는데 반하여, 인터프리터는 직접 그 입력 프로그램을 실행시킨다.
3. 번역 기법의 가장 큰 장점은 전체 실행 시간면에서 매우 효율적이라는 것이다. 반면 단점은 번역된 프로그램이 큰 기억 장치를 요구한다는 것이다.
4. 인터프리터 기법은 번역 기법의 장단점과 거의 반대의 경우가 된다. 실행 시간의 효율을 중시하는 프로그래밍 언어에서는 주로 번역 기법을 적용하고, 사용자의 융통성을 중시하는 언어에서는 주로 인터프리터 기법을 적용하게 된다.
댓글
댓글 쓰기