Ben çoğunlukla bir C / C ++ programcısıyım, bu da deneyimimin çoğunun usule dayalı ve nesne yönelimli paradigmalar ile yapıldığı anlamına geliyor. Bununla birlikte, birçok C ++ programcısının farkında olduğu gibi, C ++ yıllar içinde vurgusuyla fonksiyonel esque tarzına kaymış, sonunda C ++ 0x'deki lambda ve kapakların eklenmesiyle sonuçlanmıştır.
Ne olursa olsun, C ++ kullanarak işlevsel bir tarzda kodlama konusunda önemli bir deneyime sahip olsam da, Lisp, Haskell, vb. Gibi gerçek işlevsel dillerle ilgili çok az deneyimim var.
Son zamanlarda bu dilleri incelemeye başladım, çünkü tamamen işlevsel dillerde "yan etki yok" fikri, özellikle eşzamanlılık ve dağıtılmış hesaplama konusundaki uygulamaları konusunda beni her zaman etkiledi.
Ancak, bir C ++ arkaplanından gelince, bu "yan etki yok" felsefesinin asenkron programlama ile nasıl çalıştığı konusunda kafam karıştı. Eşzamansız programlama ile, eşzamanlı olmayan olayları (programın akışı dışında) işlemek için kullanıcı tarafından sağlanan olay işleyicilerini gönderen herhangi bir çerçeve / API / kodlama stilini kastediyorum. Bu, Boost.ASIO veya hatta sadece düz eski C gibi eşzamansız olmayan kütüphaneleri içerir sinyal işleyicileri veya Java GUI olay işleyicileri.
Bunların hepsinde ortak olan tek şey, asenkron programlamanın doğasının , programın ana akışının asenkron bir olay işleyicisinin başlatıldığının farkına varması için yan etkilerin (durum) yaratılmasını gerektiriyor görünmesidir . Tipik olarak, Boost.ASIO gibi bir çerçevede, bir olay işleyicisi bir nesnenin durumunu değiştirir , böylece olayın etkisi olay işleyicisi işlevinin ömrünün ötesine yayılır. Gerçekten, bir olay işleyicisi başka ne yapabilir? Çağrı noktasına bir değer döndüremez, çünkü çağrı noktası yoktur. Olay işleyicisi, programın ana akışının bir parçası değildir, bu nedenle asıl program üzerinde herhangi bir etkiye sahip olabilmesinin tek yolu bir durumu (veya başka longjmp
bir yürütme noktasına) değiştirmektir.
Öyle görünüyor ki, asenkron programlama, asenkron olarak yan etkiler üretmekle ilgilidir. Bu tamamen işlevsel programlamanın amaçlarına aykırı görünüyor. Bu iki paradigma fonksiyonel uygulamalarda (pratikte) nasıl uzlaştırıldı?