정의
사람이 읽고 쓰기 편한 말로 적어 둔 프로그램을, 흔히 컴퓨터가 곧바로 실행할 수 있는 기계어로 바꿔 주는 프로그램이에요(기계어 대신 다른 중간 언어로 옮기는 컴파일러도 있어요). 한 줄씩 그때그때 옮기는 것이 아니라, 원고 전체를 읽고 한 번에 새 파일로 만들어 내요. 그래서 기계어로 만들어진 파일은 다음부터 번역가 없이도 혼자 실행돼요.
요리책을 통째로 번역하는 사람
외국어로 된 요리책을 한 권 얻었다고 해 볼게요. 요리를 하려면 글자를 알아볼 수 있어야 하는데, 우리는 그 나라 말을 모르죠. 그래서 번역가에게 책을 통째로 맡기고 한국어 책 한 권을 새로 받아요.
컴퓨터도 사정이 같아요. 사람은 읽기 편한 말로 프로그램을 적지만, 컴퓨터가 알아듣는 말은 0과 1로 된 기계어뿐이에요. 사람이 적은 원고를 소스 코드라고 하는데, 이 원고를 기계어 파일로 바꿔 주는 번역가가 컴파일러예요.
번역은 실행하기 전에 미리 끝내 둬요. 그래서 프로그램을 켤 때마다 다시 번역할 필요가 없고, 번역이 끝난 파일은 곧장 실행돼요. 우리가 내려받아 실행하는 프로그램 대부분이 이렇게 미리 번역된 파일이에요.
번역가는 오탈자도 잡아 줘요
번역가는 문장을 옮기기만 하지 않아요. 원고에 빠진 낱말이나 앞뒤가 맞지 않는 문장이 있으면 옮기다 말고 표시를 해 두죠. 뜻이 통하지 않는 문장을 억지로 옮기면 이상한 요리책이 나오니까요.
컴파일러도 원고 전체를 읽으면서 규칙에 맞지 않는 곳을 찾아내요. 괄호를 닫지 않았거나 숫자 자리에 글자를 넣었으면, 번역을 멈추고 몇 번째 줄이 문제인지 알려 줘요. 이렇게 번역 도중에 걸린 문제를 컴파일 오류라고 불러요.
덕분에 프로그램을 켜 보기 전에 실수를 먼저 걸러 낼 수 있어요. 원고를 다 읽고 나면 문장을 더 매끄럽게 다듬는 일도 해요. 같은 계산을 여러 번 시키는 대목을 한 번으로 줄이는 식이라, 번역된 프로그램이 더 빠르게 돌아가요.
조금 더 정확히 말하면: 번역본은 읽을 사람이 정해져 있어요
번역가에게 받은 한국어 요리책은 한국어를 읽는 사람에게만 쓸모가 있어요. 같은 원고라도 다른 나라 사람에게 주려면 그 나라 말로 다시 번역해야 하죠.
기계어도 마찬가지예요. 컴퓨터의 두뇌인 중앙처리장치는 종류에 따라 알아듣는 기계어가 서로 달라요(예: 일반 PC용 칩과 스마트폰용 칩). 실행 파일을 담는 형식과 운영체제에 일을 부탁하는 방법도 윈도우, 리눅스, 맥이 서로 달라서, 두뇌가 같아도 그대로 열리지 않아요. 그래서 한쪽에서 만든 실행 파일이 다른 쪽 컴퓨터에서는 열리지 않을 수 있어요. 이때는 같은 원고를 그 컴퓨터의 중앙처리장치와 운영체제에 맞춰 다시 번역해요.
한편 번역가 대신 통역사를 부르는 방식도 있어요. 요리하는 옆에서 한 줄씩 읽어 주는 방식인데, 프로그램 세계에서는 이런 도구를 인터프리터라고 불러요. 미리 번역하지 않아 바로 시작할 수 있는 대신, 실행하는 내내 통역사가 곁에 있어야 해요.
흔한 오해
컴파일러는 프로그램을 실행해 주는 도구다.
실행은 운영체제와 중앙처리장치가 맡아요. 컴파일러가 하는 일은 실행할 수 있는 파일을 미리 만들어 두는 것까지예요.
컴파일이 성공하면 프로그램에 잘못된 곳이 없다는 뜻이다.
번역가가 잡는 것은 문법에 어긋난 문장이에요. 문법은 맞지만 계산 순서를 잘못 적은 실수는 실행해 봐야 드러나요.
일상에서 만나요
게임이나 사무용 프로그램을 내려받아 바로 실행할 수 있는 것은, 만든 쪽에서 미리 기계어로 번역해 두었기 때문이에요.
코드를 저장하고 빌드 버튼을 눌렀을 때 '몇째 줄에 괄호가 없다'는 메시지가 뜨는 것이 컴파일 오류예요.
그러니까 한마디로
사람이 쓴 코드 전체를 컴퓨터가 알아듣는 기계어 파일로 미리 옮겨 주고, 그 과정에서 문법 실수까지 잡아 주는 번역가예요.