프로그램 언어로 만들어진 코드가 저장된 소스(source) 파일(원시 파일)을 목적 파일(object file)로 만들어주는 프로그램을 컴파일러(compiler)라고 한다. 이를 컴파일 과정이라 하며, '컴파일한다'(compile)라고도 한다.
컴파일러는 고급 언어로 작성된 프로그램을 기계어로 바꾸어주는 프로그램이다. 즉 고급 언어로 작성한 프로그램은 컴퓨터가 직접 이해할 수 없다. 따라서 컴퓨터가 이해할 수 있는 언어인 기계어로 바꾸어주어야 하는데, 컴파일러가 이를 수행하는 것이다. 이것은 마치 한국어를 모르는 외국인이 한국어를 이해하지 못하는 것과 같다. 따라서 통역사가 한국어를 외국인이 아는 영어로 번역하는 것처럼 컴퓨터가 이해할 수 있는 언어인 기계어로 바꾸어 주어야 하는데, 이 역할을 컴파일러가 수행하는 것이다. 컴파일러에 의해 처리되기 전의 프로그램을 원시 코드라 하고, 컴파일러에 의해 기계어로 번역된 프로그램을 목적 코드(object code)라 한다. 이러한 원시 코드와 목적 코드가 저장된 파일을 각각 소스 파일, 목적 파일이라 한다.
[ 그림 7.9 ]
만일 프로그램을 고급 언어가 아닌 어셈블러로 작성했다면 컴파일러와 같은 역할을 수행하는 어셈블러가 필요하다. 어셈블러(assembler)는 어셈블리 언어로 작성된 프로그램을 기계어로 바꿔주는 프로그램이다. 어셈블러는 기계어를 제외한 다른 모든 고급 언어보다 프로그램의 실행 속도가 빠르고 하드웨어에 대한 정교한 통제가 가능하다. 주로 시스템 소프트웨어를 작성하거나 하드웨어 장치를 처리하는 프로그램 작성에 사용한다.
[ 그림 7.10 ]
목적 파일을 실행 파일(execute file)로 만들어주는 프로그램을 링커라 하고, 이과정을 링킹(linking) 과정이라 한다. 프로그램을 개발할 때 프로그램의 크기가 너무 커서 여러 명이 나누어 작업하는 경우가 일반적이다. 이 여러 개의 프로그램 각각을 컴파일하여 목적 파일을 만들게 되는데, 링커는 이러한 여러 개의 목적 파일들을 라이브러리 함수와 연결해서 하나의 파일로 합치는 작업을 수행한다. 링킹 작업 결과 생성되는 프로그램을 실행 프로그램(executable program) 또는 실행 파일이라고 부른다. 파일에서 우리가 흔히 접하는 .exe나 .com의 확장자 파일들이 실행 파일이다.
[ 그림 7.11 ]
한편 자주 사용하는 프로그램들은 프로그램을 작성할 때마다 새로 작성하는 것이 아니라 미리 만든 다음 컴파일하여 저장해 놓는데, 이러한 파일들을 라이브러리(library)라고 한다. 로더(loader)는 작성된 프로그램을 컴퓨터의 주기억장치에 로드(load)함으로써 프로그램을 실행 가능하게 하는 역할을 수행한다. 결국 고급 언어로 작성된 원시 코드는 컴파일과 링킹 과정을 거쳐 실행 파일이 되고 로더의 도움을 받아 실행된다.