객체 지향 프로그램을 유한 상태 머신으로 볼 수 있습니까?


13

이것은 철학적 / 기본적인 질문 일지 모르지만, 나는 그것을 명확히하고 싶습니다.

내가 이해하기에 유한 상태 머신은 시스템의 출력이 전류 입력뿐만 아니라 시스템의 현재 상태에 의존하는 시스템을 모델링하는 방법입니다. 또한, 이름에서 알 수 있듯이 유한 상태 머신은 각각의 상태와 동작으로 유한 N 개의 상태로 분할 될 수 있습니다.

이것이 정확하다면, 데이터와 함수 멤버를 가진 모든 단일 객체가 객체 지향 모델의 상태가되어 객체 지향 디자인을 유한 상태 머신으로 만들어서는 안됩니까?

이것이 객체 디자인에서 FSM의 해석이 아닌 경우 소프트웨어에서 FSM을 구현할 때 사람들이 정확히 무엇을 의미합니까? 뭔가 빠졌습니까?

감사


6
컴퓨터 + 소프트웨어는 메모리, 디스크 공간 및 기타 유형의 스토리지 (예 : 인터넷)를 제한하는 한 상태 머신입니다. 인터넷 또는 기타 외부 하드웨어와의 인터페이스가 허용되는 즉시 (무제한 저장 장치 포함) 이는 튜링 머신과 비슷해집니다. '완료 중'이라는 문구를 들어 본 적이 있습니까? 어쨌든 기능 프로그램과 obj 지향 프로그램은 모두 어셈블리 코드로 끝납니다. 나는 Haskel (순수한 기능 언어) / 모나드는 모르지만 튜링 머신과 그 사이에는 흥미로운 관계가 있어야합니다.
직업

잡스 포인트에 추가하면 어떤 형태의 비결정론도 상태 머신과 튜링 머신 모델을 모두 초과합니다. 인터넷에는 동기화되지 않은 여러 컴퓨터, 불완전한 연결을 통한 데이터 손실 등이 있습니다. 단일 코어 단순 컴퓨터 인 경우에도 사용자의 비 결정적 입력이 있지만 일반적으로 해당 문제를 무시하고 모든 입력은 미리 알려졌다.
Steve314

@ Steve314 : 공식적으로 결정 론적 오토마타는 단일 상태에 있습니다. 각 입력은 새로운 상태가됩니다. 비 결정적 오토마타의 경우 각 입력은 여러 상태로 이어질 수 있습니다. N 상태의 비 결정적 오토 마톤은 2 ^ N 상태의 결정적인 오토 마톤에 의해 에뮬레이트 될 수 있습니다.
케빈 클라인

@cline-이 경우에, 당신은 절대적으로 맞습니다. 그러나 내가 생각한 것은 실제 머신에서 발생하는 동시성 및 타이밍 변화의 유형이라고 생각합니다. , 데이터가 판독 헤드 아래에있는 정확한 시간 등. 이것은 모두 비결정론 적 유한 오토마타 모델에 적합하므로 물론 정확합니다. 그러나 상태의 수는 엄청나게 클 것입니다. 시스템 상태의 일부로 생각한 온도와 같은 지속적인 측정을했을 수도 있습니다 (결과뿐만 아니라).
Steve314

답변:


16

제한된 양의 스토리지가있는 머신에서 실행되는 단일 스레드 프로그램은 유한 상태 머신으로 모델링 될 수 있습니다. 유한 상태 머신의 특정 상태는 로컬 변수, 전역 변수, 힙 스토리지, 가상 메모리에서 현재 스왑 된 데이터, 관련 파일의 내용 등 모든 관련 스토리지의 특정 값을 나타냅니다. 다시 말해, 유한 상태 모델에는 아주 사소한 프로그램조차도 많은 상태 가있을 것 입니다.

