When we run a code
우리가 일반적으로 코드를 작성하고 실행할 때, 우리는 특정 언어를 사용해 코드를 짜고 언어에 따라서 Compiling, Interpreting 과정을 거치고 Run을 하고 Debugging 까지 한다. 우리의 코드가 바로 실행된다고 생각을 한다면 이 모든 과정은 하나로 연결된다고 여길 수 있지만, 실제로는 그렇지 않다.
특히, Compile time과 Run time이라는 개념이 많이 나온다. 에러 메시지 중에서 이를 표시하기도 하고, 언어의 종류를 구분할 때 그 기준이 되기도 하고, Dynamic type, Static type과 같이 타개념을 설명할 때도 많이 사용된다. 이 글을 통해 Compile time과 Run time이 무엇인지 알고 궁극적으로 코드를 실행했을 때의 처리 과정을 익혀보자.
High-Level vs Low-Level Programming Language
시작하기에 앞서서 고급 프로그래밍 언어가 무엇인지를 알아야 컴파일링과 인터프레팅 과정을 이해할 수 있다. 우리가 작성한 코드는 특정 프로그래밍 언어로 되어있다. 이 프로그래밍 언어를 컴퓨터의 하드웨어가 바로 알아들을 수 있을까? C++, Python, JS와 같은 언어들은 그렇지 않다는 것을 알 것이다. 컴퓨터의 하드웨어는 0과 1로 이루어진 바이너리 신호들로 움직인다. 하드웨어가 소통하는 언어를 기계어라고 부른다. 기계어에 가까운 정도에 따라서 Low-level부터 High-Level 프로그래밍 언어라고 부르게 된다.
Low-Level Programming Language는 기계어에 굉장히 밀접한 프로그래밍 언어로 예시로 어셈블어와 C언어가 있다. (C언어는 고급프로그래밍으로도 분류되지만 저수준 프로그래밍도 가능하여 중간 수준으로 분류된다.) 저수준 프로그래밍의 특징은 하드웨어에 가까운 프로그래밍이 가능하다는 것이다. 정확히는 하드웨어의 구체적인 세부사항을 제어할 수 있다. 메모리 관리와 프로세서의 명령 실행과 같은 하드웨어와 직접적으로 상호 작용하는 기능을 포함한다.
High-Level Programming Language는 인간의 언어에 더 가깝다. 우리에게는 더 가독성이 좋고 편리한 언어이다. 주로 사용하는 C++, Python, JS와 같은 언어들이 이에 포함된다. 하지만, 고급프로그래밍 언어는 기계어와는 거리가 멀어 하드웨어가 이해할 수 없다. 이를 해결하기 위한 다리 역할이 Compiling과 interpreting이다.
When Computer run a code
고급프로그래밍 언어로 이루어진 코드를 실행할 때 컴퓨터가 어떤 과정을 거치는 보자.
2가지 방법이 존재한다. 첫 번째 방법은 Compiling을 하는 것이고, 두 번째 방법은 Interpreting을 하는 것이다. 두 방법은 어떤 언어를 쓰는지에 따라서 결정이 되는 것이다. 예를 들어 C++나 Java를 사용한다면 Compiling 과정을 거치고, Python 혹은 JS를 사용했다면 Interpreting 과정을 거친다.
Compiling route
Compile 과정을 거치는 언어를 사용한다면 일반적으로 다음 과정을 따른다.
코드 작성
컴파일링
링킹
실행
디버깅
Compile 과정에서 1에서 작성한 코드는 기계어로 바뀐다. Compile을 하기 위해서 Compiler라고 부르는 외부 프로그램을 사용해야 한다. 컴파일러는 소스 코드를 읽고, 오류를 검사하며, 실행 가능한 바이너리 파일(기계어 파일)을 생성한다. 이후에는 3번을 거쳐 4번 5번 순으로 진행이 된어 작성한 코드가 실행이 된다.
(참고로 3번 링킹은 컴파일된 코드가 외부 라이브러리나 다른 프로그램 모듈과 함께 동작해야 할 때, 이들을 연결하는 과정이다.)
Interpreting route
Interpret 과정을 거치는 언어는 주로 스크립트 언어와 일부 고수준 언어로 다음 과정을 따른다.
코드 작성
인터프레팅
인터프레팅 과정은 소스 코드를 한 줄 씩 읽고 해석하고 실행을 한다. 이는 코드의 마지막 줄에 도달할 때까지 반복되는데 덕분에 따로 컴파일러가 필요하지 않고, 디버깅이 쉽다는 장점이 있다. 소스 코드를 사전에 번역을 하는 Compiling과 달리 번역과 실행을 동시에 한다는 것이 가장 큰 차이점이다.
Compile time vs Run time
코드가 실행되는 과정을 알았으니 Compile time과 Run time이 무엇인지 이해할 수 있다.
Compile time은 소스 코드가 컴파일러에 의해 기계어로 번역되는 과정 및 시점을 말하고 코드가 실행되기 이전의 결정이 되어 있는 시점을 말한다.
Run time은 코드를 실행한 이후의 시점을 말하며 Compiling을 거치는 경우 번역된 파일을 실행한 이후의 시점, Interpreting을 거치는 경우 Interpret을 시작한 이후의 시점을 말한다.