Compiler(컴파일러)?
컴파일러란 특정 프로그래밍 언어로 쓰여 있는 문서를 저급 프로그래밍 언어(기계어, 어셈블리어) 로 옮기는 언어 번역 프로그램을 말합니다.
컴파일러는 고급 프로그래밍 언어를 실행 프로그램으로 만들기 위해 저급 프로그래밍 언어(예: 어셈블리 언어, object 코드, machine code)로 바꾸는데 사용됩니다.
즉, 컴파일러란 우리가 프로그래밍을 할때 사용하는 언어를 컴퓨터가 이해할 수 있도록 기계어로 번역해주는 번역가 라고 볼 수 있다. 그리고 이러한 번역을 하는 행위를 컴파일이라고 합니다.
참고로 여기서 말하는 저급 언어나 고급 언어는 언어에 따른 급이 있는게 아니라 컴퓨터와 사람이 이해하기 쉬운 자연어중 더 가까운쪽을 분류해서 명칭해둔것 입니다.. 저급 언어는 컴퓨터가 이해하기 쉬운 즉, 기계어와 가까운 언어이고 반대로 고급 언어는 사람이 이해하기 쉬운 언어 입니다.
저급 언어, 저수준 언어(Low-Level Language)
앞서 말했듯이 저급 언어는 컴퓨터가 더 이해하기 쉬운 언어이며 사람보다는 기계 친화적인 언어라고 볼 수 있습니다. 저급 언어에서는 기계어와 어셈블리어가 있습니다. 기계어는 흔히 알고 있는 0과 1로 이루어진 2진수로 이루어진 언어이고 어셈블리어는 기계어를 영문자로 치환한 언어입니다. 두 언어 모두 컴퓨터에 더 가까운 언어이기에 저급 언어로 불리고 있습니다.
기계어(Machine Language)
기계어는 0과 1로 이루어진 컴퓨터가 이해하는 가장 낮은 수준의 언어입니다. 개발자가 어떠한 프로그래밍 언어를 사용하여도 결과적으로 컴파일을 거쳐서 0과 1로 이루어진 기계어로 번역되어서 컴퓨터가 이해할 수 있도록 번역이 됩니다. 기계어의 특징으로는 하드웨어에 관련되어 직접적인 제어가 가능하고 프로그램 작성시 상당한 지식과 노력이 필요하다는 점이 있습니다.
어셈블리어(Assembly Language)
어셈블리어는 알파벳 기호 등 인간이 판독하기 쉬운 기호 형식으로 기계어를 사람이 이해하기 쉬운 기호와 1:1로 매핑하여 기호화된 언어입니다. 기계와 바로 통신이 가능하여 어셈블리어로 프로그램을 작성한 경우에는 어셈블러를 이용해 기계어로 번역을 해야합니다. 어셈블리어의 특징으로는 어셈블리어로 작성된 프로그램은 대체로 컴파일러 언어로 작성된 프로그램보다 실행 속도가 빠르고 프로그래머가 하드웨어와 직접 소통할 수 있다는 장점이 있지만 특정 컴퓨터용으로 작성된 어셈블리어 프로그램을 다른 컴퓨터상에서 실행하려면 다시 코드를 작성해야 하는 번거로움이 존재합니다.
고급 언어, 고수준 언어(High-Level Language)
고급 언어는 C언어, C++, JAVA, Python 등 사람이 알기 쉽게 써진 문장 구조를 가진 프로그래밍 언어를 의미합니다. 또한 저급 언어와는 다르게 하드웨어에 관련된 지식 없이도 프로그램 작성이 가능하며, 저급 언어보다는 프로그램 생산이 수월한 편입니다. 일상적인 언어, 기호를 사용하여 기계어보다 좀 더 인간의 언어와 가깝기에 고급 언어라고 불려집니다.
그리고 기계어로 변환하기 위해서는 인터프리터나 컴파일러가 필수적으로 요구됩니다.
컴파일러와 인터프리터의 차이 컴파일러는 프로그램을 실행하기 전에 전체 코드를 한 번에 번역하여 실행 파일을 생성하는 방식입니다. 반면, 인터프리터는 프로그램을 실행하면서 한 줄씩 번역하여 실행하는 방식입니다. 컴파일러는 실행 속도가 빠르지만, 코드 수정 후 다시 컴파일해야 한다는 단점이 있으며, 인터프리터는 실행 속도가 상대적으로 느리지만 코드 실행 중간에 수정이 가능하다는 장점이 있습니다.
컴파일러의 동작 과정
- 어휘 분석(Lexical Analysis) - 소스 코드에서 의미 있는 단위(토큰)를 추출하는 과정
- 구문 분석(Syntax Analysis) - 추출된 토큰이 문법적으로 올바른지 검사하는 과정
- 의미 분석(Semantic Analysis) - 문법적으로 맞더라도 의미적으로 올바른지 검사하는 과정
- 중간 코드 생성(Intermediate Code Generation) - 최적화를 위해 중간 언어 형태로 변환하는 과정
- 최적화(Optimization) - 코드 실행 속도를 높이기 위해 최적화하는 과정
- 코드 생성(Code Generation) - 최종적으로 기계어로 변환하여 실행 파일을 생성하는 과정
- 링킹 및 로딩(Linking & Loading) - 여러 개의 목적 파일을 결합하고, 실행 가능한 상태로 만드는 과정
현대의 컴파일러 현대에는 다양한 종류의 컴파일러가 존재하며, 단순히 한 언어를 기계어로 변환하는 것뿐만 아니라 멀티 패스 컴파일러, JIT(Just-In-Time) 컴파일러, 크로스 컴파일러 등 여러 방식으로 최적화된 실행 환경을 제공합니다. 특히, Java의 경우 바이트코드(Bytecode)라는 중간 코드로 변환된 후 JVM(Java Virtual Machine)을 통해 실행되며, 이는 플랫폼 독립성을 보장합니다.
컴파일러는 단순한 번역기를 넘어서, 코드의 최적화와 실행 성능을 향상시키는 중요한 역할을 합니다. 다양한 개발 환경에서 가장 적합한 컴파일러를 선택하는 것이 중요한 이유도 여기에 있습니다.
'Software Engineering > Software Development Principles' 카테고리의 다른 글
의존성 주입(DI, Dependency Injection) (1) | 2025.03.05 |
---|---|
Refactoring(리팩토링) (0) | 2025.03.03 |
Code Smell (0) | 2025.03.03 |