क्या ऑब्जेक्ट ओरिएंटेड प्रोग्राम को Finite State Machine के रूप में देखा जा सकता है?


13

यह एक दार्शनिक / मौलिक प्रश्न हो सकता है, लेकिन मैं इसे स्पष्ट करना चाहता हूं।

मेरी समझ में एक Finite State Machine एक ऐसी प्रणाली को मॉडलिंग करने का एक तरीका है जिसमें सिस्टम का आउटपुट न केवल वर्तमान इनपुट पर निर्भर करेगा, बल्कि सिस्टम की वर्तमान स्थिति पर भी निर्भर करेगा। इसके अतिरिक्त, जैसा कि नाम से पता चलता है, एक परिमित राज्य मशीन को अपने संबंधित राज्य और व्यवहार के साथ राज्यों की परिमित एन संख्या में खंडित किया जा सकता है।

यदि यह सही है, तो डेटा और फ़ंक्शन सदस्यों के साथ हर एक ऑब्जेक्ट हमारे ऑब्जेक्ट ओरिएंटेड मॉडल में एक राज्य नहीं होना चाहिए, किसी भी ऑब्जेक्ट ओरिएंटेड डिज़ाइन को एक फाइनेंशियल स्टेट मशीन बना सकता है?

यदि ऑब्जेक्ट डिज़ाइन में FSM की व्याख्या नहीं है, तो सॉफ्टवेयर में FSM लागू करने पर लोगों को वास्तव में क्या मतलब है? क्या मैं कुछ भूल रहा हूँ?

धन्यवाद


6
कंप्यूटर + सॉफ्टवेयर एक स्टेट मशीन है जब तक आप मेमोरी, डिस्क स्पेस और अन्य प्रकार के स्टोरेज (जैसे इंटरनेट) को प्रतिबंधित करते हैं। जैसे ही इंटरनेट या अन्य बाहरी हार्डवेयर के साथ इंटरफेस करने की अनुमति है (असीमित भंडारण का अर्थ है), यह एक ट्यूरिंग मशीन की तरह हो जाता है। कभी एक वाक्यांश 'ट्यूरिंग पूरा' के बारे में सुना है? किसी भी तरह, कार्यात्मक कार्यक्रम और obj उन्मुख दोनों विधानसभा कोड के रूप में समाप्त होते हैं। मैं हास्केल (एक शुद्ध कार्यात्मक भाषा) / भिक्षुओं को नहीं जानता, लेकिन उस और ट्यूरिंग मशीन के बीच एक दिलचस्प संबंध होना चाहिए।
जॉब

जॉब्स पॉइंट में जोड़कर, गैर-नियतात्मकता का कोई भी रूप राज्य मशीन और ट्यूरिंग मशीन मॉडल दोनों से अधिक है। इंटरनेट पर, आपके पास कई गैर-सिंक्रनाइज़ किए गए मशीन हैं, अपूर्ण कनेक्शन के माध्यम से डेटा हानि, आदि। यहां तक ​​कि सिंगल-कोर सरल कंप्यूटर के साथ, आपके पास उपयोगकर्ता से गैर-नियतात्मक इनपुट है, लेकिन आप सामान्य रूप से उस मुद्दे को अनदेखा करते हैं, और सभी को दिखावा करते हैं। इनपुट पहले से ज्ञात था।
स्टीव ३१४

@ स्टीव 314: औपचारिक रूप से, नियतात्मक ऑटोमेटा एक ही राज्य में हैं। प्रत्येक इनपुट एक नई स्थिति की ओर ले जाता है। गैर-नियतात्मक ऑटोमेटा के लिए, प्रत्येक इनपुट कई राज्यों को जन्म दे सकता है। एन राज्यों के साथ एक गैर-नियतात्मक automaton 2 ^ एन राज्यों के साथ एक नियतात्मक automaton द्वारा अनुकरण किया जा सकता है।
केविन क्लाइन

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

