1. 컴파일러
컴파일러는 특정 프로그램 언어로 작성된 문장을 처리하여 기계어 또는 컴퓨터가 사용할 수 있는 코드로 변경시켜주는 특수한 용도의 프로그램이라고 정의할 수 있다. C 나 Pascal과 같은 언어로 프로그램을 개발할 경우, 프로그래머는 편집기를 이용하여 한줄 한줄 문장을 작성하게 되는데, 이러한 파일들을 소스코드라고 부른다. 소스코드의 작성이 끝나면 프로그래머는 그 소스코드의 언어에 맞는 컴파일러를 실행시킨다.
컴파일러는 실행 시에 모든 문장을 먼저 구문적으로 하나씩 분해하고, (다른 문장을 참조하는 경우) 문장이 정확하게 참조될 수 있도록 여러 번의 연속적인 상태에서 결과코드를 만든다. 컴파일로 생긴 결과물은 목적코드(object code) 또는 목적 모듈(object module)이라 불리는데 - 여기서 object 라는 용어가 나왔지만 object-oriented programming 과는 아무 관련이 없다 - 목적코드는 프로세서가 한 번에 한 명령씩 처리하거나 또는 실행시킬 수 있는 기계코드(machine code)이다.
최근에 객체지향 언어의 하나인 자바에서는, 어떠한 컴퓨터 플랫폼에서도 실행될 수 있는 컴파일 결과물(이를 바이트코드라고 부른다)을 생산하는 체제를 도입했다. 이 바이트코드는 실행될 하드웨어의 종류에 관계없이 동일한 내용으로 생성되어 서버에 저장되는데, 필요할 때마다 네트웍을 통해 클라이언트로 다운로드된다. 클라이언트는 자바 가상머신 또는 바이트코드 해석기라고 불리는 JIT 컴파일러를 이용하여 바이트코드를 다시 컴파일 함으로써, 자신에 맞는 명령어로 변환한 다음 실행시키게 된다.
전통적으로 보통의 운영체계에서는 컴파일 이후에 또 하나의 추가과정이 요구되는데, 하나 이상의 목적 모듈이 동시에 실행되고 그것들이 서로의 명령어나 데이터를 상호 참조하게 될 때, 그 명령어나 데이터들 간의 상대적 위치를 정하는 과정이 그것이다. 이 과정을 링크 편집(linkage editing)이라 하며, 그 결과물은 로드 모듈(load module)이라 한다.
컴파일러는 3세대 언어(3GL), 4세대 언어(4GL) 및 5세대 언어(5GL)에 각각 적용되며, 어셈블러는 특정 프로세서의 어셈블러 언어로 작성된 프로그램에 적용된다.
▶ 컴파일러의 종류와 특징
1) 포트란 컴파일러(FORTRAN Compiler)
포트란은 1957년에 개발된 최초의 고급언어로서, 주로 계산에 적합하며, FORTRAN77은 포트란의 최신형개발형으로 1978년에 표준 FORTRAN으로 인정받게 되었다. 이러한 포트란 언어를 기계어로 번역해 주는 것이 포트란 컴파일러이다.
2) 코볼컴파일러 (COBOL Compier)
코볼은 일반 사무처리용으로 사용되는 언어이며, 영어 문장의 표현 형식을 이용한 서술방법으로 프로그램을 작성할수 있어 세계적으로 광범위하게 사용되는 언어이다. 이러한 코볼언어를 기계어로 번역해 주는 것이 코볼 컴파일러이다.
3) 베이직 컴파일러(BASIC Compiler)
베이직은 사용이 편하고 명령어 기능이 다양한 인터프리터 언어이기 때문에 개인용 컴퓨터에서 초보자를 위한 언어로 자리잡았다. 하지만 퀵베이직 컴파일러가 출현하면서 초보자를 위한 언어라는 인상을 탈피하려고 애쓰고 있다.
베이직 언어 중에서 가장 많이 사용되고 있는 것이 마이크로소프트사에서 개발한 QUICK BASIC이다.
4) 파스칼 컴파일러 (PASCAL Compiler)
파스칼은 상당히 구조적이기 때문에 교육용 프로그래밍 언어이면서 또한 실용성도 함께 갖추고 있다. 파스칼은 처음에 알골에서 시작해서 파스칼, 모듈라-2, 에이다로 이어지는 언어 체계라 하겠다. 이러한 파스칼 프로그램을 기계어로 번연해주는 것이 파스칼 컴파일러이다. 파스칼 컴파일러 중 가장많이 사용되는 것은 볼랜드사의 터보 파스칼인데, 이것은 통합환경이라는 장점을 가지고 있다.
5) C와 C++컴파일러(C & C++)
C 언어는 유닉스라는 운영체제를 위해 개발되었다. 이러한 이유로 해서 C언어를 시스템 프로그래밍에 적합한 고급언어라고 하며 여러 분야에서 상당히 유용하게 이용하고 있다.
논리적이고 객체 지향적인 형태를 덧붙여 C++ 라고 하는 새로운 개념을 가진 컴파일러도 출현시켰다. C언어중 많이 사용되고 있는 것이 Microsoft C와 Turbo C이며 객체지향 개념인 Borland C++도 많이 사용하고 있다.
C언어로 만들어지는 프로그램은 초기 확장자가 .C인 반면 C++에서 사용하는 초기확장자는 .CPP이다. 그러나 C++은 C언어를 포함하고 있기 때문에 .C인 형태로 작성된 프로그램도 에러없이 컴파일 할수 있다.
6) 에이다 컴파일러(ADA Compiler)
에이다 언어는 처음에 미 국방성에 의해 발표된 언어로 이 언어가 발표될 당시에는 상당한 주목을 받았으나, 지금은 별로 사용되고 있지 않으며, 이 언어의 장점이라면 각 모듈별로 처리가 가능하다는 것을 들수 있다.
7) 프롤로그 컴파일러(PROLOG Compiler)
프롤로그는 논리 프로그래밍 언어로서 1개의 논리식을 기술하고 해석을 가하여 프로그램화 한 것이며 일의 성질이나 관계를 사실이나 규칙으로 순수하게 표현할수 있다. 이화 같은 특징을 가지는 프롤로그는 인공지능 분야에서 많이 사용되고 있으며, 이 프롤로그 프로그램을 기계어로 번역해 주는 것을 프롤로그 컴파일러라 한다. 프롤로그 컴파일러 중 많이 사용되는 것이 Borland International에서 나온 터보 프롤로그 이다.
8) 클리퍼 컴파일러 (CLIPPER Compiler)
클리퍼는 처음에 dBase라는 데이터베이스 관리 스프트웨어에서 출발했다. 데이터 관리에 대한 사람들의 관심이 높아가고 고정된 틀이 아닌 자신이 원하는대로 하고자 하는 욕구로 인해 dBase상에서 프로그램이 가능하도록 하였고 이것이 발달하여 이제는 dBase내의 특정 기능이 아닌 데이터 베이스 컴파일러라는 한분야로 자리잡게 되었다. dBase컴파일러중 가장 대표적인 것이 Nantuket사에서 개발된 클리퍼 컴파일러 이고, 성능또한 우수하여 널리 사용되고 있다.
2. 인터프리터
인터프리터는 고급언어로 작성된 원시코드 명령문들을 한번에 한 줄씩 읽어들여서 실행하는 프로그램이다. 고급언어로 작성된 프로그램들을 실행하는 데에는 두 가지 방법이 있다. 가장 일반적인 방법은 프로그램을 컴파일 하는 것이고, 다른 하나는 프로그램을 인터프리터에 통과시키는 방법이다. 인터프리터는 고급 명령문들을 중간 형태로 번역한 다음, 그것을 실행한다. 이와는 대조적으로, 컴파일러는 고급 명령문들을 직접 기계어로 번역한다.
컴파일된 프로그램들은 일반적으로 인터프리터를 이용해 실행시키는 것보다 더 빠르게 실행된다. 그러나 인터프리터의 장점은 기계어 명령문들이 만들어지는 컴파일 단계를 거칠 필요가 없다는데 있다. 컴파일 과정은 만약 원시 프로그램의 크기가 크다면, 상당한 시간이 걸릴 수 있다. 이와는 달리 인터프리터는 고급 프로그램을 즉시 실행시킬 수 있다. 이런 이유 때문에, 인터프리터는 종종 프로그램의 개발단계에서 사용되는데, 그것은 프로그래머가 한번에 적은 량의 내용을 추가하고 그것을 빠르게 테스트 해보길 원하기 때문이다. 이 외에도 인터프리터를 이용하면 프로그래밍을 대화식으로 할 수 있기 때문에, 학생들의 교육용으로 사용되는 경우도 많다.
인터프리터와 컴파일러는 둘다, 대부분의 고급언어에 적용이 가능하지만, BASIC 이나 LISP과 같은 일부 언어들은 특별히 인터프리터에 의해서만 실행되도록 설계되었다. 그 외에도, 포스트스크립과 같은 페이지 기술 언어 들도 인터프리터를 사용한다. 모든 포스트스크립 프린터는 포스트스크립 명령문을 실행할 수 있도록 인터프리터가 내장되어 있다.
▶ 인터프리터 의 종류
1) LISP (List Processing)
Recursion 중심의 언어이며 프로그램과 자료를 동일시 한다. 기본자료 구조는 Linked List 이다. 기억장소 운영기업에 Garbage Collection을 도입하였다.
2) SNOBOL
문자처리용 언어이다. 기계 독립 MACRO언어 구현이 쉽다.
3) APL(A Programming Language)
대화용 언어로서 과학 계산이 매우 용이하다. 배열을 기본 원소로 처 리하기 때문에 수준 높은 고급 언어이다.
4) BASIC
대화용언어로서 PC에서 많이 이용된다.
구조적 프로그래밍과는 개념이 반대이다.(GO TO문을 많이 이용하기 때문)
3. 컴파일러와 인터프리터의 차이점
컴파일이라는 것은 사용자가 작성한 프로그램 전체를 기계어로 편집하는 것을 애기하고 인터프리터라는 것은 작성한 프로그램을 한줄씩 한줄씩 번역하면서 실행해나가는 것이라고 표현된다.
그런데 컴파일러는 결과물로서 하나의 실행파일을 만들어 내지만, 인터프리터는 그로한 실행 파일을 생성하지 않는다. 즉 다시 말해서 인터프리터는 번역하는 당시에만 프로그램에 해당하는 실행 명령을 만들어 내고, 실행후에는 사라지게 된다.
◆ 컴파일러의 실행과정
1) 어휘분석(Lexical Analysis)
2) 구분 분석(Parsing)
3) 의미분석(Semantics Analysis)
4) 중간 코드 생성
5) 기계어 코드 생성
◆ 인터프리터의 프로그램 실행 과정
1) 한명령어를 메모리에서 가져온다.
2) 가져온 명령어를 해석한다.
3) 필요한 데이터를 가져온다.
4) 명령을 실행한다.
4. 컴파일러와 인터프리터의 비교
일반적으로 컴파일 방식이 인터프리터 방식에 비해 나은 많기는 하지만 두가지 방법은 각기 다음과 같은 장단점이 있다.
인터프리터의 경우에는 실행시킬 때마다 번역이 선행 되므로 시간이 많이 걸리지만 컴파일의 경우에는 한 번만 번역을 하고 실행 파일이 생기므로 실행시에는 번역하는 시간이 걸리지 않아서 수행 속도가 빠르다.
또한 컴파일러는 컴파일 시에 전체 프로그램 코드가 생성되므로 사용하는 메모리가 많아지게 되고, 때에 따라서는 '메모리 부족 에러'를 발생 하기도 한다. 그러나 인터프리터의 경우에는 번역시 그때 그때 필요한 실행 코드를 생성하므로 사용하는 메모리가 작다.