Bazen bu şekilde ifade edilmesine rağmen, fonksiyonel programlama¹ durum bilgisi olan hesaplamaları engellemez. Yaptığı şey, programcıyı durumu açık hale getirmeye zorlamaktır.
Örneğin, zorunlu bir kuyruk (bazı sözde dillerde) kullanarak bazı programların temel yapısını ele alalım:
q := Queue.new();
while (true) {
if (Queue.is_empty(q)) {
Queue.add(q, producer());
} else {
consumer(Queue.take(q));
}
}
İşlevsel kuyruk veri yapısına (tek seferde bir farkla başa çıkmak için zorunlu bir dilde) karşılık gelen yapı şöyle görünecektir:
q := Queue.empty;
while (true) {
if (q = Queue.empty) {
q := Queue.add(q, producer());
} else {
(tail, element) := Queue.take(q);
consumer(element);
q := tail;
}
}
Kuyruk şimdi değiştirilemediğinden, nesnenin kendisi değişmez. Bu sözde kodda, q
kendisi bir değişkendir; atamaları q := Queue.add(…)
ve q := tail
farklı bir nesneye işaret olun. Kuyruk işlevlerinin arabirimi değişti: her biri işlemden kaynaklanan yeni kuyruk nesnesini döndürmelidir.
Tamamen işlevsel bir dilde, yani yan etkisi olmayan bir dilde, tüm durumu açık hale getirmeniz gerekir. Üretici ve tüketici muhtemelen bir şeyler yapıyor olduğundan, durumları burada da aracının arayüzünde olmalıdır.
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)
Şimdi her devlet parçasının nasıl açıkça yönetildiğine dikkat edin. Kuyruk düzenleme işlevleri kuyruğu girdi olarak alır ve çıktı olarak yeni bir kuyruk oluşturur. Üretici ve tüketici de devletlerini geçer.
Eşzamanlı programlama çok iyi uymuyor iç fonksiyonel programlama, ama çok iyi uyuyor etrafında fonksiyonel programlama. Fikir, bir grup ayrı hesaplama düğümü çalıştırmak ve mesaj alışverişi yapmalarına izin vermektir. Her düğüm işlevsel bir program çalıştırır ve ileti gönderip alırken durumu değişir.
Örneğin devamı, tek bir kuyruk olduğu için belirli bir düğüm tarafından yönetiliyor. Tüketiciler bu düğüme bir eleman elde etmek için bir mesaj gönderir. Yapımcılar bu düğüme eleman eklemek için bir mesaj gönderir.
main_loop(q) =
consumer->consume(q->take()) || q->add(producer->produce());
main_loop(q)
Eşzamanlılık right³ alır dil “sanayileşmiş” biridir Erlang . Erlang'ı öğrenmek kesinlikle eşzamanlı programlama hakkında aydınlanmanın yoludur⁴.
Şimdi herkes yan etkisiz dillere geçiyor!
¹ Bu terim birçok anlamlara sahiptir; burada yan etkiler olmadan programlama yapmak için kullandığınızı düşünüyorum ve bu da benim kullandığım anlam.
² Örtük durum ile programlama zorunlu programlamadır ; nesne yönelimi tamamen dik bir kaygıdır.
³ Enflamatuar, biliyorum, ama demek istediğim. Paylaşılan belleğe sahip konular eşzamanlı programlamanın montaj dilidir. Mesaj geçişini anlamak çok daha kolaydır ve yan etki eksikliği, eşzamanlılığı tanıttığınız anda gerçekten parlar.
⁴ Ve bu, Erlang hayranı olmayan, başka nedenlerle gelen birinden geliyor.