जवाबों:


16

किसी एकल-थ्रेडेड प्रोग्राम को मशीन पर चलाने से भंडारण की एक सीमित मात्रा के साथ एक परिमित राज्य मशीन के रूप में मॉडलिंग की जा सकती है। परिमित राज्य मशीन में एक विशेष राज्य सभी प्रासंगिक भंडारण के विशिष्ट मूल्यों का प्रतिनिधित्व करेगा - स्थानीय चर, वैश्विक चर, ढेर भंडारण, वर्तमान में वर्चुअल मेमोरी में डेटा की अदला-बदली, यहां तक ​​कि प्रासंगिक फाइलों की सामग्री। दूसरे शब्दों में, काफी तुच्छ कार्यक्रमों के लिए भी उस सीमित राज्य मॉडल में बहुत सारे राज्य होंगे।

भले ही आपके कार्यक्रम में केवल 32-बिट पूर्णांक प्रकार का एक वैश्विक वैरिएबल हो, जो कम से कम 2 ^ 32 (4 बिलियन से अधिक) राज्यों को दर्शाता है। और वह प्रोग्राम काउंटर और कॉल स्टैक को भी ध्यान में नहीं ले रहा है।

इस तरह की चीज़ के लिए एक पुश-डाउन ऑटोमेटन मॉडल अधिक यथार्थवादी है। यह एक परिमित ऑटोमेटन की तरह है, लेकिन इसमें स्टैक की अंतर्निहित अवधारणा है। यह वास्तव में अधिकांश प्रोग्रामिंग भाषाओं में कॉल-स्टैक नहीं है, हालांकि।

वहाँ एक है विकिपीडिया स्पष्टीकरण है, लेकिन नीचे औपचारिक परिभाषा अनुभाग में नहीं फंस मिलता है।

पुश-डाउन ऑटोमेटा का उपयोग सामान्य गणनाओं को मॉडल करने के लिए किया जाता है। ट्यूरिंग मशीनें समान हैं , लेकिन IIRC समान नहीं हैं - हालांकि उनकी गणना क्षमता बराबर हैं

ऊपर की त्रुटि को इंगित करने के लिए थैंक्यू टू केविन क्लाइन - जैसा कि विकिपीडिया भी इंगित करता है, पुश-डाउन ऑटोमेटा परिमित राज्य मशीनों की तुलना में अधिक शक्तिशाली है, लेकिन ट्यूरिंग मशीनों की तुलना में कम शक्तिशाली है।

मैं ईमानदारी से पता नहीं है, जहां यह मस्तिष्क गोज़ से आया है - मैं कर इस संदर्भ संवेदनशील व्याकरण संदर्भ नि: शुल्क की तुलना में अधिक शक्तिशाली हैं पता है, और इस संदर्भ संवेदनशील व्याकरण एक साधारण धक्का-नीचे आटोमैटिक मशीन का उपयोग कर पार्स नहीं किया जा सकता है। मुझे यह भी पता है कि जबकि रैखिक समय में किसी भी अस्पष्ट संदर्भ-मुक्त व्याकरण को पार्स करना संभव है, यह आम तौर पर ऐसा करने के लिए एक (निर्धारक) पुश-डाउन ऑटोमेटन से अधिक लेता है। तो मैं कैसे समाप्त कर सकता था एक पुश-डाउन ऑटोमेटन एक ट्यूरिंग मशीन के बराबर है विचित्र।

शायद मैं कुछ अतिरिक्त मशीनरी के साथ एक पुश-डाउन ऑटोमेटन के बारे में सोच रहा था, लेकिन यह एक पुश-डाउन ऑटोमेटन (बस जोड़ने और एक स्टैक का शोषण करने) के बराबर एक परिमित ऑटोमेटन की गिनती करने जैसा होगा।

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

