Pergunta

Ultimamente como parte do meu trabalho do dia Fui aprendendo IBM Rhapsody e usá-lo para gerar código em C ++ a partir da UML.

Ontem me ocorreu que poderia ser legal para pensar sobre a adição de suporte máquina de estado ao meu compilador C ++, então eu anotei algumas notas aqui: http://ellcc.org/wiki/index.php/State_machines_and_Active_Classes

As minhas motivações para fazer isso são:

  1. Parece uma boa idéia.
  2. O compilador poderia fazer muito melhor semântica verificação (com uma melhor verificação de erros) do que o compilador atual Rhapsody / C ++ normais.
  3. Há muitas possibilidades de otimização disponível quando o compilador em si compreende a estrutura de máquina de estado.

I podem tentar estender a minha gramática para, exceto algo como a proposta para ver quão bem ele funciona.

Qual é a sua opinião sobre a proposta? Parece legível? Parece que vale a pena?


Edit:

Obrigado pelas respostas recomendando bibliotecas específicas para fazer máquinas de estado, mas que não era a minha pergunta. Eu tenho implementado muitas máquinas de estado usando ambas as bibliotecas e código que tenho escrito.

Eu estava realmente à procura de ideias, críticas, etc. sobre o projeto de uma extensão de máquina de estado para um C ++ - como a linguagem, não se esta mudança seria adequado para além de C ++ padrão. Pense nisso como uma extensão específica de domínio, onde o meu meu domínio é aplicações de controle em tempo real.

Eu comecei a implementação da extensão no meu compilador como descrito aqui: http://ellcc.org/wiki/index.php/State%5Fmachines%5Fand%5FActive%5FClasses

Até agora, o conceito não teve que mudar muito indo de proposta de implementação, mas tem havido algumas mudanças em detalhes e eu estou aprimorando minha compreensão da semântica do problema.

O tempo dirá se todo o conceito tem qualquer valor, no entanto. ; -)

Foi útil?

Solução

Com poucas exceções, C ++ tem sido tradicionalmente estendido usando bibliotecas de classe, e não novas palavras-chave. máquinas de estado pode ser facilmente implementado usando tais bibliotecas, então eu não acho que sua proposta tem muita chance.

Um problema que vejo em sua proposta é o uso de 'Goto' para ir para outro estado. O que acontece se eu quiser usar goto no meu próprio código dentro de um estado de transição?

Outras dicas

Excelente trabalho a desenvolver o que você fez. Algo como você fez, provavelmente, é possível, mas tenho dúvidas que ele nunca iria entrar no C ++. A maioria das mudanças que tornam para a língua em si são incluídos apenas para permitir que as pessoas a escrever bibliotecas mais úteis e poderosas.

Há uma biblioteca aqui que fornece suporte para máquinas de estado. Eu não tentei, mas poderia interessá-lo, e você pode ser capaz de combinar suas idéias com uma biblioteca como esta para permitir que outras pessoas para fazer uso dele.

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

Ou, você pode desenvolver seu próprio ramal como você sugere, e seria pelo menos ser útil para você. Microsoft implementar algumas palavras-chave de extensão, por isso não há razão para que você não pode criar sua própria versão estendida do C ++.

Mantenha as novas idéias que vem.

Você deve dar uma olhada em apoio máquina do Estado como outro desenvolvedor inteligente adicionada a um C-como idioma: UnrealScript Language Reference . Consulte a seção denominada "Estados".

UnrealScript suporta estados no nível de linguagem. Em UnrealScript, cada ator do mundo está sempre em um e apenas um estado. Seu estado reflete a ação que quer executar. Para exemplo, escovas que se deslocam têm vários estados como "StandOpenTimed" e "BumpOpenTimed". Os peões têm vários estados como "Morrer", "Atacar", e "errante". Em UnrealScript, você pode escrever funções e código que existir num estado em particular. Estes funções só são chamados quando o ator é nesse estado

É uma idéia interessante, mas eu acho que você realmente ter melhor sorte criando sua própria linguagem específica de domínio para máquinas de estado de estender oficialmente C ++. C ++ é concebido como uma linguagem de programação de propósito geral muito. Acho impulso provou que C ++ é suficiente flexível que a maioria dos recursos pode ser implementada muito bem com bibliotecas. Ele também evolui muito lentamente, na medida em que padrão C ++ ainda nem sequer têm embutido enfiando apoio a partir de 2009, (que é planejado com 0x). Portanto, é improvável que o comitê iria considerar esta adição por algum tempo.

A sua solução não se parece com ele tem quaisquer vantagens para a template- ou-macro-base pré-processador solução.

Eu também não estou certo, como você pode fornecer verificação melhor semântica. E duvido que você pode aplicar muitas otimizações de código útil.

No entanto, para permitir melhores otimizações e verificação semântica, você também deve substituir "goto" com uma nova palavra-chave (por exemplo __change__ newState) e Goto disallow para mudanças de estado! Permitir Goto para saltos locais como de costume.

Em seguida, o compilador pode extrair uma lista de possíveis transições.

Leia sua proposta, tem os seguintes comentários:

  1. não há realmente nenhuma palavra-chave para declarar e definir uma máquina de estado real! Você assumir uma única máquina de estado global (e, portanto, um único estado global)? Como é que se relacionam com __active__?

  2. A construo mais aproximados em C ++ é, na verdade, o enum. Por que não estendê-lo?

  3. Parece haver alguma conexão entre os eventos e estados definidos, mas eu não consigo ver como ele é implementado.

  4. Por que fios e temporizadores necessária a todos? Alguns casos de uso de máquinas de estado podem se beneficiar deles, mas uma proposta boa deve mantê-los separados. Mais importante isso deve permitir o uso de padrão C ++ 0x threads.

Pessoalmente, gostaria de estender a sintaxe enum:

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__
};

Segue-se naturalmente que agora você pode declarar seus eventos em um cabeçalho, e defini-las em um arquivo .cpp. Eu nem sequer precisa para sugerir a sintaxe aqui, qualquer C ++ programador pode acho que neste ponto. Adicione um pouco de sintaxe de herança para estados combinados:

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

e você está muito bem no ponto onde sua proposta é, sem quaisquer novas palavras-chave, todos com a reutilização de uma sintaxe já familiar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top