실행
| 프로그램 실행 |
|---|
| 일반 개념 |
| 코드의 종류 |
| 컴파일 전략 |
| 저명한 런타임 |
| 저명한 컴파일러 및 툴체인 |
|
컴퓨팅에서 실행(實行, execution, run)은 컴퓨터 프로그램이 인코딩하는 동작을 수행하도록 처리되는 과정이다. 프로세서가 프로그램 명령어를 따를 때, 해당 명령어의 의미론에 따라 효과가 생성된다. 일반적으로 'run'이라는 용어도 동의어로 사용된다. 실행을 시작하는 행위를 실행 및 'run' 외에도 'launching' 또는 'invoking'이라고 부르기도 한다.
실행 프로세서는 여러 형태로 제공된다. 기계어 프로그램은 컴퓨터나 가상 머신의 프로그래밍 가능한 인터페이스를 통해 실행될 수 있으며, 이때 실행은 제어 장치가 실행하는 각 프로그램 명령어에 대해 fetch–decode–execute 사이클을 반복적으로 따르는 과정을 포함한다. 소스 코드는 인터프리터 소프트웨어에 의해 실행될 수 있다. 프로그램은 인간의 상호작용 없이 일괄 처리 과정으로 실행될 수도 있고, 사용자가 대화형 세션에서 명령어를 입력할 수도 있다.
플랫폼 독립성
[편집]소프트웨어는 종종 호스트 환경에 맞춰진 런타임 환경 및 런타임 라이브러리와 같은 외부 서비스에 의존하여 컴퓨터 및 주변 장치의 직접적인 조작으로부터 실행 파일을 분리하고, 따라서 더 플랫폼 독립적인 솔루션을 제공하는 서비스를 제공한다.
런타임 오류
[편집]런타임 오류는 프로그램의 실행(실행 상태) 중 또는 후에 감지되는 반면, 컴파일 타임 오류는 프로그램이 실행되기 전에 컴파일러에 의해 감지된다. 타입 검사, 레지스터 할당, 코드 생성, 코드 최적화는 일반적으로 컴파일 타임에 수행되지만, 특정 언어 및 컴파일러에 따라 런타임에 수행될 수도 있다. 0으로 나누기 오류, 도메인 오류, 배열 인덱스 범위를 벗어나는 오류, 언더플로 오류, 여러 유형의 언더플로 및 오버플로 오류와 같이 다양한 런타임 오류가 존재하며, 이는 다른 프로그래밍 언어에 의해 다르게 처리된다. 이러한 오류는 일반적으로 소프트웨어 버그로 간주되며, 특정 컴퓨터 언어에 의해 포착되고 처리될 수도 있고 그렇지 않을 수도 있다.
예외 처리는 런타임 오류 처리를 지원하여, 예상치 못한 상황뿐만 아니라 예측 가능한 오류 또는 비정상적인 결과를 구조화된 방식으로 포착할 수 있게 해준다. 이는 예외 처리가 없는 언어에 필요한 인라인 오류 검사량을 줄여준다. 런타임 엔진의 최근 발전은 자동화된 예외 처리를 가능하게 하여, 관심 있는 모든 예외에 대한 "근본 원인" 디버그 정보를 제공하며, 런타임 엔진에 특수 소프트웨어 제품을 연결함으로써 소스 코드와 독립적으로 구현된다.
디버그
[편집]일부 디버그는 런타임에만 수행될 수 있거나 (또는 런타임에 수행될 때 더 효율적이거나 정확하다). 논리 오류와 배열 경계 검사가 그 예시이다. 이러한 이유로, 일부 프로그래밍 버그는 정교한 컴파일 타임 검사 및 출시 전 테스트에도 불구하고 실제 데이터가 있는 운영 환경에서 프로그램이 테스트될 때까지 발견되지 않는다. 이 경우, 최종 사용자는 "런타임 오류" 메시지를 만날 수 있다.
인터프리터
[편집]프로그램을 직접 실행하는 시스템은 인터프리터이다. 일반적으로 인터프리터는 소프트웨어를 의미하지만, CPU 또한 하드웨어로 구현된 인터프리터이다.
가상 머신
[편집]가상 머신 (VM)은 가상화/에뮬레이션된 컴퓨터 시스템이다. 가상 머신은 컴퓨터 구조를 기반으로 하며 물리적 컴퓨터의 기능을 제공한다. 구현에는 특수 하드웨어, 소프트웨어 또는 조합이 포함될 수 있다.
가상 머신은 기능에 따라 달라지며 분류된다.
- 시스템 가상 머신 (또한 완전 가상화 VM이라고도 함)은 실제 머신을 대체한다. 이들은 전체 운영체제를 실행하는 데 필요한 기능을 제공한다. 하이퍼바이저는 네이티브 실행을 사용하여 하드웨어를 공유하고 관리함으로써, 서로 격리되어 있지만 동일한 물리적 머신에 존재하는 여러 환경을 허용한다. 최신 하이퍼바이저는 하드웨어 지원 가상화, 즉 주로 호스트 CPU에서 제공하는 가상화 특정 하드웨어를 사용한다.
- 프로세스 가상 머신은 프로그래밍 언어를 플랫폼 독립적인 환경에서 실행하도록 설계되었다.
QEMU 및 비디오 게임 콘솔 에뮬레이터와 같은 일부 가상 머신 에뮬레이터는 다른 시스템 아키텍처를 에뮬레이트(또는 "가상으로 모방")하도록 설계되어 다른 CPU 또는 아키텍처용으로 작성된 소프트웨어 응용 프로그램 및 운영 체제를 실행할 수 있다. 운영체제 수준 가상화는 커널을 통해 컴퓨터의 리소스를 분할할 수 있도록 한다. 이 용어들은 보편적으로 상호 교환될 수 없다.
호스트 네이티브
[편집]이 섹션은 어셈블리어 이외의 프로그래밍 언어로 작성된 프로그램의 호스트 네이티브 실행, 즉 소스 코드에서 생성된 기계어의 CPU 해석에 중점을 둔다. 이는 실행의 매우 일반적인 시나리오이지만, 다른 실행 방식도 일반적으로 발견된다.
문맥 교환
[편집]여러 호스트 네이티브 실행 파일의 병행 실행을 지원하기 위해, 다중작업 운영체제 (OS)는 문맥 교환을 지원할 수 있다. 실행 환경에서 실행 파일(프로세스 컨텍스트 식별자로 식별됨)을 스왑 아웃하기 위해 OS는 메모리 페이지 주소 및 레지스터 값과 같은 실행 컨텍스트 데이터를 저장한다. 다시 스왑 인하기 위해 OS는 데이터를 복원한다.[1]: 3.3 [2]
리눅스 기반 운영 체제에서 프로세서 레지스터에 저장된 데이터 세트는 일반적으로 문맥 교환을 구현하기 위해 메모리의 프로세스 디스크립터에 저장된다.[1] PCID도 사용된다.
프로그램 수명 주기
[편집]어셈블리어 이외의 언어로 작성된 호스트 네이티브 프로그램은 뚜렷한 수명 주기 단계를 갖는다. 설계 시점에는 소프트웨어 개발자가 소스 코드를 작성한다. 컴파일 타임에는 소스 코드가 기계어 또는 바이트코드와 같이 컴퓨터에서 더 쉽게 사용될 수 있는 코드로 처리된다. 링크 타임에는 실행 준비가 된 실행 파일이 생성된다.
런타임 (a.k.a. 실행 시간)에는 기계어가 컴퓨터의 중앙 처리 장치 (CPU)에 의해 실행된다. 제어는 엔트리 포인트에서 시작하여 프로그램의 논리 및 입력에 따라 프로그램의 명령어를 통해 이동한다. 프로그램은 종료되거나 충돌할 때까지 실행된다.
로딩
[편집]프로그램이 시작될 때 로더는 메모리 설정을 수행하고 필요한 모든 동적으로 링크된 라이브러리와 프로그램을 연결한 다음, 프로그램의 엔트리 포인트에서 실행이 시작된다. 경우에 따라 언어 또는 구현이 이러한 작업을 언어 런타임에 의해 수행하도록 할 수 있지만, 이는 일반적인 소비자 운영 체제의 주류 언어에서는 드물다.
런타임 시스템
[편집]런타임 시스템은 실행 파일에 서비스를 제공하는 소프트웨어 계층이다. 이는 실행 모델의 일부이다. 관련하여, 런타임 환경(RTE)은 런타임 시스템을 포함하여 프로그램이 상호 작용할 수 있는 모든 것이다.
대부분의 프로그래밍 언어에는 런타임 시스템이 포함되어 있다. 이는 메모리 관리, 변수 접근, 매개변수 전달 메커니즘, 운영체제 접근 등과 같은 문제를 다룰 수 있다. 컴파일러는 코드를 생성하기 위해 특정 런타임 시스템에 따라 가정을 한다. 일반적으로 런타임 시스템은 스택 및 힙을 설정하고 관리하는 일부 책임을 가지며, 쓰레기 수집, 스레딩 또는 언어의 기타 동적 기능과 같은 기능을 포함할 수 있다.[3]
명령 주기
[편집]명령 주기는 중앙 처리 장치 (CPU)가 부팅부터 컴퓨터가 종료될 때까지 명령어를 처리하기 위해 따르는 주기이다. 이는 가져오기 단계, 디코드 단계, 실행 단계의 세 가지 주요 단계로 구성된다.

