โปรแกรมเชิงวัตถุสามารถมองเห็นเป็นเครื่องสถานะ จำกัด ได้หรือไม่?


13

นี่อาจเป็นคำถามเชิงปรัชญา / พื้นฐาน แต่ฉันแค่ต้องการชี้แจง

ในความเข้าใจของฉัน Finite State Machine เป็นวิธีการสร้างแบบจำลองระบบซึ่งผลลัพธ์ของระบบจะไม่เพียงขึ้นอยู่กับอินพุตปัจจุบัน แต่ยังรวมถึงสถานะปัจจุบันของระบบด้วย นอกจากนี้ตามชื่อที่แสดงให้เห็นมันเครื่องสถานะ จำกัด สามารถแบ่งออกเป็นจำนวน จำกัด ของรัฐที่มีสถานะและพฤติกรรมของตน

ถ้าสิ่งนี้ถูกต้องวัตถุทุกชิ้นที่มีข้อมูลและฟังก์ชั่นควรเป็นสถานะในแบบจำลองเชิงวัตถุของเราหรือไม่ทำให้การออกแบบเชิงวัตถุใด ๆ เป็นเครื่องสถานะ จำกัด ?

ถ้านั่นไม่ใช่การตีความของ FSM ในการออกแบบวัตถุสิ่งที่ผู้คนหมายถึงอย่างแน่นอนเมื่อพวกเขาใช้ FSM ในซอฟต์แวร์? ฉันพลาดอะไรไปรึเปล่า?

ขอบคุณ


6
ซอฟต์แวร์คอมพิวเตอร์ + เป็นเครื่องรัฐตราบใดที่คุณ จำกัด หน่วยความจำพื้นที่ดิสก์และพื้นที่เก็บข้อมูลประเภทอื่น (เช่นอินเทอร์เน็ต) ทันทีที่ได้รับอนุญาตให้เชื่อมต่ออินเทอร์เน็ตหรือฮาร์ดแวร์ภายนอกอื่น ๆ (หมายถึงพื้นที่เก็บข้อมูลไม่ จำกัด ) สิ่งนี้จะกลายเป็นเหมือนเครื่องทัวริง เคยได้ยินวลี 'ทัวริงสมบูรณ์' หรือไม่? อย่างไรก็ตามฟังก์ชั่นการใช้งานและ obj oriented นั้นต่างก็จบลงด้วยรหัสแอสเซมบลี ฉันไม่รู้จัก Haskel (ภาษาที่ใช้งานได้จริง) / monads แต่ต้องมีความสัมพันธ์ที่น่าสนใจระหว่างสิ่งนั้นกับเครื่องทัวริง
งาน

การเพิ่มจุดงานรูปแบบที่ไม่ใช่ระดับใดก็เกินทั้งเครื่องรัฐและเครื่องทัวริง บนอินเทอร์เน็ตคุณมีเครื่องที่ไม่ได้ซิงโครไนซ์หลายเครื่องข้อมูลสูญหายผ่านการเชื่อมต่อที่ไม่สมบูรณ์ ฯลฯ แม้จะมีคอมพิวเตอร์ที่ใช้งานง่ายแบบแกนเดียวคุณก็มีอินพุตที่ไม่ได้กำหนดจากผู้ใช้ แต่ปกติแล้วคุณไม่สนใจปัญหานั้น การป้อนข้อมูลเป็นที่รู้จักกันล่วงหน้า
Steve314

@ Steve314: เป็นทางการออโตมาตาที่กำหนดได้อยู่ในสถานะเดียว แต่ละอินพุตนำไปสู่สถานะใหม่ สำหรับออโตมาต้าแบบไม่กำหนดค่าแต่ละอินพุตสามารถนำไปสู่หลายสถานะได้ ออโตเมติกแบบไม่กำหนดค่าที่มี N สถานะสามารถจำลองได้โดยออโตเมติกแบบกำหนดค่าที่มีสถานะ 2 ^ N
kevin cline

