문제

최근에 나는 하루 종일 직장의 일환으로 IBM Rhapsody를 배우고 UML에서 C ++로 코드를 생성하는 데 사용했습니다.

어제 C ++ 컴파일러에 상태 머신 지지대를 추가하는 것이 멋질 수도 있다는 것이 나에게 충격을 받았기 때문에 여기에 몇 가지 메모를 작성했습니다. http://ellcc.org/wiki/index.php/state_machines_and_active_classes

이 작업에 대한 동기는 다음과 같습니다.

  1. 멋진 아이디어처럼 보입니다.
  2. 컴파일러는 현재 Rhapsody/Normal C ++ 컴파일러보다 더 나은 시맨틱 점검 (더 나은 오류 확인)을 수행 할 수 있습니다.
  3. 컴파일러 자체가 상태 기계 구조를 이해할 때 사용할 수있는 많은 최적화 가능성이 있습니다.

나는 그것이 얼마나 잘 작동하는지 확인하기 위해 제안과 같은 것을 제외하고 문법을 확장하려고 노력할 수 있습니다.

제안에 대한 귀하의 의견은 무엇입니까? 읽을 수있는 것 같습니까? 가치있는 것 같습니까?


편집하다:

특정 라이브러리가 주 머신을 수행하도록 권장하는 답변에 감사하지만 제 질문은 아닙니다. 나는 내가 작성한 라이브러리와 코드를 모두 사용하여 많은 주 머신을 구현했습니다.

나는 실제로이 변화가 표준 C ++에 추가하기에 적합한 지 여부가 아니라 C ++와 같은 C ++에 대한 상태 머신 확장의 설계에 대한 아이디어, 비판 등을 찾고있었습니다. 내 도메인이 실시간 제어 응용 프로그램 인 도메인 별 확장자로 생각하십시오.

여기에 설명 된대로 컴파일러의 확장을 구현하기 시작했습니다. http://ellcc.org/wiki/index.php/state%5fmachines%5Fand%5Factive%5Fclasses

지금 까지이 개념은 제안에서 구현으로 많은 변화를 바꾸지 않아도되었지만 세부 사항에는 몇 가지 변화가 있었으며 문제의 의미론에 대한 이해를 정제하고 있습니다.

그러나 시간은 전체 개념에 어떤 가치가 있는지 알 수 있습니다. ;-)

도움이 되었습니까?

해결책

몇 가지 예외를 제외하고 C ++는 전통적으로 새로운 키워드가 아닌 클래스 라이브러리를 사용하여 확장되었습니다. 주 머신은 이러한 라이브러리를 사용하여 쉽게 구현할 수 있으므로 귀하의 제안에 많은 기회가 있다고 생각하지 않습니다.

제안에서 내가 보는 한 가지 문제는 다른 상태로 가기 위해 'goto'를 사용하는 것입니다. 상태 전환 내에서 내 코드에서 goto를 사용하려면 어떻게됩니까?

다른 팁

당신이 한 일을 개발하는 훌륭한 작업. 당신이 한 것과 같은 것은 아마도 가능하지만, 나는 그것이 C ++에 들어갈 것이라고 의심 스럽다. 언어 자체로 만드는 대부분의 변경 사항은 사람들이보다 유용하고 강력한 라이브러리를 쓸 수 있도록 포함됩니다.

여기에 상태 기계를 지원하는 도서관이 있습니다. 나는 그것을 시도하지 않았지만, 당신에게 관심이있을 수 있으며, 당신은 다른 사람들이 그것을 활용할 수 있도록 당신의 아이디어를 이와 같은 도서관과 결합 할 수 있습니다.

http://www.boost.org/doc/libs/1_34_1/libs/statechart/doc/index.html

또는, 당신이 제안한대로 자신의 확장을 개발할 수 있으며, 적어도 당신에게 유용 할 것입니다. Microsoft는 일부 확장 키워드를 구현하므로 자신만의 확장 버전의 C ++를 만들 수없는 이유가 없습니다.

새로운 아이디어를 계속 오십시오.

