오토마타 기반 프로그래밍
Automata-based programming프로그래밍 패러다임 |
---|
오토마타 기반 프로그래밍은 프로그램이나 그 일부가 유한 상태 기계(FSM)나 다른 (종종 더 복잡한) 형식 자동화의 모델로 생각되는 프로그래밍 패러다임이다(오토마타 이론 참조).때로는 잠재적으로 무한한 가능 상태의 집합이 도입되기도 하는데, 그러한 집합은 단순한 열거가 아니라 복잡한 구조를 가질 수 있다.
유한 상태 기계 기반 프로그래밍은 일반적으로 동일하지만, 공식적으로는 FSM이 유한 상태 기계를 의미하기 때문에 가능한 모든 변형을 포괄하지는 않으며, 오토마타 기반 프로그래밍이 반드시 엄격한 의미에서 FSM을 채용하는 것은 아니다.
오토마타 기반 프로그래밍의 주요 지표는 다음과 같다.
- 프로그램 실행 시간은 자동 단계까지 명확히 구분된다.각 단계는 하나의 진입점이 있는 코드 섹션(모든 단계에 대해 동일)의 실행이다.이 섹션은 필요하지 않지만 다른 상태에 따라 실행될 하위 섹션으로 나눌 수 있다.
- 자동 단계 사이의 통신은 명시적으로 명시된 자동 상태 변수를 통해서만 가능하다.어떤 두 단계 사이에서도 프로그램은 국소 변수의 값, 반환 주소, 현재 명령 포인터 등과 같은 상태의 암묵적 구성요소를 가질 수 없다.즉, 자동 단계로 진입하는 어떤 두 순간에서 취해지는 전체 프로그램의 상태는 자동 상태로 간주되는 변수의 값만 다를 수 있다.
오토마타 기반 코드의 전체 실행은 오토마톤 단계의 사이클이다.
오토마타 기반 프로그래밍 개념을 사용하는 또 다른 이유는 이 기법에서 프로그램에 대한 프로그래머의 사고 방식이 튜링 머신, 마르코프 알고리즘 등을 이용하여 수학 과제를 해결하는 데 사용되는 사고 방식과 매우 유사하기 때문이다.
예
과제
표준 입력 라인별로 텍스트를 읽고 각 줄의 첫 단어를 표준 출력에 쓰는 작업을 고려하십시오.먼저, 모든 선행 공백 문자를 생략한다.그리고 나서 우리는 첫 단어의 모든 문자를 인쇄한다.마지막으로, 우리는 뉴라인 캐릭터가 마주칠 때까지 모든 후행 캐릭터를 생략한다.스트림 초입에 없는 일련의 뉴라인 문자와 마주칠 때마다, 첫 번째 문자만 인쇄하고 나머지 문자는 생략한다. 그렇지 않으면, 우리는 모두 생략한다.다음으로 다음 줄에서 프로세스를 다시 시작한다.(무대와 관계없이) 파일 종료 조건에 직면하면 중지한다.
전통 프로그램
위의 작업을 수행하는 C의 전통적인 프로그램은 다음과 같이 보일 수 있다.
#include <ctype.h> #include <stdio.h> 인트로 본래의(공허하게 하다) { 인트로 c; 하다 { 하다 { c = 당기다(); } 하는 동안에 (이스페이스(c)); 하는 동안에 (!이스페이스(c) && c != EOF) { 설탕을 넣다(c); c = 당기다(); } 하는 동안에 (c != '\n' && c != EOF) { c = 당기다(); } 만일 (c == '\n') { 설탕을 넣다(c); } } 하는 동안에 (c != EOF); 돌아오다 0; }
예를 들어, 이 입력에 대해 위의 프로그램을 컴파일하고 실행하는 경우:
$cang program.c& ("\t\f\r "\n\n\t\f\r foo baz\n\n\n\t\v\f\r quux corge" ./a.out)
산출량:
foo qux
오토마타 기반 프로그램
절차적
유한 상태 기계라는 관점에서 생각해 보면 같은 과제를 해결할 수 있다.줄의 구문 분석은 선행 공백 문자 건너뛰기, 첫 번째 단어의 문자 인쇄, 후행 문자 건너뛰기의 세 가지 단계를 가지고 있다는 점에 유의하십시오.이러한 자동화를 주(州)라고 부르자.BEFORE
,INSIDE
그리고AFTER
. 오토마타 기반의 프로그램 버전은 다음과 같이 보일 수 있다.
#include <ctype.h> #include <stdio.h> 열거하다 주 {이전, 인사이드, AFT}; 인트로 본래의(공허하게 하다) { 인트로 c; 열거하다 주 s = 이전; 하는 동안에 ((c = 당기다()) != EOF) { 바꾸다 (s) { 케이스 이전: 만일 (!이스페이스(c)) { 설탕을 넣다(c); s = 인사이드; } 부숴뜨리다; 케이스 인사이드: 만일 (c == '\n') { 설탕을 넣다(c); s = 이전; } 다른 만일 (이스페이스(c)) { s = AFT; } 다른 { 설탕을 넣다(c); } 부숴뜨리다; 케이스 AFT: 만일 (c == '\n') { 설탕을 넣다(c); s = 이전; } 부숴뜨리다; } } 돌아오다 0; }
비록 그 프로그램이 이제 더 길어 보이지만, 그것은 적어도 하나의 중요한 이점을 가지고 있다: 오직 하나의 판독치(즉, 통화)가 있다.getchar
함수) 지시그 외에도 전통판이 가지고 있던 4개의 루프 대신 1개의 루프가 있을 뿐이다.의 몸.while
루프는 자동 스텝이고 루프 자체는 자동 스텝의 사이클이다.프로그램은 상태 다이어그램에 표시된 유한 상태 기계의 작업을 실행한다.
이 프로그램의 가장 중요한 특성은 자동 단계 코드 섹션이 명확하게 국산화되어 있다는 것이다.명시적 함수와 함께step
자동화 단계를 위해 이 프로그램은 다음과 같은 속성을 더 잘 보여 준다.
#include <ctype.h> #include <stdio.h> 열거하다 주 {이전, 인사이드, AFT}; 공허하게 하다 스텝을 밟다(열거하다 주* 경시하다 s, 인트로 경시하다 c) { 바꾸다 (*s) { 케이스 이전: 만일 (!이스페이스(c)) { 설탕을 넣다(c); *s = 인사이드; } 부숴뜨리다; 케이스 인사이드: 만일 (c == '\n') { 설탕을 넣다(c); *s = 이전; } 다른 만일 (이스페이스(c)) { *s = AFT; } 다른 { 설탕을 넣다(c); } 부숴뜨리다; 케이스 AFT: 만일 (c == '\n') { 설탕을 넣다(c); *s = 이전; } 부숴뜨리다; } } 인트로 본래의(공허하게 하다) { 인트로 c; 열거하다 주 s = 이전; 하는 동안에 ((c = 당기다()) != EOF) { 스텝을 밟다(&s, c); } 돌아오다 0; }
이 프로그램은 이제 오토마타 기반 코드의 기본 특성을 명확하게 보여준다.
- 자동 단계 실행 기간이 중복되지 않을 수 있다.
- 이전 단계에서 다음 단계로 전달된 유일한 정보는 명시적으로 지정된 자동 상태일 뿐이다.
유한 자동화는 행이 현재 상태를 나타내고, 열은 입력을 나타내며, 셀은 다음 상태와 수행할 동작을 나타내는 상태 변환 표로 정의할 수 있다.
입력 현재 상태 | 뉴라인 | 공백이 있는 | 타사의 |
---|---|---|---|
전에 | 전에 | 전에 | 안/인쇄 |
안쪽에 | 전/인쇄 전 | 다음에 | 안/인쇄 |
다음에 | 전/인쇄 전 | 다음에 | 다음에 |
일반적으로 오토마타 기반 프로그램은 자연스럽게 이 접근법을 사용할 수 있다.명시적 2차원 배열 포함transitions
국가별 표의 경우 프로그램은 다음과 같은 접근법을 사용한다.
#include <ctype.h> #include <stdio.h> 열거하다 주 {이전, 인사이드, AFT}; 공허하게 하다 끄떡없다(인트로 경시하다 c) {} 공허하게 하다 인쇄하다(인트로 경시하다 c) { 설탕을 넣다(c); } 구조상의 나뭇가지 { 열거하다 주 경시하다 next_state; 공허하게 하다 (*액션)(인트로); }; 구조상의 나뭇가지 경시하다 전환[3][3] = { // 새로운 줄에 다른 입력/상태 공백이 있음 {{이전, &끄떡없다}, {이전, &끄떡없다}, {인사이드, &인쇄하다}}, // 이전 {{이전, &인쇄하다}, {AFT, &끄떡없다}, {인사이드, &인쇄하다}}, // 내부 {{이전, &인쇄하다}, {AFT, &끄떡없다}, {AFT, &끄떡없다}} // 이후 }; 공허하게 하다 스텝을 밟다(열거하다 주* 경시하다 s, 인트로 경시하다 c) { 인트로 경시하다 배를 젓다 = (*s == 이전) ? 0 : (*s == 인사이드) ? 1 : 2; 인트로 경시하다 칼럼을 세우다 = (c == '\n') ? 0 : 이스페이스(c) ? 1 : 2; 구조상의 나뭇가지 경시하다* 경시하다 b = &전환[배를 젓다][칼럼을 세우다]; *s = b->next_state; b->액션(c); } 인트로 본래의(공허하게 하다) { 인트로 c; 열거하다 주 s = 이전; 하는 동안에 ((c = 당기다()) != EOF) { 스텝을 밟다(&s, c); } 돌아오다 0; }
객체 지향
구현 언어가 객체 지향 프로그래밍을 지원하는 경우, 프로그램의 간단한 리팩터링은 자동화를 객체로 캡슐화하여 구현 세부사항을 숨기는 것이다.객체 지향 스타일을 사용하는 C++의 프로그램은 다음과 같이 보일 수 있다.
#include <ctype.h> #include <stdio.h> 열거하다 주 {이전, 인사이드, AFT}; 구조상의 나뭇가지 { 열거하다 주 경시하다 next_state; 공허하게 하다 (*액션)(인트로); }; 계급 스테이트머신 { 공중의: 스테이트머신(); 공허하게 하다 사료차르(인트로); 보호받는: 정태의 공허하게 하다 끄떡없다(인트로); 정태의 공허하게 하다 인쇄하다(인트로); 사유의: 열거하다 주 _국가; 정태의 구조상의 나뭇가지 경시하다 _beakes[3][3]; }; 스테이트머신::스테이트머신(): _국가(이전) {} 공허하게 하다 스테이트머신::사료차르(인트로 경시하다 c) { 인트로 경시하다 배를 젓다 = (_국가 == 이전) ? 0 : (_국가 == 인사이드) ? 1 : 2; 인트로 경시하다 칼럼을 세우다 = (c == '\n') ? 0 : 이스페이스(c) ? 1 : 2; 구조상의 나뭇가지 경시하다* 경시하다 b = &_beakes[배를 젓다][칼럼을 세우다]; _국가 = b->next_state; b->액션(c); } 공허하게 하다 스테이트머신::끄떡없다(인트로 경시하다 c) {} 공허하게 하다 스테이트머신::인쇄하다(인트로 경시하다 c) { 설탕을 넣다(c); } 구조상의 나뭇가지 경시하다 스테이트머신::_beakes[3][3] = { // 새로운 줄에 다른 입력/상태 공백이 있음 {{이전, &끄떡없다}, {이전, &끄떡없다}, {인사이드, &인쇄하다}}, // 이전 {{이전, &인쇄하다}, {AFT, &끄떡없다}, {인사이드, &인쇄하다}}, // 내부 {{이전, &인쇄하다}, {AFT, &끄떡없다}, {AFT, &끄떡없다}} // 이후 }; 인트로 본래의() { 인트로 c; 스테이트머신 m; 하는 동안에 ((c = 당기다()) != EOF) { m.사료차르(c); } 돌아오다 0; }
참고. — 기사의 주제와 직접 관련이 없는 변경 사항을 최소화하기 위해, 입출력 getchar
그리고putchar
C의 표준 라이브러리의 기능이 사용되고 있다.
상태설계 패턴은 가상 함수 호출로 인해 큰 조건문이나 테이블 조회에 의존하지 않고 물체가 내부 상태에 따라 런타임에 자신의 행동을 변화시키는 방식이다.큰 조건문을 사용한 코드보다 주별 코드가 단일 블록으로 국부화되지 않고 서로 다른 객체에 분산돼 유지관리성이 향상되는 것이 주된 장점이다.상태 변환 테이블을 사용하는 코드보다 가상 기능 호출이 테이블 조회보다 효율적이고 상태 변환 기준이 표 형식보다 더 명확하며 상태 전환에 수반되는 작업을 추가하는 것이 더 쉽다는 것이 주요 장점이다.그러나 그것은 새로운 문제를 야기시킨다: 클래스 수는 다른 접근법보다 코드를 덜 압축하게 만든다.상태 설계 패턴을 사용하는 프로그램은 다음과 같이 보일 수 있다.
#include <ctype.h> #include <stdio.h> 계급 스테이트머신; 계급 주 { 공중의: 가상의 공허하게 하다 사료차르(스테이트머신*, 인트로) 경시하다 = 0; }; 계급 이전: 공중의 주 { 공중의: 정태의 주 경시하다* 인스턴스화하다(); 가상의 공허하게 하다 사료차르(스테이트머신*, 인트로) 경시하다 무효로 하다; 보호받는: 이전() = 체납; 사유의: 정태의 주 경시하다* _beakes; }; 계급 내부: 공중의 주 { 공중의: 정태의 주 경시하다* 인스턴스화하다(); 가상의 공허하게 하다 사료차르(스테이트머신*, 인트로) 경시하다 무효로 하다; 보호받는: 내부() = 체납; 사유의: 정태의 주 경시하다* _beakes; }; 계급 후: 공중의 주 { 공중의: 정태의 주 경시하다* 인스턴스화하다(); 가상의 공허하게 하다 사료차르(스테이트머신*, 인트로) 경시하다 무효로 하다; 보호받는: 후() = 체납; 사유의: 정태의 주 경시하다* _beakes; }; 계급 스테이트머신 { 공중의: 스테이트머신(); 공허하게 하다 사료차르(인트로); 보호받는: 공허하게 하다 setState(주 경시하다*); 사유의: 주 경시하다* _국가; 친구 계급 이전; 친구 계급 내부; 친구 계급 후; }; 주 경시하다* 이전::인스턴스화하다() { 만일 (!_beakes) { _beakes = 새로운 이전; } 돌아오다 _beakes; } 공허하게 하다 이전::사료차르(스테이트머신* 경시하다 m, 인트로 경시하다 c) 경시하다 { 만일 (!이스페이스(c)) { 설탕을 넣다(c); m->setState(내부::인스턴스화하다()); } } 주 경시하다* 이전::_beakes = 무효의; 주 경시하다* 내부::인스턴스화하다() { 만일 (!_beakes) { _beakes = 새로운 내부; } 돌아오다 _beakes; } 공허하게 하다 내부::사료차르(스테이트머신* 경시하다 m, 인트로 경시하다 c) 경시하다 { 만일 (c == '\n') { 설탕을 넣다(c); m->setState(이전::인스턴스화하다()); } 다른 만일 (이스페이스(c)) { m->setState(후::인스턴스화하다()); } 다른 { 설탕을 넣다(c); } } 주 경시하다* 내부::_beakes = 무효의; 주 경시하다* 후::인스턴스화하다() { 만일 (!_beakes) { _beakes = 새로운 후; } 돌아오다 _beakes; } 공허하게 하다 후::사료차르(스테이트머신* 경시하다 m, 인트로 경시하다 c) 경시하다 { 만일 (c == '\n') { 설탕을 넣다(c); m->setState(이전::인스턴스화하다()); } } 주 경시하다* 후::_beakes = 무효의; 스테이트머신::스테이트머신(): _국가(이전::인스턴스화하다()) {} 공허하게 하다 스테이트머신::사료차르(인트로 경시하다 c) { _국가->사료차르(이, c); } 공허하게 하다 스테이트머신::setState(주 경시하다* 경시하다 s) { _국가 = s; } 인트로 본래의() { 인트로 c; 스테이트머신 m; 하는 동안에 ((c = 당기다()) != EOF) { m.사료차르(c); } 돌아오다 0; }
자동화 및 자동화
오토마타 기반 프로그래밍은 실제로 자동화 분야에서 발견되는 프로그래밍 요구와 밀접하게 일치한다.
생산 주기는 일반적으로 다음과 같이 모델링된다.
- 입력 데이터(캡처로부터)에 따라 스텝을 밟는 일련의 단계
- 현재 단계에 따라 수행되는 일련의 작업
다양한 전용 프로그래밍 언어는 그러한 모델을 좀 더 또는 덜 정교한 방법으로 표현할 수 있다.
자동화 프로그램
위에 제시된 예는 다음과 같은 사이비 코드('set'은 논리 변수를 활성화하고, 'reset'은 논리 변수를 비활성화하며, ':'은 변수를 할당하고, '='는 동등성을 위한 검정에서와 같이 이 관점에 따라 표현될 수 있다.
newline: '\n' whitespace: ('\t', '\n', '\v', '\f', '\r', ' ') states: (before, inside, after) setState(c) { if before and (c != newline and c not in whitespace) then set inside if inside then (if c in whitespace then set after else if c = newline then set before) if after and c = newline then set before } doAction(c) { if before and (c!= newline 및 c 공백이 아닌 경우 newline을 쓰고 c가 공백이 아닌 경우 write(c)을 쓰고, after(c) = newline이면 write(c: readCaracter) = eOL { setState(c) doAction(c) }} 사이클을 쓴다.
한쪽의 사이클 진행을 표현하는 루틴의 분리와 다른 한쪽의 실제 작용(매칭 입출력)을 통해 보다 명확하고 단순한 코드가 가능하다.
이벤트
자동화 분야에서는 기계 자체에서 나오는 입력 데이터에 따라 단계별 단계가 달라진다.이것은 텍스트에서 문자를 읽음으로써 프로그램에 표현된다.실제로 그러한 데이터는 기계의 중요한 요소들의 위치, 속도, 온도 등에 대해 알려준다.
따라서 GUI 프로그래밍에서와 마찬가지로 기계 상태의 변화는 최종 상태에 도달할 때까지 상태에서 다른 상태로의 통로를 유발하는 이벤트로 간주될 수 있다.가능한 상태의 조합은 매우 다양한 이벤트를 발생시킬 수 있으며, 따라서 더 복잡한 생산 주기를 정의할 수 있다.결과적으로, 주기는 보통 단순한 선형 시퀀스가 되기에는 멀다.공통적으로 병렬 분기가 함께 실행되고 다른 이벤트에 따라 선택된 대체 분기가 있으며, 아래에 개략적으로 표시된다.
s:stage c:c 조건 s1 -c2 s2 ------------c31 -c32 s31 s32 -c41 -c42 ---------x4
적용들
오토마타 기반 프로그래밍은 어휘 및 구문 분석에 널리 사용된다.[1]
그 외에도, 오토마타(즉, 실행 프로세스를 자동 단계로 세분화하고, 명시적 자동화 상태를 통해 단계별로 정보를 전달하는 것)의 관점에서 생각하는 것이 병렬 프로세스나 스레드를 사용하는 유일한 대안으로 이벤트 주도 프로그래밍에 필요하다.
상태와 상태 기계의 개념은 종종 공식적인 규격 분야에서 사용된다.예를 들어 UML 기반 소프트웨어 아키텍처 개발은 상태 다이어그램을 사용하여 프로그램의 동작을 지정한다.또한 다양한 통신 프로토콜은 종종 명시적인 상태 개념(예: RFC793).
automata(단계와 상태)의 관점에서 생각하는 것 또한 일부 프로그래밍 언어의 의미론을 설명하는 데 사용될 수 있다.예를 들어 Refal 언어로 작성된 프로그램의 실행은 소위 추상 Refal 기계의 단계 순서에 따라 설명된다. 기계의 상태는 보기(변수 없는 임의 Refal 표현식)이다.
체계 언어의 연속은 단계와 상태의 관점에서 사고를 필요로 하지만 체계 자체는 자동화와 관련이 없다(재귀적이다).통화/cc 기능이 작동할 수 있게 하려면 실행 프로그램의 전체 상태를 파악할 수 있어야 하는데, 이는 국가에 암묵적인 부분이 없을 때만 가능하다.이와 같이 걸린 상태는 계속이라고 하는 바로 그 상태로서 (상대적으로 복잡하게) 자동화의 상태로 볼 수 있다.오토매틱 스텝은 이전 단계로부터 다음 계속을 추론하고 있으며, 실행 과정은 그러한 단계의 사이클이다.
알렉산더 올롱렌은 그의[2] 저서에서 형식적인 오토마타에 완전히 기반을 둔 의미론적 기술들을 프로그래밍하는 소위 비엔나 방법을 설명한다.
STAT 시스템[1]은 오토마타 기반 접근법을 사용하는 좋은 예다. 이 시스템은 다른 특징 외에도 순수 오토마타 지향적인 STATL이라는 내장 언어를 포함한다.
역사
오토마타 기반 기술은 공식 언어 분석과 같이 오토마타 이론에 기반한 알고리즘이 있는 영역에서 널리 사용되었다.[1]
이것에 관한 초기 논문들 중 하나는 1968년 존슨 외 에 의해 발표되었다.[3]
일반적인 기법으로서 오토마타 기반의 프로그래밍에 대한 최초의 언급 중 하나는 1963년 피터 나우르에 의해 논문에서 발견된다.[4]저자는 테크닉을 튜링머신 접근법이라고 부르지만 논문에는 실제 튜링머신이 제시되어 있지 않다. 대신 단계와 상태를 바탕으로 한 테크닉이 기술되어 있다.
필수 및 절차적 프로그래밍과의 비교
상태라는 개념은 오토마타 기반 프로그래밍의 전유물이 아니다.[5]일반적으로 말해서, 상태(또는 프로그램 상태)는 컴퓨터 프로그램을 실행하는 동안 실행 중에 변경될 수 있는 모든 정보의 조합으로 나타난다.예를 들어, 전통적인 명령적 프로그램의 상태는
이들은 명시적 부분(변수에 저장된 값 등)과 암묵적 부분(반환 주소 및 명령 포인터)으로 나눌 수 있다.
이렇게 말했듯이, 오토마타 기반의 프로그램은 국가의 암묵적인 부분이 최소화되는 긴급 프로그램의 특별한 사례로 간주될 수 있다.단계 코드 섹션에 진입하는 두 가지 뚜렷한 순간에 취한 전체 프로그램의 상태는 자동 상태에서만 다를 수 있다.이것은 프로그램의 분석을 단순화한다.
객체 지향 프로그래밍 관계
객체 지향 프로그래밍 이론에서 객체는 내부 상태를 가지고 있으며 메시지를 수신하고, 이에 대응하며, 메시지를 처리하는 동안 다른 객체에 메시지를 보내고 내부 상태를 변경할 수 있다고 한다.보다 실용적인 용어로, 사물의 방법을 부르는 것은 사물에 메시지를 보내는 것과 같은 것으로 간주된다.
따라서 한편으로 객체 지향 프로그래밍의 객체는 프라이빗 필드의 조합인 오토마타(또는 오토마타의 모델)로 간주할 수 있으며, 하나 이상의 방법이 스텝으로 간주된다.그러한 방법은 직접 또는 간접적으로 서로 또는 그 자체를 호출해서는 안 되며, 그렇지 않으면 그 물체가 자동화된 방식으로 구현되는 것으로 간주할 수 없다.
반면에, 물체는 자동모형의 구현에 좋다.오토마타 기반 접근법이 객체 지향 언어 내에서 사용될 때, 자동모형은 보통 클래스에 의해 구현되고, 상태는 클래스의 개인 분야로 표현되며, 단계는 하나의 방법으로 구현된다. 그러한 방법은 일반적으로 클래스에 대한 유일한 비정규적 공공 방법(시공자와 소멸자 제외)이다.다른 공개적인 방법들은 그 상태를 질의할 수 있지만 그것을 변경하지는 않는다.모든 보조 방법(특정 상태 핸들러 등)은 대개 클래스의 개인 부분 내에 숨겨진다.
참고 항목
- 셀룰러 오토매틱
- 비결정론적 프로그래밍
- 상태 패턴
- 오토마타 기반의 언어인 에스테렐
- 자바와 C++에 automata를 추가하는 도구인 Umple
참조
- ^ a b Aho, Alfred V.; Ullman, Jeffrey D. (1973). The theory of parsing, translation and compiling. Vol. 1. Englewood Cliffs, N. J.: Prentice-Hall. ISBN 0-13-914564-8.
- ^ Ollongren, Alexander (1974). Definition of programming languages by interpreting automata. London: Academic Press. ISBN 0-12-525750-3.
- ^ Johnson, W. L.; Porter, J. H.; Ackley, S. I.; Ross, D. T. (1968). "Automatic generation of efficient lexical processors using finite state techniques". Comm ACM. 11 (12): 805–813. doi:10.1145/364175.364185. S2CID 17253809.
- ^ Naur, Peter (September 1963). "The design of the GIER ALGOL compiler Part II". BIT Numerical Mathematics. 3 (3): 145–166. doi:10.1007/BF01939983. S2CID 189785656.
- ^ "Automata-based programming" (PDF). Scientific and Technical Journal of Information Technologies, Mechanics and Optics (53). 2008.
외부 링크
- J. V. 노블. "Finite State Machine in Forth » - 자동 데이터 기반 프로그래밍(Forth)
- Harel, David (1987). "Statecharts: A Visual Formalism for Complex Systems" (PDF). Sci. Comput. Programming. 8 (3): 231–274. doi:10.1016/0167-6423(87)90035-9.
- Harel, David; Drusinsky, D. (1989). "Using Statecharts for Hardware Description and Synthesis". IEEE Transactions on Computer-Aided Design of Integrated Circuits and Systems. 8 (7): 798–807. doi:10.1109/43.31537. S2CID 8754800.
- Polikarpova N. I., Shalyto A. A. Automata-based programming SPb.: Piter. 2009 (rus)
- ITMO 대학교 "프로그래밍 기술" 학과