에스테렐

influenced = **에스테렐**(Esterel)은 복잡한 반응형 시스템 개발을 위한 동기 프로그래밍 언어이다. 에스테렐의 명령형 프로그래밍 스타일은 병렬 처리와 선점을 간단하게 표현할 수 있게 한다. 결과적으로 제어 중심 모델 설계에 매우 적합하다. 이 언어의 개발은 1980년대 초에 시작되었으며, 주로 프랑스의 파리국립고등광업학교와 INRIA 팀이 제라르 베리의 주도로 수행했다. 현재 컴파일러는 에스테렐 프로그램을 C 코드 또는 하드웨어(RTL) 구현(VHDL 또는 베릴로그)으로 생성한다. 이 언어는 여전히 개발 중이며, 여러 컴파일러가 나와 있다. 에스테렐의 상업용 개발 환경은 Esterel Studio이다. 이를 상용화한 회사(Synfora)는 2007년 4월 IEEE와 표준화 프로세스를 시작했지만, 워킹 그룹(P1778)은 2011년 3월 해산했다. 참조 매뉴얼은 공개되어 있다.date=November 3, 2005 에스테렐의 잠정 버전은 래킷에 구현되었다.website=docs.racket-lang.org
# 시간의 다형성 개념
에스테렐에서 사용되는 시간의 개념은 비동기 언어의 개념과 다음과 같은 방식으로 다르다. 물리적 시간의 개념은 순서의 개념으로 대체된다. 이벤트의 동시성과 선행성만이 고려된다. 이는 물리적 시간이 특별한 역할을 하지 않는다는 것을 의미한다. 이를 시간의 다형성 개념이라고 한다. 에스테렐 프로그램은 논리적 순간들의 완전히 순서가 지정된 시퀀스를 설명한다. 각 순간에는 임의의 수의 이벤트가 발생한다(0 포함). 동일한 논리적 순간에 발생하는 이벤트 발생은 동시적인 것으로 간주된다. 다른 이벤트는 발생 인스턴스에 따라 순서가 지정된다. 두 가지 유형의 명령문이 있다. 시간이 0인 명령문(동일한 순간에 실행 및 종료)과 지정된 수의 주기 동안 지연되는 명령문이 있다.
# 신호
신호는 유일한 통신 수단이다. 값이 있는 신호와 값이 없는 신호가 있다. 이들은 입력, 출력 또는 로컬 신호로 추가 분류된다. 신호는 순간에 존재하거나 존재하지 않는 속성을 갖는다. 값이 있는 신호는 값도 포함한다. 신호는 프로그램 전체에 브로드캐스트되며, 이는 모든 프로세스가 신호를 읽거나 쓸 수 있음을 의미한다. 값이 있는 신호의 값은 신호가 없어도 어떤 순간에도 결정될 수 있다. 신호의 기본 상태는 없음이다. 신호는 emit 명령문을 사용하여 명시적으로 존재하도록 설정될 때까지 없어진 상태를 유지한다. 통신은 즉각적이며, 이는 한 주기에서 방출된 신호가 즉시 보이는 것을 의미한다. 동일한 주기에서 양방향으로 통신할 수 있다는 점에 유의해야 한다.
## 신호 일관성 규칙
* 각 신호는 한 주기에서 존재하거나 없을 뿐, 동시에 존재하거나 없지 않다. * 모든 기록자는 어떤 독자보다 먼저 실행된다. 따라서 present A else emit A end 는 오류가 있는 프로그램이다. 기록자 "emit A"는 독자 "present A"보다 먼저 실행되어야 하지만, 이 프로그램은 "present A"가 먼저 수행되어야 한다고 요구하기 때문이다.
# 언어 명령문

## 원시 에스테렐 명령문
순수 에스테렐에는 열한 가지 원시 명령문이 있다.citeseerx = 10.1.1.46.2076 {| class="wikitable" |- | `nothing` || 다른 효과 없이 즉시 종료한다. |- | `pause` || 현재 주기에서 다음 주기 재개를 위해 제어 흐름을 차단한다. |- | p `;` q || p가 종료될 때까지 실행하고, 같은 반응에서 q를 시작한다. |- | p `||` q || p와 q를 병렬로 실행한다. |- | `loop` p `end` || p 본문이 종료되는 즉시 다시 시작한다. 단일 반응 내에서 무한 루프를 피하기 위해 루프 본문을 통과하는 모든 경로에는 최소한 하나의 `pause` 명령문이 포함되어야 한다. |- | `signal` S `in` p `end` || 로컬 신호를 선언한다. |- | `emit` S || 현재 순간에 신호 S를 존재하게 한다. 신호는 방출되지 않으면 존재하지 않는다. |- | class="nowrap" | `present` S `then` p `else` q `end` || 현재 순간에 신호 S가 존재하면 즉시 p를 실행하고, 그렇지 않으면 q를 실행한다. |- | `suspend` p `when` S || S가 존재하는 순간에 본문의 실행을 중단한다. |- | `trap` T `in` p `end` || 레이블이 지정된 이스케이프 블록을 선언한다. |- | `exit` T || 가장 안쪽의 T-레이블 이스케이프 블록의 끝으로 점프한다. |}
## 파생 에스테렐 명령문
에스테렐에는 여러 파생 구성이 있다.citeseerx = 10.1.1.3.1177doi = 10.1016/0167-6423(92)90005-V {| class="wikitable" |- ! 파생 명령문 !! 확장 |- | `halt` || `loop pause end` |- | `sustain` s || `loop emit` s`; pause end` |- | `present` s `then` p `end` || `present` s `then` p `else nothing` `end` |- | `await` s || `trap T in loop pause; present` s `then exit T end end loop end` |- | `await immediate` s || `trap T in loop present` s `then exit T end; pause end loop end` |- | `suspend` p `when immediate` s || `suspend present` s `then pause end;` p `when` s |- | `abort` p `when (immediate)` s || `trap T in suspend` p `when (immediate)` s`; exit T || await (immediate)` s`; exit T; end` |- | `weak abort` p `when (immediate)` s || `trap T in` p`; exit T || await (immediate)` s`; exit T; end` |- | `loop` p `each` s || `loop abort` p `; halt when` s `end loop` |- | `every (immediate)` s `do` p `end every` || `await (immediate)` s`; loop` p `each` s |}
## 다른 에스테렐 명령문
전체 에스테렐 언어는 모듈 선언 및 인스턴스화, 변수, 외부 프로시저 호출, 값이 있는 신호를 위한 명령문도 포함한다.
## 예시 (ABRO)
다음 프로그램은 입력 A와 B가 모두 수신되는 즉시 출력 O를 내보낸다. 입력 R이 수신될 때마다 동작을 재설정한다. module ABRO: input A, B, R; output O; loop [ await A || await B ]; emit O each R end module
# 장단점

## 장점
* 시간 모델이 프로그래머에게 정확한 제어 제공 * 제어 시스템 지정에 편리한 동시성 * 완전한 결정론적 * 유한 상태 언어 ** 실행 시간 예측 가능 ** 공식적으로 검증하기 훨씬 쉬움 * 하드웨어 및 소프트웨어 모두에 구현 가능
## 단점
* 언어의 유한 상태 특성이 유연성을 제한함(그러나 선택된 응용 분야에는 표현력이 충분함) * 의미론적 문제 ** 인과 관계 위반을 피하기 어려운 경우가 많음 ** 일반적인 경우 컴파일하기 어렵지만, 간단한 정확성 기준은 존재함