맨위로가기

런타임 시스템

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

런타임 시스템은 프로그래밍 언어의 실행 모델을 구현하는 데 사용되는 소프트웨어 환경이다. 초기 런타임 시스템은 베이직과 리스프와 같은 언어의 인터프리터였으며, C 언어와 같은 언어에서는 동적 메모리 할당을 관리하는 라이브러리를 포함했다. 객체 지향 프로그래밍 언어에서는 동적 타입 검사 및 메서드 참조 해결도 수행한다. 런타임 시스템은 언어의 실행 모델을 구현하며, 프로그램 실행에 필요한 다양한 지원 서비스를 제공한다. 또한, 런타임 환경과 상호 작용하여 프로그램이 시스템의 자원에 접근할 수 있도록 한다. 현대에는 병렬 실행을 지원하고, 가상 머신과 같은 추상화 계층을 제공하며, JIT 컴파일을 통해 실행 속도를 향상시키는 등 다양한 기능을 수행한다.

더 읽어볼만한 페이지

  • 런타임 시스템 - 런타임 라이브러리
    런타임 라이브러리는 프로그래밍 언어의 기능을 지원하고 컴파일러에 의해 자동으로 링크되며, 예외 처리, 메모리 할당 등의 기능을 제공하고 디버깅 및 릴리스 용도에 따라 여러 버전이 존재한다.
  • 런타임 시스템 - 디노 (소프트웨어)
    Deno는 Node.js의 대안으로 라이언 달이 개발한 JavaScript 및 TypeScript 런타임 환경으로, 보안 강화, 의존성 관리 단순화, ES 모듈 기본 사용 등 Node.js와 차별화된 특징을 가지며 관련 프로젝트 개발을 통해 생태계를 확장하고 있다.
  • 컴퓨팅 플랫폼 - 안드로이드 (운영체제)
    구글이 개발한 리눅스 커널 기반의 모바일 운영체제인 안드로이드는 오픈소스 플랫폼으로 다양한 기기에서 활용되며 세계적으로 널리 사용되지만, 개인정보 보호 문제와 독점적 지위 남용 논란 등의 비판도 존재한다.
  • 컴퓨팅 플랫폼 - 자바 플랫폼, 마이크로 에디션
    자바 ME는 임베디드 및 모바일 장치에서 자바 앱을 실행하는 플랫폼으로, 피처폰에서 주로 사용되었으며 다양한 프로파일과 에뮬레이터, 개발 도구를 제공하고 JSR을 통해 기능이 확장된다.
런타임 시스템

2. 역사

런타임 시스템의 개념은 프로그래밍 언어의 발전과 함께 진화해 왔다. 초기 런타임 시스템은 베이직과 Lisp 인터프리터처럼 가비지 컬렉션 기능을 포함하거나, Forth처럼 가상 머신을 통해 중간 코드를 해석하는 방식으로 구현되었다. 도널드 커누스의 MIX 컴퓨터도 초기 런타임 시스템의 예시 중 하나이다.[1]

C와 같이 동적 메모리 할당을 지원하는 언어들은 런타임 시스템에 메모리 풀 관리 라이브러리를 포함하기 시작했다.[1] 객체 지향 프로그래밍 언어에서는 런타임 시스템이 동적 타입 검사와 메서드 참조 해결까지 담당하는 경우가 많아졌다.[1]

2. 1. 초기 런타임 시스템

런타임 시스템의 초기 예로는 베이직과 Lisp 인터프리터가 있다. 이들은 가비지 컬렉션 기능을 포함했다. Forth는 중간 코드로 컴파일되도록 설계된 초기 언어 중 하나이며, 해당 코드를 해석하는 가상 머신이 런타임 시스템 역할을 했다. 도널드 커누스의 MIX 컴퓨터도 주목할 만한 초기 런타임 시스템의 예이다.[1]

2. 2. C 언어와 동적 메모리 할당

