⚙️ 소프트웨어 컴파일이란?

발행: (2026년 1월 17일 오후 05:51 GMT+9)
5 min read
원문: Dev.to

Source: Dev.to

일반적인 컴퓨팅에서 컴파일(Compilation) 은 고수준 프로그래밍 언어(인간이 읽을 수 있는 C++, Rust, Java 등)를 저수준 언어(머신 코드나 바이트코드 등)로 변환하여 컴퓨터 프로세서가 실제로 실행할 수 있게 하는 과정이다.

컴파일러를 매우 정교한 번역가에 비유하면, 영어로 쓰인 책을 로봇이 그 책을 재현할 수 있도록 수학적 좌표 시리즈로 변환하는 역할을 한다.

🛠️ 컴파일 단계

컴파일은 하나의 단계가 아니라, 특정 변환들의 파이프라인이다.

1. 🔍 렉시컬 분석 (스캐너)

컴파일러는 소스 코드를 문자 단위로 읽어 토큰(키워드, 연산자, 식별자)으로 그룹화한다. 또한 주석과 공백을 제거한다.

예시

x = 5 + 3;

→ 토큰들로 변환 …

2. 🌳 구문 분석 (파싱)

컴파일러는 토큰들이 언어의 문법 규칙을 따르는지 확인한다. 논리 구조를 나타내기 위해 구문 트리(Parse Tree) 혹은 추상 구문 트리(AST) 를 만든다.

오류 검사: 여기서 “세미콜론 누락”이나 “괄호 불일치” 같은 오류가 잡힌다.

3. 🧠 의미 분석

컴파일러는 “의미” 오류를 검사한다. 변수는 사용 전에 선언되어야 하고, StringInteger를 더하는 등 불가능한 연산을 시도하지 않도록 확인한다.

4. ⚙️ 중간 코드 생성

컴파일러는 기계에 독립적인 간소화된 형태의 코드를 만든다. 이는 최종 번역 전에 코드를 최적화하기 쉽게 만든다.

5. 🚀 코드 최적화

컴파일러는 프로그램의 동작을 바꾸지 않으면서 더 빠르거나 더 작게 만들 방법을 찾는다.

예시

x = 2 + 2;

최적화 단계에서는 이를 x = 4 로 교체하여 실행 시 덧셈 연산을 수행하지 않게 만든다.

6. 📠 코드 생성

중간 코드를 머신 코드(CPU에 특화된, 예: x86 또는 ARM) 혹은 바이트코드 로 변환하는 최종 단계이다.

🎓 요약

✅ 컴파일이란?

  • 고수준 코드를 머신 레벨 코드로 변환한다.
  • 프로그램 실행 전에 한 번에 모두 수행된다.
  • 독립 실행 파일(실행 파일, 예: .exe)을 만든다.

CPU는 이진(고/저 전압)만 이해한다. 인간이 효율적으로 이진을 작성할 수 없으므로, 컴파일러가 인간 논리와 하드웨어 실행 사이의 다리를 놓는다.

❌ 컴파일이 아닌 것

  • “컴파일은 실행 중에 한 줄씩 일어난다.” – 이는 인터프리테이션(예: Python, JavaScript)이다.
  • “컴파일은 디버깅과 같다.” – 디버깅은 오류를 찾는 행위이고, 컴파일은 종종 오류를 드러내는 과정이다.

🧠 컴파일러 vs. 인터프리터

“번역가 vs. 통역가” 기억법을 사용하라:

  • 컴파일러 = 책 전체를 읽기 전에 번역하는 번역가 (나중에 읽을 때는 빠르지만, 처음에 시간이 든다).
  • 인터프리터 = 말할 때마다 한 문장씩 번역해 주는 통역가 (전체를 끝내는 데는 느리지만, 바로 시작할 수 있다).

⚠️ 컴파일 vs. 링크

  • 컴파일은 소스 코드를 오브젝트 코드(반완성된 조각)로 변환한다.
  • 링크는 오브젝트 코드를 다른 라이브러리와 결합해 최종 실행 파일(완성된 퍼즐)을 만든다.
Back to Blog

관련 글

더 보기 »

6년 이상 C# 사용 후 Rust로 전환 계획

저는 C로 6~7년 동안 작업해 왔지만, 시간이 지나면서 점점 부피가 크고 제한적인 느낌이 듭니다. 사물의 동작 방식을 정확하고 low‑level로 제어하던 것이 그리워집니다.

왜 Java 또는 C#를 공부해야 할까?

‘왜 Java 또는 C를 공부해야 하는가’에 대한 표지 이미지 https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploa...

JAVA 내부: JDK, JRE, JVM, 그리고 JIT!

JDK(Java Development Kit)란 무엇인가요? JDK는 Java 프로그램을 작성하고 개발하는 데 필요한 도구들을 제공합니다. 프로그램을 작성하고 컴파일하면, JDK는 t...