WIPIVERSE

컴파일

컴파일

컴파일(compile)은 컴퓨터 프로그래밍 분야에서, 특정 프로그래밍 언어로 작성된 소스 코드를 다른 언어 또는 컴퓨터가 직접 실행할 수 있는 형태의 코드로 변환하는 과정을 뜻한다. 이 변환 작업을 수행하는 소프트웨어를 컴파일러(compiler)라고 한다.

정의

컴파일은 사람이 이해하기 쉬운 고급 프로그래밍 언어(예: C, C++, Java 등)로 작성된 프로그램을 저급 프로그래밍 언어(예: 어셈블리어, 목적 파일, 기계어) 또는 중간 표현으로 번역하는 작업을 의미한다. 원시 코드에서 목적 코드로 옮겨가는 이 과정을 가리켜 컴파일이라 부른다. 국립국어원의 순화 용어로는 '옮김', '번역' 등이 제시되어 있으며, 문화어로는 '콤파일'이라는 표현이 사용된다.

국제 표준(ISO/IEC 2382:2015 등)에서는 컴파일을 "고급 언어로 표현된 프로그램의 전부 또는 일부를 중간 언어, 어셈블리 언어 또는 기계 언어로 표현된 프로그램으로 번역"하는 것으로 정의한다.

어원

'컴파일'이라는 용어는 라틴어 'compilare'에서 유래한 것으로 알려져 있으며, '모으다', '결합하다'라는 의미를 지닌다. 이는 여러 코드와 명령어를 모아 하나의 프로그램으로 만드는 컴파일러의 역할을 반영한 것으로 설명된다.

컴파일러의 역할과 필요성

중앙처리장치(CPU)는 기계어(machine code) 형태의 명령만 직접 이해할 수 있다. 프로그래머가 직접 기계어를 작성하는 것은 사실상 불가능에 가깝고 유지보수도 매우 어렵기 때문에, 컴파일러는 인간 중심의 고급 언어 표현과 기계 중심의 실행 사이를 연결하는 역할을 한다. 컴파일러는 프로그램의 기능을 유지하면서 고급 소스 코드를 실행 가능한 대상 코드로 변환하며, 오류 검출, 코드 최적화, 플랫폼 이식성 제공 등의 기능도 수행한다.

컴파일의 주요 단계

컴파일 과정은 일반적으로 다음과 같은 단계를 거쳐 진행된다.

  1. 어휘 분석(렉싱): 소스 코드의 문자를 토큰(token)이라 불리는 의미 있는 언어 단위로 분해한다.
  2. 구문 분석(파싱): 토큰의 배열이 소스 언어의 문법 규칙을 따르는지 검사하고, 코드의 구조를 나타내는 추상 구문 트리(AST)를 생성한다.
  3. 의미 분석: 타입 검사, 변수 선언 확인 등 코드의 논리적 의미를 검증한다.
  4. 중간 표현(IR) 생성 및 최적화: 코드를 중간 표현으로 변환하고 성능 향상을 위한 최적화를 수행한다.
  5. 코드 생성: 중간 표현을 대상 CPU 아키텍처에 맞는 기계어 또는 어셈블리 언어로 변환한다.

컴파일러의 구조는 크게 프런트 엔드(소스 언어 분석), 미들 엔드(최적화), 백 엔드(대상 코드 생성)의 세 부분으로 나누어 설명되기도 한다.

컴파일러와 인터프리터의 비교

컴파일러는 소스 코드 전체를 한 번에 번역하여 실행 파일을 생성하는 반면, 인터프리터는 소스 코드를 변환하지 않고 실행 시점에 해석하거나 바이트코드 등의 중간 형태를 실행한다. 컴파일 방식은 최초 빌드에 시간이 필요하지만, 일단 실행 파일을 만들어 두면 이후 실행이 빠르다. 반면 인터프리트 방식은 별도의 빌드 단계 없이 즉시 실행할 수 있으나 일반적으로 실행 속도가 더 느리다.

일반적으로 C, C++ 등은 컴파일 언어로, Python, JavaScript 등은 인터프리트 언어로 분류되지만, 이 분류는 해당 언어의 대표적인 구현 방식을 반영한 것이며 언어 자체가 반드시 한 방식에만 국한되는 것은 아니다.

컴파일러의 종류

컴파일러에는 다양한 유형이 존재한다.

  • 크로스 컴파일러: 컴파일러가 실행되는 시스템과 다른 CPU 또는 운영체제를 위한 코드를 생성한다.
  • JIT(Just-In-Time) 컴파일러: 프로그램 실행 시점에 코드를 컴파일한다. Java, JavaScript 엔진 등에서 널리 사용된다.
  • 트랜스파일러(소스 대 소스 컴파일러): 고급 언어를 다른 고급 언어로 변환한다. 예를 들어 TypeScript를 JavaScript로 변환한다.
  • 부트스트랩 컴파일러: 더 영구적인 컴파일러를 만드는 데 사용되는 임시 컴파일러이다.
  • 역컴파일러: 저급 언어를 고급 언어로 역번역하는 프로그램이다.

역사

컴파일러 기술의 초기 이정표로는 1952년 그레이스 호퍼의 팀이 개발한 A-0 시스템이 거론되며, 이는 '컴파일러'라는 용어를 처음 사용한 사례로 알려져 있다. 1954~1957년에는 IBM의 존 배커스가 이끄는 팀이 FORTRAN 언어와 그 컴파일러를 개발했으며, 이는 최초의 고급 언어이자 최초의 최적화 컴파일러로 일반적으로 인정된다. 이후 COBOL, ALGOL, LISP 등 여러 언어와 관련 컴파일러가 개발되었고, 현대에는 GNU 컴파일러 모음(GCC), LLVM/Clang 등이 대표적인 컴파일러로 널리 사용된다.

관련 용어

컴파일과 관련된 인접 도구로는 매크로 치환 등을 처리하는 전처리기, 어셈블리 언어를 기계어로 변환하는 어셈블러, 여러 목적 파일을 결합하여 실행 파일을 만드는 링커 등이 있다. 문헌에 따라 컴파일의 범위를 전처리부터 링크까지의 전체 빌드 과정을 통틀어 가리키는 경우도 있다.

둘러보기

더 찾아볼 만한 주제

    전체 문서 보기