C와 같이 동적 메모리 할당을 지원하는 언어는 런타임 시스템에 프로그램의 메모리 풀을 관리하는 라이브러리를 포함한다.[1]

2. 3. 객체 지향 프로그래밍 언어

객체 지향 프로그래밍 언어에서 런타임 시스템은 종종 동적 타입 검사와 메서드 참조 해결도 담당한다.[1]

3. 런타임 시스템의 구성과 역할

프로그래밍 언어는 각각 고유한 실행 모델을 가지며, 많은 경우 런타임 시스템이 이 모델의 일부를 구현한다. 런타임 시스템의 동작은 프로그램 자체에 직접적으로 기인하지 않는 모든 동작으로 정의할 수 있다. 여기에는 함수 호출 전 매개변수를 스택에 넣는 것, 병렬 실행, 디스크 I/O 등이 포함된다.[1]

이러한 정의에 따르면, 컴파일 언어, 인터프리터 언어, 도메인 특화 언어 등 기본적으로 모든 언어가 런타임 시스템을 가진다. Pthreads와 같이 독립 실행형 실행 모델을 호출하는 API도 런타임 시스템을 갖는다.[2]

어떤 언어의 동작이 런타임 시스템 자체의 일부이고, 어떤 동작이 특정 소스 프로그램에 의해 결정되는지에 대한 명확한 기준이 없는 경우가 많다. 예를 들어, C 언어에서 스택 설정은 런타임 시스템의 일부인데, 이는 개별 프로그램의 의미론에 의해 결정되지 않고 모든 실행에 걸쳐 유지되기 때문이다. 이러한 체계적인 동작은 개별 프로그램의 의미론을 구현하는 것과는 반대로, 언어의 실행 모델을 구현한다.

특정 프로그램의 의미론과 런타임 환경 간의 분리는 프로그램을 컴파일하는 다양한 방식에 반영된다. 즉, 모든 함수를 포함하는 오브젝트 파일로 소스 코드를 컴파일하는 것과 전체 프로그램을 실행 바이너리로 컴파일하는 것이다. 오브젝트 파일은 포함된 함수와 관련된 어셈블리 코드만 포함하는 반면, 실행 바이너리는 런타임 환경을 구현하는 추가 코드를 포함한다. 한편, 오브젝트 파일은 링킹에 의해 해결될 런타임 환경의 정보를 누락할 수 있다. 다른 한편, 오브젝트 파일의 코드는 여전히 런타임 시스템의 가정에 의존한다. 예를 들어, 함수는 런타임 환경에서 사용되는 호출 규약에 따라 특정 레지스터 또는 스택 위치에서 매개변수를 읽을 수 있다.

API를 사용하여 런타임 시스템과 상호 작용하는 경우, 해당 API 호출은 일반 소프트웨어 라이브러리 호출과 동일하게 보이지만, 호출 중 어느 시점에서 실행 모델이 변경된다. 런타임 시스템은 라이브러리가 작성된 언어와 다른 실행 모델을 구현한다. 일반 라이브러리의 코드를 읽는 사람은 라이브러리가 작성된 언어를 아는 것만으로도 라이브러리의 동작을 이해할 수 있지만, 런타임 시스템을 호출하는 API의 코드를 읽는 사람은 호출이 작성된 언어를 아는 것만으로는 API 호출의 동작을 이해할 수 없다. 어느 시점에서, 어떤 메커니즘을 통해 실행 모델은 호출이 작성된 언어의 실행 모델이 되는 것을 멈추고 런타임 시스템에 의해 구현된 실행 모델로 전환된다. 예를 들어, 트랩 명령어는 실행 모델을 전환하는 한 가지 방법이다. 이러한 차이점은 Pthreads와 같은 API 호출 실행 모델을 일반 소프트웨어 라이브러리와 구별하는 것이다. Pthreads 호출과 소프트웨어 라이브러리 호출 모두 API를 통해 호출되지만, Pthreads 동작은 호출 언어 측면에서 이해할 수 없다. 대신, Pthreads 호출은 Pthreads 런타임 시스템(이 런타임 시스템은 종종 OS 커널이다)에 의해 구현되는 외부 실행 모델을 적용한다.

