seegongsik
내 단어장
프로그래밍

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

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

01

사람 말과 기계 말은 달라요

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

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

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

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

02

다리를 놓는 두 가지 방법

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

우리 글컴파일완성품실행

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

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

03

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

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

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

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

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

04

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

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

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

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

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

05

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

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

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

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

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

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