프로그램의 유일한 상태가 32 비트 정수 유형의 단일 전역 변수 인 경우에도 적어도 2 ^ 32 (40 억 개 이상) 상태를 의미합니다. 그리고 그것은 프로그램 카운터와 콜 스택을 고려하지도 않습니다.

푸시 다운 오토 마톤 모델은 이런 종류의 것에 더 현실적입니다. 유한 오토 마톤과 비슷하지만 스택 개념이 내장되어 있습니다. 그러나 대부분의 프로그래밍 언어에서와 마찬가지로 실제로 콜 스택은 아닙니다.

거기의 위키 백과의 설명은 있지만, 공식적인 정의 부분에서 속도가 느려하지 않습니다.

푸시 다운 오토마타는 일반 계산을 모델링하는 데 사용됩니다. 튜링 머신 은 비슷 하지만 IIRC는 동일하지 않지만 계산 기능은 동일 합니다.

위의 오류를 지적한 kevin cline에게 감사드립니다. Wikipedia 도 지적했듯이 푸시 다운 오토마타는 유한 상태 머신보다 강력하지만 튜링 머신보다 덜 강력합니다.

나는 -이 뇌 방귀가 어디에서 왔는지 솔직히 모르겠어요 중요한 문법이 문맥 자유보다 더 강력한 그 상황을 알고, 그 상황에 맞는 문법은 간단한 푸시 다운 오토마타를 사용하여 구문 분석 할 수 없습니다. 심지어 문맥 상 명확한 문법을 ​​선형 시간으로 파싱하는 것이 가능하지만 일반적으로 (결정 론적) 푸시 다운 오토 마톤 이상이 필요하다는 것을 알고 있습니다. 푸시 다운 오토 마톤이 튜링 머신과 똑같다는 믿음을 가지게됩니다.

어쩌면 추가 기계가 추가 된 푸시 다운 오토 마톤을 생각하고 있었지만 푸시 다운 오토 마톤과 같은 유한 오토 마톤을 계산하는 것과 같습니다 (스택을 추가하고 악용하십시오).

푸시 다운 오토마타는 구문 분석에 중요합니다. 나는 그 맥락에서 그들에게 충분히 익숙하지만, 실제로 그것들을 컴퓨터 과학 계산 모델로 연구 한 적이 없기 때문에, 나는 이미 가지고있는 것보다 더 자세한 내용을 말할 수 없습니다.

단일 OOP 객체를 유한 상태 머신으로 모델링 할 수 있습니다. 머신의 상태는 모든 멤버 변수의 상태에 따라 결정됩니다. 일반적으로 메소드 호출 중 (비가 아닌) 사이의 유효한 상태 만 계산합니다. 다시 말하지만, 일반적으로 걱정해야 할 상태가 많이 있습니다. 이론적 인 모델로 사용할 수도 있지만 사소한 경우를 제외하고는 모든 상태를 열거하고 싶지는 않습니다.

그러나 유한 상태 머신을 사용하여 객체 상태의 일부 측면 을 모델링하는 것이 일반적 입니다. 일반적인 경우는 게임 개체에 대한 AI입니다.

이것은 또한 푸시 다운 오토 마톤 모델을 사용하여 파서를 정의 할 때 수행되는 작업입니다. 상태 모델에는 유한 상태 세트가 있지만 파서 상태의 일부만 모델링합니다. 추가 정보는 해당 상태와 함께 추가 변수에 저장됩니다. 이를 통해 예를 들어 4 십억 개의 정수형 문제가 해결됩니다. 이러한 모든 상태를 열거하지는 않고 정수 변수 만 포함하면됩니다. 어떤 의미에서는 여전히 푸시 다운 오토 마톤 상태의 일부이지만 실제로 다이어그램에 40 억 개의 상태 버블을 그리는 것보다 훨씬 관리하기 쉬운 접근 방식입니다.


