Compile
🔶 컴파일이란
컴퓨터는 0과 1로만 모든 명령을 이해하고 실행합니다.
우리가 ‘A’라는 문자를 입력하더라도 컴퓨터는 이것을 0과1로 이루어진 이진코드로 해석하는데 ‘A’라는 문자를 어떻게 해석해줄 것 일까요?
이때 사용하는 기능을 컴파일이라고 합니다.
즉, 사람이 이해하는 언어를 컴퓨터가 이해할 수 있는 언어로 바꾸어 주는 과정, 프로그래밍 언어로 작성된 소스 코드를 컴퓨터가 이해하고 실행할 수 있는 기계어로 변환하는 과정을 컴파일이라고 합니다.
🔶 컴파일러
컴파일러(Compiler)는 컴파일을 수행하는 프로그램으로, 소스 코드를 입력으로 받아서, 그것을 분석하고, 컴퓨터가 이해할 수 있는 중간 코드로 변환하고, 그것을 최종적으로 목적 코드로 변환하여 실행 파일을 생성합니다.
따라서, 컴파일은 소스 코드를 기계어로 변환하는 과정을 의미하고, 컴파일러는 이러한 변환을 수행하는 소프트웨어입니다.
🔶 컴파일러 과정
컴파일러는 일반적으로 다음과 같은 과정을 거칩니다.
-
프리프로세싱(Preprocessing)
소스 코드를 컴파일하기 전에 전처리기(Preprocessor)가 소스 코드에 포함된 전처리 지시자(Preprocessor directive)를 처리합니다. 예를 들어 #include 지시자를 사용하여 헤더 파일을 포함하는 경우, 전처리기는 헤더 파일 내용을 소스 코드에 포함시킵니다. -
어휘 분석(Lexical Analysis)
소스 코드를 구성하는 토큰(Token)을 분석합니다. 토큰은 예약어, 식별자, 리터럴 등으로 구성됩니다. -
구문 분석(Syntax Analysis)
토큰들의 문법적인 구조를 분석하여, 추상 구문 트리(Abstract Syntax Tree)를 생성합니다. -
의미 분석(Semantic Analysis)
추상 구문 트리를 분석하여, 프로그램의 의미를 검증하고, 변수의 유효성을 검사합니다. -
코드 생성(Code Generation)
목적 코드(Executable Code)를 생성합니다. 이 과정에서 중간 코드(Intermediate Code)를 생성하고, 해당 중간 코드를 목적 코드로 변환합니다. -
최적화(Optimization)
생성된 목적 코드를 최적화하여, 실행 속도를 향상시킵니다.
🔶 컴파일과 컴파일러
컴파일은 소스 코드를 기계어로 변환하는 과정을 의미하고, 컴파일러는 이러한 변환을 수행하는 소프트웨어를 의미합니다.
컴파일과 컴파일러는 밀접한 관련이 있지만, 다음과 같은 차이점이 있습니다.
-
컴파일은 과정, 컴파일러는 소프트웨어
컴파일은 소스 코드를 목적 코드로 변환하는 과정을 말하며, 컴파일러는 이러한 변환을 수행하는 소프트웨어를 말합니다. -
컴파일러는 소스 코드를 컴파일하는 도구
컴파일러는 소스 코드를 입력으로 받아서 목적 코드를 생성하는 프로그램입니다. 따라서, 컴파일러는 개발자가 소스 코드를 컴파일할 때 사용하는 도구입니다. -
컴파일러는 언어에 종속적
컴파일러는 언어에 종속적입니다. 즉, C 언어를 컴파일하기 위해서는 C 언어에 대한 컴파일러가 필요합니다. 따라서, 컴파일러는 언어마다 구현 방식이 다를 수 있습니다. -
컴파일러는 소스 코드를 분석하고, 목적 코드를 생성하는 소프트웨어
컴파일러는 소스 코드를 분석하고, 목적 코드를 생성하는 소프트웨어입니다. 따라서, 컴파일러는 소스 코드를 분석하고, 목적 코드를 생성하는 다양한 알고리즘과 기술을 사용합니다.
🔶 컴파일 언어와 인터프리터 언어
컴파일 언어와 인터프리터 언어는 프로그래밍 언어를 해석하는 방식에 차이가 있습니다.
컴파일 언어(Compiled Language)는 소스 코드를 컴파일러를 통해 기계어로 번역하여 실행하는 언어입니다. 즉, 소스 코드를 기계어로 변환하는 컴파일 작업이 필요하며, 이 작업은 소스 코드를 실행하기 전에 미리 수행됩니다. 이후에는 번역된 기계어 코드가 직접 실행됩니다. 대표적인 컴파일 언어로는 C, C++, Java 등이 있습니다.
인터프리터 언어(Interpreted Language)는 소스 코드를 실행하는 컴퓨터 프로그램인 인터프리터를 통해 실행하는 언어입니다. 즉, 소스 코드를 실행하는 과정에서 인터프리터가 소스 코드를 한 줄씩 해석하면서 실행합니다. 따라서, 컴파일 과정 없이 바로 실행이 가능하며, 소스 코드가 수정되면 즉시 실행 결과가 반영됩니다. 대표적인 인터프리터 언어로는 Python, Ruby, JavaScript 등이 있습니다.
따라서, 컴파일 언어는 기계어 코드로 번역되어 실행되는 반면, 인터프리터 언어는 실행 중에 소스 코드를 해석하여 실행됩니다. 컴파일 언어는 실행 속도가 빠르고, 한 번의 컴파일로 실행 파일을 만들어 재사용할 수 있습니다. 반면에, 인터프리터 언어는 실행 속도는 느리지만, 실행 과정에서 소스 코드를 수정하거나 디버깅하기가 편리합니다. 또한, 인터프리터 언어는 운영체제나 하드웨어에 의존하지 않아서, 다양한 플랫폼에서 실행될 수 있습니다.