컴파일러와 인터프리터

신승준·2022년 8월 12일
0

기계어에서 고급언어로, 고급언어에서 기계어로

컴파일러와 인터프리터는 모두, 사람이 작성한 고급 언어를 컴퓨터가 읽을 수 있는 기계어로 번역해주는 프로그램이다. 여기서 고급 언어란 C나 Java, JavaScript, Python 등을 일컫는다. 그리고 컴퓨터는 0과 1로 된 데이터만 읽을 수 있는데 이렇게 0과 1로 이루어진 코드를 기계어라고 한다.

앞서 말한 바와 같이 컴퓨터는 0과 1로 된 이진 데이터만 읽어서 연산을 수행할 수 있다. 하지만 우리, 즉 사람은 0과 1로 된 데이터로 유의미한 해석을 하거나 코드를 써내려가기에는 많은 어려움이 있다. 그렇다 보니 이를 보완하기 위해 고급 언어인 C, Java, JavaScript, Python이 만들어지게 되었다.

어쨋든 코드는 사람이 작성한다.(요즘엔 코파일럿이라는 인공지능이 작성하기도 하지만!) 따라서 이 코드를 결국엔 다시 컴퓨터가 알아먹을 수 있는 기계어로 번역해주는 것이 필요하다. 이 과정에서 사용되는 것이 컴파일러와 인터프리터이다.

컴파일러와 인터프리터의 차이

컴파일러는 고급 언어 전체를 한 번에 번역한다. 그리고 곧바로 실행할 수 있는 실행 파일(0과 1로 이루어진 바이너리 파일)을 만든다.(메모리에 저장되는 것이다) 반면 인터프리터는 고급 언어 전체를 한 번에 번역하는 것이 아니라, 한 줄 한 줄 번역하며 번역된 대로 바로 실행한다. 이것이 컴파일러와 인터프리터의 동작에 있어 차이점이다.

Compiler converts the whole high level language program to machine language at a time.
Interpreter converts the whole high level language program to machine language line by line.

컴파일러는 한 번에 번역이 되다 보니 이 전체를 번역하는 과정이 느리다. 하지만 전체가 번역이 되었으니 곧바로 실행만 하면 되기에, 고급 언어로 짜여진 소스 코드 전체를 번역하고 나서는 실행이 빠르다. 당연하게도, 이 때부터는 번역을 할 필요가 없기 때문이다.

반면 인터프리터는 한 줄마다 번역하고 실행하고 하다보니, 곧바로 실행도 가능해 빠르게 보인다. 하지만 아무래도 한 줄 한 줄 번역과 실행을 반복하니, 번역을 다 마치고 나서 그 뒤로부터는 실행만 하면 되는 컴파일러로 번역된 것과는 다르게 느릴 수 밖에 없다. 코드 돌릴 때마다 한 줄 한 줄 번역과 실행을 반복하니까!

또 다른 차이점은, 컴파일러는 번역을 마치고 나면 이 번역된 코드, 즉 곧바로 실행이 가능한 executable file이 만들어진다. 하지만 인터프리터로 동작되는 언어는 이러한 파일을 생성하지 않는다. 그냥 번역하고 바로 실행하니까 따로 만들 필요가 없나보다.

또또 다른 차이점은 에러를 출력하는 시점이다. 컴파일러는 컴파일, 즉 고급 언어로 작성된 소스 코드를 번역해가면서 문법이 맞지 않는 등, 컴파일에 방해되는 지점이 발생하면 에러가 발생한다. 즉 소스 코드가 실행되기 전에 에러가 발생한다.(번역과 실행은 다른 것이다. 번역은 일단 컴퓨터가 읽을 수 있도록 기계어 코드로 만드는 과정이고, 실행은 이 번역된 것을 바탕으로 컴퓨터가 연산을 수행하는 것이다) 반면 인터프리터 언어는 한 줄 번역하고 한 줄 실행하다보니 쭈욱 읽어 내려가다가 에러가 발생한다. 그냥 실행하다가 에러가 난다고 보면 된다.

그래서 대표적으로 컴파일러 언어인 C와, 내가 자주 사용하는 인터프리터 언어인 JavaScript로 실험을 해보았다.

#include <stdio.h>

int main(void) {
    printf("hello, I\'m first.\n");
    print("hello");
    
    return 0;
}

자세히 보면 printf가 아니고 print이다. 컴파일러 언어는 번역하는 과정에서 문법 실수 등 에러를 만나면 뚱땅 에러를 낼 것이다. 그러니 실행조차 안되니까 hello, I'm first.는 뜨지 않을 것이다.

실행해보자!

머라카노! 어쨋든 hello, I'm first.는 뜨지 않았다. 고마 내보고 print가 아니고 printf가 아니냐고 친절히도 알려준다.






console.log('hello, i\'m first.');
console.lo('hello');

이번엔 자바스크립트다. 자세히 보면 log가 아니고 lo이다.

실행해보자!

오우 맨 위에 hello, i'm first.가 떴다! 즉 저기까진 실행을 했다가 lo와 같은 문법 실수를 만나 번역을 못하고 에러를 내고 꺼져버린 것이다.

  • 참고로 컴파일러 언어인 C로 방금 코드를 문법 실수 없이 실행하면 executable file(실행 파일)이 생긴 것을 알 수 있다.

위에 것이 실행파일이다.

컴파일러 언어와 인터프리터 언어의 장단점

에러가 없다 치고 한 번 번역되고 나면 컴파일러로 번역되는 기 더 빠를낀데 와 인터프리터를 사용합니꺼?

일단 웹 개발에 용이하다. 컴파일러를 사용한다면, 소스 코드에 자잘한 문제가 하나라도 있다면 실행조차 안되므로 페이지가 먹통이 된다. 반면 인터프리터는 일단 실행을 시키며, 문제가 있는 코드가 실행되지 않는다면(가령 if문 안에 있다던지) 딱히 에러가 발생하지 않을 수 있다. 컴파일러 언어는 if문 안에 있더라도 번역 과정은 모든 소스 코드를 번역하는 것이니 문제 부분을 만나면 에러를 발생시킨다. 이 때 에러가 났으니 실행조차 시키지 않는다. 그래서 웹 개발에 JavaScript를 사용하나보다.

또 디버깅에 용이하다고도 한다.

반면 컴파일러로 동작하는 언어는 번역이 다 된 후의 실행이 빠르므로 효율을 중시하는 분야에서 사용될 것이다.




틀린 내용이나 어색한 내용이 존재하면, 부디 메일이나 댓글로 알려주시어 저를 일깨워주세요. 감사합니다!!!

  • gmail : alohajune22@gmail.com
profile
메타몽 닮음 :) email: alohajune22@gmail.com

0개의 댓글