@cline - ในกรณีนี้คุณพูดถูก แต่ฉันคิดว่าสิ่งที่ฉันมีอยู่ในใจคือการเกิดขึ้นพร้อมกันและการเปลี่ยนแปลงเวลาที่เกิดขึ้นในเครื่องจักรในโลกแห่งความจริง - สิ่งต่าง ๆ เช่นแกนทำงานช้าลงเล็กน้อยเพราะมันร้อนเกินไป เวลาที่แน่นอนเมื่อข้อมูลเกิดขึ้นภายใต้หัวอ่านและอื่น ๆ ทั้งหมดนี้เหมาะกับโมเดลออโตไฟไนต์แบบไม่ จำกัด ที่คุณอธิบายแน่นอนดังนั้นคุณจึงถูกต้องอย่างแน่นอน - แต่จำนวนของรัฐจะใหญ่มากอย่างบ้าคลั่ง ฉันเดาว่าฉันอาจมีมาตรการต่อเนื่องเช่นอุณหภูมิเหล่านั้นในใจซึ่งเป็นส่วนหนึ่งของสถานะของระบบด้วย (ไม่ใช่แค่ผลที่ตามมา)
Steve314

@Job ใช่มีความสัมพันธ์ที่น่าสนใจมากระหว่างพวกเขา
Maciej Piechotka

คำตอบ:


16

โปรแกรมแบบเธรดเดี่ยวใด ๆ ที่ทำงานบนเครื่องที่มีจำนวน จำกัด ของพื้นที่จัดเก็บสามารถจำลองเป็นเครื่องสถานะ จำกัด สถานะเฉพาะในเครื่องสถานะ จำกัด จะแสดงค่าเฉพาะของหน่วยเก็บข้อมูลที่เกี่ยวข้องทั้งหมด - ตัวแปรโลคัล, ตัวแปรโกลบอล, ที่เก็บข้อมูลฮีป, ข้อมูลที่ถูกแลกเปลี่ยนในหน่วยความจำเสมือน, แม้กระทั่งเนื้อหาของไฟล์ที่เกี่ยวข้อง กล่าวอีกนัยหนึ่งจะมีรัฐจำนวนมากในรูปแบบสถานะ จำกัด นั้นแม้จะเป็นโปรแกรมที่ไม่สำคัญก็ตาม

แม้ว่าโปรแกรมของคุณจะมีเพียงตัวแปรเดียวทั่วโลกซึ่งเป็นชนิดจำนวนเต็ม 32 บิต แต่ก็มีความหมายอย่างน้อย 2 ^ 32 (มากกว่า 4 พันล้านครั้ง) และนั่นไม่ได้คำนึงถึงตัวนับโปรแกรมและ call stack

หุ่นยนต์แบบกดลงนั้นดูสมจริงมากขึ้นสำหรับสิ่งนี้ มันเป็นหุ่นยนต์ที่มีขอบเขต จำกัด แต่มีแนวคิดในตัวของสแต็ก มันไม่ได้เป็น call-stack เหมือนภาษาการเขียนโปรแกรมส่วนใหญ่

มีคำอธิบายของ Wikipediaแต่อย่าจมดิ่งลงในส่วนคำจำกัดความที่เป็นทางการ

มีการใช้ออโตบอร์ดแบบกดลงเพื่อคำนวณแบบจำลองทั่วไป เครื่องจักรทัวริงจะคล้ายกันแต่ไม่เหมือนกัน IIRC - แม้ว่าความสามารถในการคำนวณของพวกเขาจะเทียบเท่า

ขอบคุณที่เควินไคลน์ชี้ให้เห็นข้อผิดพลาดข้างต้น - เนื่องจากวิกิพีเดียชี้ให้เห็นว่าการกดออโตมาต้านั้นมีประสิทธิภาพมากกว่าเครื่องสถานะ จำกัด แต่มีประสิทธิภาพน้อยกว่าเครื่องทัวริง

