seegongsik
내 단어장
프로그래밍

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

우린 'add', 'if', '이름' 같은 사람 말로 코드를 써요. 그런데 기계는 속으로 켜짐·꺼짐 수준의 아주 작은 명령만 알아들어요. 사람 말과 기계 말 사이엔 큰 틈이 있죠. 그 틈에 다리를 놓는 게 컴파일러와 인터프리터예요.

01

사람 말과 기계 말은 달라요

우리가 쓰는 'add', 'if'는 사람이 읽기 좋은 말이에요.
그런데 기계가 진짜 아는 건
켜짐·꺼짐을 늘어놓은 아주 작은 명령뿐이죠.
우리 글과 기계가 하는 일 사이엔 큰 틈이 있어요.
그래서 우리 글은 이대로는 못 돌려요.

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

위는 우리가 쓴 한 줄, 아래는 기계가 아는 작은 명령. 가운데 틈을 눌러 보세요.

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

02

다리를 놓는 두 가지 방법

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

우리 글컴파일완성품실행

두 길을 눌러 보세요. '전체 먼저 번역'과 '한 줄씩 즉석'의 모양이 달라요.

같은 틈을 건너는데 방식이 사뭇 다르죠.
하나는 미리, 하나는 즉석에서.
먼저 '미리 통째로 번역'하는 쪽을 자세히 볼까요?
이게 컴파일러가 일하는 방식이에요.

03

컴파일: 통째로 미리 번역해요

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

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

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

전체를 미리 번역해 두니 실행은 군더더기 없이 빨라요.
대신 처음에 번역을 끝낼 때까지 기다려야 하죠.
그럼 반대로, 기다리지 않고 바로 시작하는 방법은 없을까요?
그게 인터프리터예요.

04

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

인터프리터는 완성품을 따로 만들지 않아요.
우리 글을 위에서부터 한 줄 읽고 바로 그 일을 하고,
다음 줄 읽고 또 하고, 이렇게 즉석에서 진행해요.
그래서 기다림 없이 바로 시작하고 가볍게 시험해 볼 수 있죠.
말하는 옆에서 한 문장씩 통역해 주는 통역사 같아요.

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

'실행'을 누르면 한 줄 읽고 바로 하고, 다음 줄로. 즉석에서 차례차례 진행돼요.

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

05

어느 쪽이 더 낫다기보다, 서로 주고받기예요

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

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

항목을 눌러 보세요. 시작·실행 속도·에러 시점·결과물이 둘 사이에서 어떻게 갈리는지 보여요.

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

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