एक एकल OOP ऑब्जेक्ट को परिमित राज्य मशीन के रूप में मॉडल करना संभव है। मशीन की स्थिति सभी सदस्य चर के राज्यों द्वारा निर्धारित की जाएगी। आम तौर पर, आप केवल विधि कॉल के बीच (नहीं दौरान) मान्य राज्यों की गणना करेंगे। फिर, आपके पास आम तौर पर बहुत सारे राज्य होंगे जिनके बारे में चिंता करने की ज़रूरत है - यह कुछ ऐसा है जिसे आप एक सैद्धांतिक मॉडल के रूप में उपयोग कर सकते हैं, लेकिन आप उन सभी राज्यों की गणना करना चाहते हैं, शायद एक तुच्छ मामले में छोड़कर।

यह काफी सामान्य है, हालांकि, एक परिमित राज्य मशीन का उपयोग करके किसी वस्तु की स्थिति के कुछ पहलू को मॉडल करना है । खेल की वस्तुओं के लिए एक सामान्य मामला एआई है।

यह भी आमतौर पर क्या होता है जब एक पुश-डाउन ऑटोमेटन मॉडल का उपयोग करके पार्सर को परिभाषित करता है। हालाँकि, राज्य मॉडल में राज्यों का एक सीमित सेट होता है, यह पार्सर की स्थिति का एकमात्र मॉडल हिस्सा है - अतिरिक्त जानकारी उस राज्य के साथ अतिरिक्त चर में संग्रहीत की जाती है। यह हल करता है, जैसे 4-बिलियन-स्टेट्स-फॉर-वन-पूर्णांक समस्या — उन सभी राज्यों को शामिल नहीं करते हैं, बस पूर्णांक चर शामिल करते हैं। एक मायने में यह अभी भी पुश-डाउन ऑटोमेटन राज्य का हिस्सा है, लेकिन यह एक आरेख पर 4 बिलियन राज्य बुलबुले के प्रभाव की तुलना में बहुत अधिक प्रबंधनीय दृष्टिकोण है।


1
"यह एक एकल OOP ऑब्जेक्ट को परिमित राज्य मशीन के रूप में मॉडल करना संभव है"। सच, लेकिन कमजोर। यह मुमकिन नहीं है"। यह परिभाषा की बात है। एक प्रोग्रामिंग लैंग्वेज का काम एक साफ संकेतन में FSM को व्यक्त करना है। OOP सभी विभिन्न राज्यों के लिए सरल संकेतन के साथ FSM का कार्यान्वयन है।
S.Lott

1
@ S.Lott - हाँ, लेकिन ज्यादातर लोग एक OOP ऑब्जेक्ट को FSM के रूप में व्यक्त करने के बारे में नहीं सोचते हैं, कम से कम अधिकांश समय नहीं। "राज्य मशीन" नाम का उपयोग करने का अर्थ है कि आप कुछ विशिष्ट कार्यान्वयन का उपयोग कर रहे हैं, जैसे राज्य डिजाइन पैटर्न या राज्य-आईडी सदस्य चर। "एक राज्य मशीन के रूप में मॉडलिंग" अक्सर विनिर्देश या डिजाइन प्रलेखन के बारे में कुछ भी बताता है, जो उस वर्ग के कार्यान्वयन से अलग है। इसलिए, एक क्लास को एक परिमित राज्य मॉडल के रूप में मॉडलिंग करने का अर्थ है कि क्लास के लिए स्रोत कोड प्रदान करने के अलावा कुछ और।
स्टीव 314

"लोग नहीं सोचते"। सच। और एक गहरी समस्या। सभी कार्यक्रम राज्य मशीनें हैं। उनके पास बहुत सारे राज्य हैं। प्रोग्रामिंग भाषा के लिए "ट्यूरिंग कम्प्लीट" टेस्ट की आवश्यकता होती है। यह एक बहुत, बहुत मजबूत (और निरपेक्ष) नियम है। सुझाव देने के बजाय यह "संभव" है, यह "आवश्यक" और "पर्याप्त" की तरह है।
S.Lott