ผมไม่ทราบว่านี้ผายลมสมองมาจาก - ฉันทำรู้บริบทที่มีความละเอียดอ่อนไวยากรณ์มีประสิทธิภาพมากขึ้นกว่าบริบทฟรีและที่บริบทไวยากรณ์ที่มีความสำคัญไม่สามารถแยกวิเคราะห์โดยใช้หุ่นยนต์ผลักดันลงง่ายๆ ฉันยังรู้ว่าในขณะที่เป็นไปได้ที่จะแยกไวยากรณ์ไวยากรณ์ที่ไม่มีบริบทใด ๆ ในเวลาเชิงเส้น แต่โดยทั่วไปแล้วจะใช้เวลามากกว่า (กดลง) ออโตเมติกแบบกดลงเพื่อทำสิ่งนั้น ดังนั้นฉันจะจบลงได้อย่างไรว่าการเชื่อว่าหุ่นยนต์แบบกดลงนั้นเทียบเท่ากับเครื่องจักรทัวริงที่แปลกประหลาด

บางทีฉันอาจกำลังคิดว่าหุ่นยนต์แบบกดลงที่มีการเพิ่มเครื่องจักรพิเศษบางอย่าง แต่นั่นก็เหมือนกับการนับจำนวนเครื่องจักรอัตโนมัติที่มีค่าเทียบเท่ากับเครื่องจักรแบบกดลง (เพียงแค่เพิ่มและใช้ประโยชน์จากกองซ้อน)

ออโต้แบบกดลงมีความสำคัญในการแยกวิเคราะห์ ฉันคุ้นเคยกับพวกเขาเพียงพอในบริบทนั้น แต่ฉันไม่เคยศึกษาพวกเขาเป็นแบบจำลองการคำนวณทางวิทยาศาสตร์คอมพิวเตอร์ดังนั้นฉันจึงไม่สามารถให้รายละเอียดมากกว่าที่ฉันมีอยู่

เป็นไปได้ที่จะจำลองวัตถุ OOP เดียวเป็นเครื่องสถานะ จำกัด สถานะของเครื่องจะถูกกำหนดโดยสถานะของตัวแปรสมาชิกทั้งหมด โดยปกติคุณจะนับเฉพาะสถานะที่ถูกต้องระหว่างการเรียกใช้เมธอด (ไม่ใช่ระหว่าง) อีกครั้งโดยทั่วไปคุณจะมีรัฐจำนวนมากที่ต้องกังวล - เป็นสิ่งที่คุณอาจใช้เป็นแบบจำลองเชิงทฤษฎี แต่คุณไม่ต้องการระบุรัฐเหล่านั้นทั้งหมดยกเว้นในกรณีเล็ก ๆ น้อย ๆ

มันเป็นเรื่องธรรมดาแม้ว่าแบบจำลองบางแง่มุมของสถานะของวัตถุโดยใช้เครื่องจักรสถานะ จำกัด กรณีทั่วไปคือ AI สำหรับวัตถุในเกม

นี่คือสิ่งที่มักทำเมื่อกำหนด parser โดยใช้โมเดลออโตเมติกแบบกดลง แม้ว่าจะมีชุด จำกัด ของรัฐในรูปแบบของรัฐเพียงรุ่นนี้เป็นส่วนหนึ่งของรัฐ parser - ข้อมูลเพิ่มเติมจะถูกเก็บไว้ในตัวแปรเสริมข้างรัฐ การแก้ปัญหาเช่นปัญหา 4 พันล้านสถานะสำหรับหนึ่งจำนวนเต็มไม่ระบุรัฐเหล่านั้นทั้งหมดเพียงแค่รวมตัวแปรจำนวนเต็ม ในแง่หนึ่งมันยังคงเป็นส่วนหนึ่งของสถานะออโตเมติกแบบกดลง แต่ก็เป็นวิธีการจัดการที่ดีกว่าการวาดเอฟเฟกต์ 4 พันล้านฟองบนไดอะแกรม