극단적인 예로, 실제 CPU 자체는 특정 어셈블리 언어의 런타임 시스템의 구현으로 볼 수 있다. 이 관점에서 실행 모델은 물리적 CPU 및 메모리 시스템에 의해 구현된다. 비유하자면, 상위 레벨 언어의 런타임 시스템은 다른 언어를 사용하여 자체적으로 구현된다. 이는 CPU 자체, 또는 실제로 마이크로코드 계층 이하의 로직을 최저 레벨 런타임 시스템으로 작동시키는 런타임 시스템의 계층 구조를 만든다.

일부 컴파일 언어나 인터프리터 언어는 애플리케이션 코드가 런타임 시스템과 직접 상호 작용할 수 있도록 인터페이스를 제공한다. 예를 들어, 자바의 클래스는 다른 스레드의 시작이나 정지 등을 수행하는 코드를 구현한다. 그러나 스케줄링이나 자원 관리와 같은 언어의 핵심적인 측면은 이러한 방식으로 접근할 수 없다.

고수준 동작(화면에 텍스트를 그리는 것, 인터넷 연결 실행 등)은 런타임 시스템에 의해 구현될 수 있다. 이러한 동작은 운영체제(OS)에 의해서도 제공되는 경우가 많으며, 이 경우 런타임 시스템은 런타임 시스템 호출을 OS 호출로 번역하는 추상화 계층으로 구현된다. 이는 OS 커널 자체가 런타임 시스템으로 간주될 수 있으며, OS의 동작을 호출하는 OS 호출이 런타임 시스템과의 상호 작용으로 간주될 수 있다는 것을 의미한다.

P-코드 머신 또는 가상 머신과 같은 프로세서의 명령어 집합을 숨기는 서비스를 런타임 시스템이 제공하는 극단적인 예도 있다. AWK와 같은 인터프리터 언어 대부분과 자바와 같이 머신 독립적인 중간 언어 코드(바이트코드)로 컴파일하는 언어는 이러한 방식을 채택한다. 이 방식을 사용하면 언어 구현 작업과 다양한 머신으로의 이식이 단순화되고, 리플렉션과 같은 기능을 효율적으로 구현할 수 있다. 또한 동일한 프로그램을 재컴파일 없이 임의의 머신에서 실행할 수 있게 해주는데, 이는 월드 와이드 웹 보급 이후 중요해진 기능이다. 실행 속도를 높이기 위해 일부 런타임 시스템은 기계어에 대한 JIT 컴파일을 구현하기도 한다.

런타임 시스템의 현대적인 측면은 Pthreads의 뮤텍스 구조나 OpenMP의 병렬 섹션 구조 등 병렬 실행 동작이다. 이러한 병렬 실행 동작을 가진 런타임 시스템은 모듈화되는 경우가 있다.

런타임 시스템과 유사한 개념 비교
유형설명예시
런타임 환경코드를 실행하기 위한 환경을 제공하는 소프트웨어 플랫폼Node.js, .NET 프레임워크
소프트웨어 엔진코드를 컴파일하거나 해석하여 실행하는 런타임 환경의 구성 요소웹 브라우저의 자바스크립트 엔진, 자바 가상 머신
인터프리터전체 프로그램을 미리 컴파일하지 않고 한 줄씩 코드를 읽고 실행하는 유형의 엔진CPython 인터프리터, Ruby MRI, 자바스크립트 (일부 경우)
JIT 인터프리터런타임에 코드를 기계어로 동적으로 컴파일하여 코드를 최적화하여 더 빠르게 실행하는 유형의 인터프리터V8, PyPy 인터프리터


3. 1. 실행 모델 구현

