컴파일러와 인터프리터의 차이점을 알아보기전에 컴파일이란 무엇인지 알아보자.

 

 

컴파일이란 어떤 언어의 코드전체를 다른 언어로 바꿔주는 과정이다. 
그리고 이것을 자동으로 만들어주는 소프트웨어를 컴파일러라고 한다.

 

 

코드 전체를 다른 언어로 바꿔준다고?????😧

 

 

 

음.....글쎄요....왜....굳이 다른 언어로 바꿔줘야해?

 

 

 

코드를 컴파일하는 이유는 아주 간단한데.. 바로 '의사소통' 을 해야하기때문이다.

 

컴퓨터와 의사소통을 하려면 '언어' 가 필요하고,

컴퓨터는 기계어를 사용, 인간은 사람 중심 언어인 고급 언어를 사용한다.

둘의 언어는 서로 방식이 다르기때문에 의사소통이 되지않는다.💔❌(삑)

따라서 우리는 사람의 문제를 해결하기 위한 코드를 작성하고 컴파일러를 활용해

그 코드를 기계어로 변환해주는 것이다. 

 

 

 

그럼 컴파일이 생겨난 배경도 살펴보자.

 

 

컴파일 이야기를 한다면 어셈블리어에 대해서도 간단하게 짚고 넘어가야 하는데,

 

 

어셈블리어는?

 

어셈블리어 또는 어셈블러 언어는 기계어와 일대일 대응이 되는 컴퓨터 프로그래밍의 저급 언어이다.

 

컴퓨터 구조에 따라 사용하는 기계어가 달라지게 되는데, 

그 기계어에 대응되어 만들어지는 어셈블리어도 각각 다르게 된다는 것이다.

 

 

말만들으면 어렵다.... 쉽게 풀어줘.....🤯

 

 

 

그니까 초기 컴퓨터 프로그램들은 모두 어셈블리어로 작성했다.

그러나 어셈블리어는 앞서 언급했다시피 사용하는 컴퓨터의 구조에 따라 달라진다.

이 때문에 문제가 발생하게 되는데... 

 

어떤 문제냐면,

 

새로운 아키텍쳐가 적용된 CPU가 나올때마다 매번 같은 프로그램을

새로나온 CPU에 맞는 어셈블리어로 다시 작성해야 했다. (ㅠㅠ)

이 때문에 통일된 언어체계로 작성한 코드의 필요성이 야기되고

여기서 고급 프로그래밍 언어가 나오게 된것이다.

 

하지만 컴퓨터는 고급 언어로 작성한 코드를 바로 인식하지 못하기 때문에(바보)

이를 번역해줄 과정이 필요했고, 이것이 바로 컴파일이 탄생한 배경이 된다.

 

고급 프로그래밍 언어를 사용하게 되면서 고급언어를 번역하는 번역 방법이 생겨나고, 

컴파일러 방식인터프리터 방식이 생겨났다.

 

 

 

컴파일러(compiler)

 

컴파일러는 프로그램 전체를 스캔하여 이를 모두 기계어로 번역해준다.

전체를 스캔하기 때문에 초기 스캔 시간이 오래 걸린다. (양 == 시간은 비례)

하지만 전체 실행 시간만 따지고 보면 인터프리터 보다 빠르다.

 

초기 스캔을 마치면 실행파일을 만들어 놓고

다음에 실행할때 이전에 만들어 놓았던 실행파일을 실행하기 때문이다.

 

결국 초기 스캔 시간이 오래걸리긴하지만 전체시간으로는 인터프리터보다는 빠르고,

초기 세팅만 마치면 아주 빠르게 실행된다.

 

하지만 단점도 있는데...

 

컴파일러는 고급언어로 작성된 소스를 기계어로 번역하고

이 과정에서 오브젝트 코드(Object Code)라는 파일을 만드는데

오브젝트 코드를 묶어서 하나의 실행 파일로 다시 만드는 링킹(Linking) 이라는 작업을 해야한다.

 

링킹......

 

설명만 딱 봐도 뚝딱하고 번역하는건 아닌 것 같다..😧

이때문에 컴파일러는 통상적으로 인터프리터 보다 많은 메모리를 사용해야 한다.

 

또한 컴파일러는 오류 메시지를 생성할때 전체 코드를 검사한 후에 오류 메시지를 생성한다.

그래서 실행 전에 오류를 발견 할 수 있다. 대표적인 언어로 C,C++,JAVA 등이 있다.

 

*Linking은 여러 개의 코드와 데이터를 모아 연결하여 메모리에 로드될 수 있고

실행될 수 있는 한 개의 파일로 만드는 작업이다.*

 

 

인터프리터(interpreter)

 

인터프리터는 프로그램 실행시 한 번에 한 문장씩 번역한다.

그렇기 때문에 한번에 전체를 스캔하고 실행파일을 만들어서 실행하는

컴파일러보다 실행시간이 더 걸린다. 당연히 그럴 수 밖에 없다...

 

(한 문장 읽고 번역하여 실행시키는 과정을 반복하는게

만들어 놓은 실행파일을 한번 실행시키는 것보다 빠르긴 힘들어 보임.....)

 

하지만 인터프리터는 메모리 효율이 좋다.

 

왜냐하면 컴파일러처럼 목적코드를 만들지도 않고, 링킹 과정도 거치지 않기 때문이다.

그래서 인터프리터는 메모리 사용에 컴파일러 보다 더 효율적인 모습을 보인다.

 

인터프리터의 오류 메시지 생성과정은 컴파일러와 다른데,

인터프리터는 한번에 한문장씩 번역하기 때문에 프로그램을 실행시키고

한 문장씩 번역될때 오류를 만나게 되면 바로 프로그램을 중지시킨다.

그래서 프로그램을 실행해봐야지만 오류 발견이 가능하다. 

대표적인 언어로 Python, Ruby, Javascript 등이 있다.

 

 

컴파일러(compiler)

  • 전체 파일을 스캔하여 한꺼번에 번역한다.
  • 초기 스캔시간이 오래 걸리지만, 한번 실행 파일이 만들어지고 나면 빠르다.
  • 기계어 번역과정에서 더 많은 메모리를 사용한다.
  • 전체 코드를 스캔하는 과정에서 모든 오류를 한꺼번에 출력해주기 때문에 실행 전에 오류를 알 수 있다.
  • 대표적인 언어로 C, C++, JAVA 등이 있다.

인터프리터(interpreter)

  • 프로그램 실행시 한 번에 한 문장씩 번역한다.
  • 한번에 한문장씩 번역후 실행 시키기 때문에 실행 시간이 느리다.
  • 컴파일러와 같은 오브젝트 코드 생성과정이 없기 때문에 메모리 효율이 좋다.
  • 프로그램을 실행시키고 나서 오류를 발견하면 바로 실행을 중지 시킨다. 실행 후에 오류를 알 수 있다.
  • 대표적인 언어로 Python, Ruby, Javascript 등이 있다.

'개발이야기 > TIL' 카테고리의 다른 글

[Design Pattern] React와 Flux 패턴  (1) 2022.09.30
[Design Pattern] MVC  (1) 2022.09.30
[JS] 여러 input 에 한번에 붙여넣기  (0) 2022.09.22
크기만 작아지면 반응형 웹 일까?  (0) 2022.08.05
웹 접근성에 대한 생각  (0) 2022.08.05
복사했습니다!