Ich bin hauptsächlich ein C / C ++ - Programmierer, was bedeutet, dass ich den größten Teil meiner Erfahrung mit prozeduralen und objektorientierten Paradigmen habe. Wie jedoch vielen C ++ - Programmierern bekannt ist, hat C ++ im Laufe der Jahre seinen Schwerpunkt auf einen funktionalen Stil verlagert, der schließlich in der Hinzufügung von Lambdas und Closures in C ++ 0x gipfelte.
Unabhängig davon habe ich zwar viel Erfahrung mit der Programmierung in einem funktionalen Stil mit C ++, aber nur sehr wenig Erfahrung mit tatsächlichen funktionalen Sprachen wie Lisp, Haskell usw.
Ich habe vor kurzem begonnen, diese Sprachen zu studieren, weil mich die Idee, dass "keine Nebenwirkungen" in rein funktionalen Sprachen auftreten, immer fasziniert hat, insbesondere in Bezug auf ihre Anwendungen für Parallelität und verteiltes Computing.
Ich bin jedoch verwirrt darüber, wie diese "keine Nebenwirkungen" -Philosophie bei asynchroner Programmierung funktioniert, da sie aus einem C ++ - Hintergrund stammt. Mit asynchroner Programmierung meine ich jeden Framework- / API- / Codierungsstil, der vom Benutzer bereitgestellte Ereignishandler zur Behandlung von Ereignissen absetzt, die asynchron auftreten (außerhalb des Programmflusses). Dies schließt asynchrone Bibliotheken wie Boost.ASIO oder auch nur einfaches altes C ein Signalhandler oder Java-GUI-Ereignishandler.
Allen gemeinsam ist, dass die Natur der asynchronen Programmierung die Erzeugung von Nebenwirkungen (Status) zu erfordern scheint, damit der Hauptablauf des Programms erkennt, dass ein asynchroner Ereignishandler aufgerufen wurde. In einem Framework wie Boost.ASIO ändert ein Ereignishandler normalerweise den Status eines Objekts, sodass die Wirkung des Ereignisses über die Lebensdauer der Ereignishandlerfunktion hinaus übertragen wird. Was kann ein Event-Handler sonst noch? Es kann keinen Wert an den Aufrufpunkt "zurückgeben", da kein Aufrufpunkt vorhanden ist. Die Ereignisbehandlungsroutine ist nicht Teil des Hauptablaufs des Programms. Sie kann sich also nur auf das eigentliche Programm auswirken, wenn Sie einen bestimmten Status (oder longjmp
einen anderen Ausführungspunkt) ändern .
Bei der asynchronen Programmierung geht es also anscheinend darum, Nebenwirkungen asynchron zu erzeugen. Dies scheint völlig im Widerspruch zu den Zielen der funktionalen Programmierung zu stehen. Wie werden diese beiden Paradigmen in funktionalen Sprachen (in der Praxis) in Einklang gebracht?