함수 호출, 매개변수 전달, 메모리 관리 등 프로그램 실행의 기본적인 동작은 런타임 시스템에서 구현된다. 예를 들어, C 언어의 런타임 시스템은 컴파일러가 실행 가능한 이미지에 삽입하는 특정 명령어 집합으로, 프로세스 스택 관리, 지역 변수 공간 생성, 함수 호출 매개변수 복사 등의 작업을 수행한다.[1]

Cilk와 같은 병렬 프로그래밍 모델의 런타임 시스템은 병렬 실행을 지원하며, 이러한 병렬 런타임 시스템 구현은 학술 논문의 주요 주제이다.[1] Proto-runtime 툴킷은 병렬 런타임 시스템 생성을 단순화하기 위해 만들어졌다.[2]

런타임 시스템은 실행 모델 동작 외에도 타입 검사, 디버깅, 코드 생성 및 최적화와 같은 지원 서비스를 수행할 수 있다.[3]

3. 2. 지원 서비스

실행 모델 동작 외에도 런타임 시스템은 타입 검사, 디버깅, 코드 생성 및 최적화와 같은 지원 서비스를 수행할 수 있다.

3. 3. 런타임 환경과의 상호작용

런타임 시스템은 실행 중인 프로그램이 런타임 환경과 상호작용하는 통로 역할을 한다. 런타임 환경에는 프로그램 실행 중에 접근 가능한 상태 값뿐만 아니라, 디스크 드라이브, DVD 드라이브, 사람(키보드를 통해) 등 프로그램 실행 중에 상호작용이 가능한 요소들도 포함된다.[3] 예를 들어, 환경 변수는 많은 운영 체제의 기능이며 런타임 환경의 일부이다. 실행 중인 프로그램은 런타임 시스템을 통해 환경 변수에 접근할 수 있다.

런타임 환경(RTE)의 특이한 사용 방법은, 운영체제(OS) 내부에서 RTE 이외의 실행을 허용하지 않는 것이다. 즉, 부팅부터 전원 차단까지 OS 전체가 RTE 내부에서 실행되는 프로그램에 전념한다. 이 외의 코드를 실행하려고 하거나, 애플리케이션 내에서 문제가 발생하면 RTE가 손상되고, 이로 인해 OS가 손상되어 모든 프로세스가 정지하고 재부팅이 필요해진다. 읽기 전용 메모리에서 부팅하면, 매우 안전하고 단순한 미션 전용 시스템이 생성된다. 예를 들어, 이를 통해 쉽게 패치가 불필요하고 변경 불가능한 IoT 기기를 만들 수 있다. 이 경우, IoT 기기는 다른 목적(봇넷 등)으로는 사용할 수 없지만, 재부팅을 강제하는 취약점 악용을 방지하는 패치를 할 수도 없다.

4. 런타임 시스템과 런타임 환경

프로그래밍 언어는 각각 실행 모델을 명시하며, 많은 언어는 해당 모델의 일부를 런타임 시스템에서 구현한다. 런타임 시스템은 런타임 환경(Runtime Environment, RTE)과 밀접하게 관련되어 있다.

런타임 시스템과 유사한 개념 비교
유형설명예시
런타임 환경코드를 실행하기 위한 환경을 제공하는 소프트웨어 플랫폼Node.js, .NET 프레임워크
소프트웨어 엔진코드를 컴파일하거나 해석하여 실행하는 런타임 환경의 구성 요소웹 브라우저의 자바스크립트 엔진, 자바 가상 머신
인터프리터전체 프로그램을 미리 컴파일하지 않고 한 줄씩 코드를 읽고 실행하는 유형의 엔진CPython 인터프리터, Ruby MRI, 자바스크립트 (일부 경우)
JIT 인터프리터런타임에 코드를 기계어로 동적으로 컴파일하여 코드를 최적화하여 더 빠르게 실행하는 유형의 인터프리터V8, PyPy 인터프리터



