런타임(Runtime) 뜻과 종류

런타임의 정의
프로그램은 실행되기 전까지 디스크 위의 파일에 불과하다. 코드가 메모리에 올라가 CPU가 명령을 처리하기 시작하는 순간부터, 프로세스가 종료되는 순간까지, 그 전 구간을 런타임(runtime) 이라 한다.
프로그래밍 맥락에서 런타임은 두 층위로 사용된다. 하나는 실행 중인 시점이고, 다른 하나는 그 실행을 가능하게 하는 소프트웨어 환경이다. (보통 이 경우에는 런타임 "환경"이라고 칭한다)
전자는 "런타임에 오류가 발생했다"처럼 시간 개념으로 쓰이고, 후자는 "Node.js는 JavaScript 런타임이다"처럼 플랫폼 개념으로 쓰인다. 혼용되는 경우가 많으므로 문맥으로 구분한다.
런타임이 시작되기까지
소스 코드가 실행되려면 먼저 운영체제가 이해할 수 있는 형태로 변환되어야 한다. 컴파일 언어(C, Java 등)는 컴파일러가 소스 코드를 기계어 또는 중간 코드로 변환한다.
인터프리터 언어(Python, JavaScript 등)는 인터프리터가 소스 코드를 읽으며 즉시 실행한다.

인터프리터 언어와 컴파일 언어의 순서는 다르지만, 두 방식 모두 프로그램이 메모리에 올라가고 런타임이 시작된다.
런타임이 시작되면 운영체제는 해당 프로세스에 메모리, CPU, 입출력 자원을 할당한다.
이 자원들이 반납되는 순간이 런타임의 끝이라고 할수 있다.
런타임 환경
프로그램은 대부분 고수준 언어로 작성된다. 고수준 언어는 사람이 읽기 쉽지만, 그 자체로는 운영체제의 시스템 자원에 직접 접근할 수 없다. 런타임 환경(Runtime Environment) 은 이 간극을 메우는 소프트웨어 계층이다.
런타임 환경이 제공하는 핵심 기능은 다음과 같다.
1. 시스템 자원 접근 프로그램이 메모리, 파일 시스템, 네트워크 등 운영체제의 자원을 사용할 수 있도록 중개한다. 이 계층이 없다면 고수준 언어로 작성된 프로그램은 실행될 방법이 없다.
2. 메모리 관리 객체 생성 시 메모리를 할당하고, 더 이상 참조되지 않는 메모리를 회수한다. 이 자동 회수 과정을 가비지 컬렉션(Garbage Collection) 이라 한다.
3. 실행 컨텍스트 관리 현재 실행 중인 함수, 지역 변수, 호출 순서를 콜 스택(call stack)으로 추적한다.
4. 표준 라이브러리 제공 파일 입출력, 네트워크 통신, 날짜 처리 등 언어 차원에서 공통으로 필요한 기능을 제공한다.
런타임 환경은 운영체제 자체에 내장되기도 하고, 운영체제 위에서 별도로 동작하는 소프트웨어이기도 하다.
런타임 에러
런타임 에러(runtime error)는 프로그램이 실행되는 도중 발생하는 오류다.
컴파일 단계에서 잡히는 문법 오류나 타입 오류와 달리, 실제 데이터와 사용자 입력이 개입해야만 드러난다.
이 코드는 문법적으로 완전히 올바르다. 그러나 b = 0이라는 데이터를 만나는 순간, 런타임은 오류를 일으킨다. 컴파일타임에는 이 가능성을 알 수 없다.
런타임 에러가 컴파일타임 에러보다 다루기 어려운 이유는, 배포 이후 사용자 환경에서도 발생할 수 있기 때문이다. 어떤 경우에는 수백만 번의 정상 실행 이후 특정 입력에서만 나타나기도 한다.
런타임 환경의 예시
JVM (Java Virtual Machine)
자바 코드를 실행하는 런타임 환경이다. 자바 소스 코드는 바이트코드로 컴파일되고, JVM이 이를 해석해 실행한다. 운영체제에 상관없이 동일한 동작을 보장하는 것이 설계 목표다.
Node.js
JavaScript를 브라우저 밖에서 실행하기 위한 런타임 환경이다. V8 엔진을 기반으로 하며, 파일 시스템·네트워크·프로세스 접근 기능을 추가로 제공한다.
CPython
Python의 기본 런타임 구현체다. Python 소스 코드를 바이트코드로 변환한 후 인터프리터가 실행한다.