컴파일과 런타임 차이(컴파일 언어 vs 인터프리터 언어)

개발을 하다보면 흔하게 접할 수 있는 용어인 컴파일과 런타임. 이 두 개념이 가끔 헷갈릴 떼가 있다. 두 개념에 대해 정화하게 파악하고 그 차이를 알아보자.

컴파일(Compile)

  • 정의

    컴파일은 소스 코드(사람이 읽을 수 있는 고수준 언어로 작성된 코드)를 기계어(컴퓨터가 이해할 수 있는 저수준 언어) 또는 중간 코드(바이트코드)로 변환하는 과정입니다.

  • 단계

    컴파일 과정에서는 구문 분석, 최적화, 코드 생성 등의 작업이 이루어집니다. 이 과정은 일반적으로 컴파일러에 의해 수행됩니다.

  • 결과

    컴파일이 완료되면 실행 가능한 바이너리 파일(예: .exe 파일)이나 바이트코드(예: Java의 .class 파일)가 생성됩니다.

  • 예시

    C, C++, Java 등의 언어에서 컴파일 과정을 거쳐 실행 파일이 생성됩니다.

  • 특징

    컴파일 과정에서 발생하는 오류(구문 오류, 타입 오류 등)는 컴파일 타임 오류라고 불리며, 이 오류가 있으면 프로그램은 실행되지 않습니다.

런타임(Runtime)

  • 정의

    런타임은 컴파일된 프로그램이 실제로 실행되는 시간을 의미합니다. 이 단계에서는 프로그램이 운영 체제 위에서 실행되며, 사용자가 프로그램과 상호작용하거나, 프로그램이 실제로 작업을 수행하게 됩니다.

  • 단계

    런타임 동안 프로그램은 CPU에서 실행되며, 메모리 할당, 입출력 작업, 함수 호출, 데이터 처리 등이 이루어집니다.

  • 결과

    런타임에서 발생하는 오류는 런타임 오류(예: NullPointerException, Division by Zero)라고 불립니다. 이 오류들은 프로그램 실행 중에 발생하며, 프로그램이 비정상적으로 종료될 수 있습니다.

  • 예시

    프로그램을 실행하는 순간부터 종료될 때까지의 모든 시간입니다. 사용자가 애플리케이션을 실행하고, 그 애플리케이션이 작업을 수행하는 동안의 모든 것이 런타임입니다.

컴파일 vs 런타임

즉, 컴파일은 프로그램을 만드는 과정, 런타임은 만들어진 프로그램이 실행되는 과정이라고 생각하면 쉽다.

가끔 컴파일 에러 혹은 런타임 에러라는 말을 접하는 경우가 생기는데 컴파일 에러는 컴파일 과정 중 파악할 수 있는 코드 자체의 에러를 의미해 구문 오류(문법 오류), 타입 오류(정수형에 스트링을 넣으려고 한다거나..), 참조 오류(선언되지 않은 변수에 접근하려 한다거나..) 등이 포함된다. 런타임 에러는 런타임 과정 중 생길 수 있는 에러로 예외(exception) 상황(정수를 0으로 나누기 연산 진행, 크기가 5인 배열에서 10 인덱스 참조..) 혹은 메모리 오류 등이 포함된다.

넓은 의미의 컴파일

타입스크립트를 사용할 때 이상하게 생각했던 것 중 하나가 타입스크립트는 컴파일을 통해 자바스크립트 언어로 변환된다는 것이었다. 내가 알기로는 컴파일은 고급 언어에서 저급 언어(기계어)로 변환하는 작업인데, 타입스크립트가 자바스크립트 문법으로 바뀐다고 기계어로 변환되는 것은 아니지 않기 때문이다.

즉, 컴파일은 단순히 상위 언어에서 하위 언어로 변환되는 작업을 폭넓게 부르는 용어이기도하다.

타입스크립트 컴파일 과정 중에서도 일반적인 컴파일과 같이 문법 오류, 타입 검사 등을 진행한다.

컴파일 언어 vs 인터프리터 언어

컴파일 언어와 인터프리터 언어는 위 개념들과 관련있는 내용이다. 우선 컴파일 언어와 인터프리터 언어가 무엇인지 알아보자.

컴파일 언어

컴파일 혹은 컴파일러 언어는 소스 코드를 컴파일하는 언어를 의미한다. 소스 코드를 실행하는 과정에 컴파일 단계와 런타임 단계가 나누어져 있는 언어로 C, C++, C#, JAVA 등이 속한다.

컴파일 언어는 컴파일 시에는 파일 크기에 따라 시간이 오래 걸릴 수 있지만, 컴파일이 끝난 파일을 실행하는 것은 매우 빠르다는 장점이 있다. 또한 컴파일러가 코드 최적화를 수행하기도 하고 위에서 언급했듯 컴파일 단계에서는 문법 및 타입 오류 등을 잡아주기 때문에 에러를 방지할 수 있다.

인터프리터 언어

인터프리터 언어는 컴파일 단계가 빠진 언어를 의미한다. 컴파일 대신 소스 코드를 실행하는 순간에 코드를 한 줄씩 읽어들여 바로바로 실행한다. 언어로는 Python, Javascript, Ruby 등이 있다.

인터프리터 언어는 컴파일 단계가 없기 때문에 실행할 때마다 소스 코드를 한 줄씩 읽어들여 해석하는 인터프리트 과정이 필수이므로 실행 속도가 느릴 수 있지만, 소스 코드를 컴파일 단계없이 바로 실행할 수 있어 빠른 개발이 가능하다. 또한 소스 코드가 그대로 실행되기 때문에 디버깅과 테스트도 더 쉽고 직관적이다.

results matching ""

    No results matching ""