런타임 시스템에 관한 대부분의 학술 논문은 병렬 런타임 시스템의 구현 세부 사항에 초점을 맞춘다. 병렬 런타임 시스템의 주목할 만한 예로는 널리 사용되는 병렬 프로그래밍 모델인 Cilk가 있다.[1] Proto-runtime 툴킷은 병렬 런타임 시스템의 생성을 단순화하기 위해 만들어졌다.[2]

다음은 직접 번들 런타임 시스템의 예시이다.


  • 1983년에서 1984년 사이에 Digital Research는 SpeedStart CP/M-86과 함께 부팅 가능한 플로피 디스켓에 IBM PC용 여러 비즈니스 및 교육용 애플리케이션을 번들로 제공했다. SpeedStart CP/M-86은 런타임 환경으로 CP/M-86의 축소 버전이다.
  • Ventura Publisher(1986–1993), Artline (1988–1991), Timeworks Publisher (1988–1991) 및 ViewMAX (1990–1992)의 일부 독립 실행형 버전에는 Digital Research의 GEM의 특수 런타임 버전이 런타임 환경으로 포함되어 있었다.
  • 1990년대 후반에 JP Software의 명령줄 프로세서 4DOS는 BATCOMP로 사전 컴파일 및 암호화된 일괄 작업과 연결하여 일괄 스크립트에서 수정할 수 없는 실행 파일을 생성하고 4DOS가 설치되지 않은 시스템에서 실행하기 위해 특수 런타임 버전으로 선택적으로 제공되었다.

4. 1. 런타임 환경의 정의

프로그래밍 언어는 각각 실행 모델을 명시하며, 많은 언어는 해당 모델의 일부를 런타임 시스템에서 구현한다. 런타임 시스템 동작에 대한 한 가지 정의는 "프로그램 자체에 직접 기인하지 않는 모든 동작"이다. 이 정의에 따르면 함수 호출 전에 매개변수를 스택에 넣는 것, 관련 동작의 병렬 실행, 디스크 입출력 등이 런타임 시스템에 포함된다.

이 정의에 따르면 컴파일 언어, 인터프리터 언어, 임베디드 도메인 특정 언어 등 기본적으로 모든 언어에 런타임 시스템이 존재한다. API로 호출되는 독립 실행 실행 모델, 예를 들어 Pthreads (POSIX 스레드)도 실행 모델의 동작을 구현하는 런타임 시스템을 갖는다.

실행 모델 동작 외에도 런타임 시스템은 타입 검사, 디버깅, 코드 생성, 최적화와 같은 지원 서비스를 수행할 수도 있다.[3]

런타임 시스템은 실행 중인 프로그램이 '''런타임 환경'''과 상호 작용하는 관문이다. 런타임 환경에는 접근 가능한 상태 값뿐만 아니라 프로그램이 실행 중에 상호 작용할 수 있는 활성 엔티티도 포함된다. 예를 들어, 환경 변수는 많은 운영 체제의 기능이며 런타임 환경의 일부이다. 실행 중인 프로그램은 런타임 시스템을 통해 환경 변수에 접근할 수 있다. 마찬가지로 디스크나 DVD 드라이브와 같은 하드웨어 장치는 프로그램이 런타임 시스템을 통해 상호 작용할 수 있는 활성 엔티티이다.

4. 2. 런타임 환경의 특수 활용

운영 체제(OS) 내부에서 런타임 환경만 실행하여, 부팅부터 종료까지 전체 OS를 런타임 환경 내에서 실행되는 애플리케이션에 전념하게 할 수 있다. 실행을 시도하는 다른 코드나 애플리케이션의 오류는 런타임 환경을 손상시키는데, 런타임 환경이 손상되면 운영 체제가 손상되어 모든 처리가 중단되고 재부팅이 필요하다. 부팅이 읽기 전용 메모리에서 이루어지면 매우 안전하고 단순하며 단일 임무 시스템이 생성된다.[1] 이러한 특성을 활용하여, 패치가 불필요하고 변경 불가능한 사물 인터넷(IoT) 기기를 쉽게 만들 수 있다. 이 경우, IoT 기기는 다른 목적(봇넷 등)으로 사용될 수 없지만, 재부팅을 강제하는 취약점 악용을 방지하는 패치를 할 수도 없다.

