แม้ว่าบางครั้งมันจะแสดงออกมาอย่างนั้นการเขียนโปรแกรมเพื่อการใช้งานก็ไม่ได้ป้องกันการคำนวณแบบไร้รัฐ มันทำอะไรคือบังคับให้โปรแกรมเมอร์ทำให้สถานะชัดเจน
ตัวอย่างเช่นลองใช้โครงสร้างพื้นฐานของบางโปรแกรมโดยใช้คิวที่จำเป็น (ในบาง pseudolanguage):
q := Queue.new();
while (true) {
if (Queue.is_empty(q)) {
Queue.add(q, producer());
} else {
consumer(Queue.take(q));
}
}
โครงสร้างที่สอดคล้องกับโครงสร้างข้อมูลคิวการทำงาน (ยังอยู่ในภาษาที่จำเป็นเพื่อจัดการกับความแตกต่างในแต่ละครั้ง) จะมีลักษณะเช่นนี้:
q := Queue.empty;
while (true) {
if (q = Queue.empty) {
q := Queue.add(q, producer());
} else {
(tail, element) := Queue.take(q);
consumer(element);
q := tail;
}
}
เนื่องจากคิวไม่สามารถเปลี่ยนแปลงได้ในขณะนี้วัตถุจึงไม่เปลี่ยนแปลง ในโค้ดหลอกนี้q
ตัวเองเป็นตัวแปร การมอบหมายq := Queue.add(…)
และq := tail
ทำให้มันชี้ไปที่วัตถุอื่น อินเทอร์เฟซของฟังก์ชันคิวมีการเปลี่ยนแปลง: แต่ละรายการต้องส่งคืนวัตถุคิวใหม่ที่เป็นผลมาจากการดำเนินการ
ในภาษาที่ใช้งานได้จริงเช่นในภาษาที่ไม่มีผลข้างเคียงคุณต้องทำให้ทุกสถานะชัดเจน เนื่องจากผู้ผลิตและผู้บริโภคคาดว่าจะทำอะไรบางอย่างสถานะของพวกเขาจะต้องอยู่ในอินเทอร์เฟซผู้โทรของพวกเขาที่นี่เช่นกัน
main_loop(q, other_state) {
if (q = Queue.empty) {
let (new_state, element) = producer(other_state);
main_loop(Queue.add(q, element), new_state);
} else {
let (tail, element) = Queue.take(q);
let new_state = consumer(other_state, element);
main_loop(tail, new_state);
}
}
main_loop(Queue.empty, initial_state)
ทราบว่าตอนนี้ทุกส่วนของรัฐมีการจัดการอย่างชัดเจน ฟังก์ชันการจัดการคิวใช้คิวเป็นอินพุตและสร้างคิวใหม่เป็นเอาต์พุต ผู้ผลิตและผู้บริโภคผ่านสถานะของพวกเขาเช่นกัน
การเขียนโปรแกรมพร้อมกันไม่พอดีให้ดีภายในโปรแกรมการทำงาน แต่มันเหมาะกับเป็นอย่างดีรอบการทำงานการเขียนโปรแกรม แนวคิดคือรันโหนดการคำนวณแยกต่างหากและให้พวกเขาแลกเปลี่ยนข้อความ แต่ละโหนดจะรันโปรแกรมที่ใช้งานได้และสถานะจะเปลี่ยนไปในขณะที่ส่งและรับข้อความ
ดำเนินการต่อตัวอย่างเนื่องจากมีคิวเดียวจึงถูกจัดการโดยหนึ่งโหนด ผู้บริโภคส่งข้อความถึงโหนดเพื่อรับองค์ประกอบ ผู้ผลิตส่งข้อความถึงโหนดเพื่อเพิ่มองค์ประกอบ
main_loop(q) =
consumer->consume(q->take()) || q->add(producer->produce());
main_loop(q)
หนึ่ง“อุตสาหกรรม” ภาษาที่ได้รับright³พร้อมกันคือErlang การเรียนรู้ Erlang เป็นเส้นทางสู่การตรัสรู้อย่างแน่นอนเกี่ยวกับการเขียนโปรแกรมพร้อมกัน
ตอนนี้ทุกคนเปลี่ยนไปใช้ภาษาที่ไม่มีผลข้างเคียง!
¹ คำนี้มีความหมายหลายแห่ง ที่นี่ฉันคิดว่าคุณกำลังใช้มันเพื่อหมายถึงการเขียนโปรแกรมโดยไม่มีผลข้างเคียงและนั่นคือความหมายที่ฉันใช้ด้วย
² Programming กับรัฐโดยนัยคือการเขียนโปรแกรมจำเป็น ; การวางแนววัตถุเป็นสิ่งที่ต้องคำนึงถึงอย่างสมบูรณ์
³ การอักเสบฉันรู้ แต่ฉันหมายถึงมัน เธรดที่มีหน่วยความจำแบบแบ่งใช้เป็นภาษาแอสเซมบลีของการเขียนโปรแกรมพร้อมกัน การส่งข้อความเป็นเรื่องที่เข้าใจได้ง่ายกว่ามากและการไม่มีผลข้างเคียงจะส่องสว่างทันทีที่คุณแนะนำการใช้งานพร้อมกัน
⁴ และนี่มาจากคนที่ไม่ใช่แฟนของ Erlang แต่ด้วยเหตุผลอื่น