1
"단일 OOP 객체를 유한 상태 머신으로 모델링 할 수 있습니다." 사실이지만 약합니다. "가능한"것은 아닙니다. 정의의 문제입니다. 프로그래밍 언어의 일은 FSM을 깔끔한 표기법으로 표현하는 것입니다. OOP는 모든 다양한 상태에 대해 더 간단한 표기법으로 FSM을 구현 한 것입니다.
S.Lott

1
@ S.Lott-그렇습니다. 그러나 대부분의 사람들은 OOP 객체가 적어도 대부분은 아니지만 FSM을 표현한다고 생각하지 않습니다. "state machine"이라는 이름을 사용한다는 것은 상태 디자인 패턴 또는 state-ID 멤버 변수와 같은 특정 구현을 사용하고 있음을 의미합니다. "상태 머신으로서의 모델링"은 종종 해당 클래스의 구현과는 별도로 사양 또는 설계 문서에 관한 내용을 의미합니다. 따라서 클래스를 유한 상태 모델로 모델링한다는 것은 주관적으로 클래스의 소스 코드를 제공하는 것 이외의 것을 의미합니다.
Steve314

"사람들은 생각하지 않습니다". 진실. 그리고 깊은 문제. 모든 프로그램은 상태 머신입니다. 그들은 많은 상태를 가지고 있습니다. 이것이 프로그래밍 언어에 대한 "Turing Complete"테스트에 필요한 것입니다. 매우 강력하고 절대적인 규칙입니다. "가능한"것을 제안하기보다는 "필요한"및 "충분한"과 비슷합니다.
S.Lott

1
-1 : 푸시 다운 오토마타는 튜링 머신만큼 강력하지 않습니다.
케빈 클라인

1
덕분에 - - 클라인 @kevin하고 무엇을 내가 한 생각 ! 그 비트를 치기 위해 편집되었습니다. 내가 공식적인 연구에 대해 말한 것에도 불구하고, 나는 그것보다 더 잘 알고 있었고, 그때보다 더 잘 알았어 야했다.
Steve314

5

문제는 유한 상태 머신이 "있는"것인지 "없는"것이 아닌가입니다. 유한 상태 기계는 무언가를 생각할 수 있다면 무언가를 이해하는 데 도움이 될 수있는 정신 모델입니다.

일반적으로 유한 상태 머신 모델은 정규 문법 또는 컴퓨터의 명령 시퀀서와 같이 적은 수의 상태의 항목에 적용됩니다.


1

귀하의 질문에 직접 대답하기 위해 : 거의 확실하지 않습니다. 람다 미적분학 및 / 또는 조합 논리가 기능이 낮은 프로그래밍 또는 튜링 머신이 평범한 오래된 명령 식 프로그래밍을하는 방식으로 OOP에 대한 공식적인 수학적 이론은없는 것으로 보입니다.

자세한 내용은 이 stackoverflow 질문 을 참조하십시오 .

내 생각에는 근본적인 수학적 이론이 없기 때문에 모든 사람들이 하나의 "객체"가 무엇인지 알지만, "객체"는 다른 사람과 똑같이 보는 사람이 아무도 없습니다.


0

아뇨, 실제로는 아닙니다. 유한 상태 머신은 일반적으로 현재 상태와 같은 하나의 데이터 만 기억합니다.

FSM의 일반적인 응용 프로그램은 렉싱 또는 파싱입니다. 예를 들어, 우리가 렉싱 (lexing)을 수행 할 때, 가능한 모든 입력에 대한 동작을 현재 상태와 입력 값으로 인코딩하는 것은 (일반적으로) 상당히 쉽습니다.

예를 들어, 숫자의 숫자를 읽는 NUMBER 상태 일 수 있습니다. 읽은 다음 문자가 숫자이면 NUMBER 상태를 유지합니다. 공백 또는 탭인 경우 숫자를 반환 한 다음 WHITE_SPACE 상태 또는 그 순서대로 진행합니다.