1
"เป็นไปได้ที่จะสร้างแบบจำลองวัตถุ OOP ชิ้นเดียวเป็นเครื่องจักรสถานะ จำกัด " จริง แต่อ่อนแอ มันเป็นไปไม่ได้". มันเป็นเรื่องของความหมาย งานของภาษาการเขียนโปรแกรมคือการแสดง FSM ในรูปแบบที่เป็นระเบียบ OOP เป็นการใช้งาน FSM พร้อมสัญกรณ์ที่ง่ายขึ้นสำหรับทุกสถานะ
S.Lott

1
@ S.Lott - ใช่ แต่คนส่วนใหญ่ไม่คิดว่าวัตถุ OOP เป็นการแสดง FSM อย่างน้อยก็ไม่ได้ใช้เวลาส่วนใหญ่ การใช้ชื่อ "state machine" มีแนวโน้มที่จะบอกเป็นนัยว่าคุณกำลังใช้การใช้งานเฉพาะเช่นรูปแบบการออกแบบของรัฐหรือตัวแปรสมาชิก state-ID "การสร้างแบบจำลองเป็นเครื่องรัฐ" มักจะแสดงถึงบางสิ่งบางอย่างเกี่ยวกับข้อมูลจำเพาะหรือเอกสารการออกแบบซึ่งแตกต่างจากการใช้งานคลาสนั้น ดังนั้นการสร้างโมเดลคลาสเป็นโมเดลสภาวะที่มีความ จำกัด ทางจิตใจหมายถึงสิ่งอื่นนอกเหนือจากการจัดเตรียมซอร์สโค้ดสำหรับคลาส
Steve314

"คนไม่คิด" จริง และเป็นปัญหาที่ลึกซึ้ง โปรแกรมทั้งหมดเป็นเครื่องของรัฐ พวกเขามีสถานะเป็นจำนวนมาก นั่นคือสิ่งที่การทดสอบ "Turing Complete" สำหรับภาษาการเขียนโปรแกรมต้องการ มันเป็นกฎที่แข็งแกร่งมากและสมบูรณ์ที่สุด แทนที่จะแนะนำว่า "เป็นไปได้" เป็นเหมือน "จำเป็น" และ "เพียงพอ"
S.Lott

1
-1: ออโตเมต้าแบบกดลงจะไม่ทรงพลังเท่ากับเครื่องจักรทัวริง
วินไคลน์

1
@kevin cline - ขอบคุณ - และฉันกำลังคิดอะไรอยู่!!! แก้ไขเพื่อนัดหยุดงานที่บิต แม้จะมีสิ่งที่ฉันพูดเกี่ยวกับการศึกษาอย่างเป็นทางการฉันรู้ดีกว่านั้นและควรจะรู้ดีกว่าเมื่อก่อน
Steve314

5

ปัญหาไม่ได้ว่าสิ่งที่ "เป็น" หรือ "ไม่ใช่" เครื่องสถานะ จำกัด กลไกสถานะอัน จำกัด เป็นแบบจำลองทางจิตที่อาจเป็นประโยชน์ในการทำความเข้าใจบางสิ่งหากสิ่งนั้นสามารถคิดเป็นหนึ่งได้

โดยทั่วไปแล้วโมเดลสถานะเครื่องจักรอัน จำกัด ใช้กับสิ่งที่มีสถานะจำนวนน้อยเช่นไวยากรณ์ปกติหรือซีเควนเซอร์คำสั่งของคอมพิวเตอร์


1

เพื่อตอบคำถามของคุณโดยตรง: ไม่แน่นอน ดูเหมือนจะไม่มีทฤษฎีทางคณิตศาสตร์อย่างเป็นทางการสำหรับ OOP ที่แลมบ์ดาแคลคูลัสและ / หรือ Combinatory Logic ภายใต้การเขียนโปรแกรมที่ใช้งานได้ต่ำกว่าหรือ Turing Machines ภายใต้โปรแกรมทั่วไปที่จำเป็น

