새소식

Coding/코딩잡담

컴파일러와 인터프리터

  • -

왜 가끔 보면 어떤 언어는 컴파일러, 어떤 언어는 인터프리터...라고 하는데 이게 뭔지 궁금하지 않음? 대체 이 둘이 무슨 차이길래???


자 일단 기본적으로 아셔야 할 게 있다. 프로그래밍 언어에는 저급 언어와 고급 언어가 있는데, 기계어와 어셈블리어는 저급 언어이고 나머지는 다 고급 언어다. 이게 연식이 오래돼면 저급 언어인가요? 놉. 그럼 포트란 베이직도 저급이게? 그게 아니라, 저급 언어인 기계어와 어셈블리어는 컴퓨터 입장에서 이해하기 쉬운 언어고 고급 언어는 사람 입장에서 이해하기 쉬운 언어다. 대체 어째서 우리는 010100010010 이렇게 쓰면 모르지만 컴퓨터는 반대로 print('Hello, World!') 하면 모른다. 그럼 프로그래밍이 안되는 거 아니냐고? 아니 근데 다들 하잖아요. 

 

예? 그럼 어떻게요? 컴파일러나 인터프리터가 우리가 쓴 고급 언어를 컴퓨터가 알아들을 수 있게끔 저급 언어로 번역해주는거다. 그러니까 print('Hello, World!')라고 우리가 치고 실행하면 컴파일러/인터프리터가 컴퓨터한테 '화면에 Hello, World!를 출력해'라고 번역해주는 것이다. 그리고 놀랍게도 어셈블리어도 어셈블러를 통해 기계어로 번역해주는 과정이 필요하다. 

 

요즘은 구분이 모호해지고 있지만, 컴파일러는 코드를 알파부터 오메가까지 다 번역하고 실행하고 인터프리터는 코드를 줄단위로 실행하면서 결과를 확인해본다는 차이점이 있다. 엥? 이게 머선소리9? 

 

예를 들어보자. 숫자를 입력하면 1을 더해서 출력하는 코드를 짜고 이를 실행할 때 컴파일러는 코드의 처음부터 끝까지 다 확인하고 '숫자를 입력받고, 입력받은 숫자에 1을 더하고, 출력한다' 이 세 가지를 한꺼번에 실행한다. 반면 인터프리터는 '그거 입력 받아', '1을 더해', '출력해' 이렇게 줄단위로 실행한다.

 

그럼 오류가 났을 때는? 파이썬으로 프로그래밍 하다가 코드에 오타가 났거나 하면 실행하다가 멈추고 야 이거 돌려봤는데 0으로 못나누자나!!! 하고 몇번째 줄에 문제가 있는지 출력해준다. 아니 그 몇번째 줄에 오류가 났나 그거는 C언어도 해준다. 리턴제로 까먹으면 오류난다 

 

다시 예를 들어보자. 두 숫자를 입력받아서 나눈 결과를 출력하는 코드를 실행할 때 컴파일러는 이걸 통으로 번역해서 '숫자 두 개를 입력받고, 두 개를 나눠서 출력해'라고 전달한다. 그런데 분자에 0이 들어갔어... 그러면 아 이거 안되거든요. 제로디비전이그덩. 이럴 때 컴파일러는 '야 이거 번역해서 돌려봤는데 제로디비전임!'이 된다. 인터프리터는 '숫자 두 개를 입력받고', '두 개를 나눠...보려고 했더니 분자가 0이네?' 에서 바로 제로디비전이 뜬다. 중간에 에러가 났기 때문에 출력은 실행이 안 된다.

 

그럼 인터프리터는 컴파일러랑 다른거니까 번역을 안 하나요? 놉. 어차피 고급 언어로 작성된 프로그램은 기계어로 컴파일 하는 과정이 필요하다. 그럼 생각해보자. 외국 문서같은 걸 번역할 때는 문서를 통으로 번역한 번역본을 주지만, 외국인이랑 대화할 때 중간에서 통역할 때는 이 사람이 말한 걸 통역해서 얘기해주고, 대답을 다시 통역해서 얘기해준다. 컴파일러와 인터프리터는 그 차이라고 보면 된다.

'Coding > 코딩잡담' 카테고리의 다른 글

왜 리눅스인가  (0) 2023.04.04
GUI vs CUI  (0) 2022.11.17
SI 접두어와 컴퓨터 용량  (0) 2022.10.10
SMILES  (0) 2022.10.06
불 대수와 논리게이트  (0) 2022.09.26
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.