사실 코딩을 하다보면 절대 안들어본 사람이 없는 "컴파일"
이게 대체 뭘까?? 사실 개발자에게도 컴파일러가 뭐에요?라고 물어보면 대답 못하는 사람도 있다...
기초부터 탄탄하게!!!
컴파일러(Compiler)
프로그래밍 언어로 작성된 소스 코드(흔히 우리가 에디터를 사용해서 쓰는 언어들)를 컴퓨터가 이해할 수 있는 기계어로 변환하는 소프트웨어 도구이다.
프로그래머가 작성하는 코드는 고수준 언어 즉, High Level Language라고 불리고 기계어는 컴퓨터가 이해할 수 있는 언어 즉, Low Level Language라고 불린다.
이 고수준 언어는 컴파일러라는 고마운 친구 덕분에 기계어 코드로 번역이 되는 것인데 이 과정은 컴파일(Compile)이라고 한다.
그렇다면 컴파일러는 이 고수준 언어를 저수준 언어로 변역하는 일만 할까?
그건 아니다.
컴파일러의 역할
- 구문 분석 (Parsing):
- 소스 코드를 읽고, 문법적으로 올바른지 검사한다.
- 코드의 구조를 이해하고, 이를 구문 트리(Syntax Tree)로 변환한다.
- 의미 분석 (Semantic Analysis):
- 변수의 타입 검사, 함수 호출의 유효성 검토 등 코드의 의미적 오류를 검사한다.
- 코드가 논리적으로 올바르게 작성되었는지 확인한다.
- 최적화 (Optimization):
- 코드의 실행 효율성을 높이기 위해 불필요한 연산을 제거하거나, 더 효율적인 연산으로 대체한다.
- 메모리 사용량을 줄이고, 실행 속도를 향상시키기 위한 다양한 최적화 기법을 적용한다.
- 코드 생성 (Code Generation):
- 최적화된 중간 코드를 대상 플랫폼의 기계어로 변환한다.
- 실행 파일이나 목적 파일(Object File)을 생성한다.
- 링크 (Linking):
- 여러 개의 목적 파일과 라이브러리를 하나의 실행 파일로 결합한다.
- 외부 참조를 해결하고, 최종 실행 가능한 프로그램을 만든다.
- 에러 보고 (Error Reporting):
- 소스 코드에 존재하는 문법적, 의미적 오류를 개발자에게 알린다.
- 오류 메시지를 통해 문제를 수정할 수 있도록 도움을 주는 역할을 한다.
대표적인 컴파일러와 컴파일 언어
- GNU Compiler Collection (GCC)
- 지원 언어: C, C++, Objective-C 등
- 특징: 오픈 소스, 다양한 플랫폼 지원
- Clang
- 지원 언어: C, C++, Objective-C, Swift 등
- 특징: 빠른 컴파일 속도, 우수한 에러 메시지
- Microsoft Visual C++ (MSVC)
- 지원 언어: C, C++
- 특징: Windows 환경에 최적화, Visual Studio와 통합
- rustc
- 지원 언어: Rust
- 특징: 메모리 안전성 강조, 고성능
- Go Compiler (gc)
- 지원 언어: Go
- 특징: 빠른 컴파일 속도, 간결한 문법
- Swift Compiler (swiftc)
- 지원 언어: Swift
- 특징: 애플 플랫폼 최적화, 안전한 메모리 관리
- javac
- 지원 언어: Java
- 특징: 자바 소스를 바이트코드로 변환, JVM에서 실행
인터프리터(Interpreter)
고급 프로그래밍 언어로 작성된 소스 코드를 한 번에 하나씩 읽고 실행하는 소프트웨어 도구이다.
인터프리터는 컴파일 단계를 거칠 필요가 없다는 장점이 있지만 컴파일러를 사용한것보다 속도가 느린 편이다.
인터프리터의 주요 역할과 기능
- 소스 코드 해석 (Source Code Interpretation):
- 소스 코드를 한 줄씩 읽어들여 즉시 실행한다.
- 구문 분석과 의미 분석을 실시간으로 수행하여 코드를 실행 가능한 상태로 변환한다.
- 실행 속도:
- 컴파일러가 전체 코드를 사전에 변환하는 과정이 없기 때문에 초기 실행 속도가 빠르다.
- 매 실행 시마다 코드를 해석해야 하므로 장기적인 실행 속도는 컴파일된 프로그램보다 느릴 수 있다.
- 플랫폼 독립성:
- 인터프리터가 설치된 다양한 플랫폼에서 동일한 소스 코드를 실행할 수 있다.
- 플랫폼에 따라 별도의 컴파일 과정이 필요 없으므로 이식성이 높다.
- 디버깅 및 개발 편의성:
- 코드의 각 부분을 실시간으로 실행하고 결과를 확인할 수 있어 디버깅이 용이하다.
- 개발자가 코드를 수정하고 즉시 결과를 확인할 수 있어 개발 속도가 빨라진다.
- 동적 기능 지원:
- 런타임에 코드를 수정하거나 생성하는 동적 기능을 쉽게 구현할 수 있다.
- 예를 들어, 스크립트 언어에서 자주 사용되는 동적 타이핑과 같은 기능을 자연스럽게 지원다.
컴파일러와 인터프리터의 비교
특징 | 컴파일러 | 인터프리터 |
변환 방식 | 전체 소스 코드를 한 번에 기계어로 변환 | 소스 코드를 한 줄씩 해석하고 즉시 실행 |
실행 속도 | 실행 파일이 최적화되어 있어 빠름 | 해석 과정이 추가되어 상대적으로 느림 |
디버깅 | 컴파일 시점에 오류를 모두 발견 | 실행 중에 오류를 발견하며, 디버깅이 용이함 |
이식성 | 컴파일된 실행 파일은 특정 플랫폼에 종속됨 | 인터프리터가 있는 모든 플랫폼에서 동일한 소스 코드 실행 가능 |
개발 주기 | 컴파일 과정이 필요하여 개발 속도가 상대적으로 느림 | 코드 수정 후 즉시 실행 가능하여 개발 속도가 빠름 |
예시 언어 및 도구 | C, C++, Rust (컴파일러: GCC, Clang, MSVC) | Python, JavaScript, Ruby (인터프리터: CPython, Node.js, MRI) |
대표적인 인터프리터와 인터프리터 언어
- Python: CPython, PyPy, Jython 등 다양한 인터프리터가 존재.
- JavaScript: 브라우저 내장 인터프리터(예: V8, SpiderMonkey) 및 Node.js.
- Ruby: MRI (Matz's Ruby Interpreter), JRuby, Rubinius.
- PHP: Zend Engine 등 다양한 PHP 인터프리터가 사용됨.
이렇게 컴파일러와 인터프리터에 대해 알아보았다.
마무리 말
갑자기 이렇게 가장 기초적인 컴파일러에 대해 왜 알아봤냐 하면..
오늘 기술 면접을 다녀왔는데 컴파일러의 링크에 대한 질문에 답변을 못했기 때문이다.
가장 쉽고 기초적인 개념일수록 그냥 넘어가고 잊어버리기 쉬우니 아무리 쉬운 것도 꼭꼭 한번씩 집고 넘어가는 습관을 들이자!!
참고링크
[리눅스] 컴파일러 vs 인터프리터 차이
[리눅스] 컴파일러 vs 인터프리터 차이
losskatsu.github.io
https://devparker.tistory.com/110
[CS] 컴파일러(Compiler)란? - 개념과 역할
컴파일러란? 컴파일러(Compiler)는 프로그래밍 언어로 작성된 소스 코드를 컴퓨터가 이해할 수 있는 기계어로 변환하는 소프트웨어 도구입니다. 프로그래머가 작성한 고수준 언어(High-level Language)
devparker.tistory.com
'C++' 카테고리의 다른 글
[C++] 진짜 랜덤값? 가짜 랜덤값? (0) | 2025.01.14 |
---|---|
[C++] Text RPG 몬스터 생성 로직 설계 (1) | 2025.01.13 |
[C++] Template, STL (0) | 2025.01.02 |
[C++] 유니크 포인터 (0) | 2024.12.31 |
[C++] 생성자와 소멸자 (0) | 2024.12.30 |