프로그래밍 언어의 처리

컴파일러

A compiler is a special program that processes statements written in a particular programming language and turns them into machine language or “code” that a computer’s processor uses. 출처[techtarget]

컴파일러의 각 단계

  • 어휘 분석 단계 (lexical analysis phase)

    주어진 소스 프로그램을 프로그래밍 언어의 가장 작은 거성요소인 토큰들의 나열 로 바꾸는 과정이다. 이 과정에서 프로그램의 실행과는 무관한 주석이나 각종 공백 문자들을 제거한다. 미리 정해지지 않은 토큰에 대해서는 오류를 발생한다. 미리 정해진 토큰들은 예약어, 식졀자, 상수, 연산자, 특수 기호 등이다.

  • 구문 분석 단계(syntax analysis phase)

    토큰들의 순서가 원래 언어의 문법에 맞게 작성되었는지 검사하는 과정이다. 이 과정을 다른말로 파싱 이라고 하고, 프로그램의 문법 구조를 나타내는 추상 구문 트리 혹은 파스트리를 생성한다.

  • 의미 분석 단계

    파스 트리를 이용하여 현재 분석중인 문장의 의미를 파악한다. 파스트리는 실제 의미를 가진 토큰들의 의미 트리(semantic tree)로 변환 된다.

  • 중간 코드 생성 단계

    추상 구문 트리가 완성되면, 컴파일러 내부에서만 사용 되는 중간 표현(IR, Intermediate Representation)구조로 추상 구문 트리를 변환한다. 중간 표현을 생성하는 이유는 여러 종류의 프로그래밍 언어를 생산지가 다른 CPU의 기계어와 대응 시키기 위해서이다. 중간표현이 없을 경우

    만약 중간 표현이 없다고하면 각 언어는 cpu 제조사에 따라 명령어를 모두 가지고 있어야한다. 중간 표현이 있는 경우

    출처: http://twinw.tistory.com/73 [흰고래의꿈]

  • 코드 최적화 단계

    중간 코드에서 불필요한 코드를 제거하거나 더 효율적인 코드로 개선한다.

  • 코드 생성 단계

    목적 프로그램을 생성 한다.


인터프리터

인터프리터(interpreter, 문화어: 해석기)는 프로그래밍 언어의 소스 코드를 바로 실행하는 컴퓨터 프로그램 또는 환경을 말한다. 컴파일된 프로그램들은 일반적으로 인터프리터를 이용해 실행시키는 것보다 더 빠르게 실행된다. 컴파일 과정은 만약 원시 프로그램의 크기가 크다면, 상당한 시간이 걸릴 수 있다. 이와는 달리 인터프리터는 고급 프로그램을 즉시 실행시킬 수 있다. 이런 이유 때문에, 인터프리터는 종종 프로그램의 개발단계에서 사용되는데, 그것은 프로그래머가 한번에 적은 양의 내용을 추가하고 그것을 빠르게 테스트 해보길 원하기 때문이다. 이 외에도 인터프리터를 이용하면 프로그래밍을 대화식으로 할 수 있기 때문에, 학생들의 교육용으로 사용되는 경우도 많다.

출처:[위키백과]

코드를 한 줄씩 읽어 내려가며 실행하는 프로그램.

출처:[나무위키]


혼합 방식

JIT 컴파일(just-in-time compilation) 또는 동적 번역(dynamic translation)은 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일 기법이다. 이 기법은 프로그램의 실행 속도를 빠르게 하기 위해 사용된다.

.전통적인 입장에서 컴퓨터 프로그램을 만드는 방법은 두가지가 있는데, 인터프리트 방식과 정적 컴파일 방식으로 나눌 수 있다. 이 중 인터프리트 방식은 실행 중 프로그래밍 언어를 읽어가면서 해당 기능에 대응하는 기계어 코드를 실행하며, 반면 정적 컴파일은 실행하기 전에 프로그램 코드를 기계어로 번역한다.

JIT 컴파일러는 두 가지의 방식을 혼합한 방식으로 생각할 수 있는데, 실행 시점에서 인터프리트 방식으로 기계어 코드를 생성하면서 그 코드를 캐싱하여, 같은 함수가 여러 번 불릴 때 매번 기계어 코드를 생성하는 것을 방지한다.

최근의 자바 가상 머신과 .NET, V8(node.js)에서는 JIT 컴파일을 지원한다. 즉, 자바 컴파일러가 자바 프로그램 코드를 바이트코드로 변환한 다음, 실제 바이트코드를 실행하는 시점에서 자바 가상 머신이 바이트코드를 JIT 컴파일을 통해 기계어로 변환한다.

출처 : 위키백과

컴파일러와 인터프리터는 각각 별도로 존재할 수 없다. 일반적으로 초기 번역기 간단한 경우에는 언어가 해석(interpret)된다고 하고, 번역기가 복잡한 경우에는 컴파일 된다고 한다.