2009-11-24 6 views
20

यदि मैं एक प्रोग्रामिंग भाषा है जिसमें प्राथमिक मशीन निर्माण के रूप में राज्य मशीनें (बूस्ट :: स्टेटचार्ट के समान) हैं तो मैं उत्सुक हूं।क्या अंतर्निहित राज्य मशीन निर्माण के साथ एक प्रोग्रामिंग भाषा है?

एनालॉजीज - सी # में ऐसे प्रतिनिधि हैं जहां जावा पर्यवेक्षक पैटर्न का उपयोग करता है और सी में कॉलबैक होता है। पर्ल और पायथन में अंतर्निहित हैश जबकि सी ++ और जावा को लाइब्रेरी की आवश्यकता होती है।

अद्यतन:

यह C++, C#, जावा, लिस्प के अर्थ में सामान्य प्रोग्रामिंग भाषा होना चाहिए ...

मैं सभी घंटियाँ और सीटी पर के साथ "परिपक्व" राज्य मशीनों मतलब हेल ​​औपचारिकता या यूएमएल राज्य आरेखों का स्तर या बूस्ट :: स्टेटचार्ट।

उत्तर

37

Ragel एक राज्य मशीन भाषा है। IOW, यह एक ऐसी भाषा नहीं है जो भी राज्य मशीनों का समर्थन करती है, यह एक ऐसी भाषा है जो केवल राज्य मशीनों का समर्थन करती है। जिसका स्पष्ट अर्थ है कि यह ट्यूरिंग-पूर्ण नहीं है, लेकिन इसकी आवश्यकता किसके लिए है?

अधिक सटीक, रैगेल एक राज्य मशीन कंपाइलर है, जो एक रेगेक्सपी जैसी भाषा में एक राज्य मशीन का विवरण लेता है और सी, सी ++, उद्देश्य-सी, डी, जावा या रूबी में उस राज्य मशीन के कार्यान्वयन को उत्पन्न करता है । (yacc पर विचार करें, लेकिन एलएएलआर (1) टेबल पार्सर्स की बजाय राज्य मशीनों के लिए।) रैगेल का प्राथमिक उद्देश्य बाइनरी प्रोटोकॉल (जैसे नेटवर्किंग प्रोटोकॉल या ऑन-डिस्क फ़ाइल स्वरूपों) को पार्स करना है, लेकिन यह टेक्स्ट के लिए भी उपयोग किया जा सकता है ।

रूगेल का उपयोग करने का एक प्रसिद्ध उदाहरण रूबी के लिए मंगलेल वेबसर्वर है: इसका HTTP कर्नेल रागेल में लिखा गया है, जो इसे अत्यंत तेज और सुरक्षित बनाता है।HTTP कर्नेल वास्तव में इतना अच्छा है कि विभिन्न अनुप्रयोगों में इसे कई बार पुन: उपयोग किया गया है: पतला, यूनिकॉर्न और इंद्रधनुष भी वेबसर्वर हैं, और वास्तव में सीधे प्रतिस्पर्धी मोंगल हैं। ईबीबी एक रिवर्स HTTP प्रॉक्सी है। आरएफज़ वेब अनुप्रयोगों के लिए एक फज़ परीक्षण उपकरण है। इसके अलावा, कुछ सुरक्षा उपकरण इसका उपयोग करते हैं।

Ragel भी राज्य मशीन में मेजबान भाषा में कोड को एम्बेड की अनुमति देता है, इस प्रकार यह ट्यूरिंग-पूर्ण है, और केवल पहचान नहीं करने के लिए, लेकिन यह भी प्रोटोकॉल की व्याख्या में सक्षम बना रही है।