다른 스마트 개발자가 C- 유사 언어에 상태 머신 지원을 추가 한 방법을 살펴 봐야합니다. 언어 언어 참조. "상태"라는 섹션을 참조하십시오.

UnrealScript는 언어 수준에서 상태를 지원합니다. Unrealscript에서, 세계의 각 배우는 항상 하나의 주에 있습니다. 그 상태는 수행하고자하는 행동을 반영합니다. 예를 들어, 움직이는 브러시에는 "독립형"및 "범프 펜티 밍"과 같은 여러 상태가 있습니다. 전당포에는 "죽음", "공격"및 "방황"과 같은 여러 상태가 있습니다. UnrealScript에서는 특정 상태에 존재하는 기능과 코드를 작성할 수 있습니다. 이 기능은 배우가 해당 상태에있을 때만 호출됩니다.

흥미로운 아이디어이지만, 공식적으로 C ++를 확장하는 것보다 스테이트 머신에 대한 도메인 별 언어를 만드는 더 나은 행운이 있다고 생각합니다. C ++는 매우 일반적인 목적 프로그래밍 언어로 설계되었습니다. Boost는 C ++가 라이브러리를 사용하여 대부분의 기능을 멋지게 구현할 수있을 정도로 유연하다는 것을 입증했다고 생각합니다. 또한 2009 년 현재 표준 C ++가 여전히 내장 된 스레딩 지원이없는 정도까지 매우 느리게 진화합니다 (0x로 계획되어 있습니다). 따라서위원회가 한동안이 추가를 고려하지는 않을 것입니다.

솔루션은 템플릿 또는 전처리 매크로 기반 솔루션의 장점이있는 것처럼 보이지 않습니다.

또한 더 나은 시맨틱 점검을 제공 할 수있는 방법도 확실하지 않습니다. 그리고 많은 유용한 코드 최적화를 적용 할 수 있다고 의심합니다.

그러나 더 나은 최적화 및 시맨틱 점검을 허용하려면 "goto"를 새로운 키워드로 바꿔야합니다 (예 : __change__ newState), 그리고 주 변경에 대한 Goto를 허용하지 않습니다! 평소와 같이 로컬 점프를 위해 Goto를 허용하십시오.

그런 다음 컴파일러는 가능한 전환 목록을 추출 할 수 있습니다.

제안서를 읽고 다음 의견이 있습니다.

  1. 실제로 실제 상태 머신을 선언하고 정의 할 키워드가 없습니다! 단일 글로벌 주 머신 (따라서 단일 글로벌 상태)을 가정하십니까? 그것은 어떻게 관련이 있습니까? __active__ ?

  2. C ++에서 가장 가까운 비슷한 구성은 실제로 열거입니다. 왜 확장하지 않습니까?

  3. 정의 된 이벤트와 상태 사이에는 약간의 연결이있는 것 같습니다. 그러나 그것이 어떻게 구현되었는지 알지 못합니다.

  4. 스레드와 타이머가 전혀 필요합니까? 상태 기계의 일부 사용 사례는 이들로부터 혜택을받을 수 있지만 좋은 제안은 이러한 분리를 유지해야합니다. 가장 중요한 것은 표준 C ++ 0X 스레드를 사용할 수 있어야합니다.

개인적으로, 나는 열거적 인 구문을 확장 할 것이다 :

enum Foo {
  red, blue, green; /* Standard C++ so far - defines states. State list ends with a ; not a , */ 
  Foo() { *this = red; } // Reuse ctor syntax, instead of __initial__
  ~Foo() { } // reuse dtor syntax, instead of __onexit__

  void Bar() {/**/} // Defines an event, no return value. Doesn't need keyword __event__
};

자연스럽게 이벤트를 헤더로 선언하고 .cpp 파일로 정의 할 수 있습니다. 여기서 구문을 제안 할 필요조차 없습니다. 모든 C ++ 프로그래머는이 시점에서이를 추측 할 수 있습니다. 결합 된 상태에 대해 약간의 상속 구문을 추가하십시오.

enum DrawingObject : public Shape, public Color { /** } // allows (red && circle)

그리고 당신은 이미 친숙한 구문을 재사용함으로써 새로운 키워드가 없으면 제안이있는 시점에 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top