5. 고급 기능

일부 컴파일 또는 인터프리터 언어는 애플리케이션 코드가 런타임 시스템과 직접 상호 작용할 수 있는 인터페이스를 제공한다. 런타임 시스템의 현대적인 측면으로는 Pthreads의 뮤텍스 구성 및 OpenMP의 병렬 섹션 구성과 같은 병렬 실행 동작이 있다. 이러한 병렬 실행 동작을 가진 런타임 시스템은 프로토 런타임 접근 방식에 따라 모듈화될 수 있다.

5. 1. 스레드 관리

자바 언어의 `Thread` 클래스와 같이, 코드(하나의 스레드에 의해 실행됨)는 다른 스레드를 시작하고 중지하는 등의 작업을 수행할 수 있다. 일반적으로, 태스크 스케줄링 및 자원 관리와 같은 언어의 핵심 동작은 이러한 방식으로 접근할 수 없다.

5. 2. 추상화 계층

런타임 시스템은 화면에 텍스트를 그리거나 인터넷 연결을 하는 등의 고수준 동작을 구현할 수 있다. 종종 운영체제(OS)도 이러한 동작을 제공하는데, 이 경우 런타임 시스템은 런타임 시스템 호출을 운영체제 호출로 변환하는 추상화 계층으로 구현된다.[1] 이는 서로 다른 운영체제가 제공하는 서비스의 복잡성이나 차이점을 숨기는 역할을 한다.[1] OS 커널 자체를 런타임 시스템으로 볼 수 있으며, OS 동작을 호출하는 OS 호출 집합을 런타임 시스템과의 상호 작용으로 볼 수도 있다.[1]

5. 3. 가상 머신

P-코드 머신 또는 JVM과 같이 프로세서의 명령어 집합을 추상화하는 가상 머신 서비스를 제공한다.[4] 이는 AWK와 같은 많은 인터프리터 언어와 자바와 같이 일부 머신 독립적인 중간 표현 코드(예: 바이트코드)로 컴파일되도록 설계된 언어가 따르는 접근 방식이다.[4] 이 방식은 언어 구현과 다양한 머신에 대한 적응 작업을 단순화하고 리플렉션과 같은 정교한 언어 기능의 효율성을 향상시킨다.[4] 또한 명시적인 재컴파일 단계 없이 동일한 프로그램을 모든 머신에서 실행할 수 있도록 하며, 이는 월드 와이드 웹의 확산 이후 매우 중요해진 기능이다.[4] 실행 속도를 높이기 위해 일부 런타임 시스템은 JIT 컴파일을 특징으로 한다.[4]

6. 현대적 측면

현대의 런타임 시스템은 Pthreads의 뮤텍스 및 OpenMP의 병렬 섹션 구성과 같은 병렬 실행 동작을 지원하는 경우가 많다.

6. 1. 병렬 실행 지원

Pthreads의 뮤텍스 및 OpenMP의 병렬 섹션과 같은 기능을 통해 병렬 프로그래밍을 지원하는 것은 런타임 시스템의 현대적인 측면이다. 이러한 런타임 시스템은 프로토 런타임 접근 방식에 따라 모듈화될 수 있다.

6. 2. 모듈화

Proto-runtime 접근 방식에 따라 런타임 시스템이 모듈화되는 경우가 있다.

참조

[1] 웹사이트 Cilk: An efficient multithreaded runtime system http://dl.acm.org/ci[...] ACM 1995
[2] 웹사이트 The Proto-Runtime Toolkit http://opensourceres[...] 2011
[3] 웹사이트 A Runtime System https://users-cs.au.[...] Princeton University 1989-05
[4] 서적 Compilers: Principles, Techniques and Tools https://archive.org/[...] Pearson Education 2007



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com