सामान्य में, उन्नत उपयोगकर्ता परिभाषित या तो coroutines के माध्यम से या GOTO उचित पूंछ कॉल (जैसे स्कीम) नियंत्रण प्रवाह (लुआ जैसे) निरंतरता (जैसे स्काला) या (जैसे PHP) या के लिए समर्थन के साथ हर भाषा हो सकता है आसानी से राज्य मशीनों को लागू करने के लिए उपयोग किया जाता है। (जेनरेटर (पायथन) उर्फ ​​इटरेटर्स (सी #), जो "काम" की परिभाषा के आधार पर मूल रूप से "क्रैपी कोरआउट" हो सकते हैं या काम नहीं कर सकते हैं।) और ऐसी कोई भी भाषा जिसमें लचीली वाक्यविन्यास (जैसे रूबी) है या मेटासिंक्टैक्टिक अबास्ट्रक्शन का समर्थन करता है (उदाहरण के लिए क्लोजर) राज्य मशीनों का वर्णन किया जा सकता है। (गैर- ASCII पहचानकर्ता के लिए सहायता में मदद करता है, भी, ताकि आप अपने राज्य मशीन के लिए वास्तविक तीर का उपयोग कर सकते हैं।)

इसका मतलब है कि अगर आप दो गठबंधन है, और एक भाषा है कि दोनों पूंछ कॉल का समर्थन करता है का उपयोग करें और मेटासिंक्टैक्टिक अबास्ट्रक्शन, आपको बहुत अच्छी स्थिति मशीनें मिलती हैं, के बिना मूल भाषा समर्थन की आवश्यकता होती है। श्रीराम कृष्णमूर्ति ने उद्घाटन लाइटवेट भाषा सम्मेलन में "द स्वाइन फॉर पर्ल" नामक प्रसिद्ध (अब) प्रसिद्ध भाषण दिया, जिसमें उन्होंने योजना में एक एफएसएम कार्यान्वयन का प्रदर्शन किया। (यहां slides, audio recording और paper explaining the code हैं)।

(define my-regex 
    (automaton init 
      [init : (c → more)] 
      [more : (a → more) 
        (d → more) 
        (r → end)] 
      [end : accept])) 

यह राज्य मशीन नियमित अभिव्यक्ति c(a|d)*r करने के लिए इसी की एक विनिर्देश है: कोड अपने आप में एक 26 लाइन (बहुत ही कम लाइनों, वास्तव में) मैक्रो, कि आप इस तरह से कोड लिखने की अनुमति देता है। और यह न केवल एक विनिर्देश है, बल्कि एक रननेबल प्रोग्राम राज्य मशीन को लागू करता है।

मैं इस तरह यह कॉल कर सकते हैं:

(my-regex '(c a d a d d r)) 

और इस मामले में परिणाम #t (जो true के लिए योजना-बात) मिलता है।

1

मुझे अभी एक मिला है: AsmL (Abstract State Machine Language)
यहां कोडप्लेक्स पर page with more info है।

दिलचस्प दिलचस्प है, यह माइक्रोसॉफ्ट द्वारा विकसित किया गया है।

+2

यह शायद नहीं क्या ओ पी है:

internal class Server : Machine { MachineId Client; [Start] [OnEntry(nameof(InitOnEntry))] class Init : MachineState { } void InitOnEntry() { ... this.Goto(typeof(Active)); } ... 

यहाँ उनके उच्च स्तरीय वाक्य रचना के एक हिस्से को है:

यहाँ सी # एक्सटेंशन के लिए उनके उदाहरणों में से एक से एक भाग है खोज रहे हैं वह एफएसएम के बारे में पूछ रहे थे एएसएम नहीं। एएसएम एक पूरी तरह से अलग जानवर हैं, वे कार्यक्रमों के बारे में प्रमेय साबित करने के लिए एक औपचारिक विनिर्देश तंत्र हैं। और, बीटीडब्लू, माइक्रोसॉफ्ट टोनी होरे समेत कार्यक्रम सत्यापन में कई प्रमुख वैज्ञानिकों को रोजगार देता है। (जो आश्चर्यजनक नहीं है कि विंडोज़ में एक बग मूल रूप से विश्व अर्थव्यवस्था को कम कर सकता है।) तो, वास्तव में यह आश्चर्य की बात नहीं है कि यह माइक्रोसॉफ्ट से बाहर आता है। यह भी ध्यान रखें कि यह माइक्रोसॉफ्ट रिसर्च है, माइक्रोसॉफ्ट कॉर्प नहीं, जो एक पूरी तरह से अलग जानवर है। –

6

एक नया W3C XML- आधारित राज्य मशीन भाषा SCXML कहा जाता है, डेविड हारेल के StateChart रीतिवाद के आधार पर (जो श्रेणीबद्ध और समानांतर राज्य मशीनों का समर्थन करता है) है।

Apache Commons है एक Java based implementation of SCXML:

कॉमन्स SCXML एक कार्यान्वयन बनाने और एक जावा SCXML इंजन एक राज्य मशीन एक SCXML दस्तावेज़ का उपयोग करके परिभाषित को क्रियान्वित करने में सक्षम बनाए रखने के उद्देश्य से है, जबकि पर्यावरण इंटरफेस बाहर सार संक्षेप।

1

सी # में, इटेटर ('उपज रिटर्न' और 'उपज ब्रेक' के साथ) एक भाषा निर्माण है जो सीधे राज्य मशीनों में अनुवाद करता है। मैंने वास्तव में कभी इसका उपयोग नहीं किया है, लेकिन मुझे लगता है कि यह अभ्यास में प्रयोग योग्य हो सकता है।

here के बारे में एक स्टैक ओवरफ्लो प्रश्न होता है। सबसे ज्यादा वोट दिया गया जवाब इसे हतोत्साहित करता है ...

2

एरलांग का ओटीपी 'gen_fsm' के माध्यम से राज्य मशीन संरचनाओं का समर्थन करता है। पिछले कुछ सालों से मैंने देखा है, इसलिए मैं थोड़ी जंगली हूं, लेकिन आप Google को 'एरलांग gen_fsm' के लिए Google देख सकते हैं और संदर्भ सामग्री का भार

2

काफी नहीं है, लेकिन पाइथन के लिए एक राज्य मशीन मॉड्यूल है जो आपको सजावट करने वाले हेल स्टाइल स्टेटचार्ट्स का समर्थन करने के लिए सजा देता है, जिसमें कई राज्यों के साथ संदर्भ और इतिहास के बिना घोंसले वाले पदार्थ शामिल हैं। कोड नीचे की तरह कुछ दिख रहा है। मॉड्यूल http://wiki.python.org/moin/State%20Machine%20via%20Decorators

#!/bin/env/python 
""" 
This example now works. The state pattern module 
allows defining states which are their their own context for 
implementing substates. Substate Medium (class Medium) shows this here. 
""" 
""" 
Example with 5 buttons. Two ,'up','down' cause state to rotate among the 
several states. The other three, bx,by,bz, invoke state dependent behavior. 

Switching into a state causes the labels of the three buttons bx,by,bz to 
change. Pressing one of the buttons causes associated text to appear in 
corresponding static text box. An 'onEnter' method changes the text. 
""" 
import wx 
import DecoratorStateMachine as dsm 

class MyFrame(wx.Frame, dsm.ContextBase): 

    xtable = dsm.TransitionTable('pstate') 


    def __init__(self): 
     MyFrame.xtable.initialize(self) 

     wx.Frame.__init__(self, None, -1, "My Frame", size=(470,220)) 

     family = wx.SWISS 
     style = wx.NORMAL 
     weight = wx.BOLD 
     font = wx.Font(11,family,style,weight, False, "Verdana") 
     self.SetFont(font) 

     panel = wx.Panel(self, -1) 

     b = wx.Button(panel, -1, "Up", pos=(50,20), size=(80,35)) 
     self.Bind(wx.EVT_BUTTON, self.OnUp, b) 
     b.SetDefault() 

     b = wx.Button(panel, -1, "Down", pos=(50,60), size=(80,35)) 
     self.Bind(wx.EVT_BUTTON, self.OnDown, b) 

     self.bx = wx.Button(panel, -1, "xxx", pos=(50,100), size=(110,35)) 
     self.Bind(wx.EVT_BUTTON, self.OnBA, self.bx) 
     self.tx = wx.StaticText(panel, -1, "", pos=(50,140), size=(110,35)) 

     self.by = wx.Button(panel, -1, "yyy", pos=(180,100), size=(110,35)) 
     self.Bind(wx.EVT_BUTTON, self.OnBB, self.by) 
     self.ty = wx.StaticText(panel, -1, "", pos=(180,140), size=(110,35)) 

     self.bz = wx.Button(panel, -1, "zzz", pos=(310,100), size=(110,35)) 
     self.Bind(wx.EVT_BUTTON, self.OnBC, self.bz) 
     self.tz = wx.StaticText(panel, -1, "", pos=(310,140), size=(110,35)) 


    @dsm.transition(xtable) 
    def OnUp(self, event): 
     pass 

    @dsm.transition(xtable) 
    def OnDown(self, event): 
     pass 

    @dsm.event(xtable) 
    def OnBA(self, event): 
     pass 

    @dsm.event(xtable) 
    def OnBB(self, event): 
     pass 

    @dsm.event(xtable) 
    def OnBC(self, event): 
     self.tz.SetLabel("Bossy") 


class Off(MyFrame): 
    "This is state Off " 

    def onEnter(self): 
     self.bx.SetLabel("Chase") 
     self.by.SetLabel("Onry") 
     self.bz.SetLabel("Cow") 

    def OnBA(self, event): 
     self.tx.SetLabel("Chase the") 

    def OnBB(self, event): 
     self.ty.SetLabel("Onry") 


class Low(MyFrame): 
    "This is state Low " 
    items = ["Walk", "Green", "Llama"] 

    def onEnter(self): 
     self.bx.SetLabel(self.items[0]) 
     self.by.SetLabel(self.items[1]) 
     self.bz.SetLabel(self.items[2]) 

    def OnBA(self, event): 
     self.tx.SetLabel("Walk the ") 

    def OnBB(self, event): 
     self.ty.SetLabel(self.items[1]) 

    def OnBC(self, event): 
     self.tz.SetLabel(self.items[2]) 


class Medium(MyFrame): 
    "This is state Medium " 
    ytable = dsm.TransitionTable('qstate') 

    def onEnter(self): 
     if not hasattr(self, 'qstate'): #unconditionally initialize for no history 
     self.ytable.initialize(self) 
     self.doEnter() 

    @dsm.event(ytable) 
    def doEnter(): pass 

    @dsm.transitionevent(ytable) 
    def OnBA(self, event): 
     pass 

    @dsm.transitionevent(ytable) 
    def OnBB(self, event): 
     pass 

    @dsm.transitionevent(ytable) 
    def OnBC(self, event): 
     pass 


class High(Low): 
    "This is state High " 

    items = ["Pet","Tame", "Dog"] 

    def OnBA(self, event): 
     self.tx.SetLabel("Pet his") 

class MedBlue(Medium): 
    """State med blu""" 

    items = ["Med BLue","Checkered", "Tractor"] 

    def onEnter(self): 
     self.bx.SetLabel(self.items[0]) 
     self.by.SetLabel(self.items[1]) 
     self.bz.SetLabel(self.items[2]) 

    def doEnter(self): 
     self.onEnter() 

    def OnBA(self, event): 
     self.tx.SetLabel("Med Blue") 
    def OnBB(self, event): 
     self.ty.SetLabel("Chekered") 
    def OnBC(self, event): 
     self.tz.SetLabel("Tractor") 


class MedRed(Medium): 
    """State med red""" 

    items = ["Med Red","Striped", "Combine"] 

    def onEnter(self): 
     self.bx.SetLabel(self.items[0]) 
     self.by.SetLabel(self.items[1]) 
     self.bz.SetLabel(self.items[2]) 

    def doEnter(self): 
     self.onEnter() 

    def OnBA(self, event): 
     self.tx.SetLabel("Med Red") 
    def OnBB(self, event): 
     self.ty.SetLabel("Striped") 
    def OnBC(self, event): 
     self.tz.SetLabel("Combine") 


MyFrame.xtable.nextStates(Low, (Medium,Off)) 
MyFrame.xtable.nextStates(Medium, (High,Low)) 
MyFrame.xtable.nextStates(High, (Off,Medium)) 
MyFrame.xtable.nextStates(Off, (Low,High)) 
MyFrame.xtable.initialstate = Off 

Medium.ytable.nextStates(MedBlue, (MedBlue, MedRed, MedRed)) 
Medium.ytable.nextStates(MedRed, (MedBlue, MedBlue, MedRed)) 
Medium.ytable.initialstate = MedBlue 


if __name__=='__main__': 
    app = wx.PySimpleApp() 
    frame = MyFrame() 
    frame.Show(True) 
    app.MainLoop() 
4

SMC पर एक सरल डोमेन विशिष्ट भाषा है कि कई लोकप्रिय भाषाओं के लिए राज्य मशीनों उत्पन्न होगा के लिए एक संकलक है। मैंने जटिल उपयोगकर्ता इंटरफेस और कस्टम नेटवर्क प्रोटोकॉल जैसे विभिन्न प्रकार की चीजों के लिए रखरखाव राज्य मशीनों को उत्पन्न करने के लिए इसका उपयोग किया है।

1

रैगेल के अलावा एक तकनीकी रूप से दिलचस्प है, लेकिन एसएल 1 नामक काफी अस्पष्ट भाषा है। http://ieeexplore.ieee.org/xpl/freeabs_all.jsp?arnumber=1095580 देखें। यह टेलीकॉम सिस्टम विकसित करने के लिए स्लोवेनिया में इस्क्राटेल द्वारा बनाया गया था जहां राज्य मशीनें मूल ब्लॉक हैं।

1

श्रीराम कृष्णमूर्ति के पास using macros to add an embedded sublanguage for automata to Scheme के बारे में एक बात और एक पेपर है। मुझे यकीन नहीं है कि क्या किसी भी योजना में मानक मैक्रोज़ के रूप में उनके मैक्रोज़ शामिल हैं, हालांकि।

2

प्लेड प्रोग्रामिंग भाषा "टाइपपेस्ट-ओरिएंटेड प्रोग्रामिंग, एक प्रतिमान जो टाइपस्टेट्स के साथ ऑब्जेक्ट उन्मुख प्रोग्रामिंग को बढ़ाती है।"

यहाँ डॉक है: http://www.cs.cmu.edu/~aldrich/plaid/

उदा:

state File { 
    public final String filename; 
} 

state OpenFile extends File { 
    private CFilePtr filePtr; 
    public int read() { ... } 
    public void close() [OpenFile>>ClosedFile] 
     { ... } 
} 

state ClosedFile extends File { 
    public void open() [ClosedFile>>OpenFile] 
     { ... } 
} 
0

माइक्रोसॉफ्ट रिसर्च हाल ही में GitHub पर P भाषा का विमोचन किया। उनके पास PSharp ढांचा भी है जो सी # एक्सटेंशन लाइब्रेरी और भाषा के लिए कंपाइलर के साथ उच्च स्तरीय वाक्यविन्यास प्रदान करता है।

मैं इसे आजमाने की उम्मीद कर रहा हूं।

using System; 

namespace TheStateMachine 
{ 
    internal machine Client 
    { 
    private machine Server; 
    private start state Init 
    { 
     entry 
     { 
     this.Server = (trigger as Config).target; 
     jump(Playing); 
     } 
    } 

    private state Playing 
    { 
     entry 
     { 
     //execute logic 
     } 
     on AnotherEvent goto AnotherState; 
     on SomeEvent do ProcessSomeLogic; 
    } 

    ... 
संबंधित मुद्दे