ดูคำถามเพิ่มเติมเกี่ยวกับสแต็คโฟลว์สำหรับข้อมูลเพิ่มเติม

ฉันเดาว่าการขาดทฤษฎีทางคณิตศาสตร์พื้นฐานคือเหตุผลที่ทุกคนรู้ว่า "วัตถุ" คืออะไรเมื่อพวกเขาเห็นมัน แต่ไม่มีใครเห็น "วัตถุ" ค่อนข้างเหมือนกับคนอื่น ๆ


0

ไม่ไม่จริงเลย เครื่องสถานะปกติโดยปกติจะจดจำข้อมูลหนึ่งส่วนเท่านั้น: สถานะปัจจุบัน

แอปพลิเคชันทั่วไปของ FSM คือ lexing หรือการแยก ตัวอย่างเช่นเมื่อเราทำการเล็มมันเป็นเรื่องปกติที่จะเข้ารหัสการกระทำสำหรับอินพุตที่เป็นไปได้ในแง่ของสถานะปัจจุบันและค่าของอินพุต

ตัวอย่างเช่นเราอาจมีสถานะ NUMBER ที่เรากำลังอ่านตัวเลขของตัวเลข หากอักขระตัวถัดไปที่เราอ่านเป็นตัวเลขเราจะอยู่ในสถานะ NUMBER หากเป็นช่องว่างหรือแท็บเราจะคืนค่าตัวเลขและจากนั้นไปยังสถานะ WHITE_SPACE บางอย่างหรือบางสิ่งตามลำดับนั้น

ตอนนี้มันเป็นความจริงอย่างแน่นอนว่าใน FSM ทั่วไป (โดยเฉพาะอย่างยิ่งที่ใช้ในซอฟต์แวร์) เราจบลงด้วยบิตและชิ้นส่วนทางเทคนิคที่ไม่เหมาะกับ FSM ที่ผสมกับ FSM เอง ตัวอย่างเช่นเมื่อเราอ่านตัวเลขจำนวนหนึ่งคุณมักจะบันทึกตำแหน่งของตัวเลขแรกดังนั้นเมื่อคุณไปถึงจุดสิ้นสุดคุณสามารถคำนวณค่าของตัวเลขได้อย่างง่ายดาย

FSM นั้นมีข้อ จำกัด บางประการ - ไม่มีกลไกในการนับ ตัวอย่างเช่นพิจารณาภาษาที่ใช้ "/ " เพื่อเริ่มความคิดเห็นและ " /" เพื่อสิ้นสุดความคิดเห็น lexer อาจมีสถานะ COMMENT ที่ป้อนเมื่อเห็นโทเค็น ' / ' ไม่มีวิธีในจุดนี้ (ขาดการเพิ่มสถานะอื่นเช่น COMMENT2) เพื่อตรวจหา "/ " อื่นและตระหนักว่ามันเกี่ยวข้องกับความคิดเห็นที่ซ้อนกัน แต่ในสถานะความคิดเห็นมันจะรับรู้*/ว่าเป็นการบอกให้ออกจากสถานะความคิดเห็นและสิ่งอื่นจะทิ้งไว้ในสถานะความคิดเห็น