1
-1: पुश-डाउन ऑटोमेटा ट्यूरिंग मशीनों की तरह शक्तिशाली नहीं हैं।
केविन क्लाइन

1
@kevin cline - धन्यवाद - और मैं क्या सोच रहा था !!! उस बिट को स्ट्राइक करने का एड किया। औपचारिक अध्ययन के बारे में मैंने जो कुछ भी कहा है, उसके बावजूद मैं उससे बेहतर जानता हूं और उसे फिर से बेहतर जानना चाहिए था।
स्टीव 314

5

मुद्दा यह नहीं है कि कुछ "है" या "नहीं है" एक परिमित राज्य मशीन है। एक परिमित राज्य मशीन एक मानसिक मॉडल है जो किसी चीज़ को समझने के लिए उपयोगी हो सकती है अगर उस चीज़ को एक के रूप में सोचा जा सकता है।

आमतौर पर परिमित राज्य मशीन मॉडल कम संख्या में राज्यों के साथ लागू होता है, जैसे एक नियमित व्याकरण, या कंप्यूटर का निर्देश अनुक्रम।


1

सीधे अपने प्रश्न का उत्तर देने के लिए: लगभग निश्चित रूप से नहीं। ओओपी के लिए एक औपचारिक गणितीय सिद्धांत प्रतीत नहीं होता है जिस तरह से लैम्ब्डा कैलकुलस और / या कॉम्बिनेरी लॉजिक कार्यात्मक प्रोग्रामिंग से गुजरता है, या ट्यूरिंग मशीन सामान्य पुरानी अनिवार्य प्रोग्रामिंग से गुजरती है।

अधिक के लिए यह स्टैकओवरफ़्लो प्रश्न देखें ।

मेरा अनुमान है कि एक अंतर्निहित गणितीय सिद्धांत की कमी यह है कि हर कोई जानता है कि एक "वस्तु" क्या है जब वे एक को देखते हैं, लेकिन कोई भी "वस्तुओं" को किसी और के समान नहीं देखता है।


0

नहीं, वैसे भी व्यावहारिक रूप से नहीं। एक परिमित राज्य मशीन आम तौर पर केवल डेटा के एक टुकड़े को याद करती है: इसकी वर्तमान स्थिति।

एक FSM का एक विशिष्ट अनुप्रयोग लेक्सिंग या पार्सिंग है। उदाहरण के लिए, जब हम लेक्सिंग कर रहे होते हैं, तो यह (सामान्य रूप से) वर्तमान स्थिति और इनपुट के मूल्य के अनुसार हर संभव इनपुट के लिए क्रियाओं को एनकोड करना काफी आसान होता है।

उदाहरण के लिए, हमारे पास एक NUMBER स्थिति हो सकती है जिसमें हम किसी संख्या के अंकों को पढ़ रहे होते हैं। यदि हम पढ़ा जाने वाला अगला वर्ण एक अंक है, तो हम NUMBER स्थिति में रहते हैं। यदि यह एक स्थान या टैब है, तो हम अंकों को वापस करेंगे और फिर कुछ WHITE_SPACE राज्य या उस आदेश पर कुछ प्रगति करेंगे।

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

एफएसएम ही, कुछ सीमाएं हैं - इसकी कोई गिनती तंत्र नहीं है। उदाहरण के लिए, एक टिप्पणी शुरू करने के लिए "/ " का उपयोग करने वाली भाषा और " /" का उपयोग करें। इसके लेक्सर में संभवतः एक COMMENT अवस्था होगी जो इसे '/ ' टोकन को देखने पर दर्ज हुई थी। इस बिंदु पर कोई रास्ता नहीं है (किसी अन्य राज्य को जोड़ने के लिए COMMENT2 की तरह) एक और "/ " का पता लगाने के लिए और महसूस करें कि यह एक नेस्टेड टिप्पणी के साथ काम कर रहा है। बल्कि, टिप्पणी की स्थिति में, इसे टिप्पणी की स्थिति */छोड़ने के लिए कहने के रूप में पहचाना जाएगा , और कुछ भी इसे टिप्पणी स्थिति में छोड़ देता है।

