สามารถใช้งานโปรแกรมใด ๆ ของ * ที่ไม่มีสถานะได้หรือไม่?


13

นี่เป็นคำถามเชิงทฤษฎี แต่หลังจากหลายปีของการเขียนโปรแกรมในสิ่งที่ฉันรู้ตอนนี้คือเทคนิค "ปกติ" ที่จำเป็นโดยใช้ C ++ ส่วนใหญ่ฉันได้ค้นพบโลกแห่งการเขียนโปรแกรมเชิงปฏิบัติการอีกครั้งซึ่งฉันบังเอิญบังเอิญเรียนรู้ JavaScript

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

มันเป็นความคิดที่น่าสนใจและฉันต้องยอมรับว่ามีความชัดเจนและความสง่างามในการเขียนโปรแกรมฟังก์ชั่นที่ทำให้ใจของฉันแย่จริงๆ


1
คำตอบ StackOverflow ที่เกี่ยวข้อง: stackoverflow.com/questions/3722084/…
jfriend00

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

6
หากคุณต้องการหารือเกี่ยวกับสถานะ ต้องระบุสถานะอย่างชัดเจนหากใช้สำหรับโปรแกรมเท่านั้น ดูเหมือนว่าคุณกำลังคิดถึงสถานะที่เปลี่ยนแปลงไม่ได้กับสถานะที่เปลี่ยนแปลงไม่ได้ - คุณอาจต้องการระบุว่าคุณหมายถึงอะไรในคำถาม
Billy ONeal

1
มันเหมือนกับถามว่าโปรแกรมทั้งหมดสามารถแปลงเป็นเครื่องทัวริงจริงหรือไม่ ในทางเทคนิคแล้วแม้แต่โปรแกรมที่บันทึกและโหลดจากฐานข้อมูล แต่มันก็กลายเป็นขนาดที่ยากที่จะจำลองพฤติกรรมนี้ในเครื่องทัวริง ในทำนองเดียวกันคุณอาจมีโปรแกรมที่ลบด้านควบคุมในสถาปัตยกรรม MVC และคุณทำการเรียกทั้งหมดแม้ว่ามันจะกลายเป็นเรื่องยากที่จะจัดการกับ (อีกครั้งคุณกลายเป็นตัวควบคุมเพื่อทำให้โปรแกรมไร้สัญชาติ)
Neil

คำตอบ:


17

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

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


2
อาร์กิวเมนต์เดียวกันของคุณสามารถเปลี่ยนกลับโดยบอกว่าเป็น lamba แคลคูลัสเทียบเท่ากับเครื่องทัวร์ทุกการคำนวณจะต้องมีสถานะ (มากหรือน้อยซ่อน) ไม่ว่าจะเป็นการแสดงภายนอกรหัส (โดยวิธีการของตัวแปร) หรือภายในการไหล (โดยวิธีการเรียกฟังก์ชั่นสแต็กตาม) เสมอ "รัฐ" คือ
Emilio Garavaglia

3
แคลคูลัสแลมบ์ดามีสถานะ; ข้อ จำกัด ของมันคือรัฐไม่เปลี่ยนรูป รัฐที่ไม่เปลี่ยนรูปนั้นยังคงเป็นของรัฐ พารามิเตอร์ของฟังก์ชันรวมถึง lambdas ยังคงเป็นสถานะ; สมมุติว่าคุณต้องการให้ฟังก์ชันมีพฤติกรรมที่แตกต่างกันโดยให้พารามิเตอร์ต่างกัน
Billy ONeal

@emilio การระบุว่ามีวิธีการแก้ปัญหาสถานะเทียบเท่ากับปัญหา (ตามที่คุณอธิบาย) ไม่ได้เป็นการพิสูจน์ว่าไม่มีการแก้ปัญหาแบบไม่มีรัฐนั้น
Billy ONeal

2
@EmilioGaravaglia คุณกำลังอ้างถึงสถานะของล่ามแลมบ์ดา - แคลคูลัส เมื่อให้เหตุผลในแคลคูลัสแลมบ์ดาไม่จำเป็นต้องให้เหตุผลเกี่ยวกับสถานะ นอกจากนี้ลักษณะของ "ความผันแปร" ก็แตกต่างกัน
wirrbel

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

14

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

ไม่ว่าคุณจะมีบางสิ่งที่ "จำได้" หรือขึ้นอยู่กับสิ่งที่คุณทำคุณมีสถานะ

ระบบที่ไม่มีสถานะไม่ใช่ "ไดนามิก": เป็นเพียงฟังก์ชัน combinatorial ที่อาจไม่มีสถานะ แต่ - เพื่อให้ได้ผลลัพธ์ที่แตกต่าง - ต้องระบุสถานะที่จะให้อย่างใด

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

เมื่อคุณfna(fnb(x))ให้สถานะกับ fnb ซึ่งจะทำให้เกิดสถานะสำหรับ fna นี่เป็นเพราะความจริงที่xมีอยู่ก่อนที่จะเรียกว่า fnb (ดังนั้นมันมาจาก "อดีต" ของมันเอง)

ไม่ใช่เรื่องของ "สถานะเดิม" หรือ "ไม่มีสถานะ" มันเป็น "ฉันสนใจ" หรือ "ฉันไม่"


0

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

โปรแกรมที่ใช้งานได้จริงเป็นเพียงฟังก์ชั่น ดังนั้นสำหรับการใช้งานจริงโปรแกรมที่ใช้งานได้จริงจะใส่คู่ (old_state * present_stimulus) และส่งออกคู่ (new_state * present_response) จำเป็นต้องใช้ "looper" ภายนอกที่เป็นรัฐเพื่อรอการกระตุ้นครั้งต่อไปและเผยแพร่สถานะ

โปรแกรมที่ใช้งานได้จริงไม่ได้มีสถานะเป็นจริงและไม่สามารถใช้สำหรับการใช้งานจริงโดยตรง

ดังนั้นจึงไม่สามารถเปลี่ยนโปรแกรมที่มุ่งเน้นรัฐด้วยการใช้งานที่แตกต่างกันซึ่งมีการใช้งานได้อย่างหมดจดและไม่มีรัฐ


0

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

ใน JavaScript เพื่อให้โปรแกรมของคุณมีผลเกินกว่าจะทำตามรอบตัวประมวลผลคุณต้องแก้ไข Dom หรือวัตถุ Window และ API เหล่านี้มีสถานะเป็น stateful แต่ฉันคิดว่าคุณสามารถสร้าง wrapper ที่ส่งวัตถุ Dom และ Window เป็นพารามิเตอร์ไปยังโค้ด JavaScript จากนั้นรับ Dom / Window ใหม่เป็นเอาต์พุต สิ่งนี้จะแยกรหัส JavaScript ออกจากสถานะที่ไม่แน่นอน

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

คำถามที่แตกต่างคือถ้ามันเป็นความคิดที่ดี แม้แต่ Haskell ซึ่งเป็นภาษาที่ใช้งานได้จริงโดยการออกแบบรวมถึง 'state' monad ซึ่งช่วยให้คุณจำลองสถานะที่ไม่แน่นอน นี่แสดงให้เห็นว่าบางครั้งสถานะที่เปลี่ยนแปลงไม่ได้อย่างชัดเจนเป็นรูปแบบที่ต้องการจริงๆ


0

คิดเกี่ยวกับวิธีที่คุณจะใช้ "เครื่องรัฐ" ในภาษาการเขียนโปรแกรมโดยไม่มีรัฐ

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

if (sm.atBegining()) sm.start() else if (sm.done()) sm.stop() ) else sm.progress()
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.