ดังที่กล่าวไว้คุณสามารถรวมสถานะ COMMENT2 สำหรับความคิดเห็นที่ซ้อนกัน - และในนั้นสถานะ COMMENT3 และอื่น ๆ อย่างไรก็ตามในบางจุดคุณจะรู้สึกเบื่อกับการเพิ่มสถานะและนั่นจะเป็นตัวกำหนดความลึกในการซ้อนสูงสุดที่คุณอนุญาตสำหรับความคิดเห็น ด้วยตัวแยกวิเคราะห์รูปแบบอื่น ๆ (เช่นไม่ใช่เครื่องสถานะบริสุทธิ์ แต่เป็นสิ่งที่มีหน่วยความจำเหลือไว้ให้นับ) คุณสามารถติดตามความลึกการซ้อนของคุณโดยตรงดังนั้นคุณจึงอยู่ในสถานะ COMMENT จนกว่าจะถึงโทเค็นความคิดเห็นที่ใกล้เคียง ทำให้ยอดคงเหลือคงเหลือที่หนึ่งดังนั้นตัวนับของคุณกลับเป็น 0 และคุณออกจากสถานะ COMMENT

อย่างที่ฉันได้กล่าวไปแล้วเมื่อคุณเพิ่มตัวนับเช่นนั้นสิ่งที่คุณไม่มีก็คือ FSM อย่างแท้จริง ในเวลาเดียวกันก็เป็นจริงสวยใกล้ - โดยเฉพาะใกล้พอที่จะทำให้คุณสามารถจำลองเคาน์เตอร์โดยเพียงแค่การเพิ่มรัฐมากขึ้น

อย่างไรก็ตามในกรณีทั่วไปเมื่อมีคนพูดถึงการใช้งาน FSM ในซอฟต์แวร์พวกเขาจะทำให้มัน" สมเหตุสมผล " อย่างสมเหตุสมผล โดยเฉพาะอย่างยิ่งซอฟต์แวร์จะตอบสนองต่ออินพุตปัจจุบันตามสถานะปัจจุบันเท่านั้นและมูลค่าของอินพุตนั้น หากปฏิกิริยาขึ้นอยู่กับสิ่งอื่นมากพวกเขามักจะไม่เรียกมันว่าเครื่องรัฐ (อย่างน้อยถ้าพวกเขารู้ว่าสิ่งที่พวกเขากำลังพูดถึง)


"สถานะปัจจุบัน" อาจรวมถึงข้อมูลจำนวนมาก FSM สามารถนับได้เล็กน้อยโดยการระบุสถานะสำหรับแต่ละหมายเลขที่จะนับ มัน จำกัด (ต่างจาก Turing Machine) แต่ก็ยังสามารถนับได้อย่างสมบูรณ์ ฉันคิดว่าคุณอาจต้องการตัวอย่างที่ดีกว่า
S.Lott

ซอฟแวร์ในโทรศัพท์มือถือของคุณเป็นชุดของเครื่องรัฐที่ซับซ้อนน่ารำคาญที่จำข้อมูลจำนวนมากและตีความพวกเขาตามสถานะปัจจุบัน
Mawg พูดว่าคืนสถานะโมนิก้า

-2

ฉันไม่เชื่อว่าคำตอบที่ยอมรับนั้นถูกต้องทั้งหมด

คุณไม่สามารถจำลองโปรแกรมโดยพลการที่เขียนด้วยภาษาทัวริงสมบูรณ์ไม่ว่าจะเป็นเชิงวัตถุหรือไม่เป็นเครื่องไฟไนต์สเตท ภาษาคอมพิวเตอร์สมัยใหม่เกือบทุกภาษาเช่น Java, C ++ หรือ Smalltalk ล้วนเป็น Turing Complete

ตัวอย่างเช่นคุณไม่สามารถสร้าง Finite State Machine เพื่อรับรู้ลำดับของวัตถุที่คุณมีอินสแตนซ์ n ของวัตถุหนึ่งแล้วตามด้วย n อินสแตนซ์ของวัตถุอื่นเนื่องจากเครื่องจักรสถานะ จำกัด ไม่สามารถเขียน n ไปยังตัวแปรได้ พวกเขาสามารถอ่านอินพุตเท่านั้นและเปลี่ยนเป็นสถานะ


นี่เป็นเพียงการทำซ้ำคะแนนและอธิบายในคำตอบที่โพสต์เมื่อ 3 ปีที่แล้วเช่นในอันนี้
gnat
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.