
컴파일 타임과 런타임을 모르는 개발자는 없을 것이다. 그렇다면 왜 이렇게 간단한 주제에 대해 포스팅을 하는가. 막상 자세하게 설명하려고 하면 전공 수업 때 들었던 기억이 가물가물하면서 정확한 용어가 떠오르지 않기 때문이다.
목적에 맞게, 간단하게 컴파일 과정을 살펴보면서, 컴파일 타임과 런타임이 어떻게 분리되는지 살펴보자. 이후 컴파일러 언어와 인터프리터 언어에 대해 간략히 알아보려 한다.
컴퓨터는 0과 1을 통해서만 명령을 실행할 수 있지만 개발자가 프로그래밍에 사용하는 언어들은 0과 1로 이루어진 형태가 아니다. 그렇다면, 개발자가 작성한 코드를 컴퓨터가 이해할 수 있는 언어로 바꾸어 주어야 한다. 이 과정이 바로 컴파일이다.
컴파일 (compile): 개발자가 작성한소스 코드를 프로세서가 이해할 수 있는기계어로 번환하는 작업

위 사진은 전공 수업에서 흔히 볼 수 있는 C언어 컴파일 과정이다. 넓은 의미에서 보면 컴파일은 전처리 과정, 컴파일 과정, 어셈블리 과정, 링킹 과정의 총 4 단계로 진행된다. 하지만 우리는 흔히 위의 4단계를 통틀어 빌드한다고 지칭하고 빌드 과정에 컴파일과 링킹이 포함된다고 말한다.
각 과정에 대해 간략히 요약하면 아래와 같다. 내부 동작 원리까지 알고 싶다면 하단의 참고자료 링크를 따라가면 된다. 정리를 매우 잘 해두셨다.
전처리 과정(Pre-processing):전처리기(Preprocessor)를 통해소스 파일(.c)을 전처리된소스 코드 파일(.i)로 변환컴파일 과정(Compilation):컴파일러(Compiler)를 통해소스 코드 파일(.i)을 ``어셈블리어 파일(.s)로 변환어셈블리 과정(Assembly):어셈블러(Assembler)를 통해어셈블리어 파일(.s)를오브젝트 파일(.o)로 변환링킹 과정(Linking):링커(Linker)를 통해오브젝트 파일(.o)들을 묶어실행 파일로 변환
위 컴파일 과정에서 소스 파일이 실행 파일로 만들어지는 전반적인 과정을 컴파일 타임으로 지칭한다. 만들어진 실행 파일이 실행되어 종료하기까지의 시간이 바로 런타임이다.
컴파일 타임(compile time):소스 파일이실행 파일로 만들어 지기까지의 시간
런타임(runtime):실행 파일이 실행되어 종료되기 까지의 시간
컴파일러 언어와 인터프리터 언어는 해당 언어의 컴파일 수행 여부를 기준으로 구분된다. 컴파일 절차를 거치는 C, C++, C#, JAVA의 경우 컴파일러 언어이며 이와 달리 컴파일 없이 소스 코드를 한 줄씩 읽고 해석하여 바로 수행하는 언어인 Python, JavaScript, Ruby는 인터프리터 언어에 속한다. 컴파일러 언어와 인터프리터 언어는 아래와 같이 간단하게 정리할 수 있다.
컴파일러 언어:컴파일 단계와실행 단계가 분리된 언어
인터프리터 언어:컴파일없이 프로그램 ``소스 코드를 바로 실행하는 언어
컴파일러 언어는 앞서 살펴본 컴파일 과정을 거쳐 개발자가 작성한 소스 코드를 기계어로 변환한 실행 파일을 생성한다. 한 번 컴파일 한 이후에 실행 파일을 단순 동작시키는 것만으로 실행을 수행할 수 있다는 점에서 인터프리터 언어에 비해 코드 실행 속도가 빠르다. 다만, 코드 수정이 있을 때마다 다시 컴파일(re-compile) 해야하는 번거로움이 있다.
인터프리터 언어는 이와 달리 컴파일 없이 인터프리터가 소스 코드를 한 줄 한 줄 읽고 바이트 코드로 변환하여 바로 수행한다. 따라서 코드 수정 시 재컴파일의 번거로움이 없고 컴파일 자체에 시간이 소요되지 않는다는 장점이 있다. 반면 실행파일이 생성되지 않기 때문에 매 번 실행 시마다 코드를 해석하는 인터프리트 과정이 반복 수행되어 컴파일러 언어에 비해 수행 속도가 현저히 느리다.