seegongsik
프로그래밍

어떻게 글이 기계의 일이 되는 길, 컴파일러와 인터프리터

우리는 'add', 'if', '이름' 같은 사람의 말로 코드를 쓴다. 그런데 기계가 속으로 알아듣는 것은 켜짐과 꺼짐 수준의 아주 작은 명령뿐이다. 사람 말과 기계 말 사이에는 큰 틈이 있고, 그 틈에 다리를 놓는 것이 컴파일러와 인터프리터예요.

01

사람 말과 기계 말은 다르다

우리가 쓰는 'add', 'if'는 사람이 읽기 좋은 말이다.
그런데 기계가 진짜로 아는 것은 켜짐과 꺼짐을 늘어놓은 아주 작은 명령뿐이다.
우리가 쓴 글과 기계가 하는 일 사이에는 큰 틈이 있어서, 우리 글은 이대로는 돌릴 수 없어요.

우리 글
두 수를 더해
?
1011 0010 1100 0101
기계 일

위는 우리가 쓴 한 줄, 아래는 기계가 아는 작은 명령. 틈 보기를 누르면 둘 사이의 간격이 드러난다.

위와 아래가 너무 다르다.
사람 말은 한눈에 읽히는데 기계 말은 알아보기 어렵다.
누군가 이 틈을 대신 건너 줘야 하고, 그 일을 하는 방법이 두 가지 있어요.

02

다리를 놓는 두 가지 방법

틈을 건너려면 번역해 줄 누군가가 필요하다.
하나는 글 전체를 미리 다 번역해 두는 방법이고, 다른 하나는 한 줄씩 즉석에서 읽어 바로 실행하는 방법이다.
앞의 것이 컴파일러, 뒤의 것이 인터프리터예요.

우리 글 → 컴파일 → 완성품 → 실행

컴파일러와 인터프리터를 차례로 누르면 '전체 먼저 번역'과 '한 줄씩 즉석'의 모양이 다르게 그려진다.

같은 틈을 건너는데 방식이 사뭇 다르다.
하나는 미리, 하나는 즉석에서 한다.
먼저 미리 통째로 번역하는 쪽, 곧 컴파일러가 일하는 방식부터 자세히 살펴봐요.

03

컴파일: 통째로 미리 번역한다

컴파일러는 우리 글을 처음부터 끝까지 다 읽고, 기계가 바로 쓸 수 있는 완성품으로 한 번에 바꾼다.
번역은 미리 딱 한 번 하고, 그 결과물을 여러 번 빠르게 돌린다.
어긋난 데가 있으면 돌리기 전에 미리 알려 주기도 한다.
책 한 권을 통째로 번역해 두었다가 독자에게 건네는 셈이에요.

값 정하기
두 수 더하기
결과 보여주기

컴파일을 누르면 글 전체가 완성품으로 바뀌고, 실행을 누르면 그 완성품을 한 번에 빠르게 돌린다.

전체를 미리 번역해 두니 실행은 군더더기 없이 빠르다.
대신 처음에 번역이 끝날 때까지 기다려야 한다.
그렇다면 기다리지 않고 바로 시작하는 방법은 없을까? 그것이 인터프리터예요.

04

인터프리트: 한 줄씩 즉석에서

인터프리터는 완성품을 따로 만들지 않는다.
우리 글을 위에서부터 한 줄 읽고 바로 그 일을 하고, 다음 줄을 읽고 또 하는 식으로 즉석에서 진행한다.
그래서 기다리지 않고 바로 시작할 수 있고, 가볍게 시험해 보기도 쉽다.
말하는 사람 옆에서 한 문장씩 옮겨 주는 통역사와 같아요.

값 정하기
두 수 더하기
결과 보여주기

실행을 누르면 한 줄 읽고 바로 하고, 다음 줄로 넘어간다. 즉석에서 차례차례 진행된다.

바로 시작해서 한 줄씩 진행하니 손에 착 붙는다.
대신 돌릴 때마다 처음부터 한 줄씩 다시 읽는다.
컴파일은 미리·빠르게, 인터프리트는 즉석·간편하게.
그렇다면 어느 쪽이 더 좋을까요?

05

어느 쪽이 낫다기보다 주고받기

어느 하나가 무조건 낫지는 않다. 서로 주고받는 관계다.
컴파일은 시작이 느리지만 실행이 빠르고 에러를 미리 알려 준다.
인터프리트는 바로 시작하고 시험이 쉽지만 매번 한 줄씩 다시 읽는다.
그래서 실제로는 둘을 적절히 섞어 쓰는 경우가 많고, 무엇을 더 중요하게 여기느냐에 따라 골라요.

컴파일러
인터프리터
시작
번역 먼저 (느림)
바로
실행 속도
빠름
보통
에러 시점
돌리기 전
그 줄에 닿을 때
결과물
완성품 있음
따로 없음

항목을 누르면 시작, 실행 속도, 에러 시점, 결과물이 둘 사이에서 어떻게 갈리는지 나온다.

이제 우리 글이 어떻게 기계의 일이 되는지 보았다.
그런데 그렇게 돌아가는 동안 우리가 만든 값과 객체는 대체 어디에 들어 있을까?
'이것이 저것을 가리킨다'는 말은 또 무슨 뜻일까?
이 영역의 마지막 레슨에서 그 자리를 들여다봐요.

한 줄 정리사람 말로 쓴 코드는 그대로는 기계가 돌릴 수 없다. 컴파일러는 전체를 미리 통째로 번역해 완성품을 만들고, 인터프리터는 한 줄씩 즉석에서 읽어 실행한다. 둘은 우열이 아니라 주고받기라서, 시작 속도와 실행 속도, 에러가 드러나는 시점이 서로 달라요.
← 프로그래밍
이 페이지가 도움 됐다면 후원하기