Tôi chủ yếu là một lập trình viên C / C ++, điều đó có nghĩa là phần lớn kinh nghiệm của tôi là với các mô hình hướng đối tượng và hướng đối tượng. Tuy nhiên, như nhiều lập trình viên C ++ biết, C ++ đã chuyển trọng tâm qua nhiều năm sang phong cách chức năng, cuối cùng là việc bổ sung lambdas và đóng cửa trong C ++ 0x.
Bất kể, trong khi tôi có kinh nghiệm đáng kể về mã hóa theo kiểu chức năng bằng C ++, tôi có rất ít kinh nghiệm với các ngôn ngữ chức năng thực tế như Lisp, Haskell, v.v.
Gần đây tôi đã bắt đầu nghiên cứu các ngôn ngữ này, bởi vì ý tưởng "không có tác dụng phụ" trong các ngôn ngữ chức năng thuần túy luôn khiến tôi tò mò, đặc biệt là liên quan đến các ứng dụng của nó để tính toán đồng thời và tính toán phân tán.
Tuy nhiên, đến từ nền tảng C ++, tôi bối rối không biết làm thế nào mà philsophy "không có tác dụng phụ" này hoạt động với lập trình không đồng bộ. Theo lập trình không đồng bộ, tôi có nghĩa là bất kỳ kiểu khung / API / mã hóa nào gửi các trình xử lý sự kiện do người dùng cung cấp để xử lý các sự kiện xảy ra không đồng bộ (bên ngoài luồng chương trình.) Điều này bao gồm các thư viện không đồng bộ như Boost.ASIO hoặc thậm chí chỉ là C cũ đơn giản trình xử lý tín hiệu hoặc trình xử lý sự kiện Java GUI.
Một điểm chung của tất cả những điểm chung là bản chất của lập trình không đồng bộ dường như đòi hỏi phải tạo ra các hiệu ứng phụ (trạng thái), để dòng chính của chương trình nhận ra rằng một trình xử lý sự kiện không đồng bộ đã được gọi. Thông thường, trong một khung như Boost.ASIO, một trình xử lý sự kiện thay đổi trạng thái của một đối tượng, do đó hiệu ứng của sự kiện được lan truyền vượt quá thời gian sống của chức năng xử lý sự kiện. Thực sự, một người xử lý sự kiện có thể làm gì khác? Nó không thể "trả lại" một giá trị cho điểm gọi, vì không có điểm gọi. Trình xử lý sự kiện không phải là một phần của luồng chính của chương trình, vì vậy cách duy nhất nó có thể có bất kỳ ảnh hưởng nào đến chương trình thực tế là thay đổi một số trạng thái (hoặc khác longjmp
sang điểm thực thi khác).
Vì vậy, có vẻ như lập trình không đồng bộ là tất cả về việc tạo ra các tác dụng phụ không đồng bộ. Điều này dường như hoàn toàn mâu thuẫn với các mục tiêu của lập trình chức năng. Làm thế nào hai mô hình này được điều hòa (trong thực tế) trong các ngôn ngữ chức năng?