실행 모델
Execution model프로그램 실행 |
---|
일반개념 |
코드 종류 |
컴파일 전략 |
주목할 만한 런타임 |
주목할 만한 컴파일러 및 공구 체인 |
|
프로그래밍 언어는 문법/syntax와 실행 모델로 구성된다.실행 모델은 언어 요소의 동작을 지정한다.실행 모델을 적용함으로써, 그 프로그래밍 언어의 관점에서 쓰여진 프로그램의 동작을 도출할 수 있다.예를 들어, 프로그래머가 코드를 "읽을" 때, 그들은 마음속으로 각각의 코드 라인이 하는 일을 걷는다.사실상 그들은 마음 속의 행동을 흉내낸다.프로그래머가 하는 일은 실행 모델을 코드에 적용하는 것으로 코드의 행동을 초래한다.
각각의 모든 프로그래밍 언어에는 실행 모델이 있는데, 실행 모델은 (프로그램 구문으로 표시되는) 작업 단위가 실행되도록 예약되는 방식을 결정한다.몇몇 인기 있는 언어의 실행 모델의 사양에 대한 상세한 예[2]그 Python,[1]통일 병렬 C(통일 상품 코드)프로그래밍 언어의 실행 모델의 실행 모델의 필수적인 대 기능 languages,[3]으로 여러 계층의 토론과 기사 rea를 수행 모델을 논의하고 포함한다.l-time e모국어[4]
실행 모델 세부 정보
운영 의미론(Operational Semantics)은 언어의 실행 모델을 지정하는 한 방법이다.실행 프로그램의 관찰된 동작은 작동 의미론(언어의 실행 모델을 정의함)에서 도출된 동작과 일치해야 한다.
실행 모델은 분리할 수 없는 작업 단위인 것, 그리고 그러한 작업 단위가 발생할 수 있는 순서의 제약조건과 같은 것들을 다룬다.예를 들어, 추가 연산은 여러 언어로 된 불가분의 일의 단위로서, 순차 언어에서는 그러한 일의 단위가 차례로 일어나도록 제약을 받는다.
이를 설명하기 위해 케르니건과 리치가 쓴 책에서 설명한 대로 C 프로그래밍 언어를 고려해보자.[5]C는 성명이라는 개념을 가지고 있다.언어 규격은 문을 ";"에 의해 종료되는 구문 덩어리로 정의한다.언어 규격에 따르면 "프로그램 실행은 순차적으로 한 문장씩 진행된다"고 한다.그 말들: "프로그램의 실행은 연속적으로 한 문장씩 차례로 진행된다"는 것은 C의 실행 모델의 한 부분이다.그러한 단어들은 우리에게 명령문은 분리할 수 없는 작업 단위로서 코드에서 그들의 통사적 외관과 같은 순서로 진행된다는 것을 말해준다(IF 또는 FOR와 같은 통제 명령문이 명령을 수정하는 경우는 제외).프로그래밍 모델은 "프로그램의 실행은 순차적으로 한 문장씩 차례로 진행된다"고 명시함으로써 작업 단위 수행 순서에 대한 제약을 명시했다.
C 언어는 실제로 그 실행 모델에 추가 레벨이 있는데, 이것이 우선 순위다.우선 순위는 단일 문장의 운영 순서에 대한 규칙을 명시한다.우선순위는 단일 문항 내에 있는 작업단위의 수행에 대한 제약조건을 명시하는 것으로 볼 수 있다.따라서 ";"와 "IF"와 "WHY"는 문장 순서에 대한 제약조건을 다루고, 우선순위는 문장 내 작업에 대한 제약조건을 다룬다.따라서 C 언어 규격의 이러한 부분들은 C 언어의 실행 모델의 일부이기도 하다.
실행 모델은 또한 프로그래밍 언어와 독립적으로 존재할 수 있으며, 그 예는 POSIX 스레드 라이브러리 및 Hadoop의 Map-Reduce 프로그래밍 모델이다.실행 모델의 구현은 컴파일러 또는 인터프리터를 통해 이루어질 수 있으며, 종종 런타임 시스템을 포함한다.
실행 모델의 구현은 실행 중에 작업이 수행되는 순서를 제어한다.이 순서는 어떤 상황에서 미리 선택할 수도 있고, 실행이 진행됨에 따라 동적으로 결정될 수도 있다.대부분의 실행 모델은 다양한 수준의 두 가지 모두를 허용한다.예를 들어, C 언어는 문장의 작업 순서를 수정하고 IF 문이나 루프 문장의 형식을 포함하는 문장을 제외한 모든 문장의 순서를 수정한다.따라서 실행 순서의 대부분은 실행이 시작되기 전에 정적으로 선택될 수 있지만 실행이 진행됨에 따라 적은 부분을 동적으로 선택해야 한다.
정적 선택은 컴파일러 내부에서 구현되는 경우가 가장 많으며, 이 경우 작업 순서는 실행 가능한 이진 파일에 명령이 배치되는 순서로 표현된다.그런 다음 언어의 런타임 시스템 내에서 동적 선택이 구현될 것이다.런타임 시스템은 컴파일러가 삽입한 지시에 의해 호출되는 라이브러리일 수도 있고, 런타임 시스템은 다음에 수행할 작업에 대해 동적인 선택을 하는 분기 명령을 삽입하는 등 실행 파일에 직접 내장될 수도 있다.
그러나, 통역관은 어떤 언어에 대해서도 구성될 수 있으며, 이 경우 실행 순서에 대한 모든 결정이 동적이다.통역사는 부분 번역가로서, 부분 실행 모델 구현으로 볼 수 있다.
조립 언어 실행 모델 대 마이크로 아키텍처 구현
조립 언어 또한 다른 언어와 마찬가지로 실행 모델을 가지고 있다.그러한 실행 모델은 CPU 마이크로 아키텍처에 의해 구현된다.예를 들어, 5단계 주문형 파이프라인과 대형 주문형 CPU 모두 동일한 조립 언어 실행 모델을 구현한다.실행 모델은 동작의 정의로서, 순서상 또는 순서상, 해석상 또는 JIT 등 모든 구현이 가능하다.모두 정확히 동일한 결과를 제공해야 하며, 그 결과는 실행 모델에 의해 정의된다.
병렬 실행 모델
현대에서 병렬 프로그래밍은 점점 더 중요한 주제다.병렬 실행 모델은 여러 개의 일정을 포함하기 때문에 복잡한 경향이 있다.병렬 실행 모델은 반드시 동기화 구성의 동작을 포함한다.동기화 구성은 다른 시간 표시 막대의 활동과 비교하여 한 시간 표시 막대의 활동 간 순서를 설정하는 효과가 있다.
예를 들어 일반적인 동기화 구성 요소는 잠금입니다.하나의 연대표를 생각해보자.타임라인은 "잠금의 게인 소유권" 동기화 구조를 실행하는 지점을 가지고 있다.Posix 스레드에서는 pthread_mutex_lock(&myMutex)이 될 것이다.Java에서 이것은 lock.lock()이 될 것이다.두 경우 모두 연대표를 실이라고 한다.C와 자바 실행 모델은 순차적이며, 타임라인은 "잠금의 소유권 확보"를 위한 통화 전에 오는 활동과 통화 후에 오는 활동이 있다고 기술하고 있다.마찬가지로 "잠금 소유권 포기" 작전이 있다.C에서 이것은 pthread_mutex_unlock(&myMutex)일 것이다.Java에서 이것은 lock.unlock()이 될 것이다.다시 한번 실행 모델 C와 자바에서는 잠금 소유권이 포기되기 전에 한 그룹의 문이 실행되고, 잠금 소유권이 포기된 후에 다른 그룹의 문이 실행된다고 정의한다.
이제 두 개의 스레드라고도 하는 두 개의 타임라인을 생각해 보십시오.스레드 A라고 하는 하나의 스레드는 몇 가지 문장을 실행하고, A-게인-잠금-잠금-문장이라고 부른다.그런 다음 스레드 A는 "잠금 소유권"을 실행한 다음, 스레드 A는 A-게인 잠금 후 문구를 실행하며, 이는 A가 잠금의 소유권을 획득한 후에 발생한다.마지막으로, 스레드 A는 "잠금장치 소유권 포기"를 수행한다.그런 다음 스레드 A는 A-포스트 포기-락 문을 수행한다.
두 번째 스레드는, 그것을 스레드 B라고 부르고, 몇 가지 문장을 실행하고, B-프리-락 문이라고 부른다.그 후 나사산 B는 "잠금장치 소유권"을 실행한 다음, 나사산 B는 B-후 잠금문을 실행하는데, 이는 B가 잠금의 소유권을 획득한 후에 발생한다.
이제 우리는 "잠금 소유권"과 "잠금 소유권 포기" 동기화 구조의 병렬 실행 모델을 말할 수 있다.실행 모델은 다음과 같다.
"잠금장치 소유권이 실 A에서 실 B로 넘어가는 경우, A 포스트 게인 잠금 문구는 B 포스트 게인 잠금 문항보다 먼저 나온다."
그리고 이것이 마지막입니다.
간단해 보이지, 그렇지?이러한 복잡성은 실행 모델이 "잠금 소유권 포기"를 실행할 수 있는 수단을 가지고 있지 않아 다른 시간표(스레드)에서 "잠금 소유권 포기"의 실행에 영향을 미칠 수 없다는 데서 비롯된다.매우 자주, 오직 특정한 핸드오프만이 유효한 결과를 준다.그러므로 프로그래머는 자물쇠를 포기하는 한 실과 다음에 그것을 얻는 또 다른 실의 가능한 모든 조합을 생각해야 하며, 그들의 코드가 유효한 조합만을 허용하는지 확인해야 한다.
유일한 효과는 A-게인-잠금-잠금 문장이 B-게인-잠금 문장의 앞에 나온다는 점에 유의한다.다른 영향은 발생하지 않으며, 다른 상대적 질서는 신뢰할 수 없다.구체적으로 A-포스트 기브-업-락과 B-포스트-게인락은 상대적 순서가 정해져 있지 않아 많은 사람을 놀라게 한다.그러나 실 A는 소유권을 포기한 후 교환되었을 수 있으므로, A-사후 포기-잠금 진술은 많은 B-사후-게인-잠금 진술이 끝난 지 오래 후에 일어날 수 있다.그것은 잠금장치를 설계할 때 반드시 생각해야 할 가능성 중 하나이며, 멀티스레드 프로그래밍이 왜 어려운지를 잘 보여준다.
현대의 병렬 언어는 실행 모델을 사용하는 것이 훨씬 쉽다는 점에 유의하십시오.스레드 모델은 원래 병렬 실행 모델 중 하나로, 사용이 어려움에도 불구하고 지속된 이유를 설명할 수 있다.
참고 항목
![]() | 무료 사전인 Wiktionary에서 런타임을 찾아 보십시오. |
참조
- ^ "Python Documentation: Execution Model".
- ^ "UPC Language Features".
- ^ Cardoso, J.M.P.; Diniz, P.C. (2011). Programming Languages and Execution Models. Springer US. ISBN 9780387096711.
- ^ PELLIZZONI, R.; BETTI, E.; BAK, S.; YAO, G.; CRISWELL, J.; CACCAMO, M. & KEGLEY, R (2011). "A Predictable Execution Model for COTS-based Embedded Systems" (PDF). Real-Time and Embedded Technology and Applications Symposium. IEEE.
- ^ Kernighan, Brian W.; Dennis M. Ritchie (February 1978). The C Programming Language (1st ed.). Englewood Cliffs, NJ: Prentice Hall. ISBN 0-13-110163-3.