Compiler vs Interpreter

Taeseon Kim·2021년 8월 26일
0
post-thumbnail

const, let, var로 시작하여 모르는 단어들이나 개념들이 많아 공부하면서 정리하다보니 여기까지 오게 되었는데,
오늘은 JavaScript 코드를 실행하는 원리인 인터프리터와 비슷하면서도 다른 원리인 컴파일러에 대해 이야기 해보겠다.

Compiler vs Interpreter

컴퓨터 언어들을 몇 가지 살펴보다 보면, 컴파일 언어, 인터프리터 언어라는 말이 있었다. 사실 나도 이 블로깅을 위한 공부를 하기 전까지만 해도 컴파일링 - 편집, 인터프리팅 - 통역 정도의 직역만 가능했다.

Conpiler

컴파일러와 인터프리터의 가장 큰 차이점은, 컴파일링 작업의 유무이다.
컴파일링 작업은 컴파일러나 프로그래밍 언어의 특성에 따라 일부 단계는 생략되거나 더 세부적인 단계로 나뉠 수도 있지만, 기본적인 단계는 이렇다.

  1. 구문 분석
  2. 최적화
  3. 코드 생성

1. 구문 분석(Parsing)

구문 분석 단계에서는 일련의 문자열을 의미있는 토큰(token)으로 분해하고 이들로 이루어진 parse tree를 만드는 과정을 말한다.

이해를 돕기 위해 추상적인 개념을 코드로 표현해보면,

const writer = 'tess';

간단한 js 변수 선언 코드를 컴파일한다면, 이를 파싱하는 과정은 이렇게 된다.

[const, writer, =, ', tess, ']

이런 식으로 변환이 되는 과정이 토큰 분해 과정이다. (이해를 돕기 위해 js Array type으로 표현하였다.)
그리고 분해된 토큰을 parse tree로 결합시키는데,

{
  type: const,
  content: {
    key: {
      content: writer
    },
    value: {
      type: string,
      content: tess
    }
  }
}

이런 식으로 만들어지는 모습일 것이다. (물론 이 또한 이해를 돕기 위해 js Object type으로 표현하였다.)

2. 최적화

추상 구문 트리를 분석하여 최적화를 수행한다.
도달할 수 없는 코드를 식별하거나, 상수 표현식을 미리 계산해 두거나, 루프 풀기 등의 대부분의 최적화가 이 단계에서 수행된다.

const writer = 'tess';
writer = '김코딩';

해당 코드를 컴파일링 한다면, 파싱 단계에서 추상 구문 트리화 된 해당 코드를 분석하다가, 상수인 writer에 '김코딩'을 재할당하려는 코드를 해당 단계에서 도달할 수 없는 코드로 식별하여 오류로 분류하게 될 것이다.

3. 코드 생성

컴파일링은 소스 코드을 이루는 언어와 소스 코드가 작용하는 플랫폼이 작동 가능한 언어가 다르기 때문에, 소스 코드를 플랫폼이 작동할 수 있는 언어로 바꿔주는 작업인데, 코드 생성 단계의 목적 코드는 최적화된 구문 트리를 플랫폼이 작동하는 언어로 바꿔주는 단계이다.

Interpreter

이와 같은 동작 과정을 거쳐 컴파일링이 진행되는데, 인터프리터의 경우 해당 과정을 거치지 않는다.

인터프리터는 굳이 단계를 나눈다면,

  1. 소스코드 평가과정
  2. 런 타임

해당 과정으로 진행된다.

결국 인터프리터는

  1. 소스코드의 언어를 플랫폼의 언어로 직접 변환하여 실행하거나,
  2. 인터프리터 시스템의 일부인 컴파일러가 변환한 코드를 직접 실행할 수 있거나,
  3. 소스코드를 바이트코드와 같은 효율적인 중간 코드로 변환했다가 목적 언어로 변환하여 실행한다.

Compiler vs Interpreter

두 구동방식의 장단점을 살펴보고 이번 글은 마무리 해보겠다.

Compiler

  1. 컴파일 과정이 오래 걸릴 수 있고, 메모리도 많이 차지하게 된다.
  2. 또한 코드 수정 시 컴파일 과정을 다시 진행해야 하기 때문에 개발 편의성이 떨어진다.
  3. 전송 시 실행 파일 전체를 보내야 하므로, 용량면에서도 비교적 클 수 밖에 없다.
  4. 하지만 컴파일 이후에는 최적화된 코드를 한번에 실행하기에 실행이 빠르고, 한번 변환한 코드는 더 이상 변환하지 않아도 되기에 효율적이다.
  5. 또한 코드가 변환되어 실행되므로, 보안면에서 비교적 월등하다.

Interpreter

  1. 소스 코드를 한 줄씩 읽어가며 실행하기에, 실행 시간이 비교적 느리다.
  2. 또한 코드의 변환 과정이 단순하여 보안면에서 비교적 불안하다.
  3. 하지만 코드 수정 시 즉시 실행 및 피드백이 가능하다.
  4. 또한 전송 시 코드만 보내도 되므로 용량면에서도 비교적 작다.
profile
공부하여 이해가 된 것만 정리합니다.

0개의 댓글