단순한 CPU에서는 명령 주기가 순차적으로 실행되며, 다음 명령어가 시작되기 전에 각 명령어가 처리된다. 대부분의 최신 CPU에서는 명령 주기가 대신 병행적으로, 그리고 종종 병렬적으로 명령어 파이프라인을 통해 실행된다. 이는 주기가 개별 단계로 분리되기 때문에 이전 명령어가 완료되기 전에 다음 명령어가 처리되기 시작하는 것이 가능하다.[4]
같이 보기
[편집]각주
[편집]- 1 2 Bovet, Daniel P. (2005). 《Understanding the Linux Kernel》 3판. Marco Cesati. Sevastopol, CA: O'Reilly. ISBN 0-596-00565-2. OCLC 64549743.
- ↑ “Difference between Swapping and Context Switching” (미국 영어). 《GeeksforGeeks》. 2021년 6월 10일. 2022년 8월 10일에 확인함.
- ↑ Aho, Alfred V.; Lam, Monica Sin-Ling; Sethi, Ravi; Ullman, Jeffrey David (2007). 《Compilers: Principles, Techniques and Tools》 2판. Boston, MA, US: Pearson Education. 427쪽. ISBN 978-0-321-48681-3.
- ↑ Crystal Chen, Greg Novick and Kirk Shimano (2000). “Pipelining”. 2019년 6월 26일에 확인함.