컴파일러
A compiler is a computer program that translates computer code written in one programming language into another language.
— 위키백과 정의 문구
인간이 문법 규칙을 어겼을 때 가장 자비 없이 소리 지르는 인공지능 이전의 최고의 지능형 빌런. 틀린 곳이 13번째 줄이라며? 왜 400번째 줄에서 에러가 나는 건데?
1. 개요
인간이 이해할 수 있는 고수준 프로그래밍 언어(C언어, C++, Java 등)로 쓰인 코드를 컴퓨터가 즉시 실행할 수 있는 기계어 또는 바이트코드로 변환해 주는 시스템 프로그램이다. 이와 대비되는 개념인 인터프리터가 코드를 한 줄씩 읽어가며 굼벵이처럼 실행할 때, 컴파일러는 전체 코드를 한꺼번에 샅샅이 훑고 뜯어서 최적화(Optimization)를 거친 완성형 실행 파일을 뱉어낸다. 당연히 초기 컴파일 시간은 걸리지만, 실행 속도는 인터프리터 언어 따위와 궤를 달리한다.
2. 번역의 4대 관문: 지옥의 파이프라인
컴파일러 내부에서는 상상을 초월하는 정교한 노가다가 펼쳐진다. 텍스트 소스코드를 기호 단위로 쪼개는 어휘 분석(Lexical Analysis), 문법 구조를 검사해 트리 형태로 만드는 구문 분석(Syntax Analysis), 의미적 타당성을 확인하는 의미 분석(Semantic Analysis), 그리고 마침내 기계어 효율성을 극대화하는 코드 최적화(Code Optimization) 단계를 거친다.(...) 특히 최적화 단계는 똑똑한 컴파일러가 바보 같은 개발자의 똥 코드를 초고속 슈퍼 코드로 환골탈태시키는 신의 영역으로 불린다.1
3. 컴파일 에러와의 사투: 정신 피로의 주범
개발자에게 컴파일러는 세상에서 가장 깐깐한 교정자다. 단 하나의 세미콜론(;)이 빠져도, 괄호 짝이 맞지 않아도 자비 없이 붉은 줄을 그어버리며 빌드를 거부한다. 특히 템플릿 메타 프로그래밍을 떡칠한 C++ 컴파일러의 에러 메시지는 한 번 터지면 터미널 화면 수십 페이지를 외계어로 가득 채우며 개발자의 자존감을 완전히 짓밟아버린다.
4. 관련 밈 및 드립
4.1. 컴파일 중이니까 칼싸움 해도 됨 (XKCD 303)
웹툰 XKCD의 전설적인 에피소드로, 사무실에서 개발자들이 빗자루(칼)를 들고 듀얼을 하고 있는데 사장이 '왜 일을 안 하냐'고 소리치자 '컴파일 중인데요? (My code's compiling)' 한마디에 사장마저 납득하고 돌아가는 만화다. C/C++ 기반 거대 프로젝트는 한 번 빌드하는 데 수십 분에서 수 시간까지 걸리던 역사를 위트 있게 비꼬았다.
4.2. 왜 안 빌드되는지 모름 / 왜 빌드되는지 모름
개발자의 대자연 법칙을 다룬 드립. 코드가 안 돌아갈 때는 '대체 왜 안 되는 거지?'라며 머리를 쥐어뜯다가, 코드 한 줄 고치고 갑자기 빌드가 성공하면 기뻐하기는커녕 '어?... 이게 왜 빌드가 성공하는 거지? 무서워...'라며 더 깊은 혼란과 공포에 빠지는 괴현상을 뜻한다.
5. 여담
- 자기 컴파일 (Self-Hosting): 컴파일러 자신을 자신이 컴파일하는 언어로 구현하여 빌드하는 것을 말한다. 예를 들어, C 컴파일러인 GCC를 C언어로 작성하여 기존 C 컴파일러로 컴파일하고, 그 생성된 컴파일러로 다시 자신을 빌드하는 닭과 달걀의 순환 구조를 보여준다.
- 그레이스 호퍼의 업적: 최초의 컴파일러 개념을 고안한 그레이스 호퍼는 '컴퓨터가 인간의 언어(영어)를 이해할 수 있을 것'이라고 주장했다가 당시 주위 수학자들로부터 '컴퓨터는 수학 기호만 처리할 수 있다'며 미친 사람 취급을 받았다고 한다.
- 오류 메시지의 인격화: 최근 러스트(Rust) 컴파일러는 너무 친절하게 에러의 원인과 해결법까지 짚어주어 '사실 뇌를 이식받은 대학원생이 안에서 실시간 검사하는 게 아니냐'는 의혹을 받고 있다.
6. 관련 문서
각주
-
실제로 아무런 일도 하지 않는 빈 루프(for-loop)를 정성껏 돌려놓으면 컴파일러가 무시무시한 통찰력으로 '어차피 쓸데없는 짓이군'이라며 루프 자체를 소멸시켜 버린다. ↩