⚙️ 소프트웨어 컴파일이란?
Source: Dev.to
일반적인 컴퓨팅에서 컴파일(Compilation) 은 고수준 프로그래밍 언어(인간이 읽을 수 있는 C++, Rust, Java 등)를 저수준 언어(머신 코드나 바이트코드 등)로 변환하여 컴퓨터 프로세서가 실제로 실행할 수 있게 하는 과정이다.
컴파일러를 매우 정교한 번역가에 비유하면, 영어로 쓰인 책을 로봇이 그 책을 재현할 수 있도록 수학적 좌표 시리즈로 변환하는 역할을 한다.
🛠️ 컴파일 단계
컴파일은 하나의 단계가 아니라, 특정 변환들의 파이프라인이다.
1. 🔍 렉시컬 분석 (스캐너)
컴파일러는 소스 코드를 문자 단위로 읽어 토큰(키워드, 연산자, 식별자)으로 그룹화한다. 또한 주석과 공백을 제거한다.
예시
x = 5 + 3;
→ 토큰들로 변환 …
2. 🌳 구문 분석 (파싱)
컴파일러는 토큰들이 언어의 문법 규칙을 따르는지 확인한다. 논리 구조를 나타내기 위해 구문 트리(Parse Tree) 혹은 추상 구문 트리(AST) 를 만든다.
오류 검사: 여기서 “세미콜론 누락”이나 “괄호 불일치” 같은 오류가 잡힌다.
3. 🧠 의미 분석
컴파일러는 “의미” 오류를 검사한다. 변수는 사용 전에 선언되어야 하고, String에 Integer를 더하는 등 불가능한 연산을 시도하지 않도록 확인한다.
4. ⚙️ 중간 코드 생성
컴파일러는 기계에 독립적인 간소화된 형태의 코드를 만든다. 이는 최종 번역 전에 코드를 최적화하기 쉽게 만든다.
5. 🚀 코드 최적화
컴파일러는 프로그램의 동작을 바꾸지 않으면서 더 빠르거나 더 작게 만들 방법을 찾는다.
예시
x = 2 + 2;
최적화 단계에서는 이를 x = 4 로 교체하여 실행 시 덧셈 연산을 수행하지 않게 만든다.
6. 📠 코드 생성
중간 코드를 머신 코드(CPU에 특화된, 예: x86 또는 ARM) 혹은 바이트코드 로 변환하는 최종 단계이다.
🎓 요약
✅ 컴파일이란?
- 고수준 코드를 머신 레벨 코드로 변환한다.
- 프로그램 실행 전에 한 번에 모두 수행된다.
- 독립 실행 파일(실행 파일, 예:
.exe)을 만든다.
CPU는 이진(고/저 전압)만 이해한다. 인간이 효율적으로 이진을 작성할 수 없으므로, 컴파일러가 인간 논리와 하드웨어 실행 사이의 다리를 놓는다.
❌ 컴파일이 아닌 것
- “컴파일은 실행 중에 한 줄씩 일어난다.” – 이는 인터프리테이션(예: Python, JavaScript)이다.
- “컴파일은 디버깅과 같다.” – 디버깅은 오류를 찾는 행위이고, 컴파일은 종종 오류를 드러내는 과정이다.
🧠 컴파일러 vs. 인터프리터
“번역가 vs. 통역가” 기억법을 사용하라:
- 컴파일러 = 책 전체를 읽기 전에 번역하는 번역가 (나중에 읽을 때는 빠르지만, 처음에 시간이 든다).
- 인터프리터 = 말할 때마다 한 문장씩 번역해 주는 통역가 (전체를 끝내는 데는 느리지만, 바로 시작할 수 있다).
⚠️ 컴파일 vs. 링크
- 컴파일은 소스 코드를 오브젝트 코드(반완성된 조각)로 변환한다.
- 링크는 오브젝트 코드를 다른 라이브러리와 결합해 최종 실행 파일(완성된 퍼즐)을 만든다.