2009-03-11 22 views
6

Tôi đã đọc và suy nghĩ một chút công bằng về điều này. Buzz dường như là trong tương lai đa lõi, các ngôn ngữ chức năng sẽ trở nên phổ biến hơn. Tôi là một noob tương đối với lập trình chức năng. Tiếp xúc duy nhất của tôi là học tập, và không có gì phức tạp, đủ để thực sự đưa lớp ngôn ngữ này qua các bước của nó.Các ngôn ngữ chức năng vốn có song song hơn so với OO hoặc anh em họ bắt buộc của chúng?

Vì vậy, như tôi đã hiểu, các hàm thuần túy có thể được song song một cách dễ dàng và minh bạch. Đây là một tính năng tuyệt vời, vì nó có nghĩa là không có phức tạp với việc viết mã luồng. Tuy nhiên, nó không xuất hiện để giúp đỡ nhiều với mã nối tiếp.

Example: 

fooN(... (foo3(foo2(foo1(0))))) 

Cuộc gọi nối tiếp như thế này có vẻ là vấn đề phổ biến và đôi khi không thể tránh khỏi. Đối với tôi đây là những gốc rễ của việc tại sao song song là rất khó khăn. Một số nhiệm vụ chỉ đơn giản là (hoặc xuất hiện để được) cao nối tiếp. Có một "suy nghĩ chức năng" cho phép bạn phân hủy tốt hơn một số nhiệm vụ dường như nối tiếp? Có bất kỳ ngôn ngữ chức năng hiện có nào cung cấp các cơ chế minh bạch để song song tốt hơn mã nối tiếp cao không? Cuối cùng, các ngôn ngữ chức năng vốn có song song hơn so với các ngôn ngữ OO hoặc mệnh lệnh, và tại sao?

Trả lời

8

Ngôn ngữ chức năng song song hơn các ngôn ngữ mệnh lệnh và OO vì các hàm thuần túy. Tuy nhiên, bạn hoàn toàn đúng, nếu bạn có các loại phụ thuộc dữ liệu này, bạn không thể song song nó. Giá trị chính của lập trình chức năng là làm cho sự song song hiện diện trong mã của bạn dễ dàng hơn để phát hiện và lý do vì chỉ phụ thuộc dữ liệu, không chia sẻ trạng thái có thể thay đổi, có thể cản trở. Trên thực tế, bởi vì hầu hết các lập trình viên sinh tử đều gặp khó khăn khi làm việc trong các ngôn ngữ thuần túy chức năng, và vì chính sách hoàn toàn không thể thay đổi được của Dracon có thể không hiệu quả, có một số ý kiến ​​cho phép , nhưng không cho phép tác dụng phụ qua các chức năng. Nói cách khác, tất cả các hàm được song song sẽ phải thuần khiết. Sau đó, bạn có thể có trạng thái có thể thay đổi cho các biến cục bộ để làm cho mã dễ viết hơn và hiệu quả hơn, nhưng vẫn cho phép thực hiện song song các cuộc gọi đến các chức năng thuần túy một cách an toàn, dễ dàng. Điều này đang được khám phá, ví dụ, nhánh 2.0 của ngôn ngữ D.

+0

Các ngôn ngữ hoàn toàn chức năng (với mondas thích hợp) là chìa khóa cho tương lai. Và bạn không cần phải là một lập trình viên bất tử để vượt qua nó. Bạn chỉ cần tiếp cận vấn đề một chút khác biệt. – yfeldblum

+0

Không đồng ý. Trạng thái biến đổi tồn tại trong một khoảng thời gian ngắn trong phạm vi nhỏ, chẳng hạn như các biến cục bộ cho một hàm, là một điều tốt bởi vì nó làm cho việc thực hiện các hàm dễ dàng và hiệu quả hơn. Khi nó trở thành vấn đề là cho những thứ như biến thành viên và toàn cầu. – dsimcha

+0

Dễ dàng hơn là một thuật ngữ chủ quan. Tôi từng nghĩ như bạn đã làm, bây giờ tôi nghĩ ngược lại. Tôi đã đúng cả hai lần. – luqui

6

Chủ yếu là về tác dụng phụ. Nếu trình biên dịch biết rằng một số phần của mã không có tác dụng phụ, nó có thể tối ưu hóa dựa trên cấu trúc mã để chạy một số trong những song song.

xem xét LINQ trên C#/đó là semi-chức năng:

var someValues = from c in someArray 
       where // some comparisson with no side effects 
       select c; 

Bạn đang xác định mục đích của những gì bạn muốn làm, nếu trình biên dịch biết mỗi phần của biểu thức không có tác dụng phụ, nó có thể một cách an toàn gán các phần khác nhau của mảng để xử lý trên các lõi khác nhau. Trên thực tế có một .AsParalell sẽ xuất hiện trên linq song song (plinq), điều đó sẽ cho phép điều đó. Vấn đề đến ở chỗ nó sẽ không thể thực thi bit không có tác dụng phụ (đang ở trên một ngôn ngữ/khung công tác không có hỗ trợ cho nó), điều này có thể rất tệ nếu các nhà phát triển không nhận thức được. Bởi vì điều đó, họ đã làm cho nó rõ ràng, nhưng bạn có thể thấy rằng gây rắc rối trên đường đi.

Các vấn đề liên quan