이제 전형적인 FSM (특히 소프트웨어로 구현 된 것)에서 기술적으로 FSM 자체와 혼합 된 FSM에 맞지 않는 비트와 조각으로 끝나는 것은 사실입니다. 예를 들어 숫자의 숫자를 읽을 때 종종 첫 번째 숫자의 위치를 ​​저장하므로 끝 부분에 도달하면 쉽게 숫자의 값을 계산할 수 있습니다.

FSM 자체에는 몇 가지 제한 사항이 있으며 계산 메커니즘이 없습니다. 예를 들어, "/ "를 사용 하여 주석을 시작하고 " /"를 사용하여 주석을 종료 한 언어를 고려하십시오 . 어휘 분석기는 아마도 '/ '토큰을 보았을 때 입력 한 COMMENT 상태를 가지고있을 것입니다 . 이 시점에서는 다른 "/ " 를 감지 하고 중첩 된 주석을 처리하고 있음을 인식 할 수 없습니다 (COMMENT2와 같은 다른 상태 추가 부족) . 오히려 주석 상태에서는 주석 상태 */를 떠나라고 말하고 다른 어떤 것도 주석 상태로 남겨 둡니다.

언급 한 바와 같이, 중첩 된 주석에 대해 COMMENT2 상태를 포함 할 수 있습니다 (COMMENT3 상태 등). 그러나 어느 시점에서 더 많은 상태를 추가하는 데 어려움을 겪을 수 있으며 주석을 허용하는 최대 중첩 깊이를 결정합니다. 다른 형태의 파서 (예 : 순수한 상태 머신은 아니지만 계산할 메모리가있는 것)를 사용하면 중첩 깊이를 직접 추적 할 수 있으므로 가까운 주석 토큰에 도달 할 때까지 주석 상태로 유지됩니다. 첫 번째 카운터의 균형을 맞추므로 카운터는 0으로 돌아가고 COMMENT 상태를 종료합니다.

그러나 내가 말했듯이 그런 카운터를 추가하면 더 이상 FSM이 아닙니다. 동시에, 그것은 이다 특히, 충분히 가까이 그냥 더 상태를 추가하여 카운터를 시뮬레이션 할 수 있음 - 아주 가까이 사실.

그러나 일반적인 경우에 누군가 소프트웨어에서 FSM을 구현하는 것에 대해 이야기 할 때는 "순수" 하게 유지합니다 . 특히, 소프트웨어는 현재 상태 및 입력 자체의 값에 따라 현재 입력에 반응합니다. 반응이 다른 많은 것에 의존한다면, 그들은 보통 그것을 상태 머신이라고 부르지 않을 것입니다 (적어도 그들이 말하는 것을 알고 있다면).


"현재 상태"에는 많은 정보가 포함될 수 있습니다. FSM은 계산할 각 숫자의 상태를 가짐으로써 사소하게 계산할 수 있습니다. 튜링 머신과 달리 유한하지만 여전히 완벽하게 계산할 수 있습니다. 더 나은 예가 필요할 것 같습니다.
S.Lott

휴대 전화의 소프트웨어는 많은 데이터를 기억하고 현재 상태에 따라 해석하는 매우 복잡한 상태 머신의 모음입니다.
Mawg는 모니카 복원

-2

허용 된 답변이 완전히 정확하다고 생각하지 않습니다.

Turing Complete 언어로 작성된 임의의 프로그램은 객체 지향적이든 아니든 유한 상태 머신으로 모델링 할 수 없습니다. Java, C ++ 또는 Smalltalk와 같은 거의 모든 최신 컴퓨터 언어는 Turing Complete입니다.

예를 들어, 유한 상태 머신은 변수에 n을 쓸 수 없기 때문에 한 오브젝트의 n 개의 인스턴스와 다른 오브젝트의 n 개의 인스턴스가있는 오브젝트의 시퀀스를 인식하기 위해 유한 상태 머신을 작성할 수 없습니다. 입력 만 읽고 상태로 전환 할 수 있습니다.


이 단지 포인트를 만들어 답변에 설명 된 반복은에 3 년 전 예를 들어 게시 이 한
모기
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.