CAL 배우 언어
CAL Actor Language![]() | 이 글에는 여러 가지 문제가 있다. 이 문제를 개선하거나 대화 페이지에서 토의하십시오. (이러한 템플릿 메시지를 제거하는 방법 및 시기 알아보기)
|
패러다임 | 데이터 흐름 |
---|---|
첫 등장 | 2001 |
플랫폼 | 플랫폼 독립형 |
파일 이름 확장명 | .cal, .xdf |
주요 구현 | |
개방형 RVC-CAL 컴파일러, OpenDF 프레임워크 |
CAL(Cal Actor Language)은 데이터 객체(토큰)의 입력 스트림을 출력 스트림으로 변환하는 상태 저장 연산자인 쓰기(데이터 흐름) 행위자를 위한 고도의 프로그래밍 언어다[1]. CAL은 싱글 코어 프로세서, 멀티코어 프로세서, 프로그램 가능한 하드웨어를 포함한 다양한 타겟 플랫폼으로 컴파일되었다. 비디오 및 처리, 압축 및 암호화를 포함한 여러 응용 분야에서 사용되어 왔다. MPEG Regorable Video Coding(RVC)[2] 작업 그룹은 표준화 노력의 일환으로 CAL을 채택했다.
역사와 소개
CAL 배우 언어는 2001년 버클리 캘리포니아 대학교의 프톨레마이오스 II 프로젝트의 일환으로 개발되었다. CAL은 멀티미디어 처리, 제어 시스템, 네트워크 처리 등과 같은 다양한 응용 분야에 적합한 데이터 흐름 언어다.
데이터 흐름을 선택하는 또 다른 일반적인 이유는 목표는 순차 프로그래밍 언어를 사용하는 것이 어렵거나 불가능할 수 있는 효율적인 병렬 구현이기 때문이다. 순차 언어는 일반적으로 병렬화하기가 어렵기로 악명 높기 때문에 효율적인 병렬 구현은 대개 사용자의 중요한 지침을 필요로 한다. CAL 데이터 흐름 프로그램은 필요한 만큼 또는 거의 병렬을 지정할 수 있는 간단하고 이해 가능하며 강력한 추상화를 제공하여 도구가 계산의 동시 구조를 활용하는 정교한 구현을 만들 수 있도록 한다.
데이터 흐름에서 프로그래밍할 때 프로그래머는 일반적으로 일반적인 순차 프로그램과는 다른 계산 시스템에 대한 동시 설명을 구성한다. 데이터 흐름 프로그래머는 알고리즘의 단계적 실행에 관심을 가지기보다는 행위자라 불리는 비동기적으로 의사소통하는 실체 체계를 구축한다. 프로그래밍 작업의 상당 부분은 배우들에게 문제의 좋은 인수인계를 찾고, 배우들 간의 적절한 의사소통 패턴을 설계하는 데 초점을 맞추고 있다.
CAL 기능
배우의 구조
배우들은 발사라고 불리는 일련의 단계들로 연산을 한다. 각 단계:
- 1. 행위자는 입력 포트에서 토큰을 소비할 수 있다.
- 2. 내부 상태를 변경할 수 있다.
- 3. 출력 포트에서 토큰을 생성할 수 있다.
결과적으로, 행위자를 기술하는 것은 외부와의 인터페이스, 포트, 내부 상태의 구조뿐만 아니라 수행할 수 있는 단계, 이러한 단계들이 하는 것(토큰 생산과 소비, 행위자 상태의 업데이트 측면에서), 행위자가 다음에 수행할 단계를 선택하는 방법을 설명하는 것을 포함한다. 이 절에서는 이러한 문제를 다루는 CAL 언어의 일부 구조에 대해 논의한다. 액션은 배우가 스텝을 밟는 동안 일어나는 일들을 묘사한다. 사실 한 걸음은 행동의 실행으로 이루어진다고 하는 것이 정확하다. 배우가 한 걸음 내딛을 때 입력 토큰을 소비하고 출력 토큰을 생산할 수 있다는 점을 상기하십시오.
따라서 입력 패턴은 다음을 수행한다.
- 그들은 액션이 실행될 때 사용될 토큰의 수(각 포트당)를 정의한다.
- 그들은 행동 발포에 의해 소비되는 토큰이 행동 내에서 언급될 변수 기호를 선언한다.
- 그들은 그 행동에 대한 발사 조건, 즉 그 행동이 발사될 수 있도록 충족되어야 하는 조건을 정의한다.
동작의 출력 측면이 조금 더 간단하며, 출력 표현식은 동작의 각 발화별로 각 출력 포트에서 생성될 출력 토큰의 수와 값을 간단히 정의한다. 동작이 입력 포트가 있는 만큼의 입력 패턴을 제공하거나 출력 포트가 있는 만큼 출력 식을 제공하는 경우 입력 패턴 또는 출력 식이 적용되는 포트의 명시적인 이름을 생략할 수 있다. 이 경우 패턴이나 표현식은 포트 선언에 대해 위치별로 일치한다.
배우에 대한 한 가지 사고방식은 데이터 스트림에 대한 운영자로서 토큰의 시퀀스가 입력 포트에 입력되고 토큰 시퀀스는 출력 포트에 데이터를 남기는 것이다. 배우의 운용을 논할 때, 하천에 관한 연산자로 보는 것이 유용할 때가 많다. 배우들은 매개 변수를 가질 수 있다. 그들은 배우를 실행하는 동안 상수 역할을 하며, 배우가 배우 네트워크의 일부로 인스턴스화되었을 때 구체적인 가치를 부여받는다. 배우 매개변수의 주요 목적은 프로그래머가 코드를 많이 복제할 필요 없이 관련 배우의 가족을 특정할 수 있도록 하는 것이다.
비결정론
비결정론적 행위자는 동일한 입력 시퀀스에 대해 1회 이상의 실행과 2회 이상의 가능한 출력을 허용하는 행위다. 비결정론은 적절히 사용하면 매우 강력할 수 있지만, 또한 매우 골치 아픈 오류의 원인이 되기도 한다. 특히 우려되는 점은 비결정론이 배우에게 무심코 소개될 수 있다는 점이다. 즉, 저자는 비결정론이 배우를 결정론적이라고 생각한다. CAL 언어의 주요 설계 목표 중 하나는 비결정론적 행위자에 대한 설명을 허용하는 동시에 도구로 비결정론의 가능한 근원을 식별하여 사용자에게 경고하는 것이었다.
NDMerge와 같은 비결정론적 행위자의 주요 결과는 실제 실행 중에 그 결과물의 출력이 입력 시기에 따라 달라질 수 있다는 것이다. 두 입력 대기열이 모두 비어 있고 NDMerge가 입력을 기다리고 있는 경우 다음 토큰이 도착하는 모든 입력이 출력 옆에 복사된 입력이 될 수 있다. 결과적으로, 행위자 네트워크의 활동 스케줄링 또는 NDMerge와 같은 행위자에게 먹이를 주는 행위자의 상대적 속도가 시스템의 산출물에 영향을 미칠 수 있다. 이것은 때로는 바람직하게, 때로는 그렇지 않을 수도 있다. 어떤 경우든 그것은 알아둘 필요가 있는 재산이다.
토큰 도착의 정확한 타이밍에 따라 행위자를 의존하게 하는 종류의 비결정론을 살펴보는 한 가지 방법은 그러한 행위자를 우리가 스트림의 운영자로 볼 때, 그러한 관점은 실행의 시간적 속성에서 추상화되기 때문에, 따라서 의도적으로 사용되는 정보를 제거하기 때문에, 그러한 행위자는 단지 비결정론적으로만 보인다는 것이다. 어떤 행동이 발포되는지를 결정하기 위해서. CAL 언어의 관점에서는 이것이 전적으로 정확한 것은 아니지만, 그렇다 하더라도 토큰의 타이밍과 배우 구현에 관한 모든 것을 알고 있다고 해도 결정론적이지 않을 비결정론적 행위자(예: 다음과 같은 것)를 쓰기 쉽다.
가드 액션
행동의 가드 조항은 행동이 불붙기 쉽도록 모든 것이 사실이어야 하는 많은 표현을 포함하고 있다. 첫 번째 조치가 발화 가능하려면 수신 토큰이 0보다 크거나 같아야 하며, 이 경우 토큰은 출력 P로 전송된다. 그렇지 않으면 그 행동은 발포할 수 없다. 반대로, 두 번째 액션이 불붙기 쉬우려면 토큰이 0보다 작아야 하며, 이 경우 토큰이 출력 N으로 전송된다. 이 배우의 연주는 다음과 같이 보일 수 있다. 배우 한 명이 영점 토큰을 마주치게 되면, 그 어떤 행동도 그것에 발포할 수 없을 것이기 때문에 곤경에 처할 수 있다.
어떤 입력에 의해 종료되는 행위자를 쓰는 것은 불법이 아니며, 사실 일부 시스템에서는 그러한 행위자를 몇 명 두는 것이 중요할 수 있다. 하지만 그것은 우리가 알아야 할 함정이야. 둘째로, 가드 조건 또한 완전하다는 것 외에 분리된다.
마지막으로, 경비 조건이 들어오는 토큰을 실제로 소비하지 않고 "피크"할 수 있다는 점에 유의하십시오. 즉, 경비원이 거짓이거나 다른 이유로 인해 조치를 취하지 않은 경우, 토큰이 다른 작업에 의해 소비되지 않은 경우, 해당 토큰은 그대로 유지되며, 다음 발포에도 사용할 수 있게 될 것이다. (또는 그 토큰은 다음과 같이 영원히 그곳에 남아 있을 것이다. 배우가 죽었기 때문에 절대로 제거되지 않는 스플릿데드 앞의 제로 토큰의 경우.)
아래의 선택 배우는 보호 조치의 사용의 또 다른 예다. 두 개의 스트림(A와 B 입력 포트에 도착하는 스트림)을 병합한다는 점에서 NDMerge 행위자와 유사하다. 그러나 S 입력 포트에 도착하는 토큰의 (부울) 값에 따라 그렇게 한다.
국가를 가진 배우들
지금까지 모든 배우에서, 어떤 액션 연기도 같은 배우의 후속 액션 연기에 어떤 식으로든 영향을 주지 않을 것이다. 상태 변수를 사용하면 동일한 행위자의 동일하거나 다른 액션을 후속적으로 실행하기 위한 정보를 남길 수 있다. 이 행위자가 쓰여지는 방식, 다음 입력 토큰의 선택과 출력물에 대한 토큰의 실제 복사는 하나의 원자 단계다.
Select와 IterSelect는 거의 동일하지만 완전히 동일하지는 않다는 점에 유의하십시오. 우선, IterSelect는 동일한 수의 토큰을 처리하기 위해 두 배의 단계를 만든다. 둘째로, A 또는 B에서 일치하는 데이터 토큰을 사용할 수 있는지에 관계없이 S 입력 토큰을 실제로 읽고 소비한다.
스케줄
이전 섹션의 IterSelect 행위자는 조치 선택을 제어하기 위한 상태 사용을 설명했다. 이것은 실무에서 극히 흔한 일이고, CAL 언어는 일정의 형태로 이러한 목적을 위한 특별한 구문을 제공한다. 개념적으로, 사람들은 스케줄이 특정한 국가 변수 사용 패턴을 코드화하는 것으로 생각할 수 있다. 스케줄은 표현성 측면에서 언어에 어떤 것도 추가하지 않는다. 일람표를 사용하는 이유는 두 가지다.
- 일반적으로 상태 변수와 많은 가드 및 할당을 사용하는 것보다 사용하기 쉽고 오류가 덜 발생한다.
- 도구는 일정표에 인코딩된 정보를 더 쉽게 사용할 수 있으므로, 보다 효율적인 코드를 만들거나 구현과 설계에 도움이 되는 다른 분석을 수행하는 데 도움이 될 수 있는 행위자의 규칙성을 인식한다.
각 상태 전환은 원래 상태, 동작 태그 목록, 그리고 다음 상태의 세 부분으로 구성된다. 한 가지 주목할 점은 조치 횟수가 증가했다는 점이다. 원래의 세 가지 대신, 일정이 포함된 새로운 버전은 네 가지 조치를 가지고 있다. 그 이유는 토큰 읽기 상태의 값에 따라 값 1 또는 2가 할당되는 원본과 같이 작업이 더 이상 후속 상태를 직접 할당할 수 없기 때문이다. 스케줄이 있는 버전에서는 상태 수정이 상태 기계의 구조에 내포되어 있으며, 어떤 조치가 발화하느냐에 따라 발생한다. 이에 따라 토큰 값을 확인하는 조건이 액션의 본문 내에서 readT와 readF로 태그가 지정된 두 액션의 가드로 이동했다.
우선순위
입력 포트 중 하나에 입력만 하면 모든 것이 모호하지 않다. 그러나, NDMerge와 마찬가지로, 양쪽 입력 포트에서 입력을 사용할 수 있는 즉시, 두 가지 동작 중 하나를 실행할 수 있으며, 그 행위자 사양에는 다른 동작보다 하나를 선택하는 경향이 있는 것이 없다.
지금까지 우리가 이것을 하도록 허락한 언어구조는 없다. 언어의 기존 요소(국가 변수, 경비 및 과제)로 축소될 수 있기 때문에 통사설 설탕으로 간주될 수 있는 이 일정의 경우와는 달리, 이 상황은 사실 실제적인 확장 즉 행동 우선 순위를 필요로 한다. 기본적인 생각은 그들의 사격 우선 순위에 관한 행동과 관련된 많은 불평등을 추가하는 것이다.
일정의 경우와 마찬가지로, 우리는 행동 태그를 사용하여 나중에 언급하고 싶은 행동을 식별한다. 즉, 이번에는 우선순위 불평등 내에서. 우선 순위 블록은 태그가 지정된 구성과 태그가 지정된 하나의 프로세스를 연관시켜 전자의 우선 순위를 후자의 우선 순위에 부여하는 그러한 불평등을 하나만 포함한다. 물론, 이 버전조차도 여전히 타이밍에 매우 의존적이다. 이 경우, 그것은 문제가 될 필요가 없으며, 사실 이 배우가 그 기능을 수행하기 위한 요건일 것이다. 그러나 일반적으로, 특히 앞의 예에서와 같이 사용했을 때, 올바른 결과를 얻기 위해서는 우선 순위를 잘 이해해야 한다는 것을 이해하는 것이 중요하다. 특히 네트워크 내의 통신 시기에 관한 정보가 모호할 때는, 그것을 강력한 이행 지침으로 생각하는 것이 최선일 것이다.
문장과 표현
앞 장에서는 주로 배우별 개념, 즉 토큰 입력과 출력, 액션, 액션 선택 제어 등과 관련된 CAL의 구성들에 초점을 맞췄다. 이 절에서는 CAL의 "보행성" 부분, 데이터 객체 및 표현 알고리즘을 조작하는 데 사용되는 문장과 표현(순차적)에 대해 논의한다. 언어의 이 부분은 많은 절차적 프로그래밍 언어(C, Pascal, Java, Ada 등)에서 찾아볼 수 있는 것과 유사하므로 CAL에서 약간 다를 수 있는 분야에 초점을 맞추겠다.
표현.
CAL은 C와 같은 언어와 달리 문장과 표현을 강하게 구별한다. 그들은 매우 뚜렷한 역할, 매우 뚜렷한 의미를 가지고 있으며, 결코 서로 교환하여 사용할 수 없다. CAL의 표현식은 값을 계산하는 유일한 목적을 가진 코드 조각이다. 우리는 또한 표현에는 가치가 있다고 말하거나, 또는 그 가치를 평가한다고 말한다. 대부분의 식에서, 그들이 평가하기 위해 평가하는 값은 식이 평가되는 시점에 하나 이상의 변수의 값에 따라 달라진다. 시간이 지남에 따라 변수 값이 변할 수 있기 때문에 동일한 식이 다른 시점에서 평가될 때 다른 값을 가질 수 있다.
원자식
아마도 가장 근본적인 표현은 상수일 것이다. 또 다른 기본 표현식 그룹은 변수 참조다. 구문론적으로 변수는 문자와 숫자의 순서다. 표현의 한 가지 중요한 특성은 변수를 변경하지 않도록 보장된다는 것이다. 즉, 표현 내에서 동일한 변수에 대한 다중 참조는 항상 동일한 결과를 산출할 것이다.
단순 복합 표현식
CAL은 두 가지 종류의 연산자를 제공하여 단항과 2진법의 식을 만든다. CAL에서 단항 연산자는 항상 접두사 연산자로, 즉 단일 연산자 앞에 나타난다. 이항 연산자는 두 피연산자 사이에서 발생한다.
진술들
어떤 면에서 CAL의 문장은 표현과 정반대일 뿐, "반환 값"은 없지만 변수의 값을 변경할 수 있다. 실제로 변수의 값을 바꾸는 것이 문장의 전체 지점이다. 진술은 엄격한 순차적 순서로 실행되며, 달리 명시되지 않는 한 진술의 실행은 프로그램 텍스트에 나타나는 순서로 진행되며, 진술에 의해 생성되는 모든 변수 변경이 후속 진술의 실행에 영향을 미칠 수 있음을 의미한다.
제어 흐름
대부분의 다른 프로그래밍 언어에서와 같이, 프로그램 내의 문들이 실행되는 순서를 제어하는 구조들이 있다. '예측 키워드'를 직접적으로 따르는 이 루프의 부분은 목록 포괄성에 있는 것과 매우 유사한 발전기이다.
액션
- 입력 패턴: 변수 선언
- 가드: 활성화 조건 지정
- 출력 식: 출력 토큰 계산
- 본문: 배우 상태 수정
서포트 공구
오픈DF 프레임워크
![]() | 이 구간은 비어 있다. 추가하면 도움이 된다. (2013년 2월) |
RVC-CAL 컴파일러 열기
![]() |