जैसा कि उल्लेख किया गया है, आप निश्चित रूप से एक नेस्टेड टिप्पणी के लिए एक COMMENT2 राज्य शामिल कर सकते हैं - और उस में, एक COMMENT3 राज्य, और इसी तरह। कुछ बिंदु पर, हालांकि, आप अधिक राज्यों को जोड़ने के लिए बीमार हो रहे हैं, और यह अधिकतम घोंसले के शिकार की गहराई निर्धारित करेगा जो आप टिप्पणियों के लिए अनुमति देते हैं। पार्सर के कुछ अन्य रूप के साथ (अर्थात, शुद्ध राज्य मशीन नहीं है, लेकिन कुछ ऐसा है जिसमें कुछ स्मृति है जो इसे गिनने देती है) आप सीधे अपनी घोंसले की गहराई को ट्रैक कर सकते हैं, इसलिए आप टिप्पणी अवस्था में रहें जब तक कि आप एक करीबी टिप्पणी टोकन तक न पहुंच जाएं पहले वाले को संतुलित करता है, इसलिए आपका काउंटर 0 पर वापस चला जाता है और आप COMMENT अवस्था छोड़ देते हैं।

जैसा कि मैंने कहा, हालांकि, जब आप इस तरह का एक काउंटर जोड़ते हैं, तो आपके पास जो है वह वास्तव में एफएसएम नहीं है। एक ही समय में, यह है वास्तव में बहुत करीब - विशेष रूप से, पास पर्याप्त है कि आप काउंटर सिर्फ अधिक राज्यों को जोड़ने के द्वारा अनुकरण कर सकते हैं।

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


"इसकी वर्तमान स्थिति" में बहुत सी जानकारी शामिल हो सकती है। एक FSM तुच्छ रूप से गिन सकता है कि प्रत्येक संख्या के लिए राज्यों की गिनती होगी। यह परिमित है (ट्यूरिंग मशीन के विपरीत) लेकिन यह अभी भी पूरी तरह से गिनने में सक्षम है। मुझे लगता है कि आपको एक बेहतर उदाहरण की आवश्यकता हो सकती है।
S.Lott

आपके सेल-फोन में सोफ़वेयर छिपी हुई जटिल स्थिति-मशीन का एक संग्रह है जो कई डेटा को याद रखता है और वर्तमान स्थिति के अनुसार उनकी व्याख्या करता है।
मावग का कहना है कि मोनिका

-2

मुझे विश्वास नहीं है कि स्वीकृत उत्तर पूरी तरह से सही है।

आप ट्यूरिंग लैंग्वेज में लिखे गए एक मनमाने प्रोग्राम को मॉडल नहीं कर सकते, चाहे वह ऑब्जेक्ट-ओरिएंटेड हो या न हो, एक Finite State Machine के रूप में। लगभग सभी आधुनिक कंप्यूटर भाषाएँ, जैसे कि जावा, C ++ या स्मॉलटाक, ट्यूरिंग कम्प्लीट हैं।

उदाहरण के लिए, आप ऑब्जेक्ट के अनुक्रम को पहचानने के लिए एक परिमित राज्य मशीन नहीं बना सकते हैं, जहाँ आपके पास एक वस्तु के n उदाहरण हैं और उसके बाद किसी अन्य वस्तु के n उदाहरण हैं क्योंकि Finite State Machines एक चर के लिए n लिखने में असमर्थ हैं। वे केवल एक राज्य में इनपुट और स्विच पढ़ सकते हैं।


यह केवल 3 साल पहले पोस्ट किए गए उत्तरों में किए गए और समझाए गए बिंदुओं को दोहराता है, जैसे इस एक में
gnat
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.