آلة الحالة المحدودة والتشوير بين ولايات ميكرونيزيا الموحدة

StackOverflow https://stackoverflow.com/questions/1441077

سؤال

توصيات للغات ذات الدعم الأصلي (لذلك لا توجد أدوات إنشاء FSM) لتطوير آلة الحالة و تنفيذ وتمرير الرسائل/الإشارات.هذا بالنسبة للاتصالات، على سبيل المثال تنفيذ ولايات ميكرونيزيا الموحدة بهذا المستوى من التعقيد.

لقد فكرت في Erlang، لكني أرغب في الحصول على بعض التعليقات والاقتراحات والمؤشرات إلى البرامج التعليمية والبدائل، وخاصة الأطر المستندة إلى Java.ربما سكالا؟

مفتوح المصدر فقط.أنا لا أبحث عن UML أو الحلول المتعلقة بالتعبير العادي.

وبما أن هذا يتعلق بتنفيذ بروتوكولات الاتصالات، فقد تكون ولايات ميكرونيزيا الموحدة غير تافهة.العديد من الحالات، العديد من التحولات، القائمة على الإشارة، وقيود/حراس الإدخال.سيكون إنشاء مثيل ديناميكي ميزة إضافية.عبارات التبديل غير واردة، وسرعان ما تصبح غير قابلة للاستخدام.إنه بالكاد أفضل إذا/إلا.

أنا أفضل أن لا تعتمد على التصميم الرسومي؛يجب أن يكون وصف تنسيق FSM قابلاً للقراءة/التحرير/الإدارة بواسطة الإنسان.

--

لقد قررت التركيز على الحل القائم على الممثل لـ C++

على سبيل المثال، يوفر إطار عمل ثيرون نقطة انطلاق http://theron.ashtonmason.net/ ولتجنب عبارات التبديل في معالج الأحداث المستند إلى FSM، يبدو إطار عمل قالب FSM C++ مفيدًا http://satsky.spb.ru/articles/fsm/fsmEng.php

هل كانت مفيدة؟

المحلول

وأنا أتفق يجب أن تصريحات التبديل يكون غير وارد ... أنها تؤدي في نهاية المطاف إلى كوابيس الصيانة. لا يمكنك استخدام في نمط الدولة لتنفيذ ولايات ميكرونيزيا الموحدة الخاصة بك؟ اعتمادا على التنفيذ الفعلي الخاص بك، يمكنك استخدام الجهات الفاعلة (إذا كان لديك عدة المتعاونة ولايات ميكرونيزيا الموحدة - جلالة ... هل ذلك ممكن). والشيء الجميل في الجهات غير أن إطار الرسائل التي تمر بالفعل هناك.

ومثال على استخدام الدولة ستكون كما يلي:

trait State {
  def changeState(message: Any): State
}

trait FSM extends Actor {
  var state: State

  def processMessage(message: Any) {
    state = state.changeState(message)
  }

  override def act() {
    loop {
      react {
        case m: Any => processMessage(m)
      }
    }
  }
}

وهذا هو رمز الأساسية جدا، ولكن كما قلت لا أعرف أكثر من الشروط، وهذا هو الأكثر أستطيع أن أفكر في. ميزة الدولة هي أن كل ولاية ويرد الذاتي في فئة واحدة.

نصائح أخرى

هذا التطبيق المحدد، تنفيذ بروتوكول الاتصالات، هو ما تم إنشاء Erlang من أجله.كانت التطبيقات الأولية لـ Erlang في Ericsson عبارة عن محولات الهاتف وكانت المنتجات التجارية الأولى عبارة عن محولات ATM التي تدعم جميع أنواع بروتوكولات الاتصالات.

لدى OTP سلوك قياسي لتنفيذ FSMs يسمى gen_fsm.هناك مثال على استخدامه في ولايات ميكرونيزيا الموحدة غير تافهة في بعض وثائق مكتب المدعي العام.

أوسيرل هو تطبيق SMPP مفتوح المصدر في Erlang ويوضح كيف يمكنك تنفيذ بروتوكول الاتصالات باستخدام gen_fsmس.والمثال الجيد الذي يجب النظر إليه هو gen_esme_session.

على الرغم من أنني لا أستطيع توجيهك إلى الكود، فأنا أعلم أن هناك عددًا لا بأس به من شركات Erlang التي تبيع منتجات موجهة للاتصالات: كوريلاتوس, تشابك عصبى, الدافع من بين أمور أخرى.

وأنا لا أوافق أن ولايات ميكرونيزيا الموحدة هي تافهة لتنفيذها. هذا هو قصير النظر للغاية، ويظهر إما عدم الإلمام البدائل، أو عدم وجود الخبرة مع أجهزة الدولة المعقدة.

والمشكلة الأساسية هي أن جهاز الدولة <م> الرسم البياني هو واضح، ولكن FSM <م> كود ليست كذلك. وبمجرد الحصول على ما هو أبعد من عشرات الدول وعلى درجة من التحولات، رمز ولايات ميكرونيزيا الموحدة يصبح قبيح والصعب متابعة.

وهناك أدوات حيث كنت <م> رسم آلة الدولة، وتوليد كود جافا لذلك. أنا لا أعرف من أي أدوات مفتوحة المصدر لذلك، ولكن.

والآن، والحصول على العودة إلى إرلانج / سكالا، سكالا له الفاعلون ورسالة عابرة أيضا، ويقوم على JVM، لذلك قد يكون بديلا أفضل من إرلانج نظرا القيود الخاصة بك.

وهناك مكتبة DFA / NFA على سكالا كذلك، على الرغم من أنه لا سيما فكرة جيدة. وهو يدعم التحويل من التعابير العادية التعسفي (أي حرفية لا يلزم أن يكون حرفا) في DFA / NFA.

وأنا ما بعد بعض التعليمات البرمجية أدناه استخدامه. في هذا الرمز، والفكرة هي خلق ولايات ميكرونيزيا الموحدة التي لن تقبل أي مجموعة متتابعة من البادئات التعسفية للحصول على قائمة من الكلمات، والفكرة التي تبدو حتى خيارات القائمة دون keybinds معرفة مسبقا.

import scala.util.regexp._
import scala.util.automata._

// The goal of this object below is to create a class, MyChar, which will
// be the domain of the tokens used for transitions in the DFA. They could
// be integers, enumerations or even a set of case classes and objects. For
// this particular code, it's just Char.
object MyLang extends WordExp {
  type _regexpT = RegExp
  type _labelT = MyChar

  case class MyChar(c:Char) extends Label
}

// We now need to import the types we defined, as well as any classes we
// created extending Label.    
import MyLang._

// We also need an instance (singleton, in this case) of WordBerrySethi,
// which will convert the regular expression into an automatum. Notice the
// language being used is MyLang.    
object MyBerrySethi extends WordBerrySethi {
  override val lang = MyLang
}

// Last, a function which takes an input in the language we defined,
// and traverses the DFA, returning whether we are at a sink state or
// not. For other uses it will probably make more sense to test against
// both sink states and final states.
def matchDet(pat: DetWordAutom[MyChar], seq: Seq[Char]): Boolean =
  !pat.isSink((0 /: seq) ((state, c) => pat.next(state, MyChar(c))))

// This converts a regular expression to a DFA, with using an intermediary NFA    
def compile(pat: MyLang._regexpT) = 
  new SubsetConstruction(MyBerrySethi.automatonFrom(pat, 100000)).determinize

// Defines a "?" function, since it isn't provided by the library
def Quest(rs: _regexpT*) = Alt(Eps, Sequ(rs: _*)) // Quest(pat) = Eps|pat = (pat)?


// And now, the algorithm proper. It splits the string into words
// converts each character into Letter[MyChar[Char]],
// produce the regular expression desired for each word using Quest and Sequ,
// then the final regular expression by using Sequ with each subexpression.
def words(s : String) = s.split("\\W+")
def wordToRegex(w : String) : Seq[MyLang._regexpT] = w.map(c => Letter(MyChar(c)))
def wordRegex(w : String) = Quest(wordToRegex(w) reduceRight ((a,b) => Sequ(a, Quest(b))))
def phraseRegex(s : String) = Sequ(words(s).map(w => wordRegex(w)) : _*)

// This takes a list of strings, produce a DFA for each, and returns a list of
// of tuples formed by DFA and string.
def regexList(l : List[String]) = l.map(s => compile(phraseRegex(s)) -> s)

// The main function takes a list of strings, and returns a function that will
// traverse each DFA, and return all strings associated with DFAs that did not
// end up in a sink state.
def regexSearcher(l : List[String]) = {
  val r = regexList(l)
  (s : String) => r.filter(t => matchDet(t._1, s)).map(_._2)
}

وأكاد لا أفكر في أي لغة حيث بتنفيذ ولايات ميكرونيزيا الموحدة هو غير تافهة. ربما هذا واحد .

...
if (currentState == STATE0 && event == EVENT0) return STATE1;
if (currentState == STATE1 && event == EVENT0) return STATE2;
...

ونمط الدولة (باستخدام تتضمن التعدادات جافا) هو ما نستخدمها في تطبيق الاتصالات لدينا، ومع ذلك فإننا نستخدم صغيرة ولايات ميكرونيزيا الموحدة من:

public class Controller{
    private State itsState = State.IDLE;

    public void setState(State aState){
        itsState = aState;
    }

    public void action1(){
        itsState.action1(this);
    }

    public void action2(){
        itsState.action2(this);
    }

    public void doAction1(){
        // code
    }

    public void doAction2(){
        // code
    }
}

public enum State{
    IDLE{
        @Override
        public void action1(Controller aCtx){
            aCtx.doAction1();
            aCtx.setState(State.STATE1);
        }
    },

    STATE1{
        @Override
        public void action2(Controller aCtx){
            aCtx.doAction2();
            aCtx.setState(State.IDLE);
        }
    },

    public void action1(Controller aCtx){
        throw new IllegalStateException();
    }

    public void action2(Controller aCtx){
        throw new IllegalStateException();
    }
}

وينبغي أن تكون ولايات ميكرونيزيا الموحدة تافهة لتنفيذ في أي لغة أن لديه قضية statement.Your اختيار اللغة ينبغي أن يستند إلى ما تحتاج أن آلة الدولة المحدودة للقيام به.

وعلى سبيل المثال، يمكنك القول أنك بحاجة للقيام بذلك لتنمية الاتصالات واذكر الرسائل. وأود أن ننظر في النظم / اللغات التي تدعم توزيع رسالة عابرة. إرلانج يفعل ذلك، وأنا "متأكد تقريبا كل لغة مشتركة أخرى تدعم هذا من